# 流式语音处理
平台提供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"
}
}