# 流式语音处理

平台提供HTTP方式语音处理能力之外,还提供流式处理能力,包括ASR、TTS等。

# 调用方式

使用 WebSocket 协议,控制报文为使用 UTF-8 编码的 JSON 文本。WS接口需将token信息拼写到URL上(例:ws://aigc.softsugar.com/api/voice/stream/v1?Authorization=Bearer {token})。

# 调用流程

  1. 建立 WebSocket 连接;
  2. 发送 Starter 包,内容为后续请求的通用配置信息;
  3. 收到响应,表示鉴权成功或失败;
  4. 发送 Data 数据包;
  5. 收到对应返回结果,4、5 步可重复;
  6. 如果当前没有更多任务,可以直接断开(没有链接断开报文的设计);

# 调用限制

  1. 建立 Websocket 连接后,10 秒内未发送 Starter 包会被断开 WebSocket 连接;
  2. 如果 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上。

# 调用流程

  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 文本,包含以下字段:

字段 名称 类型 默认值 说明
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 文本。

# 调用流程

  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 文本,包含以下字段:

字段 名称 类型 默认值 说明
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 文本。

# 调用流程

  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 中的多音字,默认不返回
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
    }
  }
}
最后更新: 2024/4/11 上午6:30:15