关于如何让 Vosk 正确识别中文音频,核心是 使用 Vosk 中文模型 + 确保中文音频格式符合要求

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())

操作步骤:

  1. 将上述代码保存为 asr_server.py(替换原文件);

  2. 确保模型路径正确(model 文件夹与脚本在同一目录,或使用绝对路径);

  3. 启动服务:

    复制代码
    python3 asr_server.py
  4. 测试语音识别:

    复制代码
    python3 test.py test_websocket.wav

预期结果:

  • 服务端会逐步输出中间识别结果(PartialResult);
  • 测试端最终会打印完整的识别文本(如音频中的内容)。

现在基础通信已通,整合识别逻辑后即可实现完整的语音识别功能。如果遇到模型加载问题,检查模型路径是否正确即可。


要让 Vosk 正确识别中文音频,核心是 使用 Vosk 中文模型 + 确保中文音频格式符合要求,按以下 3 个关键步骤操作,就能实现中文语音识别:

第一步:下载并配置 Vosk 中文模型(最关键!)

Vosk 识别中文必须依赖专门的中文模型(默认模型多为英文,会导致识别乱码或错误),推荐使用轻量且准确率高的 vosk-model-small-cn-0.15(适合嵌入式 / 普通场景)。

操作步骤:

  1. 删除旧模型(避免冲突) 进入 websocket 目录,删除之前可能存在的英文 / 其他语言模型:

    复制代码
    cd ~/lv_project/vosk-server/websocket
    rm -rf model  # 删除旧模型文件夹
  2. 下载中文模型 直接用 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 目录。
  3. 解压模型并命名为 model 解压后将模型文件夹重命名为 model(方便服务直接加载,无需修改代码):

    复制代码
    unzip vosk-model-small-cn-0.15.zip  # 解压
    mv vosk-model-small-cn-0.15 model  # 重命名为 model
  4. 验证模型是否正确 执行以下命令,确认 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 位深度)。

第三步:启动服务并测试中文识别

  1. 重启 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
  2. test.py 测试中文音频 运行 test.py,传入处理好的中文音频文件:

    复制代码
    python3 test.py chinese_standard.wav  # 或 chinese_record.wav
  3. 查看中文识别结果测试端会输出中文识别结果,例如:

    复制代码
    { "partial" : "你好" }
    { "partial" : "你好 世界" }
    { "text" : "你好 世界 今天 天气 很好" }

    若输出中文文本,说明中文识别成功;若仍有乱码,检查模型是否为中文版本(重新执行第一步)。

常见问题排查

  1. 识别结果是英文 / 乱码 → 确认 model 文件夹是中文模型(非 vosk-model-small-en-* 等英文模型);
  2. 音频无识别结果 → 检查音频格式(用 ffmpeg -i 验证是否为 16kHz / 单声道 / 16 位);
  3. 服务启动报错 "模型加载失败" → 重新下载中文模型,确保解压完整(model 文件夹下有 amgraph 等子文件夹)。

总结

中文音频识别的核心是 "中文模型 + 标准格式音频",按步骤配置中文模型、处理音频格式后,就能实现准确的中文语音识别。后续对接 C 代码时,只需沿用相同的 WebSocket 流程,发送中文音频即可获取中文识别结果。

相关推荐
百锦再3 小时前
一文掌握Flask:从基础使用到高级应用
后端·python·django·flask·virtualenv·scikit-learn·pygame
Q_Q19632884753 小时前
python+springboot+uniapp基于微信小程序的巴马旅居养老系统 旅游养老小程序
spring boot·python·小程序·django·flask·uni-app·node.js
小小测试开发3 小时前
用Python打造离线语音控制浏览器:基于VOSK的实用案例
python·语言模型·webbrowser·vosk·pyaudio
钟爱蛋炒饭4 小时前
Tornado和FastApi的区别
python·fastapi·tornado
铭哥的编程日记4 小时前
C++优选算法精选100道编程题(附有图解和源码)
开发语言·c++·算法
白露与泡影5 小时前
2025年高质量Java面试真题汇总
java·python·面试
程序员三藏5 小时前
Fiddler抓取HTTPS
自动化测试·软件测试·python·测试工具·https·fiddler·接口测试
꒰ঌ 安卓开发໒꒱5 小时前
Java 面试 -Java基础
java·开发语言·面试
不枯石7 小时前
Matlab通过GUI实现点云的最远点下采样(Farthest point sampling)
开发语言·图像处理·算法·计算机视觉·matlab