asr_server.py
import asyncio
import websockets
import logging
from vosk import Model, KaldiRecognizer # 导入Vosk库
# 加载模型(确保模型文件夹在当前目录)
model = Model("model") # 替换为你的模型路径(如"/home/gec/lv_project/vosk-server/websocket/model")
async def recognize(websocket):
logging.info(f"客户端连接成功:{websocket.remote_address}")
try:
# 1. 接收客户端的配置信息(如采样率)
config = await websocket.recv()
logging.info(f"收到配置:{config}")
# 2. 初始化识别器(采样率固定为16000,与音频匹配)
rec = KaldiRecognizer(model, 16000)
# 3. 循环接收音频数据并识别
while True:
data = await websocket.recv()
if not data: # 音频发送完毕
break
# 处理音频片段
if rec.AcceptWaveform(data):
# 发送完整识别结果
await websocket.send(rec.Result())
else:
# 发送中间识别结果
await websocket.send(rec.PartialResult())
# 4. 发送最终识别结果
await websocket.send(rec.FinalResult())
except Exception as e:
logging.error(f"处理错误:{str(e)}", exc_info=True)
finally:
await websocket.close()
async def start_server():
logging.basicConfig(level=logging.INFO)
async with websockets.serve(recognize, "0.0.0.0", 2700):
await asyncio.Future() # 保持服务运行
if __name__ == "__main__":
asyncio.run(start_server())
操作步骤:
-
将上述代码保存为
asr_server.py
(替换原文件); -
确保模型路径正确(
model
文件夹与脚本在同一目录,或使用绝对路径); -
启动服务:
python3 asr_server.py
-
测试语音识别:
python3 test.py test_websocket.wav
预期结果:
- 服务端会逐步输出中间识别结果(
PartialResult
); - 测试端最终会打印完整的识别文本(如音频中的内容)。
现在基础通信已通,整合识别逻辑后即可实现完整的语音识别功能。如果遇到模型加载问题,检查模型路径是否正确即可。
要让 Vosk 正确识别中文音频,核心是 使用 Vosk 中文模型 + 确保中文音频格式符合要求,按以下 3 个关键步骤操作,就能实现中文语音识别:
第一步:下载并配置 Vosk 中文模型(最关键!)
Vosk 识别中文必须依赖专门的中文模型(默认模型多为英文,会导致识别乱码或错误),推荐使用轻量且准确率高的 vosk-model-small-cn-0.15
(适合嵌入式 / 普通场景)。
操作步骤:
-
删除旧模型(避免冲突) 进入
websocket
目录,删除之前可能存在的英文 / 其他语言模型:cd ~/lv_project/vosk-server/websocket rm -rf model # 删除旧模型文件夹
-
下载中文模型 直接用
wget
命令下载(或手动从官网下载后上传到服务器):# 下载轻量版中文模型(约 1.8GB,速度取决于网络) wget https://alphacephei.com/vosk/models/vosk-model-small-cn-0.15.zip
- 若
wget
下载慢,可手动在浏览器打开 Vosk 模型官网,找到vosk-model-small-cn-0.15
下载,再通过scp
传到服务器的websocket
目录。
- 若
-
解压模型并命名为
model
解压后将模型文件夹重命名为model
(方便服务直接加载,无需修改代码):unzip vosk-model-small-cn-0.15.zip # 解压 mv vosk-model-small-cn-0.15 model # 重命名为 model
-
验证模型是否正确 执行以下命令,确认
model
文件夹包含中文模型核心文件:ls model
正常输出应包含
am
(声学模型)、graph
(语言模型)、ivector
(特征提取)等子文件夹,说明模型配置成功。
第二步:准备符合要求的中文音频(格式是基础)
Vosk 对音频格式有强制要求,中文音频也需满足:16kHz 采样率 + 单声道( mono ) + 16 位深度( PCM 编码)的 WAV 文件
两种场景的操作方法:
场景 1:已有中文音频文件(如 chinese_audio.wav
)
先验证格式是否符合要求,执行命令:
ffmpeg -i chinese_audio.wav # 查看音频信息
-
若格式符合 (输出含
16000 Hz, mono, s16
):直接用该文件测试; -
若格式不符合 (如 44100Hz、立体声):用
ffmpeg
转换为标准格式:# 转换命令:输入文件 → 16kHz 采样率 + 单声道 + 16位深度 ffmpeg -i chinese_audio.wav -ar 16000 -ac 1 -sample_fmt s16 chinese_standard.wav
转换后的
chinese_standard.wav
就是符合要求的中文音频。
场景 2:暂无中文音频,用麦克风录制
若服务器有麦克风(或通过远程桌面连接本地麦克风),用 arecord
命令录制中文音频:
# 录制 5 秒中文音频,直接生成标准格式
arecord -d 5 -r 16000 -c 1 -f S16_LE chinese_record.wav
- 参数说明:
-d 5
(录制 5 秒)、-r 16000
(16kHz 采样率)、-c 1
(单声道)、-f S16_LE
(16 位深度)。
第三步:启动服务并测试中文识别
-
重启 Vosk 服务 (加载中文模型)确保
asr_server.py
中模型加载路径是model
(中文模型),然后启动服务:python3 asr_server.py
- 正常启动日志会显示中文模型加载信息(如
LOG (VoskAPI:ReadDataFiles():model.cc:248) Loading i-vector extractor from ...
),最后停在INFO:websockets.server:server listening on 0.0.0.0:2700
。
- 正常启动日志会显示中文模型加载信息(如
-
用
test.py
测试中文音频 运行test.py
,传入处理好的中文音频文件:python3 test.py chinese_standard.wav # 或 chinese_record.wav
-
查看中文识别结果测试端会输出中文识别结果,例如:
{ "partial" : "你好" } { "partial" : "你好 世界" } { "text" : "你好 世界 今天 天气 很好" }
若输出中文文本,说明中文识别成功;若仍有乱码,检查模型是否为中文版本(重新执行第一步)。
常见问题排查
- 识别结果是英文 / 乱码 → 确认
model
文件夹是中文模型(非vosk-model-small-en-*
等英文模型); - 音频无识别结果 → 检查音频格式(用
ffmpeg -i
验证是否为 16kHz / 单声道 / 16 位); - 服务启动报错 "模型加载失败" → 重新下载中文模型,确保解压完整(
model
文件夹下有am
、graph
等子文件夹)。
总结
中文音频识别的核心是 "中文模型 + 标准格式音频",按步骤配置中文模型、处理音频格式后,就能实现准确的中文语音识别。后续对接 C 代码时,只需沿用相同的 WebSocket 流程,发送中文音频即可获取中文识别结果。