Skip to Content
API 文档Audio流式语音合成

流式语音合成

流式语音合成

请求方式

WebSocket

请求地址

api.stepfun.com/v1/realtime/audio

请求头

  • Authorization string required
    鉴权使用的 KEY,其值为 Bearer STEP_API_KEY

请求参数

  • model string required
    需要使用的模型名称,当前仅支持 step-tts-2step-tts-mini 和 step-tts-vivid

调用说明

流式生成音频需要在服务链接成功后,发送对应的 Client Event 事件,获取对应的 Server Event ,来完成音频的生成。

Client Event & Server Event 对应关系

以下为流式调用过程中,客户端发送的 Client Event 事件及服务端返回的 Server Event 事件。

详细描述可参考下方的详细说明。

消息类型客户端发送服务端返回备注
建联成功-tts.connection.doneWebSocket 链接成功后下发的事件
创建会话tts.createtts.response.created创建会话及对应响应。收到对应响应后,可进行进一步生成。
开始生成单句tts.response.sentence.start累计的文本满足生成条件,开始生成
发送文本tts.text.deltatts.response.audio.delta创建文本及对应的响应,收到响应后即可进行播放。
结束生成单句tts.response.sentence.end累计的文本满足生成条件,结束生成
清空缓冲区tts.text.flushtts.text.flushed可快速清空缓冲区,一次性获得当前尚未返回的音频内容。
发送文本结束tts.text.doneresponse.audio.done完成本次生成 ,不再生成,服务端将会释放连接。
音频生成出错-tts.response.error在生成过程中出现错误时的事件
ℹ️

如果连续 60 秒无动作,则系统会自动断开链接。

Client Event 详细说明

创建会话 tts.create

创建会话的事件,在完成建联后,收到 tts.connection.done Server Event 返回后发送此事件开始生成音频。

  • type string required
    固定为 tts.create

  • data object required
    事件内容

    • session_id string required
      会话 ID,可用于判断具体沟通是哪个会话,由 tts.connection.done 事件返回。

    • voice_id string required
      音色 ID,必填,可参考 音色列表 查看支持的音色,试听对应音色。

    • response_format string optional
      音频格式,支持 [“wav”, “mp3”, “flac”, “opus”,“pcm”],非必填,默认 mp3

    • sample_rate int optional
      采样率,可选项为 8000,16000 , 22050 ,默认为 22050

    • pronunciation_map object array optional
      定义某个文字或符号注音或发音替换规则,在中文文本中,声调用数字表示:一声为1,二声为2,三声为3,四声为4,轻声为5。注:step-tts-vivid 模型暂不支持该字段。

      • tone string required
        具体发音映射规则,以“/”隔开,示例:["绯闻/fei1闻","扁舟/偏舟","嫉妒/ji2妒"]
    • speed_ratio float optional
      语速,取值范围为 0.5~2,默认值 1.0。0.5 表示 0.5 倍速。

    • volume_ratio float optional
      音量,取值范围为 0.1~2.0,默认值 1.0。0.1 表示缩小至 10% 音量;2.0 表示扩大至 200%音量

    • mode string optional
      生成模式,可选项为 sentencedefaultdefault 表示按字生成,适合大模型流式生成场景,sentence 表示按句生成,适合已经生成好完整句子。默认为 default

    • voice_label object optional
      音色标签,使用自定义音色时需要传入。language、emotion 和 style 三个自动同时只能有一个字段有值,暂不支持多个组合。

      • language string optional
        语言,支持粤语四川话日语 三个选项。
      • emotion string optional
        情绪,支持 高兴生气等最多 11 个选项, 不同模型的支持情况可参考音色标签
      • style string optional
        支持最多17种语速或演绎风格,不同模型的支持情况可参考音色标签
ℹ️

default 模式适用于 TTS 和大语言模型组合使用,该模式会自动进行攒句和切句,因此不会马上返回而内容,而是当用户的输入满足一句话时才会进行生成;如果需要强制返回,则可以发送 tts.text.flush,模型则可快速返回内容。

sentence 模式适用于已经有现成的长文本的场景,该模式会自动基于。!?!?进行切句,并进行生成。

Example

