基于 WebSocket 协议的流式语音转文字服务,支持”边录边转”的实时交互。
流式音频上传和内容识别。
通信包含两种消息类型:
所有控制消息均采用 JSON 格式传递。
WSSttClientMessage)| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
event | string | 是 | 事件类型,可选值: task_start, task_finish |
model | string | 是(task_start) | 模型名称,目前仅支持 sense-asr-deepthink |
audio_setting | object | 是(task_start) | 音频参数设置,见下文详情 |
vad_setting | object | 否 | VAD (语音活动检测) 设置,见下文详情 |
transcription_setting | object | 否 | 识别相关设置,见下文详情 |
1. audio_setting
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
sample_rate | int | 是 | 采样率,目前仅支持 16000 |
channel | int | 是 | 声道数,目前仅支持 1 (单声道) |
format | string | 是 | 音频格式,目前仅支持 pcm |
2. vad_setting (可选)
| 字段 | 类型 | 说明 | 默认值 |
|---|---|---|---|
silence_duration | int | 静音切分阈值 (ms) | 500 |
min_speech_duration | int | 最小语音时长 (ms) | 300 |
soft_max_duration | int | 软超时时长 (ms) | 15000 |
hard_max_duration | int | 硬超时时长 (ms) | 30000 |
soft_silence_duration | int | 软超时后的静音阈值 (ms) | 300 |
threshold | float | VAD 能量阈值 (0.0 - 1.0) | 0.5 |
3. transcription_setting (可选)
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
target_language | string | 目标语言代码 (详见下表) | “en”, “zh” |
recognize_mode | string | 识别模式 | ”auto” (默认), “record_only” (仅识别不执行指令) |
支持的语言列表 (target_language):
| 代码 | 语言 | 代码 | 语言 | 代码 | 语言 |
|---|---|---|---|---|---|
ar | Arabic | yue | Cantonese | zh | Chinese |
nl | Dutch | en | English | fr | French |
de | German | id | Indonesian | it | Italian |
ja | Japanese | ko | Korean | ms | Malay |
pt | Portuguese | ru | Russian | es | Spanish |
th | Thai | tr | Turkish | ur | Urdu |
vi | Vietnamese |
base_resp)| 字段 | 类型 | 说明 |
|---|---|---|
status_code | int | 状态码,0 表示成功,非 0 表示错误 |
status_msg | string | 状态描述信息 |
WSSttResponse)| 字段 | 类型 | 说明 |
|---|---|---|
event | string | 事件类型: connected_success, task_started, result_final, task_finished, task_failed |
session_id | string | 会话 ID |
trace_id | string | 链路追踪 ID |
data | object | 识别结果数据 (仅 result_final 包含) |
base_resp | object | 基础响应信息 (状态码和消息) |
客户端发起 WebSocket 连接,服务端验证通过后返回 connected_success。
服务端响应示例:
{
"event": "connected_success",
"session_id": "trace-id-xxx",
"base_resp": {
"status_code": 0,
"status_msg": "success"
}
}task_start)客户端发送 task_start 事件配置参数。
客户端请求示例:
{
"event": "task_start",
"model": "sense-asr-deepthink",
"audio_setting": {
"sample_rate": 16000,
"format": "pcm",
"channel": 1
},
"vad_setting": {
"silence_duration": 500,
"min_speech_duration": 300
}
}参数说明:
sample_rate: 采样率,必须为 16000。channel: 声道数,必须为 1 (单声道)。format: 音频格式,目前仅支持 pcm (16-bit Little Endian)。silence_duration: 静音切分阈值 (ms)。threshold: 能量阈值 (0.0 - 1.0)。服务端响应示例:
{
"event": "task_started",
"session_id": "trace-id-xxx",
"base_resp": {
"status_code": 0,
"status_msg": "success"
}
}客户端持续发送二进制音频数据 (Binary Message)。
result_final。服务端响应示例 (result_final):
{
"event": "result_final",
"session_id": "trace-id-xxx",
"data": {
"text": "你好,今天天气真不错。",
"is_final": true,
"segment_id": 1,
"timestamp_end": 1773027072669
},
"base_resp": {
"status_code": 0,
"status_msg": "success"
}
}task_finish)客户端发送 task_finish 事件通知发送完毕。服务端处理剩余音频后返回 task_finished。
客户端请求示例:
{
"event": "task_finish"
}服务端响应示例:
{
"event": "task_finished",
"session_id": "trace-id-xxx",
"base_resp": {
"status_code": 0,
"status_msg": "success"
}
}task_failed)如果发生错误,服务端会返回 task_failed 并可能关闭连接。
{
"event": "task_failed",
"base_resp": {
"status_code": 2013,
"status_msg": "model is required"
}
}以下展示了客户端与服务端建立连接、发送任务开始指令、流式发送音频以及结束任务的完整交互流程。
请将示例代码中的 YOUR_API_KEY 和 AUDIO_FILE_PATH 替换为实际值。
依赖: pip install websockets
import asyncio
import json
import websockets
API_KEY = "YOUR_API_KEY"
WS_URL = "wss://api.senseaudio.cn/ws/v1/audio/transcriptions"
AUDIO_FILE = "test_audio_16k.pcm" # 16kHz, 16bit, PCM 单声道
async def receive_messages(websocket):
async for message in websocket:
msg_json = json.loads(message)
print(f"< Received Event: {msg_json.get('event')}")
if msg_json.get("event") == "result_final":
print(f" 识别结果: {msg_json['data']['text']}")
elif msg_json.get("event") == "task_finished":
print(" 任务完成")
break
async def speech_recognition():
headers = {"Authorization": f"Bearer {API_KEY}"}
async with websockets.connect(WS_URL, additional_headers=headers) as websocket:
# 1. 接收连接成功消息
resp = await websocket.recv()
print(f"< Received: {resp}")
# 2. 发送 task_start
start_payload = {
"event": "task_start",
"model": "sense-asr-deepthink",
"audio_setting": {"sample_rate": 16000, "format": "pcm", "channel": 1},
}
await websocket.send(json.dumps(start_payload))
print("> Sent task_start")
# 接收 task_started
resp = await websocket.recv()
print(f"< Received: {resp}")
# 3. 接收结果(并发)+ 发送音频
receive_task = asyncio.create_task(receive_messages(websocket))
with open(AUDIO_FILE, "rb") as f:
while True:
data = f.read(3200) # 每次发送 3200 字节(约 100ms)
if not data:
break
await websocket.send(data)
await asyncio.sleep(0.1) # 模拟实时流
# 4. 发送 task_finish
await websocket.send(json.dumps({"event": "task_finish"}))
print("> Sent task_finish")
await receive_task
if __name__ == "__main__":
asyncio.run(speech_recognition())