# 流式语音处理
平台提供HTTP方式语音处理能力之外,还提供流式处理能力,包括ASR、TTS等。
# 调用方式
使用 WebSocket 协议,控制报文为使用 UTF-8 编码的 JSON 文本。WS接口需将token信息拼写到URL上(例:ws://aigc.softsugar.com/api/voice/stream/v1?Authorization=Bearer {token})。
# 调用流程
- 建立 WebSocket 连接;
- 发送 Starter 包,内容为后续请求的通用配置信息;
- 收到响应,表示鉴权成功或失败;
- 发送 Data 数据包;
- 收到对应返回结果,4、5 步可重复;
- 如果当前没有更多任务,可以直接断开(没有链接断开报文的设计);
# 调用限制
- 建立 Websocket 连接后,10 秒内未发送 Starter 包会被断开 WebSocket 连接;
- 如果 60 秒内没有收到任何请求,服务端会主动断开,建议以一定间隔发送 Ping 包进行保活;
# 请求报文格式
# Starter
每次建立连接后发送的第一个包,表示此连接的目的和后续数据包的解析方式。格式为 JSON 文本,包含以下字段:
字段 | 名称 | 类型 | 默认值 | 说明 |
---|---|---|---|---|
auth | AuthN Token | string | 空字符串 | 设备鉴权 Token,如服务端开启鉴权则必填 |
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接口需将token信息拼写到URL上。
# 调用流程
- 建立 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 文本,包含以下字段:
字段 | 名称 | 类型 | 默认值 | 说明 |
---|---|---|---|---|
auth | AuthN Token | string | 空字符串 | 设备鉴权 Token,如服务端开启鉴权则必填 |
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 文本,包含以下字段:
字段 | 名称 | 类型 | 默认值 | 说明 |
---|---|---|---|---|
auth | AuthN Token | string | 空字符串 | 设备鉴权 Token,如服务端开启鉴权则必填 |
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 中的多音字,默认不返回 |
facefeature | Face Feature ID | string | 空字符串 | 可选字段,返回 Face Feature 的对应模型的 ID,空表示不返回 |
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 ,Face Feature 包为 facefeature ,时间戳包为 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=="
}
}
# 音频地址
包含上传至 Object Store 存储的音频文件缓存 URL。
音频地址样例:
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "851ab562-ec51-4ad7-bd21-4f4af19875cb",
"tts": {
"id": "02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb",
"index": 6,
"type": "audio_url",
"audio_url": "https://aigc.blob.core.chinacloudapi.cn/audio/tts-audio/02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb_851ab562-ec51-4ad7-bd21-4f4af19875cb.pcm"
}
}
# 音素包
包含 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"
}
}
# 音素地址
包含上传至 Object Store 存储的音素文件缓存 URL。
音素地址样例:
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "08a5785a-a6a2-4140-b587-a6cead592531",
"tts": {
"id": "02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb",
"index": 7,
"type": "phone_url",
"phone_url": "https://aigc.blob.core.chinacloudapi.cn/audio/tts-phone/02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb_08a5785a-a6a2-4140-b587-a6cead592531.phone"
}
}
# 字幕
包含 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=="
}
}
# 字幕地址
包含上传至 Object Store 存储的字幕文件缓存 URL。
字幕地址样例:
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "d923181d-9d9b-4be1-9370-40f456be3771",
"tts": {
"id": "02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb",
"index": 5,
"type": "subtitle_url",
"subtitle_url": "https://aigc.blob.core.chinacloudapi.cn/audio/tts-srt/02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb_d923181d-9d9b-4be1-9370-40f456be3771.srt"
}
}
# 时间戳包
包含句子级别和字级别的时间戳信息。
时间戳样例:
{
"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"]
}
]
}
}
# Face Feature
// 结果待定,视研究侧返回内容确定
# 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 多音字
```json
{
"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 字幕地址
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "d923181d-9d9b-4be1-9370-40f456be3771",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 6,
"type": "subtitle_url",
"subtitle_url": "https://aigc.blob.core.chinacloudapi.cn/audio/tts-srt/02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb_d923181d-9d9b-4be1-9370-40f456be3771.srt"
}
}
Response: 8 音频地址
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "335d508e-688f-4fc1-b057-4a4aa78b9ee7",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 7,
"type": "audio_url",
"audio_url": "https://aigc.blob.core.chinacloudapi.cn/audio/tts-audio/02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb_851ab562-ec51-4ad7-bd21-4f4af19875cb.pcm"
}
}
Response: 9 音素地址
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "08a5785a-a6a2-4140-b587-a6cead592531",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 8,
"type": "phone_url",
"phone_url": "https://aigc.blob.core.chinacloudapi.cn/audio/tts-phone/02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb_08a5785a-a6a2-4140-b587-a6cead592531.phone"
}
}
Response: 10 EOF
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "d923181d-9d9b-4be1-9370-40f456be3771",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 9,
"type": "eof"
}
}
# Case 3: 使用 TTS 单次返回接口
Request: Starter
{
"auth": "XSMLTGKQVVCPJCQHJZ4VEDMGIY",
"type": "TTS2",
"device": "device-wei",
"session": "d6bad1c4-eda9-4abd-8294-7ebb4e72cf89",
"tts": {
"qid": "8wfZav:AEA_Z10Mqp9GCwDGMrz8xIzi3VScxNzUtLCg",
"speed_ratio": 1.05,
"sample_rate": 16000,
"volume": 200,
"format": "mp3",
"phone": true
}
}
Response: 1
{
"service": "auth",
"status": "ok",
"session": "d6bad1c4-eda9-4abd-8294-7ebb4e72cf89"
}
Request: Task
{
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"query": "大家好!",
"ssml": false
}
Response: 2
{
"service": "tts",
"status": "ok",
"session": "d6bad1c4-eda9-4abd-8294-7ebb4e72cf89",
"trace": "335d508e-688f-4fc1-b057-4a4aa78b9ee7",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 1,
"type": "audio",
"audio_url": "http://tts.dui.ai/runtime/v1/cache/91891217-e1f6-4a91-9a31-1f2ce402b243?productId=914011300"
}
}
Response: 3
{
"service": "tts",
"status": "ok",
"session": "d6bad1c4-eda9-4abd-8294-7ebb4e72cf89",
"trace": "335d508e-688f-4fc1-b057-4a4aa78b9ee7",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 2,
"type": "phone",
"phone_url": "http://tts.dui.ai/runtime/v1/cache/91891217-e1f6-4a91-9a31-1f2ce402b243.json?productId=914011300",
"resource": {
"phonetic_duration_msec": [125, 125, 130, 90, 350, 95, 395],
"phonetic_symbols": ["d", "a4", "j", "ia1", "h", "ao3", "sil"],
"total_duration_msec": 1310
}
}
}
# 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 中的多音字,默认不返回 |
facefeature | Face Feature ID | string | 空字符串 | 可选字段,返回 Face Feature 的对应模型的 ID,空表示不返回 |
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 ,Face Feature 包为 facefeature ,时间戳包为 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=="
}
}
# 音频地址
包含上传至 Object Store 存储的音频文件缓存 URL。
音频地址样例:
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "851ab562-ec51-4ad7-bd21-4f4af19875cb",
"tts": {
"id": "02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb",
"index": 6,
"type": "audio_url",
"audio_url": "https://aigc.blob.core.chinacloudapi.cn/audio/tts-audio/02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb_851ab562-ec51-4ad7-bd21-4f4af19875cb.pcm"
}
}
# 音素包
包含 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"
}
}
# 音素地址
包含上传至 Object Store 存储的音素文件缓存 URL。
音素地址样例:
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "08a5785a-a6a2-4140-b587-a6cead592531",
"tts": {
"id": "02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb",
"index": 7,
"type": "phone_url",
"phone_url": "https://aigc.blob.core.chinacloudapi.cn/audio/tts-phone/02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb_08a5785a-a6a2-4140-b587-a6cead592531.phone"
}
}
# 字幕
包含 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=="
}
}
# 字幕地址
包含上传至 Object Store 存储的字幕文件缓存 URL。
字幕地址样例:
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "d923181d-9d9b-4be1-9370-40f456be3771",
"tts": {
"id": "02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb",
"index": 5,
"type": "subtitle_url",
"subtitle_url": "https://aigc.blob.core.chinacloudapi.cn/audio/tts-srt/02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb_d923181d-9d9b-4be1-9370-40f456be3771.srt"
}
}
# 时间戳包
包含句子级别和字级别的时间戳信息。
时间戳样例:
{
"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"]
}
]
}
}
# Face Feature
// 结果待定,视研究侧返回内容确定
# 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,
"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 多音字
```json
{
"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 字幕地址
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "d923181d-9d9b-4be1-9370-40f456be3771",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 6,
"type": "subtitle_url",
"subtitle_url": "https://aigc.blob.core.chinacloudapi.cn/audio/tts-srt/02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb_d923181d-9d9b-4be1-9370-40f456be3771.srt"
}
}
Response: 8 音频地址
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "335d508e-688f-4fc1-b057-4a4aa78b9ee7",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 7,
"type": "audio_url",
"audio_url": "https://aigc.blob.core.chinacloudapi.cn/audio/tts-audio/02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb_851ab562-ec51-4ad7-bd21-4f4af19875cb.pcm"
}
}
Response: 9 音素地址
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "08a5785a-a6a2-4140-b587-a6cead592531",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 8,
"type": "phone_url",
"phone_url": "https://aigc.blob.core.chinacloudapi.cn/audio/tts-phone/02261a7e-7df8-4554-b2a1-ad2fa8bf2cbb_08a5785a-a6a2-4140-b587-a6cead592531.phone"
}
}
Response: 10 EOF
{
"service": "tts",
"status": "ok",
"session": "5ef8b534-3b54-47e2-94d9-ff165864ad4a",
"trace": "d923181d-9d9b-4be1-9370-40f456be3771",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 9,
"type": "eof"
}
}
# Case 3: 使用 TTS 单次返回接口
Request: Starter
{
"auth": "XSMLTGKQVVCPJCQHJZ4VEDMGIY",
"type": "TTS2",
"device": "device-wei",
"session": "d6bad1c4-eda9-4abd-8294-7ebb4e72cf89",
"tts": {
"language": "zh-CN",
"voice": "aningfp",
"speed_ratio": 1.05,
"sample_rate": 16000,
"volume": 200,
"format": "mp3",
"phone": true
}
}
Response: 1
{
"service": "auth",
"status": "ok",
"session": "d6bad1c4-eda9-4abd-8294-7ebb4e72cf89"
}
Request: Task
{
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"query": "大家好!",
"ssml": false
}
Response: 2
{
"service": "tts",
"status": "ok",
"session": "d6bad1c4-eda9-4abd-8294-7ebb4e72cf89",
"trace": "335d508e-688f-4fc1-b057-4a4aa78b9ee7",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 1,
"type": "audio",
"audio_url": "http://tts.dui.ai/runtime/v1/cache/91891217-e1f6-4a91-9a31-1f2ce402b243?productId=914011300"
}
}
Response: 3
{
"service": "tts",
"status": "ok",
"session": "d6bad1c4-eda9-4abd-8294-7ebb4e72cf89",
"trace": "335d508e-688f-4fc1-b057-4a4aa78b9ee7",
"tts": {
"id": "bf3qmpuuk18ktv7cv4b6kzhs9",
"index": 2,
"type": "phone",
"phone_url": "http://tts.dui.ai/runtime/v1/cache/91891217-e1f6-4a91-9a31-1f2ce402b243.json?productId=914011300",
"resource": {
"phonetic_duration_msec": [125, 125, 130, 90, 350, 95, 395],
"phonetic_symbols": ["d", "a4", "j", "ia1", "h", "ao3", "sil"],
"total_duration_msec": 1310
}
}
}