{ "type": "tts.create", "data": { "session_id": "01956e7388477cfcbdc3aaabf364bc70", "voice_id": "cixingnansheng", "response_format": "wav", "volume_ratio": 1.0, "speed_ratio": 1.0, "sample_rate": 16000, "pronunciation_map":{ "tone":[ "阿胶/e1胶", "扁舟/偏舟", "LOL/laugh out loudly" ] } } }
生成音频 tts.text.delta

生成音频的 Client Event。

ℹ️

在生成过程中,如果 TTS 引擎认为已经达成了生成的条件,则会返回 tts.response.sentence.start 声明开始推理,并返回1个或多个 tts.response.audio.delta,返回音频内容。并在音频内容返回完成后,返回 tts.response.sentence.end 事件声明完成此句完成生成。如 TTS 引擎认为未达成生成的条件,则不会返回任何事件。

  • type string required
    固定为 tts.text.delta

  • data object required
    事件内容

    • session_id string required
      会话 ID,可用于判断具体沟通是哪个会话,由 tts.connection.done 事件返回。

    • text string required
      要生成的文本内容,最大长度为 1000 个字符

Example

{ "type": "tts.text.delta", "data": { "session_id": "01956e7388477cfcbdc3aaabf364bc70", "text": "今天的天气真不错,我想去学习阶跃星辰的大模型技术" } }
清空缓冲区 tts.text.flush

清空缓冲区,强制返回模型生成的音频。

  • type string required
    固定为 tts.text.flush

  • data object required
    事件内容

    • session_id string required
      会话 ID,可用于判断具体沟通是哪个会话,由 tts.connection.done 事件返回。
{ "type": "tts.text.flush", "data": { "session_id": "01956e8dc1d77bb98f9da8d1b642fcf0" } }
完成音频生成 tts.text.done

完成音频生成

  • type string required
    固定为 tts.text.done

  • data object required
    事件内容

    • session_id string required
      会话 ID,可用于判断具体沟通是哪个会话,由 tts.connection.done 事件返回。
{ "type": "tts.text.done", "data": { "session_id": "01956e8dc1d77bb98f9da8d1b642fcf0" } }

Server Event 详细说明

连接成功 tts.connection.done

连接成功

  • event_id string required
    事件 ID,用于标识本次请求,当联系客服获取支持时,可提供此 ID 协助排查问题。

  • type string required
    固定为 tts.connection.done

  • data object required
    事件内容

    • session_id string required
      会话 ID,后续请求时需要带上使用

Example

{ "event_id": "01956e73888c7953896a6e176bf3d760", "type": "tts.connection.done", "data": { "session_id": "01956e7388477cfcbdc3aaabf364bc70" } }
会话创建成功 tts.response.created

会话创建成功

  • event_id string required
    事件 ID,用于标识本次请求,当联系客服获取支持时,可提供此 ID 协助排查问题。

  • type string required
    固定为 tts.response.created

  • data object required
    事件内容

    • session_id string required
      会话 ID,后续请求时需要带上使用

Example

{ "event_id": "01956e73888c7953896a6e176bf3d760", "type": "tts.connection.done", "data": { "session_id": "01956e7388477cfcbdc3aaabf364bc70" } }
开始生成单句 tts.response.sentence.start

