1. 语音合成平台介绍
语音合成是将人类语音用人工的方式所产生。若是将电脑系统用在语音合成上,则称为语音合成器,而语音合成器可以用软/硬件所实现。文字转语音(text-to-speech,TTS)系统则是将一般语言的文字转换为语音,其他的系统可以描绘语言符号的表示方式,就像音标转换至语音一样。 - Wikipedia
最近工作中需要基于 Python 开发实现一个实时语音播报系统,故借此机会了解了一下目前语音合成开放 API 的情况。
百度语音合成 REST API
首先采用的是百度的语音合成服务,Google 搜索“语音合成”,第一个结果是维基百科,第二个就是百度的语音合成服务(很奇怪为什么像科大讯飞、云知声这样的公司排名很靠后)。它基于 HTTP 请求的 REST API 接口,拿到 token
,只需要将需要合成的文本上传,合成服务便会返回一段可以播放的 MP3 文件,详细的请求方式及参数说明可以见百度语音合成开发文档。百度语音合成提供了四种发音人选择,不过,个人觉得,合成效果一般,听起来声音比较生硬,被人吐槽,故放弃。
注意:需要合成的文本,使用 utf-8 编码
1 | def get_voice(query_msg): |
阿里云语音合成 REST API
放弃了百度的服务后,转向阿里云提供的语音合成Restful API,它的合成方式与百度的一样,用户通过 API 上传需要合成的中文文本,云端合成成功之后,返回合成结果语音。官方文档提供了一个 Java 的例子,还好,有热心人已经将合成服务封装好了一个 Python 库:aliyun-voice 1.0.2 ,遗憾的是,目前这个库只能在 Python2 下安装运行,不过这也影响不大,新建一个 python2 的虚拟环境就好了。
通过 aliyun-voice 库认证阿里云很简单,先开通智能语音服务https://data.aliyun.com/product/nls,然后从 https://ak-console.aliyun.com/ 页面获取的 Access id 和 key。同样需要注意一点的是,用户必须上传 utf-8 编码的合成文本,否则会出现麻烦的编码错误,所以传入的字符串还需要经过 encode 一层操作。
阿里云认证
1 | from aliyun_voice.voice import Voice |
获取语音数据,并存储到指定目录 dist
1 | auth.save_voice(text, dist) |
奏是这么简单!下面看一个具体实现的代码例子
1 | def play_query_msg(): |
腾讯语音合成
腾讯语音合成服务需要审核,而且审核速度有点慢,5 天过去还没有申请成功,不知道合成效果咋样。
其他
其他的语音合成提供商还有讯飞在线语音合成开放平台、云知声在线语音合成开放平台,科大讯飞提供了许多种发音人选择,而且效果很不错,不过这两个服务目前都没有提供可以供直接调用的 REST API 接口,云知声提供了一个 C 语言的接口,没有找到用 Python 实现的案例。
2. Python 播放 MP3 文件
获得了语音文件后,如何在 Python 下播放又是一个问题,在实现播放语音文件的过程中踩了不少坑。在 Python 下实现的方法有很多种,有繁有简,可用的库有 pygame、pyglet 等等 ,不过这几个库我都一一尝试了,得到了两种真正能用或者比较稳定的实现方案。
pygame
pygame 是 Python 下一个开发游戏的库,用它来播放 MP3 文件很简单,三行代码就可以实现,算是最简单的的一个了(其他的库,要么调用很麻烦,远远不止三行,要么各种平台不兼容),如果没有太多语音播放需求如重复播放、延迟播放,可以采用此法。
1 | def play_voice(voice_file_path): |
不过在使用的过程中我发现了一个 bug,如果音频文件的采样率不高(我的是 16000)的话,播放语音时会出现失真的情况,原本的正常的男声会变得语速很快、音调很高。为了解决这个问题,我花了几个小时反复查阅了 pygame 的文档,尝试使用其他方法,然而发现并没有控制播放速率或者其他控制声音质量的选项。
系统自带播放器
pygame 出现了声音失真怎么办?又不想调用其他库的时候需要十几行代码才能实现?其实还有解救的办法。经过少校指点,在 Mac 和 Linux 下是可以通过 subprocess(Python 下自带 subprocess)直接调用系统播放器的,经过测试,声音没有出现失真现象。
1 | def play_voice_by(voice_file_path, query_msg): |
推荐阅读
- https://stackoverflow.com/questions/3498313/how-to-trigger-from-python-playing-of-a-wav-or-mp3-audio-file-on-a-mac
- https://stackoverflow.com/questions/307305/play-a-sound-with-python
- https://www.whatled.com/post-1007.html
- 百度语音合成 REST API 文档
- 阿里云语音合成文档
- 讯飞在线语音合成开放平台
- 云知声语音合成开放平台
继续阅读本站其他精彩文章