如果您不希望引入阿里云智能語音交互產品SDK,或者目前提供的Java、C或C++的SDK不能滿足您的要求,可以基于本文描述自行開發代碼訪問阿里語音服務。
功能介紹
阿里云智能語音交互產品通過WebSocket協議對外提供實時語音流語音轉寫功能,支持長語音。其中指令、事件皆為WebSocket協議Text類型的DataFrame,音頻流需要以Binary Frame的形式上傳至服務端,調用時序需要符合協議要求的交互流程。發送語音數據使用Websocket的二進制幀BinaryFrame,具體可參見Data Frames。
支持的輸入格式:單聲道(mono)、16 bit采樣位數,包括PCM、PCM編碼的WAV、OGG封裝的OPUS、OGG封裝的SPEEX、AMR、MP3、AAC。
支持的音頻采樣率:8000Hz/16000Hz。
支持設置返回結果:是否返回中間識別結果,在后處理中添加標點,將中文數字轉為阿拉伯數字輸出。
支持設置多語言識別:在控制臺編輯項目中進行模型選擇,詳情請參見管理項目。
鑒權
服務端通過臨時Token進行鑒權,請求時需要在URL中攜帶Token參數,Token獲取方式請參見獲取Token概述。獲取Token之后通過如下方式訪問語音服務端。
訪問類型 | 說明 | URL |
外網訪問 | 所有服務器均可使用外網訪問URL。 | wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1?token=<your token> |
上海ECS內網訪問 | 使用阿里云上海ECS(即ECS地域為華東2(上海)),可使用內網訪問URL。ECS的經典網絡不能訪問AnyTunnel,即不能在內網訪問語音服務;如果希望使用AnyTunnel,需要創建專有網絡在其內部訪問。 說明
| ws://nls-gateway-cn-shanghai-internal.aliyuncs.com:80/ws/v1?token=<your token> |
交互流程
指令及音頻流需要嚴格按照下圖所示順序發送,否則會導致和服務端交互失敗。
指令
請求指令用于控制語音識別任務的起止,標識任務邊界,以JSON格式的Text Frame方式發送服務端請求,需要在Header中設置請求的基礎信息。指令由Header和Payload兩部分組成,其中Header部分為統一格式,不同指令的Payload部分格式各不相同。
1、Header格式說明
Header格式如下:
參數 | 類型 | 是否必選 | 說明 |
appkey | String | 是 | 管控臺創建的項目Appkey。 |
message_id | String | 是 | 當次消息請求ID,隨機生成32位唯一ID。 |
task_id | String | 是 | 整個實時語音識別的會話ID,整個請求中需要保持一致,32位唯一ID。 |
namespace | String | 是 | 訪問的產品名稱,固定為“SpeechTranscriber”。 |
name | String | 是 | 指令名稱,包含StartTranscription和StopTranscription指令。具體請參見StartTranscription指令和StopTranscription指令。 |
2、StartTranscription指令
Payload對象參數說明:
參數 | 類型 | 是否必選 | 說明 |
format | String | 否 | 音頻格式,包括PCM、WAV、OPUS、SPEEX、AMR、MP3、AAC。 |
sample_rate | Integer | 否 | 音頻采樣率,默認是16000Hz,根據音頻采樣率在管控臺對應項目中配置支持該采樣率及場景的模型。 |
enable_intermediate_result | Boolean | 否 | 是否返回中間識別結果,默認是false。 |
enable_punctuation_prediction | Boolean | 否 | 是否在后處理中添加標點,默認是false。 |
enable_inverse_text_normalization | Boolean | 否 | ITN(逆文本inverse text normalization)中文數字轉換阿拉伯數字。設置為True時,中文數字將轉為阿拉伯數字輸出,默認值:False。 |
customization_id | String | 否 | 自學習模型ID。 |
vocabulary_id | String | 否 | 定制泛熱詞ID。 |
max_sentence_silence | Integer | 否 | 語音斷句檢測閾值,靜音時長超過該閾值會被認為斷句,參數范圍200ms~2000ms,默認值800ms。 |
enable_words | Boolean | 否 | 是否開啟返回詞信息,默認是false。 |
disfluency | Boolean | 否 | 過濾語氣詞,即聲音順滑,默認值false(關閉),開啟時需要設置version為4.0。 |
speech_noise_threshold | Float | 否 | 噪音參數閾值,參數范圍:[-1,1]。取值說明如下:
重要 該參數屬高級參數,調整需慎重并重點測試。 |
enable_semantic_sentence_detection | Boolean | 否 | 是否開啟語義斷句,默認是false。 |
示例代碼如下:
{
"header": {
"message_id": "05450bf69c53413f8d88aed1ee60****",
"task_id": "640bc797bb684bd6960185651307****",
"namespace": "SpeechTranscriber",
"name": "StartTranscription",
"appkey": "17d4c634****"
},
"payload": {
"format": "opus",
"sample_rate": 16000,
"enable_intermediate_result": true,
"enable_punctuation_prediction": true,
"enable_inverse_text_normalization": true
}
}
3、StopTranscription指令
StopTranscription指令要求服務端停止語音轉寫,Payload為空。示例代碼如下:
{
"header": {
"message_id": "05450bf69c53413f8d88aed1ee60****",
"task_id": "640bc797bb684bd6960185651307****",
"namespace": "SpeechTranscriber",
"name": "StopTranscription",
"appkey": "17d4c634****"
}
}
事件
事件指的是服務端返回給客戶端的處理進度事件,代表不同的處理階段,客戶端可獲取不同處理階段的事件實現不同的業務邏輯。以JSON格式返回,事件由Header和Payload兩部分組成,其中Header部分為統一格式,不同事件的Payload部分格式可能不同。
1、TranscriptionStarted事件
TranscriptionStarted事件表示服務端已經準備好了進行識別,客戶端可以發送音頻數據了。
參數 | 類型 | 說明 |
session_id | String | 客戶端請求時傳入session_id的話則原樣返回,否則由服務端自動生成32位唯一ID。 |
示例格式如下:
{
"header": {
"message_id": "05450bf69c53413f8d88aed1ee60****",
"task_id": "640bc797bb684bd6960185651307****",
"namespace": "SpeechTranscriber",
"name": "TranscriptionStarted",
"status": 20000000,
"status_message": "GATEWAY|SUCCESS|Success."
},
"payload": {
"session_id": "1231231dfdf****"
}
}
2、SentenceBegin事件
SentenceBegin事件表示服務端檢測到了一句話的開始。
參數 | 類型 | 說明 |
index | Integer | 句子編號,從1開始遞增。 |
time | Integer | 句子開始時間相對整個音頻流的開始時間,單位是毫秒。 |
示例格式如下:
{
"header": {
"message_id": "05450bf69c53413f8d88aed1ee60****",
"task_id": "640bc797bb684bd6960185651307****",
"namespace": "SpeechTranscriber",
"name": "SentenceBegin",
"status": 20000000,
"status_message": "GATEWAY|SUCCESS|Success."
},
"payload": {
"index": 1,
"time": 320
}
}
3、TranscriptionResultChanged事件
TranscriptionResultChanged事件表示識別結果發生了變化。
參數 | 類型 | 說明 |
index | Integer | 句子編號,從1開始遞增。 |
time | Integer | 當前已處理的音頻時長,單位是毫秒。 |
result | String | 當前的識別結果。 |
words | Word | 詞信息。 |
status | Integer | 狀態碼。 |
Word 結構:
參數 | 類型 | 說明 |
text | String | 文本。 |
startTime | Integer | 詞開始時間。 |
endTime | Integer | 詞結束時間。 |
示例格式如下:
{
"header":{
"message_id":"05450bf69c53413f8d88aed1ee60****",
"task_id":"640bc797bb684bd6960185651307****",
"namespace":"SpeechTranscriber",
"name":"TranscriptionResultChanged",
"status":20000000,
"status_message":"GATEWAY|SUCCESS|Success."
},
"payload":{
"index":1,
"time":1800,
"result":"今年雙十一",
"words":[
{
"text":"今年",
"startTime":1,
"endTime":2
},
{
"text":"雙十一",
"startTime":2,
"endTime":3
}
]
}
}
4、SentenceEnd事件
SentenceEnd事件表示服務端檢測到了一句話的結束。
參數 | 類型 | 說明 |
index | Integer | 句子編號,從1開始遞增。 |
time | Integer | 當前已處理的音頻時長,單位是毫秒。 |
begin_time | Integer | 這句話對應的SentenceBegin事件的時間,單位是毫秒。 |
result | String | 當前的識別結果。 |
confidence | Double | 結果置信度,取值范圍[0.0,1.0],值越大表示置信度越高。 |
words | Word | 詞信息。 |
status | Integer | 狀態碼,默認值 20000000。 |
stash_result | StashResult | 暫存結果,開啟語意斷句后會返回下一句未斷句中間結果。 |
StashResult結構:
參數 | 類型 | 說明 |
sentenceId | Integer | 句子編號,從1開始遞增。 |
beginTime | Integer | 句子開始時間。 |
text | String | 轉寫內容。 |
currentTime | Integer | 當前處理時間。 |
示例格式如下:
{
"header": {
"message_id": "05450bf69c53413f8d88aed1ee60****",
"task_id": "640bc797bb684bd6960185651307****",
"namespace": "SpeechTranscriber",
"name": "SentenceEnd",
"status": 20000000,
"status_message": "GATEWAY|SUCCESS|Success."
},
"payload": {
"index": 1,
"time": 3260,
"begin_time": 1800,
"result": "今年雙十一我要買電視"
}
}
5、TranscriptionCompleted事件
TranscriptionCompleted事件表示服務端已停止了語音轉寫。示例格式如下:
{
"header": {
"message_id": "05450bf69c53413f8d88aed1ee60****",
"task_id": "640bc797bb684bd6960185651307****",
"namespace": "SpeechTranscriber",
"name": "TranscriptionCompleted",
"status": 20000000,
"status_message": "GATEWAY|SUCCESS|Success."
}
}