实时转写 /v3
Hub 支持 AssemblyAI 实时转写 v3 的两种接入方式。
直连模式(推荐)
客户端向 Hub 申请临时 token,然后直接连接 AssemblyAI,音频不经过 Hub。
http
GET /v3/token?expires_in_seconds=60&max_session_duration_seconds=3600
Authorization: hub-xxxxjson
{
"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-proexpires_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头;账号绑定了代理时,中继连接走该代理。
关闭码
| 关闭码 | 含义 |
|---|---|
4001 | Hub 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())