# 流式語音處理
平臺提供HTTP方式語音處理能力之外,還提供流式處理能力,包括ASR、TTS等。
# 調用方式
使用 WebSocket 協議,控制報文爲使用 UTF-8 編碼的 JSON 文本。 WS接口需將將令牌放置在Authorization頭部字段中或者在URL中拼接,Header中傳遞的token具有更高優先級。 (例:詳見FAQ)。
# 調用流程
- 建立 WebSocket 連接;
- 發送 Starter 包,內容爲後續請求的通用配置信息;
- 收到響應,表示鑒權成功或失敗;
- 發送 Data 數據包;
- 收到對應返回結果,4、5 步可重複;
- 如果當前沒有更多任務,可以直接斷開(沒有鏈接斷開報文的設計);
# 調用限制
- 建立 Websocket 連接後,10 秒內未發送 Starter 包會被斷開 WebSocket 連接;
- 如果 60 秒內沒有收到任何請求,服務端會主動斷開,建議以一定間隔發送 Ping 包進行保活;
# 請求報文格式
# Starter
每次建立連接後發送的第一個包,表示此連接的目的和後續數據包的解析方式。格式爲 JSON 文本,包含以下字段:
字段 | 名稱 | 類型 | 默認值 | 說明 |
---|---|---|---|---|
type | Workflow Type | string | 必填 | 填寫能力對應的服務引擎編號或組合,例如:"TTS3"(根據所選音色的vendor_id匹配,支持3/4/5)、"ASR5"(建議選擇ASR5)、"TTS3+ASR5" |
device | Device ID | string | 空字符串 | 設備 ID,建議填寫,以便追溯和定位問題 |
session | Session ID | string | 隨機 UUIDv4 | 建議調用者自行生成 Session ID 幷填寫,以便追溯和定位問題 |
asr | ASR Config | object | 使用 ASR 能力則必填 | ASR 專屬配置,具體信息見下文 |
tts | TTS Config | object | 使用 TTS 能力則必填 | TTS 專屬配置,具體信息見下文 |
# Starter 報文樣例
{
"auth": "XSMLTGKQVVCPJCQHJZ4VEDMGIY",
"type": "ASR5",
"device": "device-weye",
"session": "8f97055c-bd29-41c7-92d1-3933fed566fa",
"asr": {
"mic_volume": 0.67
}
}
# Data
Starter 包發送幷成功建立連接後,後續可重複發送多個 Data 數據包。Data 包格式見對應能力文檔。
# 返回報文格式
# 鑒權結果
發送 Starter 請求後會返回包含鑒權結果的報文。格式爲 JSON 文本,包含以下字段:
字段 | 名稱 | 類型 | 是否必現 | 說明 |
---|---|---|---|---|
service | Service Name | string | Yes | 當前請求對應的服務模塊,即auth |
session | Session ID | string | Yes | 當前連接的 Session ID |
status | Status Name | enum | Yes | 當前會話的狀態,正常爲 ok ,失敗爲 fail |
error | Error Message | string | No | 如果失敗,返回的錯誤信息 |
# 鑒權結果樣例
{
"service": "auth",
"status": "ok",
"session": "8f97055c-bd29-41c7-92d1-3933fed566fa"
}
# 結果數據
根據能力不同,每個請求會返回一個或多個結果數據包。格式爲 JSON 文本,包含以下字段:
字段 | 名稱 | 類型 | 是否必現 | 說明 |
---|---|---|---|---|
service | Service Name | string | Yes | 當前請求對應的服務模塊 |
session | Session ID | string | Yes | 當前連接的 Session ID |
trace | Trace ID | string | Yes | 當前請求對應的 Trace ID |
status | Status Name | enum | Yes | 當前會話的狀態,正常爲 ok ,失敗爲 fail |
error | Error Message | string | No | 如果失敗,返回的錯誤信息 |
asr | ASR Content | object | No | 如果成功,返回的識別結果 |
nlp | NLP Content | object | No | 如果成功,返回的答覆結果 |
tts | TTS Content | object | No | 如果成功,返回的合成結果 |
# ASR(語音識別)能力對接說明
中控 WebSocket 全雙工接口 ASR 調用方式的說明,鏈接方式爲 WebSocket 協議,控制報文爲使用 UTF-8 編碼的 JSON 文本。 WS接口需將將令牌放置在Authorization頭部字段中或者在URL中拼接,Header中傳遞的token具有更高優先級。 (例:詳見FAQ)。
# 調用流程
- 建立 WebSocket 連接;地址通常爲
ws://aigc.softsugar.com/api/voice/stream/v1?Authorization=Bearer {token}
; - 發送 Starter 包,內容爲後續請求的通用配置信息,如果格式錯誤或超過 10 秒未發送會被斷開 WebSocket 連接;
- 收到響應,表示鑒權成功或失敗;
- 發送 Data 二進制數據包,內容爲 PCM 音頻;
- 音頻發送完成後,發送 EOF 包;(可選,不發送則需額外發送 500 毫秒以上的環境靜音,幫助 VAD 結束)
- 收到對應ASR結果,格式爲 JSON 文本;
- 發送 EOF 請求包的情况下,收到 EOF 結果包,表示所有識別結果發送完畢;
- 如果當前沒有更多語音識別任務,可以直接斷開(沒有鏈接斷開報文的設計);
# 請求報文格式
# Starter
每次建立連接後發送的第一個包,表示此連接的目的和後續數據包的解析方式。格式爲 JSON 文本,包含以下字段:
字段 | 名稱 | 類型 | 默認值 | 說明 |
---|---|---|---|---|
type | Workflow Type | string | 必填 | 填寫能力對應的服務引擎編號,中文識別請選擇:"ASR5" |
device | Device ID | string | 空字符串 | 設備 ID,建議填寫,以便追溯和定位問題 |
session | Session ID | string | 隨機 UUIDv4 | 建議調用者自行生成 Session ID 幷填寫,以便追溯和定位問題 |
asr | ASR Config | object | 必填 | ASR 專屬配置,具體信息見下文 |
ASR Config 配置見下:
字段 | 名稱 | 類型 | 默認值 | 說明 |
---|---|---|---|---|
language | Language Code | string | zh-CN | 可選字段,待識別的語言 |
mic_volume | Microphone Volume | float | 1.0 | 可選字段,麥克風音量用于 ASR 進行自增益,支持範圍爲 0 到 1 |
subtitle | Subtitle Format | string | 空字符串 | 可選字段,返回字幕的格式,空表示不返回,支持:srt |
subtitle_max_length | Subtitle Max Length | int | 0 | 可選字段,返回每行字幕的最大字數,0表示不限制字數 |
intermediate | Return Intermediate Result | bool | false | 可選字段,是否返回中間結果 |
sentence_time | Return Sentence-Level Timestamp | bool | false | 可選字段,是否返回句級別時間戳 |
word_time | Return Word-Level Timestamp | bool | false | 可選字段,是否返回字級別時間戳 |
cache_url | Return Cache URL for Data | bool | false | 可選字段,是否將字幕文件上傳 Object Store 存儲幷返回緩存 URL |
pause_time_msec | Speech Pause Time (msec) | int | 500 | 可選字段,語音暫停時間,用于判斷語音的邊界和分段,默認爲500毫秒 |
# Data
Starter 包發送幷成功建立連接後,後續可重複發送多個二進制 Data 包流式提交音頻。
輸入的音頻流格式爲 PCM,使用 16KHz 采樣率,16bit 數據位寬,單通道,小端。即 sox -t raw -r 16000 -e signed -b 16 -c 1
可轉格式,或 ffmpeg -acodec pcm_s16le -ac 1 -ar 16000 -f s16le
可轉格式。
流式與非流式 ASR 對于音頻的發送速率要求不同:
- 流式 ASR:音頻按照從麥克風讀取的速率發送,建議爲每 40 毫秒發送 1280 字節,或每 160 毫秒發送 5120 字節。
- 非流式 ASR:音頻數據可以一次性發送,每個 Data 包的大小限制在 1920KB(1 分鐘) 以內。
# EOF
音頻包發送完成後,發送 EOF 包,表示結束識別
流式與非流式 ASR 對于 EOF 包的用法要求不同:
- 流式 ASR:音頻 Data 包發送完成後,發送 EOF 包。可選,不發送則需額外發送 500 毫秒以上的環境靜音,幫助 VAD 結束。
- 非流式 ASR:音頻 Data 包發送完成後,必須發送 EOF 包。
如果需要獲取字幕,無論是否爲流式,都必須發送 EOF 包,以通知 ASR 服務端進行字幕生成。
格式爲 JSON 文本,包含以下字段:
字段 | 名稱 | 類型 | 默認值 | 說明 |
---|---|---|---|---|
signal | 結束標記 | string | 必填 | 固定爲 eof |
trace | Trace ID | string | 隨機 UUIDv4 | 可選字段,建議調用者自行生成 Trace ID 幷填寫,以便追溯和定位問題 |
# 返回報文格式
# 鑒權結果
發送 Starter 請求後會返回包含鑒權結果的報文。格式爲 JSON 文本,包含以下字段:
字段 | 名稱 | 類型 | 是否必現 | 說明 |
---|---|---|---|---|
service | Service Name | string | Yes | 當前請求對應的服務模塊,即auth |
session | Session ID | string | Yes | 當前連接的 Session ID |
status | Status Name | enum | Yes | 當前會話的狀態,正常爲 ok ,失敗爲 fail |
error | Error Message | string | No | 如果失敗,返回的錯誤信息 |
# ASR 結果數據
ASR會持續返回多個文字識別結果數據包,幷在收到 EOF 請求後返回字幕、字幕文件地址數據包。如果在 Starter 請求中未要求返回字幕和字幕地址,則僅返回文字識別結果。
返回報文的格式爲 JSON 文本,包含以下字段:
字段 | 名稱 | 類型 | 是否必現 | 說明 |
---|---|---|---|---|
service | Service Name | string | Yes | 當前請求對應的服務模塊,即asr |
session | Session ID | string | Yes | 當前連接的 Session ID |
trace | Trace ID | string | Yes | 當前句子對應的 Trace ID |
status | Status Name | enum | Yes | 當前會話的狀態,正常爲 ok ,失敗爲 fail |
error | Error Message | string | No | 如果失敗,返回的錯誤信息 |
asr | ASR Content | object | No | 如果成功,返回的識別結果,具體字段含義見下 |
具體識別結果位于 ASR Content 中:
字段 | 名稱 | 類型 | 是否必現 | 說明 |
---|---|---|---|---|
index | Index No. | int | Yes | 返回包序列號 |
type | Package Type | enum | Yes | 文字結果包爲 text ,中間結果包爲 intermediate ,字幕包爲 subtitle ,字幕地址包爲 subtitle_url ,表示全部發送完畢爲 eof |
text | Text | string | Yes | 文字識別結果,在字幕包中亦會出現,但內容爲空 |
subtitle | Subtitle | string | No | 字幕內容,僅在字幕包中有 |
subtitle_url | Subtitle URL | string | No | 字幕內容下載地址,僅在字幕包中有 |
sentence_time | Sentence-Level Timestamp | object | No | 句子級別時間戳 |
word_times | Word-Level Timestamp | object | No | 字級別時間戳 |
# 文字結果
每句被完整識別的文字都會返回一條報文,中間識別結果不返回,如果無法識別或識別結果爲空白字符,亦不返回。
文字結果樣例:
{
"service": "asr",
"status": "ok",
"session": "eab708a8-7aca-4237-a0a3-a6422ade8a23",
"trace": "c9cb36d8-3ca9-4e2b-9034-29f2c4edc3de",
"asr": {
"index": 1,
"type": "text",
"text": "你好。"
}
}
# 字幕結果
請求字幕且發送 EOF 後,返回生成的字幕結果。
字幕結果樣例:
{
"service": "asr",
"status": "ok",
"session": "eab708a8-7aca-4237-a0a3-a6422ade8a23",
"trace": "9a971f17-f871-4b73-9084-b856b67537d5",
"asr": {
"index": 3,
"type": "subtitle",
"subtitle": "1\n00:00:00,000 --> 00:00:01,280\n你好。\n\n2\n00:00:02,960 --> 00:00:04,240\n再見。\n\n"
}
}
# 字幕地址
請求字幕、請求 Cache URL
、且發送 EOF 後,返回上傳 Object Store 存儲的字幕文件緩存 URL。
{
"service": "asr",
"status": "ok",
"session": "eab708a8-7aca-4237-a0a3-a6422ade8a23",
"trace": "25b30001-0b5a-4e9e-892c-4cc4d5bf134d",
"asr": {
"index": 4,
"type": "subtitle_url",
"subtitle_url": "https://aigc.blob.core.chinacloudapi.cn/audio/asr-srt/eab708a8-7aca-4237-a0a3-a6422ade8a23_25b30001-0b5a-4e9e-892c-4cc4d5bf134d.srt"
}
}
# EOF
收到 EOF 請求的情况下,發送 EOF 結果包,表示結果全部發送完畢。
EOF 樣例:
{
"service": "asr",
"status": "ok",
"session": "eab708a8-7aca-4237-a0a3-a6422ade8a23",
"trace": "16ff049a-41fb-4c7a-ac5e-b26dbc3218e5",
"asr": {
"index": 5,
"type": "eof"
}
}
# 實際流程樣例解析
# Case 1: 最小配置流程
Request: Starter
{
"type": "ASR5",
"asr": {}
}
Request: 二進制 Data
Response: 1
{
"service": "auth",
"status": "ok",
"session": "4ea613f2-b1d4-47cf-8033-db59aae66721"
}
Response: 2
{
"service": "asr",
"session": "4ea613f2-b1d4-47cf-8033-db59aae66721",
"trace": "e1c44bdc-4f9a-487c-806e-005679db7d0d",
"asr": {
"index": 1,
"type": "text",
"text": "早知道你喜歡十裏春光"
}
}
Response: 3
{
"service": "asr",
"session": "4ea613f2-b1d4-47cf-8033-db59aae66721",
"trace": "f7551818-5025-4d83-b41b-136bb19b5b5f",
"asr": {
"index": 2,
"type": "text",
"text": "我一定會在麥田裏種滿玫瑰和山茶"
}
}
Response: 4
{
"service": "asr",
"session": "4ea613f2-b1d4-47cf-8033-db59aae66721",
"trace": "89d3a8b4-a291-4cdc-9b78-d3f912d06223",
"asr": {
"index": 3,
"type": "text",
"text": "你路過這片土地才算浪漫"
}
}
# Case 2: 完整配置流程
Request: Starter
{
"auth": "XSMLTGKQVVCPJCQHJZ4VEDMGIY",
"type": "ASR5",
"session": "8f97055c-bd29-41c7-92d1-3933fed566fa",
"asr": {
"subtitle": "srt",
"cache_url": true,
"intermediate": true,
"mic_volume": 0.67
}
}
Response: 1
{
"service": "auth",
"status": "ok",
"session": "8f97055c-bd29-41c7-92d1-3933fed566fa"
}
Request: 二進制 Data
Request: EOF
{
"signal": "eof",
"trace": "52517513-875a-47b6-bd30-f11a75e26745"
}
Response: 2
{
"service": "asr",
"status": "ok",
"session": "8f97055c-bd29-41c7-92d1-3933fed566fa",
"trace": "dcf88fbe-6cda-452d-8f51-e316cb4a0943",
"asr": {
"index": 1,
"type": "intermediate",
"text": "介"
}
}
Response: 3
{
"service": "asr",
"status": "ok",
"session": "8f97055c-bd29-41c7-92d1-3933fed566fa",
"trace": "879d4700-746f-411b-954c-f83a2c6cd300",
"asr": {
"index": 2,
"type": "intermediate",
"text": "介紹下長"
}
}
Response: 4
{
"service": "asr",
"status": "ok",
"session": "8f97055c-bd29-41c7-92d1-3933fed566fa",
"trace": "20e6a5e5-6d5d-4284-9013-4d410f1a5d37",
"asr": {
"index": 3,
"type": "intermediate",
"text": "介紹下長寧圖書"
}
}
Response: 5
{
"service": "asr",
"status": "ok",
"session": "8f97055c-bd29-41c7-92d1-3933fed566fa",
"trace": "cf7733e2-da28-442d-b5bb-282fc8f352f3",
"asr": {
"index": 4,
"type": "text",
"text": "介紹一下長寧圖書館。",
"sentence_time": {
"begin_ms": 2080,
"end_ms": 4640
},
"word_times": [
{
"begin_ms": 2080,
"end_ms": 2560,
"text": "介"
},
{
"begin_ms": 2560,
"end_ms": 2800,
"text": "紹"
},
{
"begin_ms": 2800,
"end_ms": 2920,
"text": "一"
},
{
"begin_ms": 2920,
"end_ms": 3040,
"text": "下"
},
{
"begin_ms": 3040,
"end_ms": 3280,
"text": "長"
},
{
"begin_ms": 3280,
"end_ms": 3480,
"text": "寧"
},
{
"begin_ms": 3480,
"end_ms": 3640,
"text": "圖"
},
{
"begin_ms": 3640,
"end_ms": 3880,
"text": "書"
},
{
"begin_ms": 3880,
"end_ms": 4640,
"text": "館"
}
]
}
}
Response: 6
{
"service": "asr",
"session": "8f97055c-bd29-41c7-92d1-3933fed566fa",
"trace": "3dcafe20-d6e0-4bce-a2ba-932b442e9e92",
"asr": {
"index": 5,
"type": "subtitle",
"subtitle": "1\n00:00:00,000 --> 00:00:02,280\n介紹一下長寧圖書館\n\n"
}
}
Response: 7
{
"service": "asr",
"session": "8f97055c-bd29-41c7-92d1-3933fed566fa",
"trace": "3dcafe20-d6e0-4bce-a2ba-932b442e9e92",
"asr": {
"index": 6,
"type": "subtitle_url",
"subtitle_url": "https://aigc.blob.core.chinacloudapi.cn/audio/asr-srt/8f97055c-bd29-41c7-92d1-3933fed566fa_3dcafe20-d6e0-4bce-a2ba-932b442e9e92.srt"
}
}
Response: 8
{
"service": "asr",
"session": "8f97055c-bd29-41c7-92d1-3933fed566fa",
"trace": "2bd4cbce-0f72-402c-8e88-0f2704a22868",
"asr": {
"index": 7,
"type": "eof"
}
}
# TTS(語音合成)能力對接說明(Qid)
中控 WebSocket 全雙工接口 TTS 調用方式的說明,鏈接方式爲 WebSocket 協議,報文皆爲使用 UTF-8 編碼的 JSON 文本。
# 調用流程
- 建立 WebSocket 連接,地址通常爲
ws://aigc.softsugar.com/api/voice/stream/v3?Authorization=Bearer {token}
; - 發送 Starter 包,內容爲後續 TTS 請求的通用配置信息,如果格式錯誤或超過 10 秒未發送會被斷開 WebSocket 連接;
- 收到響應,表示鑒權成功或失敗;
- 發送 Task 包,內容爲特定需要合成的文字和格式信息;
- 收到對應 Task 的數據包;
- 如果當前沒有更多語音合成任務,可以直接斷開(沒有鏈接斷開報文的設計);
# 請求報文格式
# Starter
每次建立連接後發送的第一個包,表示此連接的目的和後續數據包的解析方式。格式爲 JSON 文本,包含以下字段:
字段 | 名稱 | 類型 | 默認值 | 說明 |
---|---|---|---|---|
type | Workflow Type | string | 必填 | 僅支持填寫TTS |
device | Device ID | string | 空字符串 | 設備 ID,建議填寫,以便追溯和定位問題 |
session | Session ID | string | 隨機 UUIDv4 | 建議調用者自行生成 Session ID 幷填寫,以便追溯和定位問題 |
tts | TTS Config | object | 必填 | TTS 專屬配置,具體信息見下 |
TTS Config 配置見下:
字段 | 名稱 | 類型 | 默認值 | 說明 |
---|---|---|---|---|
qid | Qid | string | 8wfZav:AEA_Z10Mqp9GCwDGMrz8xIzi3VScxNzUtLCg | 必填字段 |
pitch_offset | Pitch Offset | float | 0.0 | 可選字段,音調,數值越大越尖銳,越低越低沉,支持範圍 [-10, 10] |
speed_ratio | Speed Ratio | float | 1.0 | 可選字段,語速,數值越大語速越慢,支持範圍 [0.5, 2] |
sample_rate | Sample Rate | int | 16000 | 可選字段,采樣率,支持:8000, 11025, 16000, 22050, 24000, 32000, 44100, 48000 |
volume | Volume | int | 100 | 可選字段,音量,數值越大聲音越大,支持範圍 [1, 400] |
format | File Format | string | pcm | 可選字段,音頻文件和內容,可能支持 pcm, wav, mp3,但只有 pcm 支持流式返回 |
omit_error | Omit Error Message in Response | bool | false | 可選字段,是否删去報錯信息,即默認會返回 |
audio | Return Audio Data | bool | true | 可選字段,是否返回音頻,默認會返回 |
phone | Return Phonetic Symbols | bool | false | 可選字段,是否返回音素,默認不返回 |
polyphone | Return Polyphone | bool | false | 可選字段,是否返回 query 中的多音字,默認不返回 |
subtitle | Subtitle Format | string | 空字符串 | 可選字段,返回格式字幕的格式,空表示不返回,支持:srt |
subtitle_max_length | Subtitle Max Length | int | 0 | 可選字段,返回每行字幕/句級別時間戳的最大字數,0表示不限制字數,僅在返回字幕或句級別時間戳時有效 |
subtitle_cut_by_punc | Subtitle Cut by Punctuation | bool | false | 可選字段,是否根據標點符號對字幕/句級別時間戳進行換行幷去掉標點,僅在返回字幕或句級別時間戳時有效。標點符號範圍見快速參考的字幕換行標點符號範圍部分 |
sentence_time | Return Sentence-Level Timestamp | bool | false | 可選字段,是否返回句級別時間戳 |
word_time | Return Word-Level Timestamp | bool | false | 可選字段,是否返回字級別時間戳 |
# Task
Starter 包發送幷成功建立連接後,後續可重複發送多個 Task 來提交合成任務。Task 包格式爲 JSON 文本,包含以下字段:
字段 | 名稱 | 類型 | 默認值 | 說明 |
---|---|---|---|---|
id | Task ID | string | 隨機 UUIDv4 | 可選字段,建議調用者自行生成幷填寫,用于區分幷發請求時不同請求的返回 |
query | Query | string | 必填 | 待合成語音的文本內容 |
ssml | Use SSML | bool | false | 可選字段,是否使用 SSML 來對合成文本進行標記,寫法參考 ONES 使用文檔 |
no_cache | Disable Cache | bool | false | 可選字段,是否爲當前請求關閉結果緩存,開啓後針對當前請求既不會使用緩存結果,也不會將結果存入緩存 |
override | TTS Config | object | 空 | 可選字段,單條 TTS 請求的獨立配置,僅爲爲當前任務完整替換 Starter 報文中的 TTS 配置(注意:是直接替換,而不是將兩者合幷) |
# 返回報文格式
# 鑒權結果
發送 Starter 請求後會返回包含鑒權結果的報文。格式爲 JSON 文本,包含以下字段:
字段 | 名稱 | 類型 | 是否必現 | 說明 |
---|---|---|---|---|
service | Service Name | string | Yes | 當前請求對應的服務模塊,即auth |
session | Session ID | string | Yes | 當前連接的 Session ID |
status | Status Name | enum | Yes | 當前會話的狀態,正常爲 ok ,失敗爲 fail |
error | Error Message | string | No | 如果失敗,返回的錯誤信息 |
# TTS 結果數據
每個成功的 Task 持續返回多個數據包,分別爲音頻、音頻文件地址、音素、音素文件地址、字幕、和字幕文件地址包。同類型數據包按照邏輯順序依次返回,不保證不同類型數據包的返回順序。如果在 Starter 請求中未要求返回音素、字幕、Cache URL
,則僅返回音頻。
返回報文的格式爲 JSON 文本,包含以下字段:
字段 | 名稱 | 類型 | 是否必現 | 說明 |
---|---|---|---|---|
service | Service Name | string | Yes | 當前請求對應的服務模塊,即tts |
session | Session ID | string | Yes | 當前連接的 Session ID |
trace | Trace ID | string | Yes | 當前 Task 對應的 Trace ID |
status | Status Name | enum | Yes | 當前 Task 的狀態,正常爲 ok ,失敗爲 fail |
error | Error Message | string | No | 如果失敗,返回的錯誤信息 |
tts | TTS Content | object | No | 如果成功,返回的合成結果,具體字段含義見下 |
具體合成結果位于 TTS Content 中:
字段 | 名稱 | 類型 | 是否必現 | 說明 |
---|---|---|---|---|
id | Task ID | string | Yes | 當前 Task 對應的 ID |
index | Index No. | int | Yes | 返回音頻包、音素包序列號 |
type | Package Type | enum | Yes | 音頻包爲 audio ,~~音頻地址包爲 audio_url ,音素包爲 phone ,音素地址包爲 phone_url ,字幕地址包爲 subtitle_url ,~~字幕包爲 subtitle ,多音字包爲 polyphone ,時間戳包爲 timestamp ,表示全部發送完畢爲eof |
audio_data | Base64-encoded Audio Data | string | No | 音頻數據,僅在音頻包中有 |
phone_data | Base64-encoded Phonetic Symbols | string | No | 音素數據,僅在音素包中有 |
polyphones | Polyphone Data | object | No | 多音字數據,僅在多音字包中有 |
subtitle_data | Base64-encoded Subtitles | string | No | 字幕數據,僅在字幕包中有 |
sentence_time | Sentence-Level Timestamp | object | No | 句子級別時間戳,僅在時間戳包中有 |
word_times | Word-Level Timestamp | object | No | 字級別時間戳,僅在時間戳包中有 |
facefeature_data | Base64-encoded Face Feature | string | No | Face Feature 數據,僅在 Face Feature 包中有 |
~~audio_url ~~ | ~~ URL of Audio File ~~ | string | No | 音頻文件 URL,僅在音頻包中有(使用 TTS2 單次返回接口時,必會返回此字段) |
phone_url | URL of JSON for Phonetic Symbols | string | No | 音素文件 URL,僅在音素包中有(使用 TTS2 單次返回接口時,必會返回此字段) |
subtitle_url | URL of Subtitle File | string | No | 字幕文件 URL,僅在字幕包中有 |
resource | Phonetic Symbols Info | object | No | 音素相關信息,僅在音素包中有(使用 TTS2 單次返回接口時,必會返回此字段) |
# 音頻包
包含 Base64 編碼的合成音頻數據結果。
當請求音頻格式爲 pcm
時,分爲多包流式返回,其他格式會在音頻合成後單包返回。
音頻包樣例:
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "851ab562-ec51-4ad7-bd21-4f4af19875cb",
"tts": {
"id": "02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb",
"index": 1,
"type": "audio",
"audio_data": "AAAAAAA...DYBfQHDAeMBEwI8AlQCRAIaAu0BpAFCAckARQCv...AAAAAAAAAAAAAAAAAAAAAAAAAAA=="
}
}
# 音素包
包含 Base64 編碼的合成音素數據結果。
音素包樣例:
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "08a5785a-a6a2-4140-b587-a6cead592531",
"tts": {
"id": "02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb",
"index": 2,
"type": "phone",
"phone_data": "biBuIGkgaSBpIGkgaSBpIDIgMiAjMSAjMSAjMSAjMSAjMSAjMSBoIGggaCBoIGggaCBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5k"
}
}
# 字幕
包含 Base64 編碼的合成字幕數據結果。
字幕包樣例:
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "d923181d-9d9b-4be1-9370-40f456be3771",
"tts": {
"id": "02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb",
"index": 4,
"type": "subtitle",
"subtitle_data": "MQowMDowMDowMCwwMDAgLS0+IDAwOjAwOjAwLDUyOArkvaDlpb3jgIIKCg=="
}
}
# 時間戳包
包含句子級別和字級別的時間戳信息。
時間戳樣例:
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "d923181d-9d9b-4be1-9370-40f456be3771",
"tts": {
"id": "4d5ed90f-2188-42a0-b4d7-db00f1a2a944",
"index": 7,
"type": "timestamp",
"sentence_time": {
"begin_ms": 7770,
"end_ms": 9140,
"text": "新人起步很不容易"
},
"word_times": [
{"begin_ms": 7770, "end_ms": 7960, "text": "新"},
{"begin_ms": 7960, "end_ms": 8120, "text": "人"},
{"begin_ms": 8120, "end_ms": 8310, "text": "起"},
{"begin_ms": 8310, "end_ms": 8430, "text": "步"},
{"begin_ms": 8430, "end_ms": 8630, "text": "很"},
{"begin_ms": 8630, "end_ms": 8720, "text": "不"},
{"begin_ms": 8720, "end_ms": 8920, "text": "容"},
{"begin_ms": 8920, "end_ms": 9140, "text": "易"}
]
}
}
# 多音字包
包含多音字信息,推薦讀音在前,其他讀音在後。
多音字樣例:
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "b2b2b2b2-b2b2-b2b2-b2b2-b2b2b2b2b2b2",
"tts": {
"id": "a5e8b592-f0b1-46ad-bc97-836cbb010310",
"index": 4,
"type": "polyphone",
"polyphones": [
{
"word": "好",
"phones": ["hao3", "hao4"]
}
]
}
}
# EOF
EOF 結果包,表示結果全部發送完畢。
EOF 樣例:
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "d923181d-9d9b-4be1-9370-40f456be3771",
"tts": {
"id": "02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb",
"index": 8,
"type": "eof"
}
}
# 實際流程樣例解析
# Case 1: 最小配置流程
Request: Starter
{
"type": "TTS",
"tts": {}
}
Response: 1
{
"service": "auth",
"status": "ok",
"session": "49d3af81-f344-4ccf-8231-574ceac1a260"
}
Request: Task
{
"query": "大家好!"
}
Response: 2
{
"service": "tts",
"status": "ok",
"session": "49d3af81-f344-4ccf-8231-574ceac1a260",
"trace": "f2e13c02-c629-4db8-a942-4393583a5182",
"tts": {
"id": "4b69geebj4septyxh72qy885f",
"index": 1,
"type": "audio",
"audio_data": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA...//wkA/P8CAP//AAD4/wMA0v8oAL3/...AAAAAAAAAAAAA=="
}
}
# Case 2: 完整配置流程
Request: Starter
{
"auth": "XSMLTGKQVVCPJCQHJZ4VEDMGIY",
"type": "TTS3",
"device": "device-wei",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"tts": {
"qid": "8wfZav:AEA_Z10Mqp9GCwDGMrz8xIzi3VScxNzUtLCg",
"speed_ratio": 1.05,
"sample_rate": 16000,
"volume": 200,
"phone": true,
"polyphone": true,
"subtitle": "srt",
"sentence_time": true,
"word_time": true,
"cache_url": true
}
}
Response: 1
{
"service": "auth",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a"
}
Request: Task
{
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"query": "你好。",
"ssml": false
}
Response: 2 音頻
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "335d508e-688f-4fc1-b057-4a4aa78b9ee7",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 1,
"type": "audio",
"audio_data": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA...//wkA/P8CAP//AAD4/wMA0v8oAL3/...AAAAAAAAAAAAA=="
}
}
Response: 3 音素
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "08a5785a-a6a2-4140-b587-a6cead592531",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 2,
"type": "phone",
"phone_data": "aiBqIGluIGluIGluIGluIGluIG...ZCBlbmQgZW5k"
}
}
Response: 4 時間戳
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "08a5785a-a6a2-4140-b587-a6cead592531",
"tts": {
"id": "de9a1066-d968-475a-ac38-b2da017b2a27",
"index": 3,
"type": "timestamp",
"sentence_time": {
"begin_ms": 500,
"end_ms": 1010,
"text": "你好。"
},
"word_times": [
{"begin_ms": 500, "end_ms": 590, "text": "你"},
{"begin_ms": 590, "end_ms": 1010, "text": "好"}
]
}
}
Response: 5 多音字
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "08a5785a-a6a2-4140-b587-a6cead592531",
"tts": {
"id": "a5e8b592-f0b1-46ad-bc97-836cbb010310",
"index": 4,
"type": "polyphone",
"polyphones": [
{
"word": "好",
"phones": ["hao3", "hao4"]
}
]
}
}
Response: 6 字幕
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "d923181d-9d9b-4be1-9370-40f456be3771",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 5,
"type": "subtitle",
"subtitle_data": "MQowMDowMDowMCwwMDAgLS0+IDAwOjAwOjAwLDUyOArkvaDlpb3jgIIKCg=="
}
}
Response: 7 EOF
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "d923181d-9d9b-4be1-9370-40f456be3771",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 9,
"type": "eof"
}
}
# LLM(大語言模型)能力對接說明
中控 WebSocket 全雙工接口 LLM 調用方式的說明,鏈接方式爲 WebSocket 協議,控制報文爲使用 UTF-8 編碼的 JSON 文本。 WS接口需將將令牌放置在Authorization頭部字段中或者在URL中拼接,Header中傳遞的token具有更高優先級。 (例:詳見FAQ)。
# 調用流程
- 建立 WebSocket 連接;地址通常爲
ws://aigc.softsugar.com/api/voice/stream/v1?Authorization=Bearer {token}
; - 發送 Starter 包,內容爲後續請求的通用配置信息,如果格式錯誤或超過 10 秒未發送會被斷開 WebSocket 連接;
- 收到響應,表示鑒權成功或失敗;
- 發送 Data 二進制數據包,內容爲 PCM 音頻;
- 音頻發送完成後,發送 EOF 包;(可選,不發送則需額外發送 500 毫秒以上的環境靜音,幫助 VAD 結束)
- 收到對應ASR結果,格式爲 JSON 文本;
- 發送 EOF 請求包的情况下,收到 EOF 結果包,表示所有識別結果發送完畢;
- 如果當前沒有更多語音識別任務,可以直接斷開(沒有鏈接斷開報文的設計);
# 請求報文格式
# Starter
每次建立連接後發送的第一個包,表示此連接的目的和後續數據包的解析方式。格式爲 JSON 文本,包含以下字段:
字段 | 名稱 | 類型 | 默認值 | 說明 |
---|---|---|---|---|
type | Workflow Type | string | 必填 | 填寫能力對應的服務引擎編號,例如:“NLP7” NLP7(sensechat),NLP10(商湯擬人大模型) |
device | Device ID | string | 空字符串 | 設備 ID,建議填寫,以便追溯和定位問題 |
session | Session ID | string | 隨機 UUIDv4 | 建議調用者自行生成 Session ID 幷填寫,以便追溯和定位問題 |
nlp | NLP Config | object | 必填 | NLP 專屬配置,具體信息見下 |
NLP Config 配置見下:
字段 | 名稱 | 類型 | 默認值 | 說明 |
---|---|---|---|---|
omit_error | Omit Error Message in Response | bool | false | 可選字段,是否删去報錯信息,即默認會返回 |
know_ids | Knowledge IDs | string list | 空列表 | 可選字段,知識庫 ID 列表,僅部分語言大模型引擎支持 |
prompt_header | System Role of Prompt | string | 空字符串 | 可選字段,Prompt 的背景描述,爲空時使用配置中的預設值,僅部分語言大模型引擎支持。 NLP10(擬人大模型)有專門的json定義,需要按照要求傳輸。 |
max_reply_token | Max Toke in Reply | int | 500 | 可選字段,回復內容的最大 token 數,實際最大可用值和模型相關,僅部分語言大模型引擎支持 |
# Query
Starter 包發送幷成功建立連接後,後續可發送多個 Query 文本包提交用戶問題,格式爲 JSON 文本,包含以下字段:
字段 | 名稱 | 類型 | 默認值 | 說明 |
---|---|---|---|---|
id | Trace ID | string | 隨機 UUIDv4 | 可選字段,建議調用者自行生成幷填寫,用于區分幷發請求時不同請求的返回 |
query | Query | string | 必填 | 用戶問題的文本內容 |
# 返回報文格式
# 鑒權結果
發送 Starter 請求後會返回包含鑒權結果的報文。格式爲JSon文本,包含以下字段:
字段 | 名稱 | 類型 | 是否必現 | 說明 |
---|---|---|---|---|
service | Service Name | string | Yes | 當前請求對應的服務模塊,即auth |
session | Session ID | string | Yes | 當前連接的 Session ID |
status | Status Name | enum | Yes | 當前會話的狀態,正常爲 ok ,失敗爲 fail |
error | Error Message | string | No | 如果失敗,返回的錯誤信息 |
# NLP 結果數據
針對每一條成功處理的 Query ,都會有一條報文返回,當 omit_error
爲 false
時,出錯報文亦會返回。返回報文的基本格式見下:
字段 | 名稱 | 類型 | 是否必現 | 說明 |
---|---|---|---|---|
service | Service Name | string | Yes | 當前請求對應的服務模塊,即nlp |
session | Session ID | string | Yes | 當前連接的 Session ID |
trace | Trace ID | string | Yes | 當前句子對應的 Trace ID |
status | Status Name | enum | Yes | 當前會話的狀態,正常爲 ok ,失敗爲 fail |
error | Error Message | string | No | 如果失敗,返回的錯誤信息 |
nlp | NLP Content | object | No | 如果成功,返回的答覆結果,具體字段含義見下 |
具體識別結果位于 NLP Content 中:
字段 | 名稱 | 類型 | 是否必現 | 說明 |
---|---|---|---|---|
index | Index No. | int | Yes | 返回包序列號 |
query | Query | string | Yes | 提交的問題文本 |
answer | Answer | string | Yes | 返回的播報文本,數字人前端調用 TTS 進行播報 |
text | Text | string | No | 返回的展示文本,數字人前端上屏作爲文本展示 |
finish_reason | Text | string | Yes | 停止生成的原因,枚舉值 因結束符停止生成: stop 因達到最大生成長度停止生成: length 因觸發敏感詞停止生成: sensitive 因觸發模型上下文長度限制(若要繼續接受後續內容,則在下一條query中發送“請繼續”): context |
# 擬人大模型(NLP10)參數定義
# 數據定義:
名稱 | 類型 | 必須 | 默認值 | 可選值 | 描述 |
---|---|---|---|---|---|
name | string | 是 | - | - | 角色姓名,長度不超過50個Unicode字符 |
gender | string | 是 | - | - | 角色性別,長度不超過50個Unicode字符 |
identity | string | 否 | - | - | 角色身份,長度不超過200個Unicode字符 |
nickname | string | 否 | - | - | 角色別名,長度不超過50個Unicode字符 |
feeling_toward | object[] | 否 | - | - | 好感度設定 |
detail_setting | string | 否 | - | - | 詳細設定,長度不超過500個Unicode字符 |
other_setting | json string | 否 | - | - | 其他設定,長度不超過3000個Unicode字符 |
feeling_toward定義:
名稱 | 類型 | 必須 | 默認值 | 可選值 | 描述 |
---|---|---|---|---|---|
name | string | 是 | - | - | 角色姓名,只能選擇character_settings 中已設定的name |
level | int | 是 | - | [1,3] | 對該角色的好感度,數字越大代表好感度越高 |
參考示例:
"prompt_header": "[{\"name\":\"周梓柔\",\"gender\":\"女\",\"identity\":\"我一直信賴的姐姐\",\"nickname\":\"\",\"feeling_toward\":[{\"name\":\"弟弟\",\"level\":3}],\"detail_setting\":\"周梓柔具有卓越成就感,學業和職場表現都極爲杰出,從小就是個學霸,經常被長輩提及爲榜樣。外表冷艶,給人以遠離塵囂的印象,令人印象深刻的氣質既獨立又自信。對外或許保持距離,但在我面前總是展現出無限的溫柔與包容,耐心傾聽我的煩惱,用細膩的關懷化解我的困惑。MBTI人格是ENTJ。\",\"other_setting\":\"\"},{\"name\":\"弟弟\",\"gender\":\"男\",\"identity\":\"弟弟\",\"nickname\":\"\",\"detail_setting\":\"周梓柔總是在弟弟面前展現出無限的溫柔與包容,耐心傾聽我的煩惱,用細膩的關懷化解我的困惑。\",\"other_setting\":\"\"}]"
# TTS(語音合成)能力對接說明(舊)
注:本接口目前維護狀態,不在更新新功能。
中控 WebSocket 全雙工接口 TTS 調用方式的說明,鏈接方式爲 WebSocket 協議,報文皆爲使用 UTF-8 編碼的 JSON 文本。
# 調用流程
- 建立 WebSocket 連接,地址通常爲
ws://aigc.softsugar.com/api/voice/stream/v1?Authorization={Token}
; - 發送 Starter 包,內容爲後續 TTS 請求的通用配置信息,如果格式錯誤或超過 10 秒未發送會被斷開 WebSocket 連接;
- 收到響應,表示鑒權成功或失敗;
- 發送 Task 包,內容爲特定需要合成的文字和格式信息;
- 收到對應 Task 的數據包;
- 如果當前沒有更多語音合成任務,可以直接斷開(沒有鏈接斷開報文的設計);
# 請求報文格式
# Starter
每次建立連接後發送的第一個包,表示此連接的目的和後續數據包的解析方式。格式爲 JSON 文本,包含以下字段:
字段 | 名稱 | 類型 | 默認值 | 說明 |
---|---|---|---|---|
auth | AuthN Token | string | 空字符串 | 設備鑒權 Token,如服務端開啓鑒權則必填 |
type | Workflow Type | string | 必填 | 填寫能力對應的服務引擎編號,例如:"TTS3" |
device | Device ID | string | 空字符串 | 設備 ID,建議填寫,以便追溯和定位問題 |
session | Session ID | string | 隨機 UUIDv4 | 建議調用者自行生成 Session ID 幷填寫,以便追溯和定位問題 |
tts | TTS Config | object | 必填 | TTS 專屬配置,具體信息見下 |
TTS Config 配置見下:
字段 | 名稱 | 類型 | 默認值 | 說明 |
---|---|---|---|---|
language | Language Code | string | zh-CN | 可選字段,待合成的語言,需發音人支持 |
voice | Voice ID | string | 服務引擎不同,默認發音人不同 | 可選字段,可選發音人 |
pitch_offset | Pitch Offset | float | 0.0 | 可選字段,音調,數值越大越尖銳,越低越低沉,支持範圍 [-10, 10] |
style | Style | string | 空 | 可選字段,表示發音人的情感 |
speed_ratio | Speed Ratio | float | 1.0 | 可選字段,語速,數值越大語速越慢,支持範圍 [0.5, 2] |
sample_rate | Sample Rate | int | 16000 | 可選字段,采樣率,支持:8000, 11025, 16000, 22050, 24000, 32000, 44100, 48000 |
volume | Volume | int | 100 | 可選字段,音量,數值越大聲音越大,支持範圍 [1, 400] |
format | File Format | string | pcm | 可選字段,音頻文件和內容,可能支持 pcm, wav, mp3,但只有 pcm 支持流式返回 |
omit_error | Omit Error Message in Response | bool | false | 可選字段,是否删去報錯信息,即默認會返回 |
audio | Return Audio Data | bool | true | 可選字段,是否返回音頻,默認會返回 |
phone | Return Phonetic Symbols | bool | false | 可選字段,是否返回音素,默認不返回 |
polyphone | Return Polyphone | bool | false | 可選字段,是否返回 query 中的多音字,默認不返回 |
subtitle | Subtitle Format | string | 空字符串 | 可選字段,返回格式字幕的格式,空表示不返回,支持:srt |
subtitle_max_length | Subtitle Max Length | int | 0 | 可選字段,返回每行字幕/句級別時間戳的最大字數,0表示不限制字數,僅在返回字幕或句級別時間戳時有效 |
subtitle_cut_by_punc | Subtitle Cut by Punctuation | bool | false | 可選字段,是否根據標點符號對字幕/句級別時間戳進行換行幷去掉標點,僅在返回字幕或句級別時間戳時有效。標點符號範圍見快速參考的字幕換行標點符號範圍部分 |
sentence_time | Return Sentence-Level Timestamp | bool | false | 可選字段,是否返回句級別時間戳 |
word_time | Return Word-Level Timestamp | bool | false | 可選字段,是否返回字級別時間戳 |
cache_url | false |
# Task
Starter 包發送幷成功建立連接後,後續可重複發送多個 Task 來提交合成任務。Task 包格式爲 JSON 文本,包含以下字段:
字段 | 名稱 | 類型 | 默認值 | 說明 |
---|---|---|---|---|
id | Task ID | string | 隨機 UUIDv4 | 可選字段,建議調用者自行生成幷填寫,用于區分幷發請求時不同請求的返回 |
query | Query | string | 必填 | 待合成語音的文本內容 |
ssml | Use SSML | bool | false | 可選字段,是否使用 SSML 來對合成文本進行標記,寫法參考 ONES 使用文檔 |
no_cache | Disable Cache | bool | false | 可選字段,是否爲當前請求關閉結果緩存,開啓後針對當前請求既不會使用緩存結果,也不會將結果存入緩存 |
override | TTS Config | object | 空 | 可選字段,單條 TTS 請求的獨立配置,僅爲爲當前任務完整替換 Starter 報文中的 TTS 配置(注意:是直接替換,而不是將兩者合幷) |
# 返回報文格式
# 鑒權結果
發送 Starter 請求後會返回包含鑒權結果的報文。格式爲 JSON 文本,包含以下字段:
字段 | 名稱 | 類型 | 是否必現 | 說明 |
---|---|---|---|---|
service | Service Name | string | Yes | 當前請求對應的服務模塊,即auth |
session | Session ID | string | Yes | 當前連接的 Session ID |
status | Status Name | enum | Yes | 當前會話的狀態,正常爲 ok ,失敗爲 fail |
error | Error Message | string | No | 如果失敗,返回的錯誤信息 |
# TTS 結果數據
每個成功的 Task 持續返回多個數據包,分別爲音頻、音頻文件地址、音素、音素文件地址、字幕、和字幕文件地址包。同類型數據包按照邏輯順序依次返回,不保證不同類型數據包的返回順序。如果在 Starter 請求中未要求返回音素、字幕、Cache URL
,則僅返回音頻。
返回報文的格式爲 JSON 文本,包含以下字段:
字段 | 名稱 | 類型 | 是否必現 | 說明 |
---|---|---|---|---|
service | Service Name | string | Yes | 當前請求對應的服務模塊,即tts |
session | Session ID | string | Yes | 當前連接的 Session ID |
trace | Trace ID | string | Yes | 當前 Task 對應的 Trace ID |
status | Status Name | enum | Yes | 當前 Task 的狀態,正常爲 ok ,失敗爲 fail |
error | Error Message | string | No | 如果失敗,返回的錯誤信息 |
tts | TTS Content | object | No | 如果成功,返回的合成結果,具體字段含義見下 |
具體合成結果位于 TTS Content 中:
字段 | 名稱 | 類型 | 是否必現 | 說明 |
---|---|---|---|---|
id | Task ID | string | Yes | 當前 Task 對應的 ID |
index | Index No. | int | Yes | 返回音頻包、音素包序列號 |
type | Package Type | enum | Yes | 音頻包爲 audio ,音頻地址包爲 audio_url ,音素包爲 phone ,~~音素地址包爲 phone_url ,字幕包爲 subtitle ,字幕地址包爲 subtitle_url ,~~多音字包爲 polyphone ,時間戳包爲 timestamp ,表示全部發送完畢爲eof |
audio_data | Base64-encoded Audio Data | string | No | 音頻數據,僅在音頻包中有 |
phone_data | Base64-encoded Phonetic Symbols | string | No | 音素數據,僅在音素包中有 |
polyphones | Polyphone Data | object | No | 多音字數據,僅在多音字包中有 |
subtitle_data | Base64-encoded Subtitles | string | No | 字幕數據,僅在字幕包中有 |
sentence_time | Sentence-Level Timestamp | object | No | 句子級別時間戳,僅在時間戳包中有 |
word_times | Word-Level Timestamp | object | No | 字級別時間戳,僅在時間戳包中有 |
resource | Phonetic Symbols Info | object | No | 音素相關信息,僅在音素包中有(使用 TTS2 單次返回接口時,必會返回此字段) |
# 音頻包
包含 Base64 編碼的合成音頻數據結果。
當請求音頻格式爲 pcm
時,分爲多包流式返回,其他格式會在音頻合成後單包返回。
音頻包樣例:
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "851ab562-ec51-4ad7-bd21-4f4af19875cb",
"tts": {
"id": "02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb",
"index": 1,
"type": "audio",
"audio_data": "AAAAAAA...DYBfQHDAeMBEwI8AlQCRAIaAu0BpAFCAckARQCv...AAAAAAAAAAAAAAAAAAAAAAAAAAA=="
}
}
# 音素包
包含 Base64 編碼的合成音素數據結果。
音素包樣例:
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "08a5785a-a6a2-4140-b587-a6cead592531",
"tts": {
"id": "02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb",
"index": 2,
"type": "phone",
"phone_data": "biBuIGkgaSBpIGkgaSBpIDIgMiAjMSAjMSAjMSAjMSAjMSAjMSBoIGggaCBoIGggaCBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBhbyBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5k"
}
}
# 字幕
包含 Base64 編碼的合成字幕數據結果。
字幕包樣例:
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "d923181d-9d9b-4be1-9370-40f456be3771",
"tts": {
"id": "02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb",
"index": 4,
"type": "subtitle",
"subtitle_data": "MQowMDowMDowMCwwMDAgLS0+IDAwOjAwOjAwLDUyOArkvaDlpb3jgIIKCg=="
}
}
# 時間戳包
包含句子級別和字級別的時間戳信息。
時間戳樣例:
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "d923181d-9d9b-4be1-9370-40f456be3771",
"tts": {
"id": "4d5ed90f-2188-42a0-b4d7-db00f1a2a944",
"index": 7,
"type": "timestamp",
"sentence_time": {
"begin_ms": 7770,
"end_ms": 9140,
"text": "新人起步很不容易"
},
"word_times": [
{"begin_ms": 7770, "end_ms": 7960, "text": "新"},
{"begin_ms": 7960, "end_ms": 8120, "text": "人"},
{"begin_ms": 8120, "end_ms": 8310, "text": "起"},
{"begin_ms": 8310, "end_ms": 8430, "text": "步"},
{"begin_ms": 8430, "end_ms": 8630, "text": "很"},
{"begin_ms": 8630, "end_ms": 8720, "text": "不"},
{"begin_ms": 8720, "end_ms": 8920, "text": "容"},
{"begin_ms": 8920, "end_ms": 9140, "text": "易"}
]
}
}
# 多音字包
包含多音字信息,推薦讀音在前,其他讀音在後。
多音字樣例:
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "b2b2b2b2-b2b2-b2b2-b2b2-b2b2b2b2b2b2",
"tts": {
"id": "a5e8b592-f0b1-46ad-bc97-836cbb010310",
"index": 4,
"type": "polyphone",
"polyphones": [
{
"word": "好",
"phones": ["hao3", "hao4"]
}
]
}
}
# EOF
EOF 結果包,表示結果全部發送完畢。
EOF 樣例:
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "d923181d-9d9b-4be1-9370-40f456be3771",
"tts": {
"id": "02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb",
"index": 8,
"type": "eof"
}
}
# 實際流程樣例解析
# Case 1: 最小配置流程
Request: Starter
{
"type": "TTS3",
"tts": {}
}
Response: 1
{
"service": "auth",
"status": "ok",
"session": "49d3af81-f344-4ccf-8231-574ceac1a260"
}
Request: Task
{
"query": "大家好!"
}
Response: 2
{
"service": "tts",
"status": "ok",
"session": "49d3af81-f344-4ccf-8231-574ceac1a260",
"trace": "f2e13c02-c629-4db8-a942-4393583a5182",
"tts": {
"id": "4b69geebj4septyxh72qy885f",
"index": 1,
"type": "audio",
"audio_data": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA...//wkA/P8CAP//AAD4/wMA0v8oAL3/...AAAAAAAAAAAAA=="
}
}
# Case 2: 完整配置流程
Request: Starter
{
"auth": "XSMLTGKQVVCPJCQHJZ4VEDMGIY",
"type": "TTS3",
"device": "device-wei",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"tts": {
"language": "zh-CN",
"voice": "xiaoling",
"speed_ratio": 1.05,
"sample_rate": 16000,
"volume": 200,
"phone": true,
"polyphone": true,
"subtitle": "srt",
"sentence_time": true,
"word_time": true
}
}
Response: 1
{
"service": "auth",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a"
}
Request: Task
{
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"query": "你好。",
"ssml": false
}
Response: 2 音頻
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "335d508e-688f-4fc1-b057-4a4aa78b9ee7",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 1,
"type": "audio",
"audio_data": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA...//wkA/P8CAP//AAD4/wMA0v8oAL3/...AAAAAAAAAAAAA=="
}
}
Response: 3 音素
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "08a5785a-a6a2-4140-b587-a6cead592531",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 2,
"type": "phone",
"phone_data": "aiBqIGluIGluIGluIGluIGluIG...ZCBlbmQgZW5k"
}
}
Response: 4 時間戳
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "08a5785a-a6a2-4140-b587-a6cead592531",
"tts": {
"id": "de9a1066-d968-475a-ac38-b2da017b2a27",
"index": 3,
"type": "timestamp",
"sentence_time": {
"begin_ms": 500,
"end_ms": 1010,
"text": "你好。"
},
"word_times": [
{"begin_ms": 500, "end_ms": 590, "text": "你"},
{"begin_ms": 590, "end_ms": 1010, "text": "好"}
]
}
}
Response: 5 多音字
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "08a5785a-a6a2-4140-b587-a6cead592531",
"tts": {
"id": "a5e8b592-f0b1-46ad-bc97-836cbb010310",
"index": 4,
"type": "polyphone",
"polyphones": [
{
"word": "好",
"phones": ["hao3", "hao4"]
}
]
}
}
Response: 6 字幕
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "d923181d-9d9b-4be1-9370-40f456be3771",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 5,
"type": "subtitle",
"subtitle_data": "MQowMDowMDowMCwwMDAgLS0+IDAwOjAwOjAwLDUyOArkvaDlpb3jgIIKCg=="
}
}
Response: 7 EOF
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "d923181d-9d9b-4be1-9370-40f456be3771",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 9,
"type": "eof"
}
}