以下描述了如何使用灵云TTS能力。
1. TTS简介
TTS (Text To Speech) 语音合成技术,能将文字信息实时转化为各种不同音色的声音。
2. 选择模块和能力
灵云可以提供云端和本地端的合成能力 无论使用云端或本地端的合成能力,基础模块 hci_tts都是需要的。 需要使用云端能力时,需要加上hci_tts_cloud_synth模块; 需要使用本地端能力时,需要加上hci_tts_local_synth模块; 需要使用本地歌唱能力时,需要加上hci_tts_local_synth_sing模块;
如果使用本地合成引擎,需要访问相应的本地音库。具体某种能力需要的本地音库,可参见 能力列表 。
3. 语音合成
通过 hci_tts_synth() 来进行语音合成,示例如下:
char * pszConfig = "";
char * pszText = "要合成的文本";
FILE * fp = fopen("out.pcm", "w");
errCode =
hci_tts_synth(nSessionId, pszText, pszConfig, TtsSynthCallbackFunction, fp);
fclose(fp);
回调函数的示例如下:
bool HCIAPI TtsSynthCallbackFunction(void * pvUserParam,
{
{
return false;
}
FILE * fp = (FILE *)pvUserParam;
{
}
return true;
}
合成函数是通过回调函数的方式给出数据,但仍然是同步方式,也即只有所有数据都通过回调函数给出后,合成函数才会返回。 因此如果需要响应用户界面操作等,需要将此函数放在一个独立的线程中进行。
合成是分段进行的,在合成过程中会调用多次回调函数,每次给出部分数据。在回调函数的TTS_SYNTH_RESULT参数中, 其pszText为当前正在合成文本段的首地址, 如果当前文本段的合成数据需要多次回调, 则只在第一次回调时给出该文本段的信息,其余回调中,该地址为NULL。
合成的过程中,也有可能出现某个回调没有声音数据返回,即pvVoiceData可能为NULL或者uiVoiceSize为0的情况, 这是正常的,简单忽略即可。
回调函数传入的数据,在退出回调函数后,不保证继续有效,因此,如果需要继续使用这些数据, 需要开发者自行将数据拷贝出去。
回调函数返回false会中止合成,而返回true则会继续合成。可以利用这一特性实现中断合成的操作。
4. 合成选项
主要支持的合成选项如下:
- pitch, speed, volume
分别对应基频、语速、音量,这些配置项可用于调节合成语音的效果,一般情况下取默认值即可。
- audioFormat
输出的语音格式,根据云端或本地合成不同,支持的语音格式不一样,可根据需要选择。
- encode, encLevel
如果是云端合成,可以使用音频压缩配置,以便让云端对合成的音频数据进行压缩后再进行传输,以节省网络流量。 另外,可以使用encLevel选项,来调节音频压缩的级别, 以便在传输流量和音频质量之间达到平衡。具体编解码库使用上的说明参见 音频编解码库。
当本地合成时,不支持这两个配置项,将会直接忽略。当云端合成但audioFormat为vox6k4bit/vox8k4bit/mp3时, 也会忽略这两个配置项,数据会直接使用vox或mp3格式传输,不再另行启动encode指定的压缩。
这一选项只影响传输过程,在数据传输到客户端后,灵云SDK会将数据转换为audioFormat选项指定的格式, 因此在回调函数中获取的数据格式,仍然是audioFormat指定的格式。
- 其它配置
例如数字读法(digitMode), 标点符号读法(puncMode)等,请参见 hci_tts_synth()的说明。 要注意的是,这些参数和不同的合成引擎相关,不同的引擎支持的配置项不完全一致,具体请参见《灵云能力列表》文档。