91精品久久人人妻人人爽人人,最新久久精品日本,成人无码网站视频,淫乱综合

幫助與文檔 > 產(chǎn)品文檔 > 智能語(yǔ)音服務(wù) > API文檔 > 短語(yǔ)音識(shí)別
短語(yǔ)音識(shí)別

短語(yǔ)音識(shí)別 API 簡(jiǎn)介

概念解釋

短語(yǔ)音識(shí)別:將一段不超過(guò)60秒的語(yǔ)音轉(zhuǎn)換成文本,將音頻文件中的文字信息識(shí)別出來(lái),代替?zhèn)鹘y(tǒng)輸入場(chǎng)景。

說(shuō)明

Hi,您好,歡迎使用有道智云短語(yǔ)音識(shí)別API接口服務(wù)。

如果您想快速體驗(yàn)服務(wù),建議您前往 語(yǔ)音識(shí)別體驗(yàn)中心 或者在體驗(yàn)中心右下側(cè)找到小程序二維碼,掃描進(jìn)行體驗(yàn)。

本文檔主要針對(duì)需要集成API的技術(shù)開(kāi)發(fā)工程師,詳細(xì)描述短語(yǔ)音識(shí)別能力相關(guān)的技術(shù)內(nèi)容。

如果您有與我們商務(wù)合作的需求,可以通過(guò)以下方式聯(lián)系我們:

商務(wù)郵箱: AIcloud_Business@corp.youdao.com

如果您對(duì)文檔內(nèi)容有任何疑問(wèn),可以通過(guò)以下幾種方式聯(lián)系我們:

客服QQ:1906538062

智云語(yǔ)音技術(shù)交流QQ群:861723255

聯(lián)系郵箱: zyservice@corp.youdao.com

溫馨提示:

  • 本文檔主要針對(duì)開(kāi)發(fā)人員,接入測(cè)試前需要在后臺(tái)創(chuàng)建API應(yīng)用,獲取應(yīng)用ID應(yīng)用密鑰;如果您還沒(méi)有,請(qǐng)按照 新手指南 獲取。
  • 平臺(tái)向每個(gè)賬戶贈(zèng)送50元的體驗(yàn)金,供用戶集成前測(cè)試所用,具體資費(fèi)規(guī)則詳見(jiàn) 短語(yǔ)音識(shí)別服務(wù)報(bào)價(jià)

接口說(shuō)明

有道短語(yǔ)音識(shí)別API接口提供有道的短語(yǔ)音識(shí)別服務(wù),包含了中文和英文的識(shí)別功能。您只需要通過(guò)調(diào)用有道語(yǔ)音識(shí)別API,傳入待識(shí)別的音頻文件,并指定要識(shí)別的源語(yǔ)言種類,以POST方式請(qǐng)求就可以得到相應(yīng)的識(shí)別結(jié)果。

有道語(yǔ)音識(shí)別API HTTPS地址:

https://openapi.youdao.com/asrapi

語(yǔ)音支持:

格式支持:wav(不壓縮,pcm編碼,采樣率:推薦16k ,編碼:16bit位深的單聲道),aac,mp3

格式代碼
wavwav
aacaac
mp3mp3

注:上傳的文件時(shí)長(zhǎng)不能超過(guò)60s,文件大小不能超過(guò)10M。

接口調(diào)用參數(shù)

調(diào)用API需要向接口發(fā)送以下字段來(lái)訪問(wèn)服務(wù)。

字段名類型含義必填備注
qtext要翻譯的音頻文件的Base64編碼字符串True必須是Base64編碼
langTypetext源語(yǔ)言True支持語(yǔ)言
appKeytext應(yīng)用 IDTrue可在 應(yīng)用管理 查看
salttextUUIDTrueuuid,唯一通用識(shí)別碼
curtimetext時(shí)間戳(秒)true秒數(shù)
signtext簽名,通過(guò)sha256(應(yīng)用ID+q+salt+curtime+密鑰)生成Truesha256(應(yīng)用ID+input+salt+curtime+密鑰)
signTypetext簽名版本Truev3
formattext語(yǔ)音文件的格式,wavtruewav
ratetext采樣率, 推薦 16000 采用率true16000
channeltext聲道數(shù), 僅支持單聲道,請(qǐng)?zhí)顚懝潭ㄖ?true1
typetext上傳類型, 僅支持base64上傳,請(qǐng)?zhí)顚懝潭ㄖ?true1

簽名sign生成方法如下:
1、將請(qǐng)求參數(shù)中的 應(yīng)用ID "appKey" , Base64編碼字符串 "q" ,UUID "salt" , 時(shí)間戳 "curTime"應(yīng)用密鑰 按照 應(yīng)用ID+q+salt+curTime+應(yīng)用密鑰 的順序拼接得到字符串 str 。

