实时语音转写
平台通过 WebSocket 提供实时语音转写 API(API 编码
a2t_realtime),适用于会议记录、直播字幕、客服质检等需要持续推流、边录边识别的长时会话场景。发送end并收到end=true后,服务端会关闭连接。
- 支持中间结果(
variable)与句末稳态结果(fixed)推送。 - 支持智能标点与后处理,句末结果可携带
start_time/end_time(毫秒)。 - 支持上下文与热词增强,提升专有名词识别率。
- 支持说话人分离(
speaker_separate=true时使用 Yama 引擎)。 - 支持
heartbeat心跳帧,用于刷新连接空闲计时。
使用流程
- 在 API Key 管理 获取密钥,并写入环境变量
API_KEY。 - 建立 WebSocket 连接:
wss://maas-api.hivoice.cn/v1/audio/asr/realtime?model=u2-asr(详见 实时语音转写 API)。 - 发送文本帧
start,业务参数位于data对象内。 - 在
start成功之后、end之前,循环发送二进制音频帧。 - 长连接场景可周期性发送
{ "type": "heartbeat" }防止空闲超时。 - 发送文本帧
end结束本轮识别。 - 持续接收 ResultVO,直至
end=true(成功后服务端关闭连接)。
start之前发送的音频会被丢弃。布尔参数字段请传字符串"true"/"false"。
过程示例
1. 建立连接并发送 start
Python
"""
本示例演示实时语音转写的 WebSocket 会话。
注意:需要先将密钥写入环境变量 API_KEY;并安装 websockets:pip install websockets
"""
import asyncio
import json
import os
import websockets
API_KEY = os.environ["API_KEY"]
MODEL = "u2-asr"
WS_URL = f"wss://maas-api.hivoice.cn/v1/audio/asr/realtime?model={MODEL}"
START_FRAME = {
"type": "start",
"data": {
"format": "pcm",
"sample": "16k",
"variable": "true",
"punctuation": "true",
"post_proc": "true",
"max_end_silence": "500",
"speaker_separate": "false",
"context": "产品名称是小云助手",
"hotwords": ["小云", "转写"],
},
}
async def run(pcm_path: str):
headers = {"Authorization": f"Bearer {API_KEY}"}
async with websockets.connect(WS_URL, additional_headers=headers) as ws:
await ws.send(json.dumps(START_FRAME))
with open(pcm_path, "rb") as f:
while chunk := f.read(3200):
await ws.send(chunk)
await asyncio.sleep(0.1) # 模拟实时推流
await ws.send(json.dumps({"type": "end"}))
while True:
msg = json.loads(await ws.recv())
print(msg)
if msg.get("end"):
break
if __name__ == "__main__":
asyncio.run(run("path/to/audio.pcm"))
2. 解析识别结果
Python
# 典型中间结果(variable)
{
"code": 0,
"msg": "success",
"sid": "a1b2c3d4e5f6478990abcdef12345678",
"type": "variable",
"text": "你好",
"start_time": null,
"end_time": null,
"end": false
}
# 典型句末结果(fixed)
{
"code": 0,
"msg": "success",
"sid": "a1b2c3d4e5f6478990abcdef12345678",
"type": "fixed",
"text": "你好世界",
"start_time": 0,
"end_time": 1200,
"end": false
}
# 会话结束
{
"code": 0,
"msg": "success",
"sid": "a1b2c3d4e5f6478990abcdef12345678",
"type": "fixed",
"text": "",
"end": true
}
更多字段说明、引擎差异(Stream / Yama)、音频格式与错误码,请参阅 实时语音转写 API。也可在 模型体验 · 实时转写 中在线调试。