开始生成单句

  • event_id string required
    事件 ID,用于标识本次请求,当联系客服获取支持时,可提供此 ID 协助排查问题。
  • type string required
    固定为 tts.response.sentence.start
  • data object required
    事件内容
    • session_id string required
      会话 ID
    • text string required
      本次生成的文本内容
    • started_at string required
      本次生成开始的时间,时间戳
{ "event_id": "01956e73888c7953896a6e176bf3d760", "type": "tts.response.sentence.start", "data": { "session_id": "01956e7388477cfcbdc3aaabf364bc70", "text":"blah blah", "started_at":10292929292 # 时间戳 } }
接收生成好的音频 tts.response.audio.delta

接收生成好的音频

  • event_id string required
    事件 ID,用于标识本次请求,当联系客服获取支持时,可提供此 ID 协助排查问题。

  • type string required
    固定为 tts.response.audio.delta

  • data object required
    事件内容

    • session_id string required
      会话 ID,后续请求时需要带上使用
    • status string required
      生成状态,可选项为 unfinishedfinishedunfinished 表示生成未完成,finished 表示生成完成。
    • audio string required
      音频内容,BASE64 编码的音频内容
    • duration float required
      音频时长,单位为秒
{ "event_id": "42bd707a-ba16-4ddb-a751-54d84301b474", "type": "tts.response.audio.delta", "data": { "session_id": "01956e8dc1d77bb98f9da8d1b642fcf0", "status": "unfinished", "audio": "BASE64 的音频内容", "duration": 2.043375 } }
结束生成单句 tts.response.sentence.end

结束生成单句

  • event_id string required
    事件 ID,用于标识本次请求,当联系客服获取支持时,可提供此 ID 协助排查问题。
  • type string required
    固定为 tts.response.sentence.end
  • data object required
    事件内容
    • session_id string required
      会话 ID
      • text string required
        本次生成的文本内容
      • ended_at string required
        本次生成结束的时间,时间戳
{ "event_id": "01956e73888c7953896a6e176bf3d760", "type": "tts.response.sentence.end", "data": { "session_id": "01956e7388477cfcbdc3aaabf364bc70", "text":"blah blah", "ended_at":10292929292 # 时间戳 } }
开始清空缓存 tts.text.flushed

系统收到指令,开始清空缓存。

  • event_id string required
    事件 ID,用于标识本次请求,当联系客服获取支持时,可提供此 ID 协助排查问题。
  • type string required
    固定为 tts.response.audio.delta
  • data object required
    事件内容
    • session_id string required
      会话 ID,后续请求时需要带上使用
{ "event_id": "01956e8ee1b9788c95d5981b1cfdbf12", "type": "tts.text.flushed", "data": { "session_id": "01956e8dc1d77bb98f9da8d1b642fcf0" } }
完成本次生成 tts.response.audio.done

完成本次生成。接收此事件后,将会自动断开链接。此外当 IDLE 时长超过 60 秒,也会自动完成生成。

  • event_id string required
    事件 ID,用于标识本次请求,当联系客服获取支持时,可提供此 ID 协助排查问题。
  • type string required
    固定为 tts.response.audio.delta
  • data object required
    事件内容
    • session_id string required
      会话 ID,后续请求时需要带上使用
    • audio string required
      音频内容,BASE64 编码的音频内容,包含所有音频的内容。

Example

{ "event_id": "01956e8bf5067d6499cdfa0dad34f805", "type": "tts.response.audio.done", "data": { "session_id": "01956e7388477cfcbdc3aaabf364bc70", "audio": "" } }
故障报错 tts.response.error

当生成过程中出现问题后,将会返回此事件。

{ "event_id": "01956e8fdb157619a852bdf38028db45", "type": "tts.response.error", "data": { "session_id": "01956e8dc1d77bb98f9da8d1b642fcf0", "code": "503", "message": "The engine is currently overloaded, please try again later", "details": { "error": "The engine is currently overloaded, please try again later" } } }

调用代码参考

先执行 pip install websocket rel 后执行如下代码。

import websocket import rel import json headers = { "Authorization": "" # 更新为你的 STEPFUN API KEY } def get_start_event(sid): return json.dumps( { "type": "tts.create", "data": { "session_id": sid, "voice_id": "cixingnansheng", "response_format": "wav", "volume_ratio": 1.0, "speed_ratio": 1.0, "sample_rate": 16000 }, } ) def on_message(ws, message): data = json.loads(message) session_id = data["data"]["session_id"] event_type = data["type"] if event_type == "tts.connection.done": start_event = get_start_event(session_id) ws.send(start_event) # 继续添加其他事件处理逻辑 print(message) def on_error(ws, error): print(error) if __name__ == "__main__": websocket.enableTrace(True) ws = websocket.WebSocketApp( "wss://api.stepfun.com/v1/realtime/audio?model=step-tts-mini", header=headers, on_message=on_message, on_error=on_error, ) ws.run_forever( dispatcher=rel, reconnect=5 ) rel.signal(2, rel.abort) rel.dispatch()
Last updated on