其中,q的計(jì)算方式為:q=q前10個(gè)字符 + q長(zhǎng)度 + q后10個(gè)字符(當(dāng)q長(zhǎng)度大于20)或 input=q字符串(當(dāng)q長(zhǎng)度小于等于20);

注意:

  1. 請(qǐng)先將需要翻譯的音頻文件轉(zhuǎn)換為 Base64 編碼
  2. 在發(fā)送 HTTP 請(qǐng)求之前需要對(duì)各字段做 URL encode。
  3. 在生成簽名拼接 應(yīng)用ID+q+salt+curTime+密鑰 字符串時(shí),q 不需要做 URL encode,在生成簽名之后,發(fā)送 HTTP 請(qǐng)求之前才需要對(duì)要發(fā)送的待翻譯文本字段 q 做 URL encode。

輸出結(jié)果

響應(yīng)結(jié)果是以json形式輸出,包含字段如下表所示:

字段含義
errorCode識(shí)別結(jié)果錯(cuò)誤碼,一定存在。
詳細(xì)信息參加 錯(cuò)誤代碼列表
result識(shí)別結(jié)果,識(shí)別成功一定存在

示例

{
    "result": [
        "今天天氣不錯(cuò)" //識(shí)別結(jié)果
    ],    
    "errorCode": "0",    //錯(cuò)誤碼。一定存在
}

支持語(yǔ)言

英文名中文名代碼
Arabic阿拉伯語(yǔ)ar
Bahasa (Indonesia)巴哈薩語(yǔ)(印度尼西亞)in
Cantonese粵語(yǔ)yue
Catalan加泰隆語(yǔ)ca
Czech捷克語(yǔ)cs
Danish丹麥語(yǔ)da
Dutch荷蘭語(yǔ)nl
Dutch (Belgium)荷蘭語(yǔ)(比利時(shí))nl-BEL
English (Australia)英語(yǔ)(澳大利亞)en-AUS
English (GB)英語(yǔ)(英國(guó))en-GBR
English (India)英語(yǔ)(印度)en-IND
English (Ireland)英語(yǔ)(愛(ài)爾蘭)en-IRL
English (Scotland)英語(yǔ)(蘇格蘭)en-SCT
English (South Africa)英語(yǔ)(南非)en-ZAF
English (US)英語(yǔ)(美國(guó))en
Finnish芬蘭語(yǔ)fi
French法語(yǔ)fr
French (Canada)法語(yǔ)(加拿大)fr-CAN
German德語(yǔ)de
Greek希臘語(yǔ)el
Hebrew希伯來(lái)語(yǔ)he
Hindi印地語(yǔ)hi
Hungarian匈牙利語(yǔ)hu
Italian意大利語(yǔ)it
Japanese日語(yǔ)ja
Korean韓語(yǔ)ko
Mandarin (China)普通話(中國(guó))zh-CHS
Mandarin (Taiwan)普通話(中國(guó)臺(tái)灣)zh-TWN
Norwegian挪威語(yǔ)no
Polish波蘭語(yǔ)pl
Portuguese (Brazil)葡萄牙語(yǔ)(巴西)pt-BRA
Portuguese (Portugal)葡萄牙語(yǔ)(葡萄牙)pt
Romanian羅馬尼亞語(yǔ)ro
Russian俄語(yǔ)ru
Slovak斯洛伐克語(yǔ)sk
Spanish (Castilian)西班牙語(yǔ)(卡斯蒂利亞)es-ESP
Spanish (Columbia)西班牙語(yǔ)(哥倫比亞)es-COL
Spanish (Mexico)西班牙語(yǔ)(墨西哥)es-MEX
Spanish (Mexico)西班牙語(yǔ)es
Swedish瑞典語(yǔ)sv
Thai泰語(yǔ)th
Turkish土耳其語(yǔ)tr

服務(wù)配置

支持格式音頻大小上限單次最大請(qǐng)求時(shí)長(zhǎng)(s)每小時(shí)最大查詢次數(shù)每小時(shí)最大音頻時(shí)長(zhǎng)(s)支持語(yǔ)言
wav10M(編碼后)60300060000中/英/日/韓等詳細(xì)可參考支持的語(yǔ)言列表
  • 注意:如需上調(diào)調(diào)用量請(qǐng)聯(lián)系技術(shù)人員咨詢。

錯(cuò)誤代碼列表

