1. 语音合成平台介绍语音合成是将人类语音用人工的方式所产生。若是将电脑系统用在语音合成上,则称为语音合成器,而语音合成器可以用软/硬件所实现。文字转语音(text-to-speech,TTS)系统则是将一般语言的文字转换为语音,其他的系统可以描绘语言符号的表示方式,就像音标转换至语音一样。 - Wikipedia

最近工作中需要基于 Python 开发实现一个实时语音播报系统,故借此机会了解了一下目前语音合成开放 API 的情况。Photo by Jaromír Kavan on Unsplash

百度语音合成 REST API

首先采用的是百度的语音合成服务,Google 搜索“语音合成”,第一个结果是维基百科,第二个就是百度的语音合成服务(很奇怪为什么像科大讯飞、云知声这样的公司排名很靠后)。它基于 HTTP 请求的 REST API 接口,拿到 token,只需要将需要合成的文本上传,合成服务便会返回一段可以播放的 MP3 文件,详细的请求方式及参数说明可以见百度语音合成开发文档。百度语音合成提供了四种发音人选择,不过,个人觉得,合成效果一般,听起来声音比较生硬,被人吐槽,故放弃。百度语音合成上传参数要求注意:需要合成的文本,使用 utf-8 编码

def get_voice(query_msg):

'''从百度语音合成 API 生成语音文件注意 tex 参数需要按照 url 参数标准使用 urlencode utf-8 编码'''

token = config['authority']['baidu_token']

cuid = config['authority']['cuid']

audio_file_path = config['file_path']['audio_path']

url = 'http://tsn.baidu.com/text2audio?' # 请求地址

data = {

'lan': 'zh',

'cuid': cuid,

'tok': token,

'tex': query_msg,

'vol': 10, # 音量

'ctp': 1,

'per': 3, # 发音人选择:0为普通女声,1为普通男生,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女声

'spd': 2

}

params = urllib.parse.urlencode(data, encoding='utf-8')

voice_data = urllib.request.urlopen(url + params).read()

voice_file = open(audio_file_path, 'wb+')

voice_file.write(voice_data)

voice_file.close()

阿里云语音合成 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 一层操作。

阿里云认证

from aliyun_voice.voice import Voice

auth = Voice(ALIYUNACCESSID, ALIYUNACCESSKEY)

获取语音数据,并存储到指定目录 dist

auth.save_voice(text, dist)

奏是这么简单!下面看一个具体实现的代码例子

def play_query_msg():

'''播放查询的问题文本Args:receive_data: 用户查询后返回的数据,数据类型为列表,用户查询问题在 content 中的 msg 字段query_msg: 用户查询的问题ALIYUNACCESSID: 阿里云 API 密钥 id(请使用https://ak-console.aliyun.com/ 页面获取的Access 信息)ALIYUNACCESSKEY: 阿里云 API 密钥 key'''

ws = create_connection("")

while True:

time.sleep(0.5)

try:

receive_items = json.loads(ws.recv())

for item in receive_items:

if item['action_type'] == 'query':

query_msg = json.loads(item['content'])['msg']

ALIYUNACCESSID = config.get('authority', 'ALIYUNACCESSID')

ALIYUNACCESSKEY = config.get('authority', 'ALIYUNACCESSKEY')

voice_file_path = config.get('file_path', 'audio_path')

auth = Voice(ALIYUNACCESSID, ALIYUNACCESSKEY)

auth.save_voice(query_msg.encode('utf-8'), voice_file_path) # 必须是 UTF-8 编码的合成文本

except WebSocketConnectionClosedException:

ws = create_websocket_connection()

continue

腾讯语音合成

腾讯语音合成服务需要审核,而且审核速度有点慢,5 天过去还没有申请成功,不知道合成效果咋样。申请开通腾讯语音合成服务

其他

其他的语音合成提供商还有讯飞在线语音合成开放平台、云知声在线语音合成开放平台,科大讯飞提供了许多种发音人选择,而且效果很不错,不过这两个服务目前都没有提供可以供直接调用的 REST API 接口,云知声提供了一个 C 语言的接口,没有找到用 Python 实现的案例。Photo by Nathan Anderson on Unsplash

2. Python 播放 MP3 文件

获得了语音文件后,如何在 Python 下播放又是一个问题,在实现播放语音文件的过程中踩了不少坑。在 Python 下实现的方法有很多种,有繁有简,可用的库有 pygame、pyglet 等等 ,不过这几个库我都一一尝试了,得到了两种真正能用或者比较稳定的实现方案。

pygame

pygame 是 Python 下一个开发游戏的库,用它来播放 MP3 文件很简单,三行代码就可以实现,算是最简单的的一个了(其他的库,要么调用很麻烦,远远不止三行,要么各种平台不兼容),如果没有太多语音播放需求如重复播放、延迟播放,可以采用此法。

def play_voice(voice_file_path):

'''用 pygame 库播放语音文件'''

pygame.mixer.init()

track = pygame.mixer.music.load(voice_file_path)

pygame.mixer.music.play()

不过在使用的过程中我发现了一个 bug,如果音频文件的采样率不高(我的是 16000)的话,播放语音时会出现失真的情况,原本的正常的男声会变得语速很快、音调很高。为了解决这个问题,我花了几个小时反复查阅了 pygame 的文档,尝试使用其他方法,然而发现并没有控制播放速率或者其他控制声音质量的选项。

