python语音合成并播放_Python:TTS语音合成技术,市场各大平台对比以及实现

本文详细介绍了如何使用讯飞、阿里云、百度、腾讯、思必驰和捷通华声(灵云)的TTS技术进行音频合成。通过Python示例代码展示了各个平台的API调用步骤,并对各平台的音频效果和价格进行了比较。在实际使用中,作者认为标贝的音频效果最佳,其次是讯飞、阿里、百度、思必驰和灵云。
摘要由CSDN通过智能技术生成

ii6RJf.jpg

前景提要:在线的实时合成TTS技术,巴拉巴拉… 此处省略3千字

市场的TTS平台:讯飞科技,百度智能语音开放平台,阿里云,腾讯云,思必驰,捷通华声(灵云

TTS的合成简单来说就三大步:

1️⃣创建应用

2️⃣发起请求

3️⃣解析音频数据,合成音频文件

咱们废话不说一个一个来:

一、讯飞,音频届的老大哥

支持多种语言开发,选择适合自己的,我这里选的是WebAPI:

6jQrya.png

01、创建应用

i6JbQz.png

说明:

1和3: 是在代码中具体使用到的 鉴权码

2:表示试用期间的每天使用次数

4:请求IP要添加白名单,不添加白名单会请求失败

5:可以选择不同的发音人:(分初级和高级,高级的另收费)

code:

def tts_xunfei(text):

# API请求地址、API KEY、APP ID等参数,提前填好备用

api_url = "http://api.xfyun.cn/v1/service/v1/tts"

API_KEY = "API_KEY"

APP_ID = "APP_ID"

OUTPUT_FILE = "讯飞.wav" # 输出音频的保存路径,请根据自己的情况替换

TEXT = text

# 构造输出音频配置参数custom_skill.py3

Param = {"auf": "audio/L16;rate=16000", # 音频采样率

"aue": "raw", # 音频编码,raw(生成wav)或lame(生成mp3)

"voice_name": "x_xiaoyuan", "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请求Body

body = {"text": TEXT}

body_urlencode = urllib.parse.urlencode(body)

body_utf8 = body_urlencode.encode('utf8')

# 发送HTTP POST请求

req = urllib.request.Request(api_url, data=body_utf8, headers=header)

response = urllib.request.urlopen(req)

# 读取结果

response_head = response.headers['Content-Type']

if (response_head == "audio/mpeg"):

data = response.read() # a 'bytes' object

save_wav(data, OUTPUT_FILE)

else:

print(response.read().decode('utf8'))

注意:将上面的APP_ID和API_KEY更换为自己的即可,另外记得添加IP白名单

二、阿里平台

用户鉴权有有效期,到期了要重新获取token

def tts_ali(text):

# 获取存储的access_token, token_expireTime 两个同时更新

token_expireTime = 1551513046

access_token = "9fcdcd2a190f49cb926dc5c2e24043c8"

# 当前的时间戳 和 token有效期对比,如果过期则重新生成

local_time = int(time.time())

if local_time >= token_expireTime:

# 重新生成并存储

access_token, token_expireTime = get_token()

headers = {

"Content-Type": "application/json;charset=UTF-8",

"X-NLS-Token":access_token,

}

data_info = {

"appkey":"5dz4RRvAJufMAB6g",

"text":text,

"token":access_token,

"format":"wav",

"voice":"yina",

"sample_rate":"16000", # 音频采样率,默认是16000

"volume":"50", # 音量,范围是0~100,默认50

"speech_rate":"45", # 语速,范围是-500~500,默认是0

"pitch_rate":"0", # 语调,范围是-500~500,默认是0

# 试听发音人:https://ai.aliyun.com/nls/tts?spm=5176.8142029.388261.47.f8ed6d3e0NhBch

# 发音人参数:https://help.aliyun.com/document_detail/84435.html?spm=a2c4g.11186623.6.581.69a853d5E4c3vM

# 推荐:小梦 思悦 小美 伊娜

}

data = json.dumps(data_info)

ret = requests.post(ALI_URL, headers=headers, data=data, timeout=5)

save_wav(ret.content, "ali2.wav")

提醒:

token的获取我代码里有完整的

另外开发测试期间,开发文档会提供简易的不过期token,方便测试

三、百度

调用方式简单,开发文档里有说明

# 百度

def tts_baidu(text):

baidu_url = "http://tsn.baidu.com/text2audio?lan=zh&ctp=1&cuid=abcdxxx&tok=24.ed4dfdxxxxxff0af259fc.2592000.1553756573.282335-15631432&tex={}&vol=9&per=0&spd=5&pit=5&aue=6".format(text)

ret = requests.get(baidu_url, timeout=5)

save_wav(ret.content, "siyue.wav")

四、腾讯

正在开发测试阶段,直接舍弃了

五、标贝

# 标贝

def tts_biaobei(text):

"""获取tts语音"""

tts_url = "http://1.203.80.138:8001/tts?user_id=xxx&domain=1&volume=0&language=zh&speed=5&audiotype=5&text=" + text

f = requests.get(tts_url)

voice = f.content

return voice

六、思必驰

# 思必驰

def tts_dui(text):

data_dict = {

"context": {"productId": "productId"},

"request": {"requestId": "tryRequestId",

"audio": {"audioType": "WAV", "sampleRate": 16000, "channel": 1, "sampleBytes": 2},

"tts": {

"text": text,

"textType": "text",

"voiceId": "lili1f_shangwu"}}}

data = json.dumps(data_dict)

headers = {

'content-type': 'application/json',

'User-Agent': 'Mozilla/5.0 '}

r = requests.post(DUI_URL, data=data, headers=headers, timeout=5)

print(r)

# 写入文件生成音频

save_wav(r.content, "DUI.wav")

七、捷通华声(灵云)

# 灵云

def tts_lingyun(text):

linghyun_URL = "http://api.hcicloud.com:8880/tts/synthtext"

request_data = "2014-6-18 10:10:11"

data = request_data + "应用参数"

md5 = hashlib.md5()

md5.update(data.encode('utf-8')) # 注意转码

res = md5.hexdigest()

headers = {"x-app-key": "c95d54cf", "x-sdk-version": "3.9", "x-request-date": request_data,

"x-task-config": "capkey=tts.cloud.xiaokun,audioformat=mp3,speed=2,volume=9.99", "x-session-key": res,

"x-udid": "101:1234567890"}

r = requests.post(linghyun_URL, headers=headers,

data=text.encode('utf-8'),

timeout=5)

# 获取音频数据

ret = r.content

ret = ret[ret.find(b'') + 15:]

# 写入文件生成音频

save_wav(bytes(ret), "aasdasd.mp3")

没有python示例代码,返回参数比较变态,解析出音频耗了我大量时间(因为我技术不佳)

使用过程中:百度无人回复,没给报价,思必驰没找到任何公司人员

各平台均有使用,每天限次数,可以开发试听一下,

效果比较个人感觉:

标贝 > 讯飞 > 阿里 > 百度 > 思必驰 > 灵云

音频效果,见公众号文章:回复 TTS 即可

价格比较:

讯飞:

nMrYRn.png

Iz63A3.png

百度:暂时免费 超高量并发另行收费

标贝:16万/年

灵云:2万次/100

Git代码: 公众号后台回复 python_tts 或 tts

aURRjy.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值