錯(cuò)誤碼含義
101缺少必填的參數(shù),首先確保必填參數(shù)齊全,然后,確認(rèn)參數(shù)書寫是否正確。
102不支持的語(yǔ)言類型
103翻譯文本過(guò)長(zhǎng)
104不支持的API類型
105不支持的簽名類型
106不支持的響應(yīng)類型
107不支持的傳輸加密類型
108應(yīng)用ID無(wú)效,注冊(cè)賬號(hào),登錄后臺(tái)創(chuàng)建應(yīng)用并完成綁定,可獲得應(yīng)用ID和應(yīng)用密鑰等信息
109batchLog格式不正確
110無(wú)相關(guān)服務(wù)的有效應(yīng)用,應(yīng)用沒(méi)有綁定服務(wù),可以新建服務(wù)。注:某些服務(wù)的結(jié)果發(fā)音需要tts服務(wù),需要在控制臺(tái)創(chuàng)建語(yǔ)音合成實(shí)例綁定應(yīng)用后方能使用。
111開(kāi)發(fā)者賬號(hào)無(wú)效
112請(qǐng)求服務(wù)無(wú)效
113q不能為空
114不支持的圖片傳輸方式
201解密失敗,可能為DES,BASE64,URLDecode的錯(cuò)誤
202簽名檢驗(yàn)失敗,如果確認(rèn)應(yīng)用ID和應(yīng)用密鑰的正確性,仍返回202,一般是編碼問(wèn)題。請(qǐng)確保翻譯文本 q 為UTF-8編碼.
203訪問(wèn)IP地址不在可訪問(wèn)IP列表
205請(qǐng)求的接口與應(yīng)用的平臺(tái)類型不一致,確保接入方式(Android SDK、IOS SDK、API)與創(chuàng)建的應(yīng)用平臺(tái)類型一致。如有疑問(wèn)請(qǐng)參考入門指南
206因?yàn)闀r(shí)間戳無(wú)效導(dǎo)致簽名校驗(yàn)失敗
207重放請(qǐng)求
301辭典查詢失敗
302翻譯查詢失敗
303服務(wù)端的其它異常
304會(huì)話閑置太久超時(shí)
401賬戶已經(jīng)欠費(fèi)停
402offlinesdk不可用
411訪問(wèn)頻率受限,請(qǐng)稍后訪問(wèn)
412長(zhǎng)請(qǐng)求過(guò)于頻繁,請(qǐng)稍后訪問(wèn)
1001無(wú)效的OCR類型
1002不支持的OCR image類型
1003不支持的OCR Language類型
1004識(shí)別圖片過(guò)大
1201圖片base64解密失敗
1301OCR段落識(shí)別失敗
1411訪問(wèn)頻率受限
1412超過(guò)最大識(shí)別字節(jié)數(shù)
2003不支持的語(yǔ)言識(shí)別Language類型
2004合成字符過(guò)長(zhǎng)
2005不支持的音頻文件類型
2006不支持的發(fā)音類型
2201解密失敗
2301服務(wù)的異常
2411訪問(wèn)頻率受限,請(qǐng)稍后訪問(wèn)
2412超過(guò)最大請(qǐng)求字符數(shù)
3001不支持的語(yǔ)音格式
3002不支持的語(yǔ)音采樣率
3003不支持的語(yǔ)音聲道
3004不支持的語(yǔ)音上傳類型
3005不支持的語(yǔ)言類型
3006不支持的識(shí)別類型
3007識(shí)別音頻文件過(guò)大
3008識(shí)別音頻時(shí)長(zhǎng)過(guò)長(zhǎng)
3009不支持的音頻文件類型
3010不支持的發(fā)音類型
3201解密失敗
3301語(yǔ)音識(shí)別失敗
3302語(yǔ)音翻譯失敗
3303服務(wù)的異常
3411訪問(wèn)頻率受限,請(qǐng)稍后訪問(wèn)
3412超過(guò)最大請(qǐng)求字符數(shù)
4001不支持的語(yǔ)音識(shí)別格式
4002不支持的語(yǔ)音識(shí)別采樣率
4003不支持的語(yǔ)音識(shí)別聲道
4004不支持的語(yǔ)音上傳類型
4005不支持的語(yǔ)言類型
4006識(shí)別音頻文件過(guò)大
4007識(shí)別音頻時(shí)長(zhǎng)過(guò)長(zhǎng)
4201解密失敗
4301語(yǔ)音識(shí)別失敗
4303服務(wù)的異常
4304識(shí)別結(jié)果為空
4411訪問(wèn)頻率受限,請(qǐng)稍后訪問(wèn)
4412超過(guò)最大請(qǐng)求時(shí)長(zhǎng)
4416包含不合時(shí)宜詞匯
4414音頻格式轉(zhuǎn)換失敗
5001無(wú)效的OCR類型
5002不支持的OCR image類型
5003不支持的語(yǔ)言類型
5004識(shí)別圖片過(guò)大
5005不支持的圖片類型
5006文件為空
5201解密錯(cuò)誤,圖片base64解密失敗
5301OCR段落識(shí)別失敗
5411訪問(wèn)頻率受限
5412超過(guò)最大識(shí)別流量
9001不支持的語(yǔ)音格式
9002不支持的語(yǔ)音采樣率
9003不支持的語(yǔ)音聲道
9004不支持的語(yǔ)音上傳類型
9005不支持的語(yǔ)音識(shí)別 Language類型
9301ASR識(shí)別失敗
9303服務(wù)器內(nèi)部錯(cuò)誤
9411訪問(wèn)頻率受限(超過(guò)最大調(diào)用次數(shù))
9412超過(guò)最大處理語(yǔ)音長(zhǎng)度
10001無(wú)效的OCR類型
10002不支持的OCR image類型
10004識(shí)別圖片過(guò)大
10201圖片base64解密失敗
10301OCR段落識(shí)別失敗
10411訪問(wèn)頻率受限
10412超過(guò)最大識(shí)別流量
11001不支持的語(yǔ)音識(shí)別格式
11002不支持的語(yǔ)音識(shí)別采樣率
11003不支持的語(yǔ)音識(shí)別聲道
11004不支持的語(yǔ)音上傳類型
11005不支持的語(yǔ)言類型
11006識(shí)別音頻文件過(guò)大
11007識(shí)別音頻時(shí)長(zhǎng)過(guò)長(zhǎng),最大支持30s
11201解密失敗
11301語(yǔ)音識(shí)別失敗
11303服務(wù)的異常
11411訪問(wèn)頻率受限,請(qǐng)稍后訪問(wèn)
11412超過(guò)最大請(qǐng)求時(shí)長(zhǎng)
12001圖片尺寸過(guò)大
12002圖片base64解密失敗
12003引擎服務(wù)器返回錯(cuò)誤
12004圖片為空
12005不支持的識(shí)別圖片類型
12006圖片無(wú)匹配結(jié)果
13001不支持的角度類型
13002不支持的文件類型
13003表格識(shí)別圖片過(guò)大
13004文件為空
13301表格識(shí)別失敗
15001需要圖片
15002圖片過(guò)大(1M)
15003服務(wù)調(diào)用失敗
17001需要圖片
17002圖片過(guò)大(1M)
17003識(shí)別類型未找到
17004不支持的識(shí)別類型
17005服務(wù)調(diào)用失敗

