摘要:所以這次總結(jié)一下在中使用訊飛進(jìn)行語(yǔ)音合成的過(guò)程。最后需要將配置參數(shù)編碼為字符串字典類(lèi)型明文字符串編碼字符串,具體實(shí)現(xiàn)可以參考代碼。返回值的具體說(shuō)明請(qǐng)參考返回值語(yǔ)音合成。
前幾日訊飛開(kāi)放平臺(tái)推出了WebAPI接口,恰好最近需要實(shí)現(xiàn)一個(gè)文字轉(zhuǎn)語(yǔ)音的功能,于是就嘗試著用了起來(lái)。但不知什么原因,官方文檔的調(diào)用示例一直報(bào)錯(cuò),最后自己照著示例的思路用python3重寫(xiě)了一遍。所以這次總結(jié)一下在Python中使用訊飛Web API進(jìn)行語(yǔ)音合成的過(guò)程。
注冊(cè)訊飛開(kāi)放平臺(tái)首先注冊(cè)訊飛開(kāi)放平臺(tái):http://passport.xfyun.cn/regi...
注冊(cè)完成后進(jìn)入控制臺(tái),在控制臺(tái)創(chuàng)建一個(gè)新應(yīng)用 ,填寫(xiě)一些基本信息,注意 應(yīng)用平臺(tái) 選擇 WebAPI 。
創(chuàng)建完成后,記錄下 APPID 和 APIKey ,將在程序中用到。
另外,請(qǐng)?jiān)?IP白名單 中添加自己的外網(wǎng)IP,可以在http://www.ip138.com/ 查看。(一般來(lái)說(shuō)外網(wǎng)IP會(huì)常常發(fā)生變化,請(qǐng)注意)
在Python3中使用訊飛Web API先上代碼,后面進(jìn)行必要的說(shuō)明:
可能提示缺庫(kù):pip3 install requests
* 使用python3執(zhí)行
import base64 import json import time import hashlib import requests # API請(qǐng)求地址、API KEY、APP ID等參數(shù),提前填好備用 api_url = "http://api.xfyun.cn/v1/service/v1/tts" API_KEY = "替換成你的APIKEY" APP_ID = "替換成你的APPID" OUTPUT_FILE = "C://output.mp3" # 輸出音頻的保存路徑,請(qǐng)根據(jù)自己的情況替換 TEXT = "茍利國(guó)家生死以,豈因禍福避趨之" # 構(gòu)造輸出音頻配置參數(shù) Param = { "auf": "audio/L16;rate=16000", #音頻采樣率 "aue": "lame", #音頻編碼,raw(生成wav)或lame(生成mp3) "voice_name": "xiaoyan", "speed": "50", #語(yǔ)速[0,100] "volume": "77", #音量[0,100] "pitch": "50", #音高[0,100] "engine_type": "aisound" #引擎類(lèi)型。aisound(普通效果),intp65(中文),intp65_en(英文) } # 配置參數(shù)編碼為base64字符串,過(guò)程:字典→明文字符串→utf8編碼→base64(bytes)→base64字符串 Param_str = json.dumps(Param) #得到明文字符串 Param_utf8 = Param_str.encode("utf8") #得到utf8編碼(bytes類(lèi)型) Param_b64 = base64.b64encode(Param_utf8) #得到base64編碼(bytes類(lèi)型) 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 } # 發(fā)送HTTP POST請(qǐng)求 def getBody(text): data = {"text":text} return data response = requests.post(api_url, data=getBody(TEXT), headers=header) # 讀取結(jié)果 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"))
下面按照代碼順序進(jìn)行各部分的說(shuō)明。
APIKey等參數(shù)在代碼開(kāi)頭填好各項(xiàng)參數(shù),方面代碼中使用。
API_KEY和APP_ID請(qǐng)?zhí)鎿Q為上一步創(chuàng)建應(yīng)用后得到的內(nèi)容。請(qǐng)不要?jiǎng)h除雙引號(hào)。
OUTPUT_FILE是最終輸出音頻的保存路徑,根據(jù)自己的情況替換。
TEXT是將要輸出為語(yǔ)音的文本。
音頻配置參數(shù)Param 是字典格式的音頻配置參數(shù),其中 "aue" 可選 raw (生成wav)或 lame (生成mp3),如果修改成raw請(qǐng)記得同時(shí)修改輸出文件的擴(kuò)展名。
最后需要將配置參數(shù)編碼為Base64字符串:字典類(lèi)型→明文字符串→utf8編碼→Base64(bytes)→Base64字符串,具體實(shí)現(xiàn)可以參考代碼。
音頻配置參數(shù)的詳細(xì)說(shuō)明可以參考請(qǐng)求參數(shù) | 語(yǔ)音合成 。
HTTP請(qǐng)求頭部根據(jù) 授權(quán)認(rèn)證 | 科大訊飛RESET_API開(kāi)發(fā)指南 ,在調(diào)用所有業(yè)務(wù)接口時(shí),都需要在HTTP請(qǐng)求頭部中配置以下參數(shù)用于授權(quán)認(rèn)證:
參數(shù) | 格式 | 說(shuō)明 |
---|---|---|
X-Appid | string | 訊飛開(kāi)放平臺(tái)注冊(cè)申請(qǐng)應(yīng)用的應(yīng)用ID(appid) |
X-CurTime | string | 當(dāng)前UTC時(shí)間戳,從1970年1月1日0點(diǎn)0 分0 秒開(kāi)始到現(xiàn)在的秒數(shù) |
X-Param | string | 音頻配置參數(shù)JSON串經(jīng)Base64編碼后的字符串 |
X-CheckSum | string | 令牌,計(jì)算方法:MD5(apiKey + curTime + param)。三個(gè)值拼接的字符串,進(jìn)行MD5哈希計(jì)算(32位小寫(xiě))。 |
具體實(shí)現(xiàn)參考代碼中字典 header 。
發(fā)送請(qǐng)求&讀取結(jié)果最后使用requests庫(kù)發(fā)送HTTP POST請(qǐng)求,得到結(jié)果。根據(jù)響應(yīng)的 header 可以判斷是否合成成功。
若響應(yīng)頭部包含Content-type: audio/mpeg,則響應(yīng)Body為音頻數(shù)據(jù),可寫(xiě)入文件保存。
若合成出現(xiàn)錯(cuò)誤,響應(yīng)頭部包含Content-type: text/plain,響應(yīng)Body為記載了錯(cuò)誤類(lèi)型的json字符串。
返回值的具體說(shuō)明請(qǐng)參考 返回值 | 語(yǔ)音合成 。
運(yùn)行結(jié)果使用幾次后,感覺(jué)合成語(yǔ)音的斷句做得不是很優(yōu)秀,但響應(yīng)速度很快,還是比較滿(mǎn)意的。
output.mp3
小結(jié)最近使用了幾種Web API,對(duì)這類(lèi)API的使用方法也算是有些經(jīng)驗(yàn)了。最后,現(xiàn)在語(yǔ)音識(shí)別、圖靈機(jī)器人、語(yǔ)音合成都試著做了一遍,下一篇博客將把他們組合起來(lái),實(shí)現(xiàn)一個(gè)簡(jiǎn)單的語(yǔ)音助手。
感謝你閱讀文章!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44660.html
摘要:最后,現(xiàn)在時(shí)間是年月日到目前為止科大訊飛的不支持客戶(hù)端和服務(wù)端分開(kāi)的情況,也就是說(shuō),語(yǔ)音合成是在服務(wù)端的話(huà)筒的播放,語(yǔ)音識(shí)別需要服務(wù)端的麥克風(fēng)錄音,,對(duì)于沒(méi)有任何卵用。 首先登陸科大訊飛開(kāi)發(fā)者平臺(tái),注冊(cè)賬號(hào),(走你->http://www.xfyun.cn/)可以根據(jù)功能(語(yǔ)音識(shí)別,語(yǔ)音播放等),平臺(tái)(java,window等),來(lái)創(chuàng)建屬于自己的應(yīng)用。應(yīng)用創(chuàng)建成功后對(duì)有一個(gè)對(duì)應(yīng)的app...
摘要:科大訊飛的語(yǔ)音識(shí)別客戶(hù)端提供了下的語(yǔ)言,卻沒(méi)有的。有了,我們就可以很輕松的用來(lái)使用科大訊飛的語(yǔ)音識(shí)別了。通過(guò)函數(shù)加載動(dòng)態(tài)庫(kù)在里面調(diào)用函數(shù)時(shí)主要是注意參數(shù)的類(lèi)型。 ctypes 是 Python 的一個(gè)模塊,它提供了C語(yǔ)言相關(guān)的數(shù)據(jù)類(lèi)型,可以方便的調(diào)用C語(yǔ)言編寫(xiě)的DLL(Windows 動(dòng)態(tài)鏈接庫(kù))和so(Linux動(dòng)態(tài)鏈接庫(kù))。科大訊飛的語(yǔ)音識(shí)別客戶(hù)端SDK提供了Linux下的C語(yǔ)言S...
摘要:一背景作為一名前端同學(xué)有時(shí)候感覺(jué)挺可憐的,復(fù)雜的操作都依賴(lài)后端同學(xué)在服務(wù)器端完成。 一、背景 作為一名前端同學(xué)有時(shí)候感覺(jué)挺可憐的,復(fù)雜的操作都依賴(lài)后端同學(xué)在服務(wù)器端完成。那么,有一天我們自己想玩一個(gè)新技術(shù)或者后端同學(xué)不搭理我們,怎么辦?絕望中..... 二、小程序語(yǔ)音識(shí)別 接到這個(gè)需求,我們明確兩個(gè)問(wèn)題: 小程序錄音支持什么格式 由小程序文檔可知:只支持 mp3格式和 aac格式微信...
摘要:前不久寫(xiě)了個(gè)工具型微信小程序周邊,里面用到了語(yǔ)音識(shí)別技術(shù)。當(dāng)然如果你要兼容低端微信用戶(hù)需要使用做兼容處理。如果發(fā)現(xiàn)不當(dāng)之處歡迎微信交流。想看實(shí)際案例的可以微信掃碼關(guān)于安裝關(guān)于安裝關(guān)于安裝 前不久寫(xiě)了個(gè)工具型微信小程序(Find周邊),里面用到了語(yǔ)音識(shí)別技術(shù)?,F(xiàn)將實(shí)現(xiàn)細(xì)節(jié)整理如下: 接口預(yù)覽 通過(guò)閱讀了解科大訊飛接口文檔、小程序接口開(kāi)發(fā)文檔以及對(duì)后端ThinkPhp框架的學(xué)習(xí),我整理...
摘要:前不久寫(xiě)了個(gè)工具型微信小程序周邊,里面用到了語(yǔ)音識(shí)別技術(shù)。當(dāng)然如果你要兼容低端微信用戶(hù)需要使用做兼容處理。如果發(fā)現(xiàn)不當(dāng)之處歡迎微信交流。想看實(shí)際案例的可以微信掃碼關(guān)于安裝關(guān)于安裝關(guān)于安裝 前不久寫(xiě)了個(gè)工具型微信小程序(Find周邊),里面用到了語(yǔ)音識(shí)別技術(shù)?,F(xiàn)將實(shí)現(xiàn)細(xì)節(jié)整理如下: 接口預(yù)覽 通過(guò)閱讀了解科大訊飛接口文檔、小程序接口開(kāi)發(fā)文檔以及對(duì)后端ThinkPhp框架的學(xué)習(xí),我整理...
閱讀 1422·2021-11-15 11:38
閱讀 3566·2021-11-09 09:47
閱讀 1969·2021-09-27 13:36
閱讀 3211·2021-09-22 15:17
閱讀 2547·2021-09-13 10:27
閱讀 2862·2019-08-30 15:44
閱讀 1158·2019-08-27 10:53
閱讀 2702·2019-08-26 14:00