在Python中使用科大訊飛Web API進行語音合成

前幾日訊飛開放平臺推出了WebAPI接口,剛好最近須要實現一個文字轉語音的功能,因而就嘗試着用了起來。但不知什麼緣由,官方文檔的調用示例一直報錯,最後本身照着示例的思路用python3重寫了一遍。因此此次總結一下在Python中使用訊飛Web API進行語音合成的過程。html

註冊訊飛開放平臺

首先註冊訊飛開放平臺:http://passport.xfyun.cn/regi...python

註冊完成後進入控制檯,在控制檯建立一個新應用 ,填寫一些基本信息,注意 應用平臺 選擇 WebAPIjson

建立完成後,記錄下 APPIDAPIKey ,將在程序中用到。api

另外,請在 IP白名單 中添加本身的外網IP,能夠在http://www.ip138.com/ 查看。(通常來講外網IP會經常發生變化,請注意)app

在Python3中使用訊飛Web API

先上代碼,後面進行必要的說明: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

APIKey等參數

在代碼開頭填好各項參數,方面代碼中使用。rest

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的使用方法也算是有些經驗了。最後,如今語音識別、圖靈機器人、語音合成都試着作了一遍,下一篇博客將把他們組合起來,實現一個簡單的語音助手。

感謝你閱讀文章!

相關文章
相關標籤/搜索