前几日讯飞开放平台推出了WebAPI接口,刚好最近须要实现一个文字转语音的功能,因而就尝试着用了起来。但不知什么缘由,官方文档的调用示例一直报错,最后本身照着示例的思路用python3重写了一遍。因此此次总结一下在Python中使用讯飞Web API进行语音合成的过程。html
首先注册讯飞开放平台:http://passport.xfyun.cn/regi...python
注册完成后进入控制台,在控制台建立一个新应用 ,填写一些基本信息,注意 应用平台
选择 WebAPI
。json
建立完成后,记录下 APPID
和 APIKey
,将在程序中用到。api
另外,请在 IP白名单
中添加本身的外网IP,能够在http://www.ip138.com/ 查看。(通常来讲外网IP会经常发生变化,请注意)app
先上代码,后面进行必要的说明:post
可能提示缺库:pip3 install requests编码
* 使用python3执行url
import base64 import json import time import hashlib import requests # API请求地址、API KEY、APP ID等参数,提早填好备用 api_url = "http://api.xfyun.cn/v1/service/v1/tts" API_KEY = "替换成你的APIKEY" APP_ID = "替换成你的APPID" OUTPUT_FILE = "C://output.mp3" # 输出音频的保存路径,请根据本身的状况替换 TEXT = "苟利国家生死以,岂因祸福避趋之" # 构造输出音频配置参数 Param = { "auf": "audio/L16;rate=16000", #音频采样率 "aue": "lame", #音频编码,raw(生成wav)或lame(生成mp3) "voice_name": "xiaoyan", "speed": "50", #语速[0,100] "volume": "77", #音量[0,100] "pitch": "50", #音高[0,100] "engine_type": "aisound" #引擎类型。aisound(普通效果),intp65(中文),intp65_en(英文) } # 配置参数编码为base64字符串,过程:字典→明文字符串→utf8编码→base64(bytes)→base64字符串 Param_str = json.dumps(Param) #获得明文字符串 Param_utf8 = Param_str.encode('utf8') #获得utf8编码(bytes类型) Param_b64 = base64.b64encode(Param_utf8) #获得base64编码(bytes类型) Param_b64str = Param_b64.decode('utf8') #获得base64字符串 # 构造HTTP请求的头部 time_now = str(int(time.time())) checksum = (API_KEY + time_now + Param_b64str).encode('utf8') checksum_md5 = hashlib.md5(checksum).hexdigest() header = { "X-Appid": APP_ID, "X-CurTime": time_now, "X-Param": Param_b64str, "X-CheckSum": checksum_md5 } # 发送HTTP POST请求 def getBody(text): data = {'text':text} return data response = requests.post(api_url, data=getBody(TEXT), headers=header) # 读取结果 response_head = response.headers['Content-Type'] if(response_head == "audio/mpeg"): out_file = open(OUTPUT_FILE, 'wb') data = response.content # a 'bytes' object out_file.write(data) out_file.close() print('输出文件: ' + OUTPUT_FILE) else: print(response.read().decode('utf8'))
下面按照代码顺序进行各部分的说明。spa
在代码开头填好各项参数,方面代码中使用。rest
API_KEY和APP_ID请替换为上一步建立应用后获得的内容。请不要删除双引号。
OUTPUT_FILE是最终输出音频的保存路径,根据本身的状况替换。
TEXT是将要输出为语音的文本。
Param
是字典格式的音频配置参数,其中 "aue"
可选 raw
(生成wav)或 lame
(生成mp3),若是修改为raw请记得同时修改输出文件的扩展名。
最后须要将配置参数编码为Base64字符串:字典类型→明文字符串→utf8编码→Base64(bytes)→Base64字符串,具体实现能够参考代码。
音频配置参数的详细说明能够参考请求参数 | 语音合成 。
根据 受权认证 | 科大讯飞RESET_API开发指南 ,在调用全部业务接口时,都须要在HTTP请求头部中配置如下参数用于受权认证:
参数 | 格式 | 说明 |
---|---|---|
X-Appid | string | 讯飞开放平台注册申请应用的应用ID(appid) |
X-CurTime | string | 当前UTC时间戳,从1970年1月1日0点0 分0 秒开始到如今的秒数 |
X-Param | string | 音频配置参数JSON串经Base64编码后的字符串 |
X-CheckSum | string | 令牌,计算方法:MD5(apiKey + curTime + param)。三个值拼接的字符串,进行MD5哈希计算(32位小写)。 |
具体实现参考代码中字典 header
。
最后使用requests库发送HTTP POST请求,获得结果。根据响应的 header
能够判断是否合成成功。
若响应头部包含Content-type: audio/mpeg
,则响应Body为音频数据,可写入文件保存。
若合成出现错误,响应头部包含Content-type: text/plain
,响应Body为记载了错误类型的json字符串。
返回值的具体说明请参考 返回值 | 语音合成 。
使用几回后,感受合成语音的断句作得不是很优秀,但响应速度很快,仍是比较满意的。
最近使用了几种Web API,对这类API的使用方法也算是有些经验了。最后,如今语音识别、图灵机器人、语音合成都试着作了一遍,下一篇博客将把他们组合起来,实现一个简单的语音助手。
感谢你阅读文章!