机器人语音合成功能模块利用iFly TTS SDK在Visual C++6.0环境下进行开发。本节采用iFly TTS SDK开发语音合成模块具有高质量的文本语音转换效果,采用了大型语料库合成技术;采用了超大规模的自然语流数据库的制作,并以此作为数据统计和机器学习的训练数据;依据语言学、语音学、人工智能知识基础,利用机器学习中的决策树、神经网络系统,分别建立了较为完善的基频、时长、能量、停顿模型;具有高效的集成策略,系统可以通过边合成边播放的策略,避免了由于合成长文本带来的较大的延时,系统在分段播放语音时,用户的任何打断都可以中止该次合成任务,免去了无谓的资源消耗;支持对语速、合成风格、音量等合成参数的调整;能保证合成语音连续、可懂、自然,相当于普通人说话标准。机器人语音合成模块的程序流程如图8-18所示。
图8-18 语音合成流程
1)初始化。在程序开始,首先要利用SDK提供的TSInitialize()函数全局初始化语音合成系统,把语音合成系统使用的一些全局数据装载到系统内存中。如果语音合成系统初始化成功,则创建一个TTSConnectStruct对象,并对其进行初始化,设置结构体的各个成员的值。TTSConnectStruct结构体的定义如下所示:
其中,结构体成员包括结构体版本号、连接TTS服务时的用户名、连接TTS服务时的公司名、连接TTS服务时的序列号等。
2)连接语音合成服务器。对TTSConnectStruct对象初始化后,利用TTSConnect()函数建立到语音合成服务器的连接,成功时返回连接到TTS服务的服务实例句柄m_hTTSIn-stance。利用以下两个语句将语音识别的音库设置为女声发音,停顿风格设置为一气呵成。
TTSSetSynthParam(m_hTTSInstance,TTS_PARAM_AVAILABLEVID,1);
TTSSetSynthParam(m_hTTSInstance,TTS_PARAM_STALL_STYLE,TTS_SSL_VER-BOSE);(www.daowen.com)
3)开始语音合成。机器人平台中,采用消息机制来发送语音合成请求。当产生语音合成请求后,调用BeginSynth()函数对需要合成的语音文本进行合成。在BeginSynth()函数中,分别定义TTSData和TTSCallBacks结构体来表示合成过程中的输入/输出信息和合成过程的回调函数与合成事件的回调函数。其中TTSCallBacks结构体的定义如下所示:
其中,结构体成员nNumCallbacks说明每次TTS服务(客户连接)中使用的回调函数个数,在本节中,它的取值为1;结构体成员pfnTTSProcessCB是合成过程控制的回调函数指针;结构体成员pfnTTSEventCB是合成过程中一些事件的回调函数,一般情况下,不用设置该函数。通过下面这条语句定义了合成过程控制的回调函数:
m_TtsCB.pfnTTSProcessCB=SynthProcessProc;
4)利用TTSSynthTextEx()异步合成函数,把this指针作为用户数据传递到合成服务实例句柄。
5)合成过程中,每个分句合成完毕时调用合成处理过程的回调函数,在回调函数中,PlaySound()函数播放合成语音。回调函数如下所示:
TTSRETVAL SynthProcessProc(HTTSINSTANCE m_hTTSInstance,PTTSData pTTSData,TTSINT32 lParam,PTTSVOID pUserData)
6)合成结束,释放资源。当TTSData->dwOutFlags等于TTS_FLAG_DATA_END时,表示语音合成结束。如果不需要再合成文本,需要释放语音合成占用的资源。TTSClean(m hTTSInstance)语句清除合成缓冲区,把当前服务的状态设置成初始状态;TTSDisconnect(m_hTTSInstance)语句断开与语音合成系统建立的连接;TTSUninitialize()语句实现全局逆初始化语音合成系统,从系统内存中移出语音合成系统。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。