TTS 前景提要:在線的實(shí)時(shí)合成TTS技術(shù),巴拉巴拉... 此處省略3千字 市場的TTS平臺(tái):訊飛語音,,百度智能語音開放平臺(tái),,阿里云,,騰訊云,,思必馳,捷通華聲(靈云)等,。 TTS的合成簡單來說就三大步: 1??創(chuàng)建應(yīng)用 2??發(fā)起請(qǐng)求 3??解析音頻數(shù)據(jù),,合成音頻文件 咱們廢話不說一個(gè)一個(gè)來: 一、訊飛,,音頻屆的老大哥 支持多種語言開發(fā),,選擇適合自己的,我這里選的是WebAPI: 多種語言開發(fā) 01,、創(chuàng)建應(yīng)用 創(chuàng)建應(yīng)用 說明: 1和3: 是在代碼中具體使用到的 鑒權(quán)碼 2:表示試用期間的每天使用次數(shù) 4:請(qǐng)求IP要添加白名單,,不添加白名單會(huì)請(qǐng)求失敗 5:可以選擇不同的發(fā)音人:(分初級(jí)和高級(jí),高級(jí)的另收費(fèi)) code: def tts_xunfei(text): # API請(qǐng)求地址,、API KEY,、APP ID等參數(shù),提前填好備用 api_url = "http://api./v1/service/v1/tts" API_KEY = "API_KEY" APP_ID = "APP_ID" OUTPUT_FILE = "訊飛.wav" # 輸出音頻的保存路徑,,請(qǐng)根據(jù)自己的情況替換 TEXT = text # 構(gòu)造輸出音頻配置參數(shù)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(英文) } # 配置參數(shù)編碼為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字符串 # 構(gòu)造HTTP請(qǐng)求的頭部 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} # 構(gòu)造HTTP請(qǐng)求Body body = {"text": TEXT} body_urlencode = urllib.parse.urlencode(body) body_utf8 = body_urlencode.encode('utf8') # 發(fā)送HTTP POST請(qǐng)求 req = urllib.request.Request(api_url, data=body_utf8, headers=header) response = urllib.request.urlopen(req) # 讀取結(jié)果 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白名單 二,、阿里平臺(tái) 用戶鑒權(quán)有有效期,,到期了要重新獲取token def tts_ali(text): # 獲取存儲(chǔ)的access_token, token_expireTime 兩個(gè)同時(shí)更新 token_expireTime = 1551513046 access_token = "9fcdcd2a190f49cb926dc5c2e24043c8" # 當(dāng)前的時(shí)間戳 和 token有效期對(duì)比,如果過期則重新生成 local_time = int(time.time()) if local_time >= token_expireTime: # 重新生成并存儲(chǔ) 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", # 音頻采樣率,,默認(rèn)是16000 "volume":"50", # 音量,,范圍是0~100,默認(rèn)50 "speech_rate":"45", # 語速,,范圍是-500~500,,默認(rèn)是0 "pitch_rate":"0", # 語調(diào),范圍是-500~500,,默認(rèn)是0 # 試聽發(fā)音人:https://ai.aliyun.com/nls/tts?spm=5176.8142029.388261.47.f8ed6d3e0NhBch # 發(fā)音人參數(shù):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的獲取我代碼里有完整的 另外開發(fā)測試期間,,開發(fā)文檔會(huì)提供簡易的不過期token,,方便測試 三,、百度 調(diào)用方式簡單,開發(fā)文檔里有說明 # 百度 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") 四,、騰訊 正在開發(fā)測試階段,,直接舍棄了 五、標(biāo)貝 # 標(biāo)貝 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.:8880/tts/synthtext" request_data = "2014-6-18 10:10:11" data = request_data + "應(yīng)用參數(shù)" md5 = hashlib.md5() md5.update(data.encode('utf-8')) # 注意轉(zhuǎn)碼 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) # 獲取音頻數(shù)據(jù) ret = r.content ret = ret[ret.find(b'</ResponseInfo>') + 15:] # 寫入文件生成音頻 save_wav(bytes(ret), "aasdasd.mp3") 沒有python示例代碼,返回參數(shù)比較變態(tài),,解析出音頻耗了我大量時(shí)間(因?yàn)槲壹夹g(shù)不佳) 使用過程中:百度無人回復(fù),,沒給報(bào)價(jià),思必馳沒找到任何公司人員 各平臺(tái)均有使用,,每天限次數(shù),,可以開發(fā)試聽一下, 效果比較個(gè)人感覺: 標(biāo)貝 > 訊飛 > 阿里 > 百度 > 思必馳 > 靈云 |
|