# 流式語音處理

平臺提供HTTP方式語音處理能力之外,還提供流式處理能力,包括ASR、TTS等。

# 調用方式

使用 WebSocket 協議,控制報文爲使用 UTF-8 編碼的 JSON 文本。 WS接口需將將令牌放置在Authorization頭部字段中或者在URL中拼接,Header中傳遞的token具有更高優先級。 (例:詳見FAQ)。

# 調用流程

  1. 建立 WebSocket 連接;
  2. 發送 Starter 包,內容爲後續請求的通用配置信息;
  3. 收到響應,表示鑒權成功或失敗;
  4. 發送 Data 數據包;
  5. 收到對應返回結果,4、5 步可重複;
  6. 如果當前沒有更多任務,可以直接斷開(沒有鏈接斷開報文的設計);

# 調用限制

  1. 建立 Websocket 連接後,10 秒內未發送 Starter 包會被斷開 WebSocket 連接;
  2. 如果 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)。

# 調用流程

  1. 建立 WebSocket 連接;地址通常爲 ws://aigc.softsugar.com/api/voice/stream/v1?Authorization=Bearer {token}
  2. 發送 Starter 包,內容爲後續請求的通用配置信息,如果格式錯誤或超過 10 秒未發送會被斷開 WebSocket 連接;
  3. 收到響應,表示鑒權成功或失敗;
  4. 發送 Data 二進制數據包,內容爲 PCM 音頻;
  5. 音頻發送完成後,發送 EOF 包;(可選,不發送則需額外發送 500 毫秒以上的環境靜音,幫助 VAD 結束)
  6. 收到對應ASR結果,格式爲 JSON 文本;
  7. 發送 EOF 請求包的情况下,收到 EOF 結果包,表示所有識別結果發送完畢;
  8. 如果當前沒有更多語音識別任務,可以直接斷開(沒有鏈接斷開報文的設計);

# 請求報文格式

# 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 文本。

# 調用流程

  1. 建立 WebSocket 連接,地址通常爲 ws://aigc.softsugar.com/api/voice/stream/v3?Authorization=Bearer {token}
  2. 發送 Starter 包,內容爲後續 TTS 請求的通用配置信息,如果格式錯誤或超過 10 秒未發送會被斷開 WebSocket 連接;
  3. 收到響應,表示鑒權成功或失敗;
  4. 發送 Task 包,內容爲特定需要合成的文字和格式信息;
  5. 收到對應 Task 的數據包;
  6. 如果當前沒有更多語音合成任務,可以直接斷開(沒有鏈接斷開報文的設計);

# 請求報文格式

# 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)。

# 調用流程

  1. 建立 WebSocket 連接;地址通常爲 ws://aigc.softsugar.com/api/voice/stream/v1?Authorization=Bearer {token}
  2. 發送 Starter 包,內容爲後續請求的通用配置信息,如果格式錯誤或超過 10 秒未發送會被斷開 WebSocket 連接;
  3. 收到響應,表示鑒權成功或失敗;
  4. 發送 Data 二進制數據包,內容爲 PCM 音頻;
  5. 音頻發送完成後,發送 EOF 包;(可選,不發送則需額外發送 500 毫秒以上的環境靜音,幫助 VAD 結束)
  6. 收到對應ASR結果,格式爲 JSON 文本;
  7. 發送 EOF 請求包的情况下,收到 EOF 結果包,表示所有識別結果發送完畢;
  8. 如果當前沒有更多語音識別任務,可以直接斷開(沒有鏈接斷開報文的設計);

# 請求報文格式

# 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_errorfalse 時,出錯報文亦會返回。返回報文的基本格式見下:

字段 名稱 類型 是否必現 說明
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 文本。

# 調用流程

  1. 建立 WebSocket 連接,地址通常爲 ws://aigc.softsugar.com/api/voice/stream/v1?Authorization={Token}
  2. 發送 Starter 包,內容爲後續 TTS 請求的通用配置信息,如果格式錯誤或超過 10 秒未發送會被斷開 WebSocket 連接;
  3. 收到響應,表示鑒權成功或失敗;
  4. 發送 Task 包,內容爲特定需要合成的文字和格式信息;
  5. 收到對應 Task 的數據包;
  6. 如果當前沒有更多語音合成任務,可以直接斷開(沒有鏈接斷開報文的設計);

# 請求報文格式

# 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 Return Cache URL for Data bool false 可選字段,是否將音頻、音素、字幕文件上傳 Object Store 存儲幷返回緩存 URL。已删除字段,不再進行維護,請儘快停止使用。

# 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"
  }
}
最後更新: 2025/2/5 下午5:54:45