![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2PnVGcq5yaysGZxBDM3N2Yvw1N3EDMyMjMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.jpeg)
TTS
前景提要:線上的實時合成TTS技術,巴拉巴拉... 此處省略3千字
市場的TTS平台:訊飛語音,百度智能語音開放平台,阿裡雲,騰訊雲,思必馳,捷通華聲(靈雲)等。
TTS的合成簡單來說就三大步:
1️⃣建立應用
2️⃣發起請求
3️⃣解析音頻資料,合成音頻檔案
咱們廢話不說一個一個來:
一、訊飛,音頻屆的老大哥
支援多種語言開發,選擇适合自己的,我這裡選的是WebAPI:
多種語言開發
01、建立應用
建立應用
說明:
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'</ResponseInfo>') + 15:]
# 寫入檔案生成音頻
save_wav(bytes(ret), "aasdasd.mp3")
複制
沒有python示例代碼,傳回參數比較變态,解析出音頻耗了我大量時間(因為我技術不佳)
使用過程中:百度無人回複,沒給報價,思必馳沒找到任何公司人員
各平台均有使用,每天限次數,可以開發試聽一下,
效果比較個人感覺:
标貝 > 訊飛 > 阿裡 > 百度 > 思必馳 > 靈雲