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

4 篇文章 0 订阅
2 篇文章 0 订阅

就像流星一样划过我的天空,绚即的美过后就剩下孤寂深邃的黑。我决定用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吧,学习机器学习,学习大数据处理技术。
这里写图片描述

资源下载

TTSSample 讯飞TTS封装类

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
语音合成API可以通过Python编程语言进行调用。以下是一个简单的示例代码: ```python import requests import base64 # API请求的URL url = "http://api.xfyun.cn/v1/service/v1/tts" # 应用ID和API Key app_id = "your_app_id" api_key = "your_api_key" # 请求头部信息 headers = { "Content-Type": "application/x-www-form-urlencoded; charset=utf-8", "X-Param": "ssml", "X-Appid": app_id, "X-CurTime": "当前时间戳", "X-CheckSum": "MD5(app_key + cur_time + 参数)" } # 请求参数 text = "需要合成的文本" body = { "text": text, "voice_name": "xiaoyan", "speed": "50", "volume": "50", "pitch": "50", "engine_type": "intp65", "auf": "audio/L16;rate=16000", "aue": "raw" } # 计算X-CheckSum的值 import hashlib import time cur_time = str(int(time.time())) param = base64.b64encode(str(body).encode('utf-8')) m = hashlib.md5() m.update((api_key + cur_time + str(param, 'utf-8')).encode('utf-8')) checksum = m.hexdigest() headers['X-CurTime'] = cur_time headers['X-CheckSum'] = checksum # 发送POST请求 r = requests.post(url, headers=headers, data=body) # 保存返回的语音文件 with open("output.wav", "wb") as f: f.write(r.content) ``` 在上面的代码中,需要替换`your_app_id`和`your_api_key`为自己的应用ID和API Key。`text`变量表示需要合成的文本内容。请求头部信息中的`X-Param`表示请求参数的格式,这里使用了SSML格式。请求参数中的`voice_name`表示朗读人物,`speed`表示语速,`volume`表示音量,`pitch`表示音高,`engine_type`表示语音合成引擎类型,`auf`表示返回的音频格式,`aue`表示音频编码格式。计算`X-CheckSum`值的代码使用了MD5算法,需要将API Key和当前时间戳拼接后进行加密。最后将API返回的语音文件保存在本地的`output.wav`文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值