文章目錄
- 訊飛ASR轉寫API完整指南
- 1. 引言
- 2. 訊飛ASR API介紹
- 3. API參數說明
- 3.1 認證參數
- 3.2 上傳參數
- 3.3 查詢結果參數
- 3.4 orderResult 字段
- 3.5 Lattice 字段
- 3.6 json_1best 字段
- 3.7 st 字段
- 4. Python代碼實現
- 4.1 生成簽名
- 4.2 上傳音頻文件
- 4.3 獲取轉寫結果
- 4.4 解析轉寫結果
- 5. 請求與返回示例
- 5.1 成功返回示例
- 5.4 異步回調
- 1. 轉寫結束異步回調狀態
- 6. 文檔地址
- 7. 結論
訊飛ASR轉寫API完整指南
1. 引言
在這篇博客中,我們將詳細解析如何使用訊飛ASR(自動語音識別)API進行音頻轉寫,包括上傳音頻、查詢轉寫結果及解析返回數據。本文將涵蓋API的參數說明,并提供完整的Python代碼,確保代碼能夠順利執行。
2. 訊飛ASR API介紹
訊飛ASR API提供了一整套音頻轉寫的解決方案,主要流程如下:
- 生成簽名 - 認證請求的合法性。
- 上傳音頻 - 通過URL方式或本地文件上傳音頻。
- 查詢結果 - 輪詢轉寫結果,等待識別完成。
- 解析結果 - 處理返回的JSON數據,提取文本和說話人信息。
3. API參數說明
3.1 認證參數
參數名 | 說明 |
---|---|
appId | 訊飛開發者平臺分配的應用ID |
secret_key | 用于生成簽名的密鑰 |
ts | 時間戳,單位為秒 |
signa | 認證簽名,由appId、ts和secret_key計算得出 |
3.2 上傳參數
參數名 | 說明 |
---|---|
fileName | 音頻文件名稱 |
fileSize | 文件大小(若使用URL方式可隨意填寫) |
duration | 音頻時長(單位秒,可隨機填寫) |
language | 語言(cn代表中文) |
audioMode | 上傳模式(urlLink 代表通過URL上傳) |
audioUrl | 音頻文件的URL(需要URL編碼) |
3.3 查詢結果參數
參數名 | 說明 |
---|---|
orderId | 訂單ID,用于查詢轉寫結果 |
resultType | 返回結果類型(transfer 表示最終轉寫文本) |
成功
{"code": "000000","descInfo": "success","content": {"orderId": "DKHJQ202209021522090215490FAAE7DD0008C","taskEstimateTime": 28000}
}
失敗
{"code": "26600","descInfo": "轉寫業務通用錯誤"
}
3.4 orderResult 字段
參數名 | 類型 | 說明 |
---|---|---|
lattice | List | 做順滑功能的識別結果 |
lattice2 | List | 未做順滑功能的識別結果,當開啟順滑和后語規整后 orderResult 才返回 lattice2 字段(需要開通權限) |
label | Object | 轉寫結果標簽信息,用于補充轉寫結果相關信息,標記轉寫結果角色和聲道的對應關系 |
3.5 Lattice 字段
參數名 | 類型 | 說明 |
---|---|---|
json_1best | String | 單個 VAD 的結果的 JSON 內容 |
3.6 json_1best 字段
參數名 | 類型 | 說明 |
---|---|---|
st | Object | 單個句子的結果對象 |
3.7 st 字段
參數名 | 類型 | 說明 |
---|---|---|
bg | String | 單個句子的開始時間,單位毫秒 |
ed | String | 單個句子的結束時間,單位毫秒 |
rl | String | 分離的角色編號,取值正整數,需開啟角色分離的功能才返回對應的分離角色編號 |
rt | List | 輸出詞語識別結果集合 |
4. Python代碼實現
4.1 生成簽名
def generate_signa(self):"""生成簽名:return: 簽名字符串"""appid = self.appidts = self.tsbase_string = appid + tsmd5 = hashlib.md5()md5.update(base_string.encode('utf-8'))base_string_md5 = md5.hexdigest()key = self.secret_key.encode('utf-8')message = base_string_md5.encode('utf-8')hmac_obj = hmac.new(key, message, hashlib.sha1)signa = base64.b64encode(hmac_obj.digest()).decode('utf-8')return signa
4.2 上傳音頻文件
1、文件上傳
#概述
首先調用文件上傳接口,上傳待轉寫音頻文件的基本信息(文件名、大小等)和相關的可配置參數。
調用成功,返回訂單ID(orderId
,用于查詢結果或者聯調排查問題時使用),是后續接口的必傳參數。
#請求示例
https://raasr.xfyun.cn/v2/api/upload?duration=200&signa=Je5YsBvPcsbB4qy8Qvzd367fiv0%3D&fileName=%E9%98%B3%E5%85%89%E6%80%BB%E5%9C%A8%E9%A3%8E%E9%9B%A8%E5%90%8E.speex-wb&fileSize=11895&sysDicts=uncivilizedLanguage&appId=3e79d91c&ts=1662101767
#URL
POST https: //raasr.xfyun.cn/v2/api/upload
#請求頭
Content-Type: application/json; charset=UTF-8,Chunked: false
#signa生成
def upload(self):"""上傳音頻文件:return: 上傳響應結果"""try:file_name = os.path.basename(urllib.parse.unquote(self.audio_url))param_dict = {"appId": self.appid,"signa": self.signa,"ts": self.ts,"fileName": file_name,"fileSize": "10000","duration": "200","language": "cn","audioMode": "urlLink","audioUrl": urllib.parse.quote(self.audio_url, safe='')}url = lfasr_host + api_upload + "?" + urllib.parse.urlencode(param_dict)response = requests.post(url, headers={"Content-Type": "application/json; charset=UTF-8"})result = json.loads(response.text)if str(result.get('code', '')) != '000000':return Nonereturn resultexcept Exception as e:return None
4.3 獲取轉寫結果
status == 4
def get_result(self):"""獲取轉寫結果:return: 轉寫結果"""uploadresp = self.upload()if not uploadresp:return Nonetry:orderId = uploadresp['content']['orderId']param_dict = {"appId": self.appid,"signa": self.signa,"ts": self.ts,"orderId": orderId,'roleType':1,'roleNum':2,"resultType": "transfer"}url = lfasr_host + api_get_result + "?" + urllib.parse.urlencode(param_dict)status = 3while status == 3:response = requests.post(url, headers={"Content-Type": "application/json; charset=UTF-8"})result = json.loads(response.text)if str(result.get('code', '')) != '000000':continuestatus = result['content']['orderInfo']['status']if status == 4:return resulttime.sleep(5)return Noneexcept Exception as e:return None
查詢結構返回數據
{"code": "000000","descInfo": "success","content": {"orderInfo": {"orderId": "DKHJQ2022090510220905100562536FEF00062","failType": 0,"status": 4,"originalDuration": 200,"realDuration": 1878},"orderResult": "{\"lattice\":[{\"json_1best\":\"{\\\"st\\\":{\\\"sc\\\":\\\"0.86\\\",\\\"pa\\\":\\\"0\\\",\\\"rt\\\":[{\\\"ws\\\":[{\\\"cw\\\":[{\\\"w\\\":\\\"這\\\",\\\"wp\\\":\\\"n\\\",\\\"wc\\\":\\\"1.0000\\\"}],\\\"wb\\\":1,\\\"we\\\":16},{\\\"cw\\\":[{\\\"w\\\":\\\"是\\\",\\\"wp\\\":\\\"n\\\",\\\"wc\\\":\\\"1.0000\\\"}],\\\"wb\\\":17,\\\"we\\\":36},{\\\"cw\\\":[{\\\"w\\\":\\\"一\\\",\\\"wp\\\":\\\"n\\\",\\\"wc\\\":\\\"1.0000\\\"}],\\\"wb\\\":37,\\\"we\\\":52},{\\\"cw\\\":[{\\\"w\\\":\\\"條\\\",\\\"wp\\\":\\\"n\\\",\\\"wc\\\":\\\"1.0000\\\"}],\\\"wb\\\":53,\\\"we\\\":80},{\\\"cw\\\":[{\\\"w\\\":\\\"測試\\\",\\\"wp\\\":\\\"n\\\",\\\"wc\\\":\\\"1.0000\\\"}],\\\"wb\\\":81,\\\"we\\\":116},{\\\"cw\\\":[{\\\"w\\\":\\\"音頻\\\",\\\"wp\\\":\\\"n\\\",\\\"wc\\\":\\\"1.0000\\\"}],\\\"wb\\\":117,\\\"we\\\":172},{\\\"cw\\\":[{\\\"w\\\":\\\"。\\\",\\\"wp\\\":\\\"p\\\",\\\"wc\\\":\\\"0.0000\\\"}],\\\"wb\\\":172,\\\"we\\\":172},{\\\"cw\\\":[{\\\"w\\\":\\\"\\\",\\\"wp\\\":\\\"g\\\",\\\"wc\\\":\\\"0.0000\\\"}],\\\"wb\\\":172,\\\"we\\\":172}]}],\\\"bg\\\":\\\"50\\\",\\\"rl\\\":\\\"0\\\",\\\"ed\\\":\\\"1840\\\"}}\"}],\"lattice2\":[{\"lid\":\"0\",\"end\":\"1840\",\"begin\":\"50\",\"json_1best\":{\"st\":{\"sc\":\"0.86\",\"pa\":\"0\",\"rt\":[{\"nb\":\"1\",\"nc\":\"1.0\",\"ws\":[{\"cw\":[{\"w\":\"這\",\"wp\":\"n\",\"wc\":\"1.0000\"}],\"wb\":1,\"we\":16},{\"cw\":[{\"w\":\"是\",\"wp\":\"n\",\"wc\":\"1.0000\"}],\"wb\":17,\"we\":36},{\"cw\":[{\"w\":\"一\",\"wp\":\"n\",\"wc\":\"1.0000\"}],\"wb\":37,\"we\":52},{\"cw\":[{\"w\":\"條\",\"wp\":\"n\",\"wc\":\"1.0000\"}],\"wb\":53,\"we\":80},{\"cw\":[{\"w\":\"測試\",\"wp\":\"n\",\"wc\":\"1.0000\"}],\"wb\":81,\"we\":116},{\"cw\":[{\"w\":\"音頻\",\"wp\":\"n\",\"wc\":\"1.0000\"}],\"wb\":117,\"we\":172},{\"cw\":[{\"w\":\"。\",\"wp\":\"p\",\"wc\":\"0.0000\"}],\"wb\":172,\"we\":172},{\"cw\":[{\"w\":\"\",\"wp\":\"g\",\"wc\":\"0.0000\"}],\"wb\":172,\"we\":172}]}],\"pt\":\"reserved\",\"bg\":\"50\",\"si\":\"0\",\"rl\":\"0\",\"ed\":\"1840\"}},\"spk\":\"段落-0\"}]}","taskEstimateTime": 0}
4.4 解析轉寫結果
def parse_result(self, result_json):"""解析轉寫結果,按說話人分組"""try:result = json.loads(result_json)speakers = {}if 'lattice2' in result:for item in result['lattice2']:speaker = item.get('spk', '未知')json_1best = json.loads(item['json_1best'])text = "".join(cw['w'] for rt in json_1best.get('st', {}).get('rt', []) for ws in rt.get('ws', []) for cw in ws.get('cw', []) if 'w' in cw)speakers.setdefault(speaker, []).append(text)return speakersexcept Exception as e:return None
5. 請求與返回示例
5.1 成功返回示例
{"code": "000000","descInfo": "success","content": {"orderId": "DKHJQ202209021522090215490FAAE7DD0008C","taskEstimateTime": 28000}
}
5.4 異步回調
1. 轉寫結束異步回調狀態
當訂單轉寫流程結束時會回調用戶(如果錄音文件轉寫接口 upload
傳了callbackUrl
),會把訂單號和訂單狀態返回,具體的格式和參數說明如下: 回調地址示例:
GET http://ip:prot/server/xxx?orderId=DKHJQ202004291620042916580FBC96690001F&status=1
6. 文檔地址
訊飛ASR文檔
7. 結論
本文詳細講解了訊飛ASR API的使用流程,包括如何生成簽名、上傳音頻、查詢結果并解析返回數據。希望這篇文章對你有所幫助!如果對你有幫助,幫忙給個一鍵三連,求求了,各位吳彥祖,劉亦菲們