她就像流星一样划过我的天空,绚即的美过后就剩下孤寂深邃的黑。我决定用Python来充实自己!
题记:来深圳也有两年了,和同事一起,他们兴奋地讲着粤语,而我却听不懂。我决定学习粤语,苦于资料受限。用Python开发语音软件,实现想学习什么词或语句就可以立即语音合成。了解了讯飞语音和百度语音之后,最终选择了讯飞语音。讯飞语音API支持主流操作系统和移动平台,拥有丰富的语音资源,支持多种方言和不同的美女帅哥的语音。
采用Python的方便和QT的强大界面,她俩成了我最佳选择,而且跨平台,跨平台!
软件一览
实现思路
结合我的需要,准备好自己想要听的TXT文本,普通话和粤语一句一句朗读,合成WAV文件。然后空闲时间或上班路途多听一听。
1、首先在讯飞语音开发者平台注册应用并下载对应平台的SDK,这里我只需要TTS语音合成功能。
2、了解SDK中Demo中的tts_sample。
实现一次完整的text转语音,需要实现登陆、开始传输会话,上传文本,接收数据并保存,结束会话,退出登陆。注意: 并不是每一次都要登陆,只需要一次登陆之后,之后就不需要登陆。
OK,So easy!
3、Python封装C语言DLL接口。
在开始设计之时,主要有3种方案:
- 采用Cython来实现与C语言的通信,需要安装Cython,太复杂了。NO!
- 采用独立的exe程序,增加通信难度,软件更大。NO!
- Python原生ctypes支持,简单高效的胶水功能。Yes!
采用方法3,只需原生Python模块,只需要讯飞的语音dll,就实现接口。
TTSSample类实现
让我们看一个讯飞语音DLL接口的函数声明。
/**
* @fn QTTSSessionBegin
* @brief Begin a TTS Session
*
* Create a tts session to synthesize data.
*
* @return const char* - Return the new session id in success, otherwise return NULL, error code.
* @param const char* params - [in] parameters when the session created.
* @param int* errorCode - [out] error code if failed, 0 to success.
* @see
*/
const char* MSPAPI QTTSSessionBegin(const char* params, int* errorCode);
typedef const char* (MSPAPI *Proc_QTTSSessionBegin)(const char* params, int* errorCode);
#ifdef MSP_WCHAR_SUPPORT
const wchar_t* MSPAPI QTTSSessionBeginW(const wchar_t* params, int* errorCode);
typedef const wchar_t* (MSPAPI *Proc_QTTSSessionBeginW)(const wchar_t* params, int* errorCode);
#endif
很好,如何用Python表示 char*和int* 呢?
def get_c_char_p(src_text):
if src_text is None:
c_text = ctypes.POINTER(ctypes.c_char)()
elif isinstance(src_text, str):
c_text = ctypes.c_char_p(src_text.encode('utf-8'))
else:
c_text = src_text
return c_text
其中mscdllobj 就是加载DLL对象,DLL文件需要放在Python代码同级目录,加载代码如下:
def load_dll_msc(dllpath):
obj = ctypes.windll.LoadLibrary(dllpath)
return obj
_QTTSSessionBegin = self.mscdllobj.QTTSSessionBegin
_QTTSSessionBegin.argtypes = (ctypes.c_char_p, ctypes.POINTER(ctypes.c_int))
_QTTSSessionBegin.restype = ctypes.c_char_p
c_params = get_c_char_p(params)
c_errorCode = ctypes.c_int()
sessionID = _QTTSSessionBegin(c_params, c_errorCode)
通过代码不难看出,我们需要声明函数的参数类型argtypes 和返回值类型restype 。C语言的char* 对应ctypes的ctypes.c_char_p,int* 对应ctypes的ctypes.POINTER(ctypes.c_int),int 对应ctypes的ctypes.c_int,其它的C语言参数类型对应ctypes类型请查看ctypes帮助文档。
封装一个接口就是如此简单
文本转语音
text_to_speech语音转文本,实现过程很简单,直接看代码就明白了。
加好友一起学习
此文章仅仅实现文本转语音部分,下篇文章将会介绍QyQt5的实现,以及其中编程技巧,感谢大家支持。如果你也是Python爱好者,扫一扫加我微信把,我们一起学习优雅的Python吧,学习机器学习,学习大数据处理技术。