news 2026/9/11 13:29:24

3行代码跑通Vosk离线语音识别:零基础从安装到出字幕完整攻略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
3行代码跑通Vosk离线语音识别:零基础从安装到出字幕完整攻略

3行代码跑通Vosk离线语音识别:零基础从安装到出字幕完整攻略

【免费下载链接】vosk-apiOffline speech recognition API for Android, iOS, Raspberry Pi and servers with Python, Java, C# and Node项目地址: https://gitcode.com/GitHub_Trending/vo/vosk-api

Vosk 是一个完全离线的开源语音识别工具包:音频在本地转文字,不上传任何数据,支持 20 多种语言,模型只有约 50MB。它适合想在自己设备、树莓派或服务器上嵌入语音转文字的开发者,以及不想把会议录音、采访音频交给云端处理的你。

它到底解决什么问题

一句话:把"音频→文字"做成一个可以在树莓派上跑的本地库。

和云端识别 API 相比,区别在于三点:

  • 断网可用,音频不出内网,隐私可控
  • 流式接口,边说边出结果,延迟接近零
  • 模型约 50MB(小模型),加载快、部署轻

代价是识别精度略低于大型云端服务,专有名词、强口音场景要多做调优。

五分钟装好

三步:装包、下模型、跑示例。

第 1 步,装 Python 包:

pip install vosk

第 2 步,准备模型。你不用手动下载:Model(lang="en-us")会按语言名自动查找本地缓存(~/.cache/vosk),找不到就自动下载解压。中文对应lang="zh-cn",全部可选模型名可以查仓库里 python/vosk/init.py 中的模型列表逻辑。

第 3 步,跑最小示例。准备一个 16kHz、单声道、16bit 的 WAV 文件,然后:

import wave from vosk import Model, KaldiRecognizer model = Model(lang="en-us") wf = wave.open("test.wav", "rb") rec = KaldiRecognizer(model, wf.getframerate()) while True: data = wf.readframes(4000) if len(data) == 0: break if rec.AcceptWaveform(data): print(rec.Result()) print(rec.FinalResult())

运行后,每识别完一句就打印一段 JSON,rec.Result()返回{"result": ["word", "word"]},最后一句在循环外由FinalResult()兜底——这个细节很多人漏掉,导致结尾丢字。

最常用功能逐个过

流式识别与实时中间结果

AcceptWaveform返回 0 时,用rec.PartialResult()拿当前半句话,就能做"边说边显示"的交互界面;返回 1 表示一句话结束,取Result()。麦克风实时转写的完整写法在 python/example/test_microphone.py,依赖pip install sounddevice,音频块通过队列喂给识别器,结构可以直接抄。

顺手生成 SRT 字幕

SrtResult内置了按词时间戳切字幕的逻辑,配合 ffmpeg 把任意视频音频流成 16kHz 单声道,十几行就能出 .srt 文件:

import subprocess from vosk import Model, KaldiRecognizer model = Model(lang="en-us") rec = KaldiRecognizer(model, 16000) rec.SetWords(True) # 字幕依赖逐词时间戳,必须开启 cmd = ["ffmpeg", "-loglevel", "quiet", "-i", "video.mp4", "-ar", "16000", "-ac", "1", "-f", "s16le", "-"] with subprocess.Popen(cmd, stdout=subprocess.PIPE).stdout as stream: print(rec.SrtResult(stream))

仓库里的 python/example/test_srt.py 就是这段的完整版。想批量处理整个目录、输出 txt/srt/json,可以看 python/vosk/transcriber/ 里的 Transcriber 实现,它已经写好了 ffmpeg 重采样和多任务并行。

用语法锁住识别范围

自由识别之外,KaldiRecognizer支持传入 JSON 词表做受限识别,适合命令词场景(如"上/下/暂停"):

rec = KaldiRecognizer(model, rate, '["one two three", "[unk]"]')

只接受词表里的短语,加[unk]兜底识别表外内容;运行时还能用rec.SetGrammar()换词表,做动态菜单。

