Python语音识别实战:基于Vosk实现离线语音转文字(附完整代码)
如果你需要开发离线语音转文字功能,Vosk 绝对是比 Whisper 更轻量化的选择(Whisper 基础模型需数百 MB,且依赖 PyTorch)。下载后解压,记住模型文件夹路径(如 D:\models\vosk-model-small-cn-0.22),后续代码中需配置。print("PyAudio是否可用:", pyaudio.PyAudio() is not None)print(f"\n
一、为什么选择 Vosk?—— 离线场景的最优解
在语音识别领域,常见的方案有百度 AI、讯飞等在线 API,以及 Whisper、Vosk 等离线工具。而 Vosk 的核心优势的在于:
- 完全离线:无需网络即可运行,适合嵌入式设备(树莓派)、内网环境等场景;
- 轻量高效:模型体积小(最小仅几十 MB),支持实时流处理,延迟低;
- 多语言支持:内置中文、英文、日语等 40 + 语言模型,无需额外训练;
- 易集成:提供 Python、Java、C++ 等多语言 SDK,API 简洁,5 行代码即可实现基础功能;
- 开源免费:无调用次数限制,商业项目可直接使用。
如果你需要开发离线语音转文字功能,Vosk 绝对是比 Whisper 更轻量化的选择(Whisper 基础模型需数百 MB,且依赖 PyTorch)。
二、环境搭建:3 步快速部署
1. 安装依赖库
Vosk 的 Python SDK 支持 Python 3.6+,直接通过 pip 安装:
|
pip install vosk # 核心库 pip install pyaudio # 音频输入(麦克风录音用) pip install wave # 音频文件处理(可选,用于解析WAV文件) |
⚠️ 避坑提醒:
- Windows 系统安装 pyaudio 失败时,先下载对应 Python 版本的 whl 文件(https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio),再执行 pip install 文件名.whl;
- Linux 系统需先安装依赖:sudo apt-get install portaudio19-dev python3-pyaudio。
2. 下载语言模型
Vosk 的识别效果依赖预训练模型,需根据需求下载对应模型(推荐中文用户选择以下两个):
|
模型名称 |
体积 |
适用场景 |
下载地址 |
|
vosk-model-small-cn-0.22 |
40MB |
轻量场景、嵌入式设备 |
|
|
vosk-model-cn-0.22 |
1.1GB |
高精度场景、桌面应用 |
下载后解压,记住模型文件夹路径(如 D:\models\vosk-model-small-cn-0.22),后续代码中需配置。
3. 验证环境
创建测试文件 test_env.py,运行以下代码检测依赖是否正常:
|
import vosk import pyaudio print("Vosk版本:", vosk.__version__) print("PyAudio是否可用:", pyaudio.PyAudio() is not None) |
无报错则说明环境搭建成功!
三、实战案例 1:麦克风实时语音转文字
实现实时录音并识别,适合语音助手、实时字幕等场景。
完整代码
|
import vosk import pyaudio import json # 1. 配置模型路径(替换为你的模型文件夹路径) MODEL_PATH = r"D:\models\vosk-model-small-cn-0.22" # 2. 初始化模型 model = vosk.Model(MODEL_PATH) # 3. 配置音频参数(需与模型要求一致) FORMAT = pyaudio.paInt16 # 16位采样 CHANNELS = 1 # 单声道 RATE = 16000 # 采样率(Vosk模型默认16000Hz) CHUNK = 4096 # 缓冲区大小 def realtime_asr(): # 初始化音频流 p = pyaudio.PyAudio() stream = p.open( format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK ) print("�� 开始录音,按 Ctrl+C 停止...") try: while True: # 读取音频数据 data = stream.read(CHUNK) # 语音识别(返回JSON字符串) result = model.Recognize(data) # 解析结果 if result: text = json.loads(result)["text"] if text: # 过滤空结果 print(f"识别结果:{text}") except KeyboardInterrupt: print("\n�� 录音停止") finally: # 释放资源 stream.stop_stream() stream.close() p.terminate() if __name__ == "__main__": realtime_asr() |
运行效果
|
�� 开始录音,按 Ctrl+C 停止... 识别结果:你好 Vosk 语音识别 识别结果:今天天气不错 识别结果:Python 实战教程 �� 录音停止 |
四、实战案例 2:解析本地 WAV 文件
如果需要识别已保存的音频文件(仅支持 WAV 格式),可使用以下代码:
完整代码
|
import vosk import wave import json MODEL_PATH = r"D:\models\vosk-model-small-cn-0.22" WAV_FILE_PATH = r"D:\test_audio.wav" # 你的WAV文件路径 def wav_asr(): # 验证WAV文件参数 wf = wave.open(WAV_FILE_PATH, "rb") if wf.getnchannels() != CHANNELS or wf.getsampwidth() != 2 or wf.getframerate() != RATE: print("❌ WAV文件参数错误!需满足:单声道、16位、16000Hz") return # 初始化模型和识别器 model = vosk.Model(MODEL_PATH) rec = vosk.KaldiRecognizer(model, wf.getframerate()) rec.SetWords(True) # 启用词级识别(可选) print("�� 正在识别音频文件...") full_text = "" # 逐帧读取音频并识别 while True: data = wf.readframes(4096) if len(data) == 0: break if rec.AcceptWaveform(data): # 解析完整句子 result = json.loads(rec.Result()) full_text += result["text"] + " " # 识别最后一段音频 final_result = json.loads(rec.FinalResult()) full_text += final_result["text"] print(f"\n完整识别结果:{full_text.strip()}") wf.close() if __name__ == "__main__": wav_asr() |
⚠️ 注意:
- 本地 WAV 文件必须满足:单声道、16 位采样、16000Hz 采样率,否则会识别失败;
- 可使用格式工厂等工具将 MP3、MP4 等格式转换为符合要求的 WAV 文件。
五、进阶优化:提升识别准确率
- 选择合适的模型:追求精度优先用 vosk-model-cn-0.22(1.1GB),嵌入式设备用 small 版本;
- 优化音频输入:
- 减少环境噪音(使用麦克风时远离声源干扰);
- 确保说话人距离麦克风 30-50cm,避免大声喊叫或小声低语;
- 启用语言模型扩展:Vosk 支持加载自定义词汇表(.txt 文件),适合专业领域(如技术术语、行业名词),配置方式:
|
# 自定义词汇表(vocab.txt 中每行一个词汇) rec = vosk.KaldiRecognizer(model, RATE) rec.SetGrammarFile("vocab.txt") |
- 处理连续语音:通过 rec.AcceptWaveform() 累积音频数据,识别完整句子后再输出,避免逐帧输出的碎片化结果。
六、常见问题排查
- 模型加载失败:检查模型路径是否正确,文件夹是否包含 model.bin 等核心文件;
- 识别结果为空:音频参数(采样率、声道数)与模型不匹配,或环境噪音过大;
- Pyaudio 导入失败:参考 “环境搭建” 部分的避坑提醒,手动安装对应版本的 whl 文件;
- 识别速度慢:降低 CHUNK 缓冲区大小(如 2048),或使用 small 版本模型。
七、总结与扩展
Vosk 作为轻量级离线语音识别工具,在 Python 中集成难度低、运行效率高,适合快速落地语音转文字功能。除了本文的基础场景,还可扩展到:
- 语音控制程序(如通过语音指令执行 Python 脚本);
- 批量处理音频文件(如会议录音转文字);
- 嵌入式设备开发(如树莓派 + 麦克风实现离线语音助手)。
如果需要进一步提升准确率,可结合 NLP 工具(如 jieba 分词、同义词替换)优化识别结果;若需支持更多音频格式(MP3、MP4),可搭配 ffmpeg 先转码为 WAV 再识别。
更多推荐
所有评论(0)