前幾日訊飛開放平臺推出了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的使用方法也算是有些經驗了。最後,如今語音識別、圖靈機器人、語音合成都試着作了一遍,下一篇博客將把他們組合起來,實現一個簡單的語音助手。
感謝你閱讀文章!