使用IoT大平台語音辨識/語音轉文字(STT)功能
步驟1. 登入IoT大平台會員
Step1. Login CHT IoT platform我想這不需要多介紹...
步驟2. 取得IoT大平台的API金鑰
Step2. Register X-API-API key for STT/TTS登入大平台後,右上角個人圖像,點下去會顯示[API金鑰管理]
或是直接前往網址https://iot.cht.com.tw/iot/appkey
申請金鑰時預設是全部都可以使用,如果你只是要用STT功能,找到如下圖所示的chtlasr國語語音辨識服務部分勾選即可。
步驟3. 開始使用
Step3. Ready for use the speech-to-text apiAPI的說明頁https://iot.cht.com.tw/iot/developer/intelligence
辨識包含三個步驟: (1) 取得ASR ID (2) 傳送語音資料, 並獲得辨識結果 (3) 結束辨識
我下面假定你步驟2取得的x-api-key是aaaaaaaa-bbbb-cccc-dddd-123456789ab
(1) 取得ASR ID
curl -v -i \-X POST \
-H "X-API-Key: aaaaaaaa-bbbb-cccc-dddd-123456789ab" \
-H "Accept: application/json" \
https://iot.cht.com.tw/apis/CHTIoT/chtlasr/v2/MyServlet/tlasr?Action=connect
正常的話伺服器會回應http 200,內容會中會包ASR ID(紅色粗體標示){"ResultStatus":"Success","AsrReferenceId":"tlasr_116017588_20190709_145925058_009","ApiProcessingTime":"2019-07-09T14:59:25.058_2019-07-09T14:59:25.339_281ms"}
-H "Expect:" 這個一般程式是不需要的部份,在這裡是為了解決curl當要POST資料大於1024byte時,若沒加此header會卡在server回覆的HTTP/1.1 100 Continue中,然後發生SSL socket timeout,原因是curl遵照http 1.1的要求實作會先詢問server是否能處理, 確認後才會傳大量數據出去,請參考說明:curl Expect:100-continue https://blog.csdn.net/fdipzone/article/details/42463727
--data-binary這參數指定要post的binary data。http query中的參數ByetNum是這次要傳送的資料長度;參數SpeechEnd表示這次傳送是否是結束。
正常的話伺服器會回應http 200,內容包含辨識得結果(藍色粗體標示)
{"ResultStatus":"Success","SpeechIn":1,"RecognitionDone":1,"ApiProcessingTime":"2019-07-09T14:59:36.262_2019-07-09T14:59:36.778_516ms","SpeechGot":1,"Result":["開示關"]}
如果給的參數有問題, 或是比較久才給語音資料時,伺服器可能也會回http 200,但是就會帶失敗狀態和錯誤訊息{"ResultStatus":"Fail","ErrorMessage":"syncData fail, no such ReferenceId!"}
正常的話伺服器會回應http 200,內容是{"ResultStatus":"Success","ApiProcessingTime":"2019-07-09T14:58:54.033_2019-07-09T14:58:54.096_63ms"}
串起來使用就變成下面這樣
(2) 傳送語音資料
這裡演示如何傳送一整個音訊資料給iot大平台,test.pcm是錄音為pcm-16bit的16kHz聲音的資料 。如果你的語音資料是.wav, 要先除去wave header,才丟給IoT大平台。如何用Android手機產生test.pcm錄音檔,請參考https://www.cnblogs.com/renhui/p/7457321.htmlcurl -v -i \
-X POST \
-H "X-API-Key: aaaaaaaa-bbbb-cccc-dddd-123456789ab" \
-H "Content-Type: application/octet-stream" \
-H "Accept: application/json" \
-H "Expect:" \
--data-binary @test.pcm \
"https://iot.cht.com.tw/apis/CHTIoT/chtlasr/v2/MyServlet/tlasr?Action=syncData&AsrReferenceId=tlasr_116017588_20190709_145925058_009&ByteNum=104960&SpeechEnd=y"
-H "Expect:" 這個一般程式是不需要的部份,在這裡是為了解決curl當要POST資料大於1024byte時,若沒加此header會卡在server回覆的HTTP/1.1 100 Continue中,然後發生SSL socket timeout,原因是curl遵照http 1.1的要求實作會先詢問server是否能處理, 確認後才會傳大量數據出去,請參考說明:curl Expect:100-continue https://blog.csdn.net/fdipzone/article/details/42463727
--data-binary這參數指定要post的binary data。http query中的參數ByetNum是這次要傳送的資料長度;參數SpeechEnd表示這次傳送是否是結束。
正常的話伺服器會回應http 200,內容包含辨識得結果(藍色粗體標示)
{"ResultStatus":"Success","SpeechIn":1,"RecognitionDone":1,"ApiProcessingTime":"2019-07-09T14:59:36.262_2019-07-09T14:59:36.778_516ms","SpeechGot":1,"Result":["開示關"]}
如果給的參數有問題, 或是比較久才給語音資料時,伺服器可能也會回http 200,但是就會帶失敗狀態和錯誤訊息{"ResultStatus":"Fail","ErrorMessage":"syncData fail, no such ReferenceId!"}
(3) 結束辨識
curl -v -i \
-X POST \
-H "X-API-Key: aaaaaaaa-bbbb-cccc-dddd-123456789ab" \
-H "Accept: application/json" \
"https://iot.cht.com.tw/apis/CHTIoT/chtlasr/v2/MyServlet/tlasr?Action=stopRcg&AsrReferenceId=tlasr_116017588_20190709_145925058_009"
正常的話伺服器會回應http 200,內容是{"ResultStatus":"Success","ApiProcessingTime":"2019-07-09T14:58:54.033_2019-07-09T14:58:54.096_63ms"}
串起來使用就變成下面這樣
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
## settings | |
CHT_IOT_STT_API_KEY=aaaaaaaa-bbbb-cccc-dddd-123456789ab | |
PCM_FILE_FOR_STT=test.pcm | |
## script start | |
if [ ! -f "${PCM_FILE_FOR_STT}" ]; then | |
echo "ERROR:Cannot open pcm file @ ${PCM_FILE_FOR_STT}" | |
exit 1 | |
fi | |
echo "PCM File Size: $(du -b ${PCM_FILE_FOR_STT} | awk '{print $1}') byte" | |
export PYTHONIOENCODING=utf8 | |
curl -X POST \ | |
-H "X-API-Key: ${CHT_IOT_STT_API_KEY}" \ | |
-H "Accept: application/json" \ | |
"https://iot.cht.com.tw/apis/CHTIoT/chtlasr/v2/MyServlet/tlasr?Action=connect" | \ | |
python -c "import sys, json; print json.load(sys.stdin)['AsrReferenceId']" > asr_id | |
TARGET_ASR_ID=$(cat asr_id) | |
echo "ASR ID: ${TARGET_ASR_ID}" | |
if [ -n ${TARGET_ASR_ID} ]; then | |
curl -X POST \ | |
-H "X-API-Key: ${CHT_IOT_STT_API_KEY}" \ | |
-H "Content-Type: application/octet-stream" \ | |
-H "Accept: application/json" \ | |
--data-binary "@${PCM_FILE_FOR_STT}" \ | |
"https://iot.cht.com.tw/apis/CHTIoT/chtlasr/v2/MyServlet/tlasr?Action=syncData&AsrReferenceId=${TARGET_ASR_ID}&ByteNum=$(du -b ${PCM_FILE_FOR_STT} | awk '{print $1}')&SpeechEnd=y" | tee asr_res | \ | |
python -c "import sys, json; print 'STT Result:',json.load(sys.stdin)['Result'][0]" | |
curl -X POST \ | |
-H "X-API-Key: ${CHT_IOT_STT_API_KEY}" \ | |
-H "Accept: application/json" \ | |
"https://iot.cht.com.tw/apis/CHTIoT/chtlasr/v2/MyServlet/tlasr?Action=stopRcg&AsrReferenceId=${TARGET_ASR_ID}" > /dev/null | |
else | |
echo "ERROR:Cannot get asr_id" | |
fi |
留言