音頻轉(zhuǎn)換

本部分描述如何把其他格式的音頻轉(zhuǎn)成符合語(yǔ)音識(shí)別輸入要求的格式文件。

語(yǔ)音識(shí)別底層使用的是wav格式,因此推薦使用wav格式音頻。音頻格式轉(zhuǎn)換推薦使用ffmpeg

ffmpeg簡(jiǎn)介

ffmpeg是一個(gè)自由軟件,可以運(yùn)行音頻、視頻多種格式的錄影、轉(zhuǎn)換、流功能,包含libavcodec--這是一個(gè)用于多個(gè)項(xiàng)目中的音頻、視頻的解碼器庫(kù),以及l(fā)ibavformat--一個(gè)音頻和視頻格式轉(zhuǎn)換庫(kù)。

ffmpeg官網(wǎng):https://www.ffmpeg.org/

ffmpeg的github地址:https://github.com/FFmpeg/FFmpeg

ffmpeg編譯參數(shù)

ffmpeg默認(rèn)支持pcm與wav(pcm編碼)格式,額外的編譯參數(shù)如下:

—enable-libopencore-amrnb 支持amr-nb(8000 采樣率) 讀寫

—enable-libopencore-amrwb 支持amr-wb(16000 采樣率) 讀取

—enable-libvo-amrwbenc 支持amr-wb(16000 采樣率) 寫入

—enable-libmp3lame 支持mp3 寫入

ffmpeg -codecs 可以查看所有的格式:

D..... = Decoding supported  # 讀取
.E.... = Encoding supported  # 寫入
..A... = Audio codec      # 音頻編碼
....L. = Lossy compression # 有損
.....S = Lossless compression # 無(wú)損
DEA..S pcm_s16le            PCM signed 16-bit little-endian
DEA.LS wavpack              WavPack
DEA.L. mp3  MP3 (MPEG audio layer 3)
DEA.L. amr_nb       AMR-NB (Adaptive Multi-Rate NarrowBand)
DEA.L. amr_wb       AMR-WB (Adaptive Multi-Rate WideBand)

主要參數(shù)

-i 設(shè)定輸入流

-f 設(shè)定格式

-ss 開(kāi)始時(shí)間

wav、mp3、amr格式都自帶頭部,包含采樣率、編碼、多聲道等信息。而pcm為原始音頻信息,沒(méi)有頭部信息。wav(pcm編碼)就是pcm文件加了wav的頭部信息。

輸入wav、mp3、amr:

ffmpeg -i audio.wav/audio.mp3/audio.amr

輸入pcm格式:pcm需要額外告知編碼格式,采樣率,單聲道信息

-f s16le -ac 1 -ar 16000 -i 16k.pcm    //單聲道、16000采樣率、16bits編碼的pcm文件

音頻參數(shù)

-ar 設(shè)定采樣率

-ac 設(shè)定聲音的channel數(shù)

