Python利用讯飞语音API实现方言学习之语音接口封装

就像流星一样划过我的天空,绚即的美过后就剩下孤寂深邃的黑。我决定用Python来充实自己!

题记:来深圳也有两年了,和同事一起,他们兴奋地讲着粤语,而我却听不懂。我决定学习粤语,苦于资料受限。用Python开发语音软件,实现想学习什么词或语句就可以立即语音合成。了解了讯飞语音和百度语音之后,最终选择了讯飞语音。讯飞语音API支持主流操作系统和移动平台,拥有丰富的语音资源,支持多种方言和不同的美女帅哥的语音。

采用Python的方便和QT的强大界面,她俩成了我最佳选择,而且跨平台,跨平台!

    • 软件一览
    • 实现思路
    • TTSSample类实现
    • 文本转语音
    • 加好友一起学习
    • 资源下载

软件一览

Python利用讯飞语音API实现方言学习之语音接口封装_第1张图片

实现思路

结合我的需要,准备好自己想要听的TXT文本,普通话和粤语一句一句朗读,合成WAV文件。然后空闲时间或上班路途多听一听。

1、首先在讯飞语音开发者平台注册应用并下载对应平台的SDK,这里我只需要TTS语音合成功能。
Python利用讯飞语音API实现方言学习之语音接口封装_第2张图片

2、了解SDK中Demo中的tts_sample。
Python利用讯飞语音API实现方言学习之语音接口封装_第3张图片

实现一次完整的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帮助文档。

封装一个接口就是如此简单
Python利用讯飞语音API实现方言学习之语音接口封装_第4张图片

文本转语音

text_to_speech语音转文本,实现过程很简单,直接看代码就明白了。

Python利用讯飞语音API实现方言学习之语音接口封装_第5张图片

加好友一起学习

此文章仅仅实现文本转语音部分,下篇文章将会介绍QyQt5的实现,以及其中编程技巧,感谢大家支持。如果你也是Python爱好者,扫一扫加我微信把,我们一起学习优雅的Python吧,学习机器学习,学习大数据处理技术。
Python利用讯飞语音API实现方言学习之语音接口封装_第6张图片

资源下载

TTSSample 讯飞TTS封装类

你可能感兴趣的:(python-语法,python-tts,qt,Python,语音合成,讯飞语音,方言学习)