流式语音生成
使用 TTS 1.5 Flash 进行低延迟流式语音生成。该能力与单人语音生成使用相同 Endpoint,通过 version=flash-20260626 和 stream=true 启用。
认证
在请求头中加入 Authorization: Bearer <API_KEY> 完成鉴权,密钥可在控制台「API 密钥」页生成。
curl https://api.mosi.cn/v1/audio/speech \
-H "Authorization: Bearer $MOSS_API_KEY"
支持模型
| 字段 | 允许值 |
|---|---|
| model |
|
| version |
|
启用条件与约束
- 必须精确传入小写
model=moss-tts,大小写不会被归一化。 version必填,必须传flash-20260626。stream必填,必须为true。response_format必填,当前仅支持pcm。stream_format=sse返回 SSE,每帧为data: JSON Event。- 省略
stream_format或传audio时返回原始 PCM 字节流。 sample_rate不是公开请求参数,传入非零值会在创建任务前返回参数错误。stream=true不支持和async=true同时使用,非空webhook_url也不支持流式调用。voice_url、voice_data、file_id不支持流式调用,只能使用voice_id指定音色 ID。delivery_method和aigc_metadata当前在流式路径中不会生效,请勿传入。
请求字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| model | string | 是 | 必须为精确小写值 |
| version | string | 是 | 必须传 |
| input | string | 是 | 待合成文本。 |
| voice_id | string | 否 | 音色 ID;可通过 查询音色列表 获取;也可前往 Mossland 音色库,在音色卡片上点击复制图标获取。TTS 只接受音色 ID,不支持 |
| language | string | 否 | 语言提示,去除首尾空白后传给模型。 |
| speed | number | 否 | 语速,默认 |
| expected_duration_sec | number | 否 | 期望音频时长,单位秒;传入时必须大于 |
| stream | boolean | 是 | 设为 |
| response_format | string | 是 | 流式请求当前仅支持 |
| stream_format | string | 否 |
|
请求示例
curl --no-buffer -X POST "https://api.mosi.cn/v1/audio/speech" \
-H "Authorization: Bearer $MOSS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "moss-tts",
"version": "flash-20260626",
"input": "欢迎使用 Mossland API。",
"voice_id": "<voice_id>",
"language": "zh",
"speed": 1,
"expected_duration_sec": 3,
"stream": true,
"response_format": "pcm",
"stream_format": "sse"
}'
流式响应
stream_format=sse 返回 SSE,每一帧的 data: 后都是一个 JSON Event。type 是事件判别字段,客户端应根据 type 选择对应字段结构。省略 stream_format 或传 audio 时返回原始 PCM 字节流。
部分接入链路会先返回 task.created,部分会直接从 speech.created 开始。客户端必须以每帧的 type 为准,不要依赖固定的首个事件。
SSE Event Types
| Event Type | 说明 | 终态 |
|---|---|---|
task.created | 流式任务创建成功后可能返回;并非所有接入链路都会发送 | 否 |
speech.created | 声明后续 PCM 音频分片的格式参数 | 否 |
speech.audio.delta | Base64 编码的 PCM 音频分片,可能返回零个或多个 | 否 |
speech.audio.done | TTS 正常流的终态事件,收到后可结束 SSE 读取 | 是 |
error | 流已经开始后发生失败时返回,收到后停止读取 | 是 |
task.created
| 字段 | 类型 | 必返 | 说明 |
|---|---|---|---|
| type | string | 是 | 固定为 |
| task_id | string | 是 | AGW 创建的流式任务 ID。 |
| object | string | 是 | 固定为 |
| status | string | 是 | 创建时通常为 |
| model | string | 是 | 客户端请求使用的公开模型名。 |
speech.created
| 字段 | 类型 | 必返 | 说明 |
|---|---|---|---|
| type | string | 是 | 固定为 |
| format | string | 是 | 当前必须为 |
| sample_rate | integer | 是 | 采样率,单位 Hz;必须为正数并满足 WAV 参数范围,以下游事件为准。 |
| channels | integer | 是 | 声道数;必须为正数并满足 WAV 参数范围,以下游事件为准。 |
| bit_depth | integer | 是 | 位深;必须为正数、能被 8 整除并满足 WAV 参数范围,以下游事件为准。 |
speech.audio.delta
| 字段 | 类型 | 必返 | 说明 |
|---|---|---|---|
| type | string | 是 | 固定为 |
| audio | string | 正常应有 | 非空时为 Base64 编码的 PCM 字节分片;当前实现允许空字符串,客户端应忽略空分片。 |
speech.audio.done
| 字段 | 类型 | 必返 | 说明 |
|---|---|---|---|
| type | string | 是 | 固定为 |
error
| 字段 | 类型 | 必返 | 说明 |
|---|---|---|---|
| type | string | 是 | 固定为 |
| error | object | 正常应有 | 错误详情。 |
| error.code | string | 否 | 机器可读错误码。 |
| error.message | string | 否 | 错误说明。 |
原始 PCM 响应头
| 字段 | 类型 | 出现条件 | 说明 |
|---|---|---|---|
Content-Type | HTTP header | 必有 | 固定为 audio/pcm。 |
X-Sample-Rate | HTTP header | 必有 | 原始 PCM 采样率,客户端必须按该值解释音频。 |
X-Channels | HTTP header | 必有 | 原始 PCM 声道数。 |
X-Bit-Depth | HTTP header | 必有 | 原始 PCM 位深。 |
响应示例
# SSE 响应示例:请求中传 stream_format=sse
Content-Type: text/event-stream; charset=utf-8
# 部分接入链路会省略 task.created,直接从 speech.created 开始
data: {"type":"task.created","task_id":"task-123","object":"audio.speech","status":"PROCESSING","model":"moss-tts"}
data: {"type":"speech.created","format":"pcm","sample_rate":48000,"channels":1,"bit_depth":16}
data: {"type":"speech.audio.delta","audio":"BASE64_PCM_CHUNK"}
data: {"type":"speech.audio.done"}
# 原始 PCM 响应示例:省略 stream_format 或传 stream_format=audio
Content-Type: audio/pcm
X-Sample-Rate: 48000
X-Channels: 1
X-Bit-Depth: 16
<raw pcm bytes>
错误与断连语义
missing_required_field:input缺失或去除首尾空白后为空。unsupported_response_format/response_format:流式请求未显式使用pcm,或传入其他音频格式。unsupported_stream/stream:stream_format非audio/sse,或解析出的模型不支持流式调用。unsupported_for_stream/sample_rate:流式请求传入非零sample_rate。invalid_range/speed:speed不在0.25-4范围内。unsupported_with_async/stream:stream=true与async=true同时传入。unsupported_with_webhook/stream:流式请求传入非空webhook_url。- 请求校验、模型解析、流式能力检查和任务创建错误发生在响应开始前,返回标准 JSON 错误。
- SSE 在
speech.audio.done前失败时发送error数据帧并结束连接。 - 原始 PCM 在响应头或音频已写入后失败时只能结束连接,已返回的 PCM 可能不完整。
- 客户端断开会终止当前 HTTP 流;不同接入链路可能取消上游请求,也可能只取消当前订阅。客户端不要假定生成任务一定继续或一定被取消。
- 原始 PCM 场景不能只凭 EOF 判断音频是否完整。