Skip to content

实时转写 /v3 ​

Hub 支持 AssemblyAI 实时转写 v3 的两种接入方式。

直连模式(推荐) ​

客户端向 Hub 申请临时 token,然后直接连接 AssemblyAI,音频不经过 Hub。

http
GET /v3/token?expires_in_seconds=60&max_session_duration_seconds=3600
Authorization: hub-xxxx
json
{
  "token": "<临时 token>",
  "expires_in_seconds": 60,
  "websocket_url": "wss://streaming.assemblyai.com/v3/ws"
}

websocket_url 是 Hub 补充的字段,对应所分配账号的区域(EU 账号为 wss://streaming.eu.assemblyai.com/v3/ws)。连接方式与官方一致:

txt
wss://streaming.assemblyai.com/v3/ws?token=<临时 token>&sample_rate=16000&speech_model=universal-3-6-pro
  • expires_in_seconds:1 到 600;max_session_duration_seconds:60 到 10800。
  • 浏览器端应由你的后端调用 /v3/token,不要把 Hub Key 放在前端。
  • 直连模式下音频不经过 Hub,账号绑定的代理不生效,Hub 只记录 token 发放次数。

中继模式 ​

客户端连接 Hub,Hub 再连接 AssemblyAI 并双向转发所有消息。

txt
ws://<hub>/v3/ws?sample_rate=16000&format_turns=true&token=hub-xxxx
  • Hub Key 可放在 Authorization 头或 token 查询参数中;token 不会转发给上游。
  • 其它查询参数(speech_model、encoding、language_codes、keyterms_prompt、speaker_labels、llm_gateway 等)原样转发,新参数无需升级 Hub。
  • 二进制音频帧与 JSON 控制消息(UpdateConfiguration、ForceEndpoint、Terminate)原样转发;Begin、Turn、Termination 等事件原样返回。
  • 客户端异常断开且未发送 Terminate 时,Hub 会代为发送,避免上游会话继续计费。
  • 会话结束时按 Termination 事件中的时长记录用量。
  • 支持 X-Hub-Region 头;账号绑定了代理时,中继连接走该代理。

关闭码 ​

关闭码含义
4001Hub Key 无效
4003没有可用的上游账号
其它透传 AssemblyAI 的关闭码和原因

中继模式在会话建立时选定一个账号,会话中途不会换号。

示例(Python,中继模式) ​

python
import asyncio, json, websockets

async def main():
    url = "ws://<hub>:18080/v3/ws?sample_rate=16000&format_turns=true&token=hub-xxxx"
    async with websockets.connect(url) as ws:
        async def send():
            with open("audio_16k_mono.raw", "rb") as f:
                while chunk := f.read(3200):      # 100 ms 的 16 kHz 16-bit PCM
                    await ws.send(chunk)
                    await asyncio.sleep(0.1)
            await ws.send(json.dumps({"type": "Terminate"}))
        sender = asyncio.create_task(send())
        async for msg in ws:
            event = json.loads(msg)
            if event.get("type") == "Turn" and event.get("end_of_turn"):
                print(event["transcript"])
        await sender

asyncio.run(main())

文档版本 v3.4.0 · 与项目版本同步