资讯专栏INFORMATION COLUMN

在Python中使用科大讯飞Web API进行语音合成

Eminjannn / 1788人阅读

摘要:所以这次总结一下在中使用讯飞进行语音合成的过程。最后需要将配置参数编码为字符串字典类型明文字符串编码字符串,具体实现可以参考代码。返回值的具体说明请参考返回值语音合成。

前几日讯飞开放平台推出了WebAPI接口,恰好最近需要实现一个文字转语音的功能,于是就尝试着用了起来。但不知什么原因,官方文档的调用示例一直报错,最后自己照着示例的思路用python3重写了一遍。所以这次总结一下在Python中使用讯飞Web API进行语音合成的过程。

注册讯飞开放平台

首先注册讯飞开放平台:http://passport.xfyun.cn/regi...

注册完成后进入控制台,在控制台创建一个新应用 ,填写一些基本信息,注意 应用平台 选择 WebAPI

创建完成后,记录下 APPIDAPIKey ,将在程序中用到。

另外,请在 IP白名单 中添加自己的外网IP,可以在http://www.ip138.com/ 查看。(一般来说外网IP会常常发生变化,请注意)

在Python3中使用讯飞Web API

先上代码,后面进行必要的说明:

可能提示缺库:pip3 install requests

* 使用python3执行

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"))

下面按照代码顺序进行各部分的说明。

APIKey等参数

在代码开头填好各项参数,方面代码中使用。

API_KEY和APP_ID请替换为上一步创建应用后得到的内容。请不要删除双引号

OUTPUT_FILE是最终输出音频的保存路径,根据自己的情况替换。

TEXT是将要输出为语音的文本。

音频配置参数

Param 是字典格式的音频配置参数,其中 "aue" 可选 raw (生成wav)或 lame (生成mp3),如果修改成raw请记得同时修改输出文件的扩展名。

最后需要将配置参数编码为Base64字符串:字典类型→明文字符串→utf8编码→Base64(bytes)→Base64字符串,具体实现可以参考代码。

音频配置参数的详细说明可以参考请求参数 | 语音合成 。

HTTP请求头部

根据 授权认证 | 科大讯飞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字符串。

返回值的具体说明请参考 返回值 | 语音合成 。

运行结果

使用几次后,感觉合成语音的断句做得不是很优秀,但响应速度很快,还是比较满意的。

output.mp3

小结

最近使用了几种Web API,对这类API的使用方法也算是有些经验了。最后,现在语音识别、图灵机器人、语音合成都试着做了一遍,下一篇博客将把他们组合起来,实现一个简单的语音助手。

感谢你阅读文章!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44660.html

相关文章

  • 科大讯飞语音识别和语音播放dome

    摘要:最后,现在时间是年月日到目前为止科大讯飞的不支持客户端和服务端分开的情况,也就是说,语音合成是在服务端的话筒的播放,语音识别需要服务端的麦克风录音,,对于没有任何卵用。 首先登陆科大讯飞开发者平台,注册账号,(走你->http://www.xfyun.cn/)可以根据功能(语音识别,语音播放等),平台(java,window等),来创建属于自己的应用。应用创建成功后对有一个对应的app...

    KitorinZero 评论0 收藏0
  • Python用ctypes调用动态库的方式使用科大讯飞语音识别

    摘要:科大讯飞的语音识别客户端提供了下的语言,却没有的。有了,我们就可以很轻松的用来使用科大讯飞的语音识别了。通过函数加载动态库在里面调用函数时主要是注意参数的类型。 ctypes 是 Python 的一个模块,它提供了C语言相关的数据类型,可以方便的调用C语言编写的DLL(Windows 动态链接库)和so(Linux动态链接库)。科大讯飞的语音识别客户端SDK提供了Linux下的C语言S...

    andycall 评论0 收藏0
  • 微信小程序--------语音识别(前端自己也能玩)

    摘要:一背景作为一名前端同学有时候感觉挺可怜的,复杂的操作都依赖后端同学在服务器端完成。 一、背景 作为一名前端同学有时候感觉挺可怜的,复杂的操作都依赖后端同学在服务器端完成。那么,有一天我们自己想玩一个新技术或者后端同学不搭理我们,怎么办?绝望中..... 二、小程序语音识别 接到这个需求,我们明确两个问题: 小程序录音支持什么格式 由小程序文档可知:只支持 mp3格式和 aac格式微信...

    omgdog 评论0 收藏0
  • 小程序实现语音识别到底要填多少坑?

    摘要:前不久写了个工具型微信小程序周边,里面用到了语音识别技术。当然如果你要兼容低端微信用户需要使用做兼容处理。如果发现不当之处欢迎微信交流。想看实际案例的可以微信扫码关于安装关于安装关于安装 前不久写了个工具型微信小程序(Find周边),里面用到了语音识别技术。现将实现细节整理如下: 接口预览 通过阅读了解科大讯飞接口文档、小程序接口开发文档以及对后端ThinkPhp框架的学习,我整理...

    Benedict Evans 评论0 收藏0
  • 小程序实现语音识别到底要填多少坑?

    摘要:前不久写了个工具型微信小程序周边,里面用到了语音识别技术。当然如果你要兼容低端微信用户需要使用做兼容处理。如果发现不当之处欢迎微信交流。想看实际案例的可以微信扫码关于安装关于安装关于安装 前不久写了个工具型微信小程序(Find周边),里面用到了语音识别技术。现将实现细节整理如下: 接口预览 通过阅读了解科大讯飞接口文档、小程序接口开发文档以及对后端ThinkPhp框架的学习,我整理...

    gaara 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<