-acodec 設(shè)定聲音編解碼器,未設(shè)定時(shí)則使用與輸入流相同的編解碼器

-an 不處理音頻

-ab 設(shè)置比特率(單位:bit/s,也許老版是kb/s),前面ac設(shè)置為立體聲時(shí)要以一半的比特率來(lái)設(shè)置,比如192kbps的就設(shè)置為96,轉(zhuǎn)換默認(rèn)比特率都較小,轉(zhuǎn)換默認(rèn)比特率都較小,要聽(tīng)到高品質(zhì)聲音的話建議設(shè)到160kbps(80)以上。

在原始采樣率 大于或者接近16000的時(shí)候,推薦使用16000,8000采樣率會(huì)降低識(shí)別效果。

輸出wav和amr時(shí),如果沒(méi)有指定聲音編解碼器,則會(huì)選擇默認(rèn)的編碼器。

輸出pcm:

-f s16le -ac 1 -ar 16000 16k.pcm  // 單聲道 16000 采樣率 16bits編碼 pcm文件

輸出wav:

-ac 1 -ar 16000 16k.wav //單聲道 16000 采樣率 16bits編碼 pcm編碼的wav文件

amr-nb:全稱是:Adaptive Multi-Rate,自適應(yīng)多速率,是一種音頻編碼文件格式,專用于有效地壓縮語(yǔ)音頻率。amr-nb格式只能選 8000采樣率。bit rates越高音質(zhì)越好,但是文件越大

bit rates 4.75k, 5.15k, 5.9k, 6.7k, 7.4k, 7.95k, 10.2k or 12.2k

輸出 amr-wb 格式,采樣率 16000。 bit rates越高音質(zhì)越好,但是文件越大。

6600 8850 12650 14250 15850 18250 19850 23050 23850

常用參數(shù)

-y 覆蓋同名文件

-v 日志輸出 基本如-v ERROR -v quiet等

轉(zhuǎn)換命令示例

ffmpeg {常用參數(shù)} {輸入音頻參數(shù)} {輸出音頻參數(shù)}

wav 文件轉(zhuǎn) 16k 16bits 位深的單聲道pcm文件

ffmpeg -y  -i 16k.wav  -acodec pcm_s16le -f s16le -ac 1 -ar 16000 16k.pcm

pcm文件轉(zhuǎn)wav:

ffmpeg -y -f s16le -ar 16000 -ac 1 -acodec pcm_s16le 16k.pcm 16k.wav

m4a文件轉(zhuǎn)16k 16bits 位深的單聲道pcm文件

D:\ffmpeg\bin>ffmpeg -y -i test.m4a -acodec pcm_s16le -f s16le -ac 1 -ar 1600
0 16k.pcm

PCM文件音頻介紹

pcm保存的是未壓縮的音頻信息,沒(méi)有頭文件

16bits編碼是指每次采樣信息用2個(gè)字節(jié)保存。

16000采樣率,是指1秒采樣16000次,常見(jiàn)的音頻是44100HZ,即一秒采樣44100次。

單聲道: 只有一個(gè)聲道。

根據(jù)這些信息,可以得出:

1ms的16采樣率音頻文件大小是 2*16 = 32字節(jié) 。

1ms的8采樣率音頻文件大小是 2*8 = 16字節(jié),由此即可得到音頻的長(zhǎng)度。

版本更新記錄

上線日期版本號(hào)更新內(nèi)容
2018.03.29v1.0.0支持15s以內(nèi)音頻識(shí)別;支持中文或者英文音頻識(shí)別。
2019.05.29v1.0.0支持2min以內(nèi)音頻識(shí)別;支持中英混合音頻識(shí)別。

常用語(yǔ)言 Demo

Java 示例