说话人识别

加载一个说话人模型SpkModel(path)后,识别结果里会多出一个spk向量,用余弦距离判断"是不是同一个人",可做免唤醒的身份确认。参考 python/example/test_speaker.py。注意短于 4 秒的语句 x-vector 不可靠。

多语言与多平台

20 多种语言模型按需加载,切语言就是Model(lang="xx")换个参数。除 Python 外,仓库自带 Java/Kotlin(含 Android 语音服务)、Node.js、C#、Go、C 的绑定和示例,手机侧入口在 android/lib/src/main/java/org/vosk/。GPU 批量推理有GpuInit()+BatchModel接口,适合服务器场景。

踩过坑才知道的实用技巧

  • 采样率必须和识别器声明的一致KaldiRecognizer(model, 16000)就喂 16kHz 音频,不一致时识别全乱且无报错,先查wf.getframerate()
  • 非标准格式先转码。Vosk 只吃 WAV 单声道 16bit PCM,MP3/48kHz 立体声先用 ffmpeg 转,别指望它自动兼容。
  • 静音太长会误判句尾。长停顿被当成句子结束,可用rec.SetEndpointerMode()调成LONG模式放宽判定。
  • 小模型优先。50MB 的 small 模型覆盖大多数场景,别一上来就选大模型拖慢加载。

高频问题,一句话答

现象:Failed to create a model→ 原因:模型路径不存在或没下载完 → 解法:改用Model(lang="xx")让它自动下载,或检查网络后重试。

现象:识别结果全空或乱码→ 原因:音频不是 16kHz 单声道 16bit → 解法:ffmpeg -i in.mp3 -ar 16000 -ac 1 -f s16le out.wav转码后再喂。

现象:句子末尾丢字→ 原因:没取最终结果 → 解法:音频读完后再调一次rec.FinalResult()

总结

Vosk 用"约 50MB 模型 + 流式 API + 多语言绑定"换来了断网环境里可用的完整离线语音识别链路。下一步:pip install vosk,clone 仓库(git clone https://gitcode.com/GitHub_Trending/vo/vosk-api)后打开 python/example/,先跑通 test_simple.py,再换你的音频。

【免费下载链接】vosk-apiOffline speech recognition API for Android, iOS, Raspberry Pi and servers with Python, Java, C# and Node项目地址: https://gitcode.com/GitHub_Trending/vo/vosk-api

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 13:27:46

RustFS AWS IAM 策略变量(Policy Variables)端到端测试全解析

RustFS AWS IAM 策略变量(Policy Variables)端到端测试全解析 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

作者头像 李华
网站建设 2026/9/11 13:25:33

OpenCV与多模态大模型实战:从图像预处理到模型部署全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 13:25:28

微信刷题小程序商业模式与盈利策略分析

1. 刷题类微信小程序的商业潜力分析微信小程序自2017年推出以来,已经成为移动互联网生态中不可忽视的力量。在教育领域,刷题类小程序因其轻量化、即用即走的特性,获得了大量学生和职场人士的青睐。这类产品通常聚焦于各类考试题库&#xff08…

作者头像 李华
网站建设 2026/9/11 13:25:19

Python核心语法与高级特性精要解析

1. Python核心语法精要回顾 作为一门已经使用多年的动态语言,Python的语法糖和特性总是让我在每次重新使用时都能发现新的惊喜。最近在准备技术面试时,我系统梳理了Python中那些容易被忽视却又至关重要的语法要点,这里分享给同样需要巩固基础…

作者头像 李华
网站建设 2026/9/11 13:19:59

动态规划解决最大子数组和问题

1. 最大子数组和问题解析最大子数组和(Maximum Subarray)是算法领域的一个经典问题,也是力扣(LeetCode)HOT100题库中的高频面试题。题目描述很简单:给定一个整数数组nums,找到一个具有最大和的连…

作者头像 李华
网站建设 2026/9/11 13:19:31

多层PCB阻抗控制与布线实操:从叠层设计到高速差分信号

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华