系统自带播放器

pygame 出现了声音失真怎么办?又不想调用其他库的时候需要十几行代码才能实现?其实还有解救的办法。经过少校指点,在 Mac 和 Linux 下是可以通过 subprocess(Python 下自带 subprocess)直接调用系统播放器的,经过测试,声音没有出现失真现象。

def play_voice_by(voice_file_path, query_msg):

'''- 调用 mac 系统播放器 afplay 播放 MP3 文件- linux 下安装 sudo apt install mplayer,调用方法为:subprocess(['mplayer', voice_file_path])'''

subprocess.call(['afplay', voice_file_path])

推荐阅读继续阅读本站其他精彩文章

python语音合成需要的库_语音合成的几种方案实现与分析相关推荐

  1. python中nlp的库_用于nlp的python中的网站数据清理

    python中nlp的库 The most important step of any data-driven project is obtaining quality data. Without t ...

  2. python中nlp的库_单词袋简介以及如何在Python for NLP中对其进行编码

    python中nlp的库 by Praveen Dubey 通过Praveen Dubey 单词词汇入门以及如何在Python中为NLP 编写代码的简介 (An introduction to Bag ...

  3. python需要安装的库_使用python学习【机器学习】需要安装的库~

    ---------------------------------------------------------------------------------------------------- ...

  4. pillow是python的图像处理标准库_详解Python图像处理库Pillow常用使用方法

    pil(python image library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了. 其官方主页为:pil. pil ...

  5. python动态交互式图表库_五个创建交互式图表的Python库

    数据可视化专家Andy Kirk说过,数据可视化分为两类:探索性可视化图表和解释性可视化图表.解释性可视化图表的目标是进行描述--它们是根据对事物表面的关键线索而被仔细构造出来的. 另一方面,探索性可 ...

  6. 基于python的车辆轨迹研究_基于车牌信息的车辆出行信息分析系统设计——以桂林市为例...

    1. 设计背景与目的 交通调查的主要内容包括出行起讫点调查(OD调查).交通量与交通设施调查.道路通行能力调查等,而进行交通调查需要耗费大量的人力物力,调查过程中各种不确定因素将直接影响调查结果的可信 ...

  7. python解析html的库_用python解析html

    python中,有三个库可以解析html文本,HTMLParser,sgmllib,htmllib.他们的实现方法不通,但功能差不多.这三个库中 提供解析html的类都是基类,本身并不做具体的工作.他 ...

  8. python判断题题库_《Python程序设计》判断题1-240题

    1.Python是一种跨平台.开源.免费的高级动态编程语言.(对) 2.Python 3.x完全兼容Python 2.x.(错) 3.Python 3.x和Python 2.x唯一的区别就是:prin ...

  9. python中的urllib库_七、urllib库(一)

    python2中,有urllib和urllib2两个库,在python3中统一为urllib库 它是python内置的HTTP请求库,包含了4个模块: request:最基本的HTTP请求模块,用来模 ...

最新文章

  1. ASP.NET中在线用户统计
  2. 破局!Alan Yuille:深度学习关键在于克服组合爆炸
  3. 使用Junit4时问题
  4. 解决Linux安装 VMware tools 工具的方法
  5. android基础(基本框架的构成)
  6. vs linux 交叉编译,VS结合VisualGDB搭建OpenWrt交叉编译远程调试开发环境
  7. 网络订票当心三类陷阱 最好当场识别真伪
  8. 批量移动某目录下某类型的文件到指定的目录下
  9. P1460 健康的荷斯坦奶牛 Healthy Holsteins (简单的dfs)
  10. NodeJS+Express+Mysql+MongoDB之环境配置
  11. 当当网新用户注册界面——CSS代码
  12. JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码。
  13. npm WARN build `npm build` called with no arguments. Did you mean to `npm run-script build`
  14. python 命令行解析模块_Python解析命令行读取参数 -- argparse模块
  15. SpringBoot面试常问
  16. 阿里P5、P6是什么级别?加入超级实习生能拿到吗?
  17. python十二生肖_十二生肖入诗,妙趣横生,越读越有味道!
  18. vs2019无法启动程序 系统找不到指定文件
  19. 心理压力的测试软件,心理压力测量量表(WYB)
  20. 生命线检查计算机还是连接线,lifeline生命线泰勒到达山脚找到控制室 面对控制室的电脑电线要怎么做...

热门文章

  1. 简论智能物流系统的四大元素 -- 仓储, 物流, 交通, 驾驶
  2. 代码迁移_三种类型的代码迁移
  3. JDK 16 新特性,正式发布!程序员:追不上了...
  4. 已知圆上三点坐标求圆心和半径
  5. DIV 元素和 SPAN 元素的区别?
  6. c语言课程设计文本编辑器实验报告6,C课程设计简易文本编辑器.doc
  7. 修改DISCUZ支持又拍云缩略图
  8. tightvnc viewer 传文件_丢掉U盘,TinyPXESever网络启动WinPE,TightVNC远程控制(无人值守)装系统(无显示器也可测试)...
  9. Pytorch Lightning使用指南
  10. printf中用%d输出float或者double