package com.youdao.ai;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;
import java.util.Base64;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class AsrV2Demo {
    private static final String YOUDAO_URL = "https://openapi.youdao.com/asrapi";

    private static final String APP_KEY = "您的應(yīng)用ID";

    private static final String APP_SECRET = "您的應(yīng)用密鑰";

    public static String truncate(String q) {
        if (q == null) {
            return null;
        }
        int len = q.length();
        String result;
        return len <= 20 ? q : (q.substring(0, 10) + len + q.substring(len - 10, len));
    }

    public static String loadAsBase64(String filename) {
        InputStream in = null;
        byte[] data = null;
        try {
            in = new FileInputStream(filename);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Base64.getEncoder().encodeToString(data);
    }

    public static String doRequest(String url, Map<String,String> requestParams) throws Exception{
        String result = null;
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(url);
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        for (String key : requestParams.keySet()) {
            params.add(new BasicNameValuePair(key, requestParams.get(key)));
        }
        httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
        CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
        try {
            HttpEntity httpEntity = httpResponse.getEntity();
            result = EntityUtils.toString(httpEntity, "utf-8");
            EntityUtils.consume(httpEntity);
        } finally {
            try {
                if (httpResponse != null) {
                    httpResponse.close();
                }
            } catch(IOException e) {
                System.out.println("## release resouce error ##" + e);
            }
        }
        return result;
    }

    public static String getDigest(String string) {
        if (string == null) {
            return null;
        }
        char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
        byte[] btInput = string.getBytes(StandardCharsets.UTF_8);
        try {
            MessageDigest mdInst = MessageDigest.getInstance("SHA-256");
            mdInst.update(btInput);
            byte[] md = mdInst.digest();
            int j = md.length;
            char str[] = new char[j * 2];
            int k = 0;
            for (byte byte0 : md) {
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);
        } catch (NoSuchAlgorithmException e) {
            return null;
        }
    }

    public static void main(String[] args) throws Exception {
        Map<String, String> params = new HashMap<String, String>();
        String filename = "音頻的路徑";
        String langType = "合成文本的語(yǔ)言類型";
        params.put("appKey", APP_KEY);
        String q = loadAsBase64(filename);
        params.put("q", q);
        params.put("format", "wav");
        params.put("rate", "16000");
        params.put("channel", "1");
        params.put("docType", "json");
        params.put("type", "1");
        String salt = UUID.randomUUID().toString();
        params.put("salt", salt);
        params.put("langType", langType);
        String curtime = String.valueOf(System.currentTimeMillis() / 1000);
        params.put("curtime", curtime);
        String signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET;
        String sign = getDigest(signStr);
        params.put("sign", sign);
        params.put("signType", "v2");

        String result = doRequest(YOUDAO_URL, params);
        System.out.println(result);
    }
}

Python2 示例

# -*- coding: utf-8 -*-
import sys
import uuid
import requests
import wave
import base64
import hashlib
import time

reload(sys)
sys.setdefaultencoding('utf-8')

YOUDAO_URL = 'https://openapi.youdao.com/asrapi'
APP_KEY = '您的應(yīng)用ID'
APP_SECRET = '您的應(yīng)用密鑰'

def truncate(q):
    if q is None:
        return None
    q_utf8 = q.decode("utf-8")
    size = len(q_utf8)
    return q_utf8 if size <= 20 else q_utf8[0:10] + str(size) + q_utf8[size - 10:size]

def encrypt(signStr):
    hash_algorithm = hashlib.sha256()
    hash_algorithm.update(signStr.encode('utf-8'))
    return hash_algorithm.hexdigest()

def do_request(data):
    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    return requests.post(YOUDAO_URL, data=data, headers=headers)

def connect():
    audio_file_path = '音頻的路徑'
    lang_type = '合成文本的語(yǔ)言類型'
    extension = audio_file_path[audio_file_path.rindex('.')+1:]
    if extension != 'wav':
        print '不支持的音頻類型'
        sys.exit(1)
    wav_info = wave.open(audio_file_path, 'rb')
    sample_rate = wav_info.getframerate()
    nchannels = wav_info.getnchannels()
    wav_info.close()
    with open(audio_file_path, 'rb') as file_wav:
        q = base64.b64encode(file_wav.read())

    data = {}
    curtime = str(int(time.time()))
    data['curtime'] = curtime
    salt = str(uuid.uuid1())
    signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET
    sign = encrypt(signStr)
    data['appKey'] = APP_KEY
    data['q'] = q
    data['salt'] = salt
    data['sign'] = sign
    data['signType'] = "v2"
    data['langType'] = lang_type
    data['rate'] = sample_rate
    data['format'] = 'wav'
    data['channel'] = nchannels
    data['type'] = 1

    response = do_request(data)
    print response.content

if __name__ == '__main__':
    connect()

Python3 示例

# -*- coding: utf-8 -*-
import sys
import uuid
import requests
import wave
import base64
import hashlib

from imp import reload

import time

reload(sys)

YOUDAO_URL = 'https://openapi.youdao.com/asrapi'
APP_KEY = '您的應(yīng)用ID'
APP_SECRET = '您的應(yīng)用密鑰'

def truncate(q):
    if q is None:
        return None
    size = len(q)
    return q if size <= 20 else q[0:10] + str(size) + q[size-10:size]

def encrypt(signStr):
    hash_algorithm = hashlib.sha256()
    hash_algorithm.update(signStr.encode('utf-8'))
    return hash_algorithm.hexdigest()

def do_request(data):
    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    return requests.post(YOUDAO_URL, data=data, headers=headers)

def connect():
    audio_file_path = '音頻的路徑'
    lang_type = '合成文本的語(yǔ)言類型'
    extension = audio_file_path[audio_file_path.rindex('.')+1:]
    if extension != 'wav':
        print('不支持的音頻類型')
        sys.exit(1)
    wav_info = wave.open(audio_file_path, 'rb')
    sample_rate = wav_info.getframerate()
    nchannels = wav_info.getnchannels()
    wav_info.close()
    with open(audio_file_path, 'rb') as file_wav:
        q = base64.b64encode(file_wav.read()).decode('utf-8')

    data = {}
    curtime = str(int(time.time()))
    data['curtime'] = curtime
    salt = str(uuid.uuid1())
    signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET
    sign = encrypt(signStr)
    data['appKey'] = APP_KEY
    data['q'] = q
    data['salt'] = salt
    data['sign'] = sign
    data['signType'] = "v2"
    data['langType'] = lang_type
    data['rate'] = sample_rate
    data['format'] = 'wav'
    data['channel'] = nchannels
    data['type'] = 1

    response = do_request(data)
    print(response.content)

if __name__ == '__main__':
    connect()

C#示例

using System;
using System.IO;
using System.Web;
using System.Net;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Security.Cryptography;

namespace zhiyun_csharp_demo
{
    class AsrV2Demo
    {
        public static void Main()
        {
            String url = "https://openapi.youdao.com/asrapi";
            Dictionary<String, String> dic = new Dictionary<String, String>();

            string q = LoadAsBase64("音頻的路徑");
            string appKey = "您的應(yīng)用ID";
            string appSecret = "您的應(yīng)用密鑰";
            string langType = "合成文本的語(yǔ)言類型";
            string format = "wav";
            string rate = "16000";
            string channel = "1";
            string type = "1";
            string salt = Guid.NewGuid().ToString();
            TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc));
            long millis = (long) ts.TotalMilliseconds;
            string curtime = Convert.ToString(millis / 1000);
            dic.Add("curtime", curtime);
            string signStr = appKey + Truncate(q) + salt + curtime + appSecret;;
            string sign = ComputeHash(signStr, new SHA256CryptoServiceProvider());
            dic.Add("q", System.Web.HttpUtility.UrlEncode(q));
            dic.Add("appKey", appKey);
            dic.Add("langType", langType);
            dic.Add("format", format);
            dic.Add("rate", rate);
            dic.Add("channel", channel);
            dic.Add("type", type);
            dic.Add("salt", salt);
            dic.Add("sign", sign);
            dic.Add("signType", "v2");

            string result = Post(url, dic);
            Console.WriteLine(result);
        }

        protected static string ComputeHash(string input, HashAlgorithm algorithm)
        {
          Byte[] inputBytes = Encoding.UTF8.GetBytes(input);
          Byte[] hashedBytes = algorithm.ComputeHash(inputBytes);
          return BitConverter.ToString(hashedBytes).Replace("-", "");
        }

        protected static string Truncate(string q)
        {
            if (q == null)
            {
               return null;
            }
            int len = q.Length;
            return len <= 20 ? q : (q.Substring(0, 10) + len + q.Substring(len - 10, 10));
        }

        protected static string LoadAsBase64(string filename)
        {
            try
            {
                FileStream filestream = new FileStream(filename, FileMode.Open);
                byte[] arr = new byte[filestream.Length];
                filestream.Position = 0;
                filestream.Read(arr, 0, (int)filestream.Length);
                filestream.Close();
                return Convert.ToBase64String(arr);
            }
            catch (Exception ex)
            {
                return null;
            }
        }

        protected static string Post(string url, Dictionary<String, String> dic)
        {
            string result = "";
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded";
            StringBuilder builder = new StringBuilder();
            int i = 0;
            foreach (var item in dic)
            {
                if (i > 0)
                    builder.Append("&");
                builder.AppendFormat("{0}={1}", item.Key, item.Value);
                i++;
            }
            byte[] data = Encoding.UTF8.GetBytes(builder.ToString());
            req.ContentLength = data.Length;
            using (Stream reqStream = req.GetRequestStream())
            {
                reqStream.Write(data, 0, data.Length);
                reqStream.Close();
            }
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            Stream stream = resp.GetResponseStream();
            using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
            {
                result = reader.ReadToEnd();
            }
            return result;
        }
    }
}

