1. 为什么用Python做语音识别选whisper还是vosk先把结论摆在前面如果你需要在本地、离线环境下把语音转成文字现阶段最省心、效果最稳的两条路就是OpenAI开源的whisper和基于Kaldi的vosk。这两个我都跑过不少场景包括给视频批量生成字幕、在树莓派上做语音控制、以及会议录音的文字化整理总体感受是whisper的准确率上限更高vosk的轻量实时性更好具体选谁完全取决于你的使用场景。先说Python为什么是首选。语音识别这个方向Python生态实在是太成熟了whisper官方就提供了Python接口vosk也专门做了Python绑定底层虽然一个是PyTorch、一个是C库Kaldi但到Python这一层全部封装成了几行代码就能调用的API。你不需要理解声学模型、语言模型背后的复杂原理只要会用Python、会装依赖包就能在本地跑出一套可用的语音转写系统。对于绝大多数个人项目和中小型业务来说这个门槛已经低到“照着文档抄一遍就能用”的程度。那whisper和vosk到底怎么选我用一张表把核心差异列出来你对照自己的场景看就清楚了对比维度whispervosk底层架构Transformer基于大规模多语言训练Kaldi经典DNN-HMM架构模型体积tiny约75MBbase约142MBsmall约466MBmedium约1.5GBlarge约3GB英文小模型约40MB中文小模型约42MB大模型约1.8GB识别精度中英文混输、长难句、带口音的语音表现都很强标准普通话识别不错但复杂场景弱于whisper实时性需整段音频输入离线批量转写实时性差支持流式识别边录音边出文字延迟低资源占用CPU能跑但慢GPU体验好很多CPU完全能扛树莓派也能跑适合场景离线批量转写、字幕生成、会议记录、准确保留语义实时语音控制、智能硬件、交互式对话、低延迟场景一句话总结我的经验不赶时间、追求转写质量直接上whisper要实时、要轻量、要部署在低功耗设备上选vosk。如果你预算够、需求也不极端两个方案可以结合起来用——vosk做实时唤醒和指令词识别whisper做对准确率要求高的长文本转写。后面的内容我会把这两个方案从安装到调用完整走一遍包括我踩过的坑和调优参数照着做基本能少走很多弯路。2. 环境准备与依赖安装2.1 Python版本与基础依赖不管用whisper还是vosk先保证你的Python环境是干净、可用的。我开发机上用的是Python 3.10whisper和vosk官方都对3.8到3.11支持得比较稳妥3.12和3.13虽然也能装但有些底层依赖可能还没有完全适配所以不建议一上来就用最新版本。安装whisper需要的最核心依赖是PyTorch。如果你机器上有NVIDIA显卡建议先去PyTorch官网按你的CUDA版本安装GPU版比如CUDA 11.8对应的安装命令是pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118没有显卡也没关系CPU版一样能跑只是速度会慢一些后面我会单独说CPU和GPU的体验差异。vosk的依赖则简单得多它不依赖PyTorch核心库是C写的Python包只是封装层所以不管有显卡没显卡直接装就行。安装完Python基础环境后还有几个通用依赖需要确认一是ffmpegwhisper读取音频时依赖ffmpeg做解码Windows用户建议去ffmpeg官网下载安装包后把bin目录加到系统PATH中Linux用户用apt或yum装即可二是numpy、soundfile这类音频处理库后面处理音频文件时会用到。2.2 安装whisper和vosk环境清理干净后安装过程其实就两条命令pip install openai-whisper pip install voskwhisper安装时会自动拉取torch、tiktoken、more-itertools这些依赖第一次安装耗时可能较长属于正常现象。如果你网络条件一般建议先配置好国内pip镜像源比如pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple配置完镜像源之后whisper和vosk的下载速度都会有明显提升。这里提一句安装whisper后命令行工具也会自动装好你甚至不需要写Python代码直接用命令就能转写音频whisper audio.mp3 --model base --language zh不过我更推荐用Python API来调用因为可以灵活控制输出格式、批量处理文件、接入你自己的业务流程。后面我会详细演示。3. whisper实操离线批量转写中文音频3.1 模型选择与速度实测whisper的模型从tiny到大参数规模递增识别效果也随之提升。我测试过同一份2分钟左右的中文会议录音家里录的环境噪音不大几种模型的耗时和效果对比如下模型参数量CPU耗时2分钟音频GPU耗时2分钟音频中文识别效果tiny39M约40秒约5秒勉强能听错误较多base74M约1分钟约7秒短句可以长句会漏字small244M约3分钟约12秒日常对话基本能看懂medium769M约10分钟约35秒比较准确个别专有名词会错large1550M约30分钟约1分半准确率最高接近人工转写从实际体验看中文场景我建议至少用small起步追求效果就直接medium或者large。tiny和base在英文上表现还行但中文因为语序、同音字、语气词纷繁复杂小模型真的力不从心。模型加载时会自动从OpenAI的服务器下载权重文件多语言模型默认会缓存到当前用户目录下的. cache/whisper文件夹。如果你不想每次重复下载可以把模型文件下载好之后放到本地路径通过model参数指定路径加载import whisper # 直接加载首次会下载权重 model whisper.load_model(medium) # 或者指定本地缓存路径 model whisper.load_model(/your/local/path/medium.pt)3.2 基本调用与关键参数解读加载完模型之后转写一段音频只需要一行代码result model.transcribe(meeting_recording.mp3, languagezh) print(result[text])如果你只需要纯文本打印result[text]就行。但其实transcribe函数返回的结果远不止这些里面包含了每个片段的起止时间、置信度等信息for seg in result[segments]: print(f[{seg[start]:.2f}s - {seg[end]:.2f}s] {seg[text]})这个输出格式特别适合做字幕文件。你不需要手动拼接时间轴whisper已经帮你把切分工作做完了直接遍历segments就能导出SRT或VTT字幕。transcribe的几个关键参数我实际调下来最常改的是language指定语言比如中文就传zh不传会自动检测。自动检测在短音频上偶发误判建议手动指定。fp16GPU上默认为TrueCPU上需要手动设为False。fp16能显著提升推理速度但如果你的GPU不支持比如部分旧显卡会报错或出现NaN结果遇到就改成fp16False。beam_sizebeam search的束宽默认是5。调大会更精准但也更慢追求速度可以调小到1相当于贪心解码。best_of仅在beam_size1时生效默认是5控制候选序列数量。这个参数一般用默认就行不用过度纠结。verbose默认True会打印每个片段的识别过程批量处理时建议设成False输出更干净。temperature采样温度。默认0表示完全确定的解码结果稳定可复现如果你发现识别结果不够多样可以适当调高到0.2左右增加一点随机性但大多数场景不推荐乱调。一段相对完整的批量转写脚本我贴出来给你参考import whisper import os model whisper.load_model(medium) audio_dir ./audios output_dir ./transcripts os.makedirs(output_dir, exist_okTrue) for filename in os.listdir(audio_dir): if not filename.endswith((.mp3, .wav, .m4a)): continue filepath os.path.join(audio_dir, filename) print(f正在处理: {filename}) result model.transcribe( filepath, languagezh, fp16False, beam_size3, verboseFalse ) output_file os.path.join(output_dir, os.path.splitext(filename)[0] .txt) with open(output_file, w, encodingutf-8) as f: f.write(result[text].strip()) print(f已完成: {filename} - {output_file})这个脚本我一直在用批量处理几十个音频文件时非常省心。唯一要注意的是内存medium模型在CPU上大约占2GB左右的内存如果机器配置低建议每次只处理一个文件处理完就释放。3.3 中文识别优化的几个技巧用whisper做中文转写光靠默认参数能解决80%场景但想把准确率再往上提有几个技巧值得一试第一音频预处理很关键。如果音频里有明显环境噪音、音乐或者回声建议先做降噪或去混响。我用的是ffmpeg sox的组合简单粗暴有效ffmpeg -i input.mp3 -ar 16000 -ac 1 -af highpassf200,lowpassf8000 output.wav转换成16kHz单声道音频再加高通滤波去掉低频噪声、低通滤波去掉高频嘶声whisper的识别效果会有肉眼可见的提升。这个步骤对whisper和vosk都有帮助。第二长音频切成短片段再识别。whisper本身设计是能处理长音频的但对于十几分钟、几十分钟的长录音中间某个片段如果环境突变比如有人开门、突然有音乐可能会连带影响前后片段的识别。我习惯先用ffmpeg按静音自动切分或者直接按固定时长切片每段不超过10分钟识别完再拼接文本。切片时注意留一点前后重叠避免文字从中间被切断ffmpeg -i input.wav -f segment -segment_time 600 -c copy part_%02d.wav第三利用initial_prompt做上下文校正。whisper支持传入一段初始化提示文本可以帮助模型理解语言风格和专业术语。比如你做医疗领域的内容可以这样传result model.transcribe( doctor_lecture.mp3, languagezh, initial_prompt以下是一段关于临床医学的学术讲座请准确转写医学术语。 )实测下来对有特定领域词汇的音频这个办法能明显减少错字。不过提示语不要写太长一两句话点到为止。4. vosk实操轻量级实时语音识别4.1 模型下载与加载vosk的模型需要单独下载不在pip包里。官方提供了很多语言模型中文有两个常用版本一个是small版vosk-model-small-cn-0.22体积约42MB适合树莓派、嵌入式设备一个是完整版vosk-model-cn-0.22体积约1.8GB精度更高但资源占用也大。模型下载解压后加载方式非常直观from vosk import Model, KaldiRecognizer model Model(vosk-model-small-cn-0.22)对比whispervosk的模型加载速度要快得多small中文模型在普通笔记本上基本上1秒内就能加载完这在需要频繁启停的应用场景里优势明显。4.2 离线文件识别与实时麦克风识别vosk支持两种典型使用方式第一种是文件识别直接把音频文件转成文字import json import wave from vosk import Model, KaldiRecognizer model Model(vosk-model-small-cn-0.22) wf wave.open(test_audio.wav, rb) if wf.getsampwidth() ! 2: raise ValueError(音频必须是16bit位深) if wf.getcomptype() ! NONE: raise ValueError(音频必须是未压缩格式) rec KaldiRecognizer(model, wf.getframerate()) rec.SetWords(True) results [] while True: data wf.readframes(4000) if len(data) 0: break if rec.AcceptWaveform(data): result json.loads(rec.Result()) results.append(result[text]) final_result json.loads(rec.FinalResult()) results.append(final_result[text]) print( .join(results))这里有三个容易踩坑的点我逐个说一是音频格式。vosk对WAV格式要求严格必须是16kHz采样率、16bit位深、单声道、未压缩的PCM编码。你随便拿一个从网上下载的WAV文件去处理很可能就是8bit或44.1kHz直接喂进去识别率会大幅下降甚至报错。解决办法是用ffmpeg统一转格式ffmpeg -i any_audio.mp3 -ar 16000 -ac 1 -sample_fmt s16 out.wav二是识别结果的拼接逻辑。vosk的识别是流式的你需要通过AcceptWaveform逐块喂数据每一块返回的中间结果和最终结果通过Result()和FinalResult()获取。中间结果会不断修正所以如果你只用FinalResult()得到的文本会更准确但会牺牲一定实时性如果你用Result()能实现边输入边出文字的效果但单次输出的片段可能不完整。三是**SetWords(True)**这个参数。开启后会把每个词的时间戳、置信度也返回给你方便做字词级别的时间对齐。如果不需要保持默认False就行还能省一点内存和时间。第二种是麦克风实时识别这也是vosk最拿手的场景。官方示例用的是pyaudio做音频采集我用下来需要注意pyaudio在Windows上安装可能遇到麻烦如果pip直接装不上可以下载对应Python版本的whl文件离线安装。核心代码如下import json import pyaudio from vosk import Model, KaldiRecognizer model Model(vosk-model-small-cn-0.22) rec KaldiRecognizer(model, 16000) p pyaudio.PyAudio() stream p.open(formatpyaudio.paInt16, channels1, rate16000, inputTrue, frames_per_buffer8000) stream.start_stream() print(开始语音识别按CtrlC结束) while True: data stream.read(4000, exception_on_overflowFalse) if rec.AcceptWaveform(data): result json.loads(rec.Result()) if result[text]: print(result[text], flushTrue) stream.stop_stream() stream.close() p.terminate()这段代码跑起来之后你对着麦克风说话屏幕上会实时刷新识别出的文字。我实测在普通笔记本上从说完话到文字上屏延迟基本在0.5秒以内这比whisper动辄等几秒才出结果要爽太多了。4.3 vosk的参数调优与场景适配vosk的KaldiRecognizer还有两个比较有用的方法一个SetMaxAlternatives一个是SetWords前者可以输出多个候选结果后者可以返回词级时间戳rec.SetMaxAlternatives(2) rec.SetWords(True)MaxAlternatives开启后结果里会带alternatives字段里面是模型认为可能的其他说法在需要做关键词匹配的场景下很有用。举个例子你做一个“开灯”“关灯”的语音控制如果识别结果是两个候选你就能通过模糊匹配提高指令的命中率。vosk还有一个官方配套的VAD语音活动检测逻辑虽然库本身没有直接暴露VAD接口但通过监听每段的静音时长可以在一定程度上实现“检测到静音就断句”的效果。我做过一个简单的实现每识别出一段文字就判断前面是否有足够长的静音间隔超过阈值则把这段文字单独输出。这样比单纯按时间切分要自然得多。在实际项目里vosk更适合做关键词唤醒、命令词识别、实时字幕、电话录音转写这类轻量场景。它不追求把每个字都转得完美而是追求用很低的资源消耗完成“够用的识别”。我自己在树莓派4B上跑过vosk small中文模型CPU占用大概在20%到30%之间内存占用不到100MB完全能作为语音控制模块长时间运行这一点whisper在相同硬件上是做不到的。5. 常见问题与排查技巧实录语音识别这个方向跑通demo容易但真正放到项目里用各种意外多得是。我把这段时间遇到的高频问题整理成一张速查表方便你直接对照排查。问题现象可能原因解决方案whisper报错ffmpeg not foundffmpeg没有安装或没加入PATHWindows下载ffmpeg后配置环境变量Linux执行apt install ffmpegwhisper结果出现乱码或全英文没有指定language参数模型自动检测误判transcribe传参languagezhCPU上whisper很慢甚至卡死模型太大或误用fp16换small模型加fp16False参数vosk报错Model file not found模型路径写错或模型文件没解压确认路径是解压后的文件夹而不是压缩包vosk识别结果为空音频采样率不是16kHz或位深不对用ffmpeg统一转成16kHz、16bit、单声道WAVpyaudio安装失败缺少编译环境Windows下载对应whl安装Linux安装portaudio麦克风实时识别有回声扬声器声音被麦克风采集戴上耳机或调整声卡的回声消除设置GPU显存溢出模型太大、batch开太高用medium模型或降低batch_size除了速查表里的内容还有几个我特别想提醒的坑第一个是whisper的CPU推理耗时问题。一张30分钟的会议录音用small模型在CPU上跑可能需要半小时以上这个时间成本对很多项目来说是不可接受的。所以如果你的业务需要频繁处理长音频我非常建议上一块NVIDIA显卡哪怕入门的GTX 1650medium模型的推理速度都能比CPU快五倍以上。第二个是vosk模型的版本匹配问题。vosk库升级后旧的模型文件有时会出现不兼容的情况表现就是加载时报错或者识别结果全部为空。解决办法是把vosk包和模型一起更新到同一时期发布的版本官网每个模型页面都会标注它适配的vosk版本范围下载前花十秒确认一下。第三个是中文的标点符号问题。whisper的英文输出本身就带标点和大小写中文输出则没有标点或者只有极少数句号。如果你想在中文转写结果里加上完整的逗号、句号、问号需要额外做标点恢复。一个简单做法是用自然语言处理库比如paddle-nlp的标点恢复模型或者简单粗暴地用规则根据语气词和停顿来切句。我目前用的是后者因为轻量、不引入额外依赖。有没有更完美的方案说实话whisper官方一直没给出很好的中文标点恢复能力这个算是whisper中文场景里最大的短板之一。6. 两个方案怎么选以及我的一些实践建议到这里两个方案的基本用法你都清楚了我再把选择思路和落地的细节说透一点。如果你拿不准自己该用哪个可以按下面的路径做决策如果你的需求是把一段已有的音频文件转成高质量文字比如会议录音、采访录音、网课内容选whisper模型直接上medium或large不要犹豫。如果你的需求是实时读取麦克风语音并做出响应比如语音助手、语音控制、实时字幕选vosk模型用small足够延迟低、资源占用小。如果两者都需要比如做一个语音记事本先用vosk做声音活动检测和临时文字预览用户点击“保存并全文转写”后再调whisper做一次精识别效率和体验都能兼顾。这个混合方案我目前就在用体感很好。vosk负责实时反应的粗识别whisper负责最终的精细转写两边各取所长既解决了vosk长音频累计误差的问题也解决了whisper无法实时出结果的问题。另外还有一个容易忽略的点是识别结果的标记与置信度利用。whisper的segment输出里包含综合置信度信息vosk的word输出里也带置信度。在实际项目中我会把置信度低于某个阈值的片段单独标记出来交给人工复核或者在下游处理时降低这些片段的影响。比如自动生成会议纪要时低置信度的片段直接不参与关键词提取避免把错误内容带进摘要里。最后想说的是语音识别这个领域发展太快了去年觉得whisper已经很强今年又出现了更快更准的方案。但不管底层模型怎么换Python这套调用逻辑、音频预处理流程、模型选型思路都是通用的。把基础打牢后面换模型对你来说也就是换个API的事。如果你在实际跑的过程中遇到代码或者配置上的问题欢迎在评论区留言我看到会一一回复。也可以分享一下你准备用语音识别做什么项目说不定我能给你一些更针对性的建议。