PHP 示例

<?php
define("CURL_TIMEOUT",   2000);
define("URL",            "https://openapi.youdao.com/asrapi");
define("APP_KEY",        "您的應(yīng)用ID"); // 替換為您的應(yīng)用ID
define("SEC_KEY",        "您的應(yīng)用密鑰"); // 替換為您的密鑰

function do_request($q, $langType, $channel, $rate, $format)
{
    $salt = create_guid();
    $args = array(
        'q' => $q,
        'appKey' => APP_KEY,
        'salt' => $salt,
        'langType' => $langType,
        'channel' => $channel,
        'rate' => $rate,
        'format' => $format,
        'type' => "1",
        'signType' => "v2",
    );
    $curtime = strtotime("now");
    $args['curtime'] = $curtime;
    $signStr = APP_KEY . truncate($q) . $salt . $curtime . SEC_KEY;
    $args['sign'] = hash("sha256", $signStr);
    $ret = call(URL, $args);
    print_r($ret);
    $ret = json_decode($ret, true);
    return $ret;
}

// 發(fā)起網(wǎng)絡(luò)請(qǐng)求
function call($url, $args=null, $method="post", $testflag = 0, $timeout = CURL_TIMEOUT, $headers=array())
{
    $ret = false;
    $i = 0;
    while($ret === false)
    {
        if($i > 1)
            break;
        if($i > 0)
        {
            sleep(1);
        }
        $ret = callOnce($url, $args, $method, false, $timeout, $headers);
        $i++;
    }
    return $ret;
}

function callOnce($url, $args=null, $method="post", $withCookie = false, $timeout = CURL_TIMEOUT, $headers=array())
{
    $ch = curl_init();
    if($method == "post")
    {
        $data = convert($args);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_POST, 1);
    }
    else
    {
        $data = convert($args);
        if($data)
        {
            if(stripos($url, "?") > 0)
            {
                $url .= "&$data";
            }
            else
            {
                $url .= "?$data";
            }
        }
    }
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    if(!empty($headers))
    {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }
    if($withCookie)
    {
        curl_setopt($ch, CURLOPT_COOKIEJAR, $_COOKIE);
    }
    $r = curl_exec($ch);
    curl_close($ch);
    return $r;
}

function convert(&$args)
{
    $data = '';
    if (is_array($args))
    {
        foreach ($args as $key=>$val)
        {
            if (is_array($val))
            {
                foreach ($val as $k=>$v)
                {
                    $data .= $key.'['.$k.']='.rawurlencode($v).'&';
                }
            }
            else
            {
                $data .="$key=".rawurlencode($val)."&";
            }
        }
        return trim($data, "&");
    }
    return $args;
}

// uuid generator
function create_guid(){
    $microTime = microtime();
    list($a_dec, $a_sec) = explode(" ", $microTime);
    $dec_hex = dechex($a_dec* 1000000);
    $sec_hex = dechex($a_sec);
    ensure_length($dec_hex, 5);
    ensure_length($sec_hex, 6);
    $guid = "";
    $guid .= $dec_hex;
    $guid .= create_guid_section(3);
    $guid .= '-';
    $guid .= create_guid_section(4);
    $guid .= '-';
    $guid .= create_guid_section(4);
    $guid .= '-';
    $guid .= create_guid_section(4);
    $guid .= '-';
    $guid .= $sec_hex;
    $guid .= create_guid_section(6);
    return $guid;
}

function truncate($q) {
    $len = abslength($q);
    return $len <= 20 ? $q : (mb_substr($q, 0, 10) . $len . mb_substr($q, $len - 10, $len));
}

function abslength($str)
{
    if(empty($str)){
        return 0;
    }
    if(function_exists('mb_strlen')){
        return mb_strlen($str,'utf-8');
    }
    else {
        preg_match_all("/./u", $str, $ar);
        return count($ar[0]);
    }
}

function ensure_length(&$string, $length){
    $strlen = strlen($string);
    if($strlen < $length)
    {
        $string = str_pad($string, $length, "0");
    }
    else if($strlen > $length)
    {
        $string = substr($string, 0, $length);
    }
}

function create_guid_section($characters){
    $return = "";
    for($i = 0; $i < $characters; $i++)
    {
        $return .= dechex(mt_rand(0,15));
    }
    return $return;
}

$file = "音頻的路徑";
$langType = "合成文本的語(yǔ)言類型";

$fp = fopen($file, "r") or die("Can't open file");

// base64編碼
$q = chunk_split(base64_encode(fread($fp, filesize($file))));

fclose($fp);

do_request($q, $langType, "1", 16000, "wav");
?>
一级黄片一级黄片黄色视频| 久久qingqing| 亚洲日本久久| 日本久久久免费观看| 人人爽天天| 大香蕉大香蕉| 西盟| 欧美 日韩 国产 中文| 精品人妻熟女毛片av久久| 日本精品国产亚洲| 国产日韩欧美自拍| 影视资源| 成人色视频中文| 伦一理一级一a一片| 久久久www成人免费无遮挡大片| 激情久久老熟视频| 欧美日韩三a| 国产佗精品一区二区三区| 九九精品一区| 亚洲AV无码乱码国产精品久久| 欧美成人性爱白浆电影| 又黄又爽又无遮挡免费的网站| 五月丁香五月停停| 无码一区福利| 花生AV在线| 最新久久精品日本| 乱码小说中文字幕中字| 国产免费无码一区二区| 国产一区二区日韩| 久久国产乱子伦免费精品无码| 欧美精品一区二区精品久久免费| 欧美精品黄片一区二区三区| 亚洲中文字幕久久精品无码APP| 欧美日韩人妻精品| 在线福利| 国产精品自产拍在线观看| 国产精品www在线观看| 久久精品久| 亚洲色图久久久| 久久青青草原国产毛片| 日韩大片免费看|