ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Vosk Python 离线语音识别 API 实战指南:多语言模型、流式识别与说话人识别

Vosk Python 离线语音识别 API 实战指南:多语言模型、流式识别与说话人识别 人工智能语音【免费下载链接】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点击查看免费下载本文以仓库 python/README.md 为核心骨架系统讲解 Vosk 官方 Python 模块的定位、能力边界与完整使用方式并结合仓库内vosk包源码、example示例与vosk-transcriber命令行工具深入剖析 Model、KaldiRecognizer、SpkModel、BatchModel 等核心类的实际调用方式帮助读者快速构建从离线转写到实时流式再到说话人识别的完整语音处理方案。Vosk 是什么离线开源语音识别工具包Vosk 是一个离线运行的开源语音识别工具包对应的 Python 模块即为本仓库python/目录下的vosk包。它最核心的特征是完全离线音频数据在本机完成识别不需要把语音上传到任何云端服务这使其天然适合对隐私、网络稳定性或延迟有严格要求的场景。从 python/README.md 的官方描述可以提炼出 Vosk 的四大能力支柱多语言覆盖支持 20 种语言与方言包括 English英语、Indian English印度英语、German德语、French法语、Spanish西班牙语、Portuguese葡萄牙语、Chinese中文、Russian俄语、Turkish土耳其语、Vietnamese越南语、Italian意大利语、Dutch荷兰语、Catalan加泰罗尼亚语、Arabic阿拉伯语、Greek希腊语、Farsi波斯语、Filipino菲律宾语、Ukrainian乌克兰语、Kazakh哈萨克语、Swedish瑞典语、Japanese日语、Esperanto世界语、Hindi印地语、Czech捷克语、Polish波兰语并且更多语言还在持续加入中。模型轻量但功能完整Vosk 模型很小约 50 MB却能提供连续的大词汇量转录continuous large vocabulary transcription、零延迟响应的流式 APIstreaming API、可重构的词汇表reconfigurable vocabulary以及说话人识别speaker identification。应用场景广泛可用于聊天机器人chatbots、智能家居设备smart home appliances、虚拟助手virtual assistants也可以为电影生成字幕subtitles for movies为讲座与访谈生成转录文本transcription for lectures and interviews。规模弹性大Vosk 可以从 Raspberry Pi、Android 智能手机这类小设备一路扩展到大型服务器集群big clusters。需要说明的是上述能力描述以官方 README 表述为准约 50 MB是官方文档给出的模型体量描述实际不同语言、不同精度的模型大小可能有所差异。Python 模块在 Vosk 生态中的位置Vosk 提供多语言 APIPython 只是其中之一。在本仓库中可以看到同等的 Java、C#、Node.js、Go、Ruby 以及 Android 原生封装底层统一通过 C API 与 C 实现recognizer.cc、model.cc 等交互。Python 模块通过 CFFI 绑定 C 动态库因此继承了同一套底层引擎的全部能力。安装 vosk Python 包Python 包通过 PyPI 分发标准安装方式为pip install vosk安装包的构建与依赖信息可从 python/setup.py 中确认包名vosk版本号0.3.75描述为 Offline open source speech recognition API based on Kaldi and Vosk运行时依赖cffi1.0C 接口绑定、requests模型列表查询、tqdm下载进度条、srt字幕生成、websockets远程识别服务需要 Python 3 及以上python_requires3通过 CFFI 模块cffi_modules[vosk_builder.py:ffibuilder]在安装时编译绑定层打包时会把src/下预编译的 C 库复制进vosk包内见 python/vosk_builder.py并声明package_data {vosk: [*.so, *.dll, *.dyld]}因此libvosk.so/libvosk.dll/libvosk.dyld会随包一起分发。安装完成后vosk包在导入时会自动加载对应平台的动态库。从 python/vosk/init.py 的open_dll()实现可以看到Windows 加载libvosk.dll并通过os.add_dll_directory处理依赖 DLL 路径、Linux 加载libvosk.so、macOS 加载libvosk.dyld其他平台会直接抛出TypeError(Unsupported platform)。语言模型与说话人模型识别需要额外的语言模型文件。官方提供vosk-model-*语音识别模型与vosk-model-spk-*说话人识别模型两类。Python 模块会自动管理模型的下载与缓存模型目录搜索顺序MODEL_DIRS见 python/vosk/init.py环境变量VOSK_MODEL_PATH→/usr/share/vosk→~/AppData/Local/vosk→~/.cache/vosk官方模型清单与下载源https://alphacephei.com/vosk/models/下的model-list.json以及list_models()/list_languages()两个工具函数在 python/vosk/init.py 中实现分别列出可用模型名与可用语言。快速开始离线转写一个 WAV 文件仓库 python/example/test_simple.py 是官方最简示例完整流程如下#!/usr/bin/env python3 import wave import sys from vosk import Model, KaldiRecognizer, SetLogLevel # You can set log level to -1 to disable debug messages SetLogLevel(0) wf wave.open(sys.argv[1], rb) if wf.getnchannels() ! 1 or wf.getsampwidth() ! 2 or wf.getcomptype() ! NONE: print(Audio file must be WAV format mono PCM.) sys.exit(1) model Model(langen-us) # You can also init model by name or with a folder path # model Model(model_namevosk-model-en-us-0.21) # model Model(models/en) rec KaldiRecognizer(model, wf.getframerate()) rec.SetWords(True) rec.SetPartialWords(True) while True: data wf.readframes(4000) if len(data) 0: break if rec.AcceptWaveform(data): print(rec.Result()) else: print(rec.PartialResult()) print(rec.FinalResult())这个示例包含四个必须掌握的关键点音频格式校验Vosk 只接受单声道mono、16-bit PCM、未压缩的 WAV 音频即getnchannels() 1、getsampwidth() 2、getcomptype() NONE。这也是几乎所有example/脚本共用的前置校验逻辑。模型初始化Model(langen-us)按语言初始化模型注释中还给出了两种等价方式——按模型名Model(model_namevosk-model-en-us-0.21)或按本地目录Model(models/en)。流式数据投喂rec.AcceptWaveform(data)接受原始音频字节返回非零值表示检测到一个完整的语音段utterance结束返回 0 表示仍在识别中应继续读取下一块数据。示例每次读取 4000 帧frame。三种结果获取Result()返回已结束语音段的最终结果、PartialResult()返回实时部分结果、FinalResult()返回文件末尾的收尾结果。三者的输出都是 JSON 字符串。对应仓库 python/example/test.wav 中的测试音频可用如下命令运行python test_simple.py test.wav从底层实现看AcceptWaveform最终调用的是 C APIvosk_recognizer_accept_waveform见 python/vosk/init.py其返回值对应引擎内部对语音段边界的判断实现在 src/recognizer.ccResult/PartialResult/FinalResult则分别对应vosk_recognizer_result、vosk_recognizer_partial_result、vosk_recognizer_final_result。Model 类三种初始化方式与自动下载Model的构造函数支持三种参数形态python/vosk/init.pymodel Model(model_pathmodels/en) # 直接指定本地模型目录 model Model(model_namevosk-model-en-us-0.21) # 按模型名查找/下载 model Model(langen-us) # 按语言自动选择模型其内部逻辑get_model_by_name/get_model_by_lang见 python/vosk/init.py按名称查找依次在MODEL_DIRS中查找目录名与模型名完全一致的本地模型找不到则请求远程model-list.json确认该模型名存在随后自动下载并解压到缓存目录。按语言查找本地匹配前缀vosk-model(-small)?-{lang}的目录远程则从模型清单中筛选lang lang、type small、obsolete false的条目找不到时打印lang xxx does not exist并退出。下载过程使用tqdm显示进度条download_model见 python/vosk/init.py下载完成后自动解压 zip 并删除压缩包。此外Model还提供find_word(word)方法对应 C APIvosk_model_find_word用于查询某个词是否在模型词典中这对动态语法校验很有用。KaldiRecognizer流式识别核心 APIKaldiRecognizer是 Python 包中最常用的识别器类。构造函数有三种形态python/vosk/init.pyrec KaldiRecognizer(model, sample_rate) # 基础识别 rec KaldiRecognizer(model, sample_rate, spk_model) # 带说话人模型 rec KaldiRecognizer(model, sample_rate, grammar_json) # 带受限语法JSON 字符串第 2 个参数是采样率如 16000 Hz第 3 个参数若是SpkModel实例则创建带说话人识别的识别器vosk_recognizer_new_spk第 3 个参数若是字符串则视为 JSON 格式语法vosk_recognizer_new_grm。常用配置方法方法对应 C API作用SetWords(True/False)vosk_recognizer_set_words在结果中输出带时间戳的逐词信息result字段SetPartialWords(True/False)vosk_recognizer_set_partial_words在部分结果中也输出逐词信息SetMaxAlternatives(n)vosk_recognizer_set_max_alternatives输出最多 n 个候选识别结果alternatives字段SetNLSML(True/False)vosk_recognizer_set_nlsml启用 NLSML 格式结果输出SetGrammar(json)vosk_recognizer_set_grm动态切换受限语法SetEndpointerMode(mode)vosk_recognizer_set_endpointer_mode调整静音端点检测灵敏度SetEndpointerDelays(t_start_max, t_end, t_max)vosk_recognizer_set_endpointer_delays自定义端点检测延迟参数SetSpkModel(spk_model)vosk_recognizer_set_spk_model为已创建的识别器附加说话人模型Reset()vosk_recognizer_reset清除识别器内部状态重新开始SetEndpointerMode的参数取自EndpointerMode枚举python/vosk/init.pyDEFAULT 0、SHORT 1、LONG 2、VERY_LONG 3用于在语音活动检测VAD灵敏度上做权衡——比如需要等待更长的句间停顿以合并长句时可选用LONG/VERY_LONG。识别循环的标准模式所有示例脚本都遵循同一种投喂—取结果循环while True: data wf.readframes(4000) if len(data) 0: break if rec.AcceptWaveform(data): print(rec.Result()) # 一段语音结束输出最终结果 else: print(rec.PartialResult()) # 仍在识别输出部分结果 print(rec.FinalResult()) # 流结束收尾逐词结果与候选结果test_words.py 与 test_alternatives.py开启SetWords(True)后Result()返回的 JSON 会包含带start/end时间戳和conf置信度的逐词数组。结合SetMaxAlternatives(n)与json.loads解析可获取多个候选文本。完整示例见 python/example/test_words.py 与 python/example/test_alternatives.pyrec KaldiRecognizer(model, wf.getframerate()) rec.SetMaxAlternatives(10) rec.SetWords(True) ... print(json.loads(rec.Result())) # 得到带 alternatives 与 result 的结构化结果受限语法缩小词表提升准确率python/example/test_words.py 还演示了受限语法grammar的用法把允许出现的词或短语以 JSON 列表形式传给识别器识别将被约束在该词表内从而显著提升特定领域如数字串、命令词的准确率rec KaldiRecognizer(model, wf.getframerate(), [oh one two three, four five six, seven eight nine zero, [unk]])语法可以在识别过程中动态切换调用rec.SetGrammar(...)非常适合先识别命令再进入数字输入这类多阶段交互。注意列表中包含[unk]用于显式声明允许输出未知词。NLSML 输出test_nlsml.pypython/example/test_nlsml.py 演示了rec.SetNLSML(True)与rec.SetMaxAlternatives(10)的组合使用使结果按 NLSMLNatural Language Semantic Markup Language自然语言语义标记语言格式输出适合需要语义结构化结果的下游系统。Reset对话中途重新开始python/example/test_reset.py 演示了rec.Reset()的典型用途当部分结果PartialResult的partial字段命中某个触发条件例如识别到 one zero zero zero时调用Reset()清空识别器内部状态、从头开始新一轮识别这是实现可打断式交互的基础。直接生成 SRT 字幕SrtResultKaldiRecognizer内置了SrtResult(stream, words_per_line7)方法python/vosk/init.py可直接从音频字节流生成 SRT 字幕文本。它会持续调用AcceptWaveform/Result/FinalResult把逐词时间戳按words_per_line个词一行分组借助srt库组装成标准字幕。python/example/test_srt.py 给出了配套用法——先用ffmpeg把任意格式音频转成 16 kHz、单声道、s16le 裸流再喂给SrtResultSAMPLE_RATE 16000 rec KaldiRecognizer(model, SAMPLE_RATE) rec.SetWords(True) with subprocess.Popen([ffmpeg, -loglevel, quiet, -i, sys.argv[1], -ar, str(SAMPLE_RATE), -ac, 1, -f, s16le, -], stdoutsubprocess.PIPE).stdout as stream: print(rec.SrtResult(stream))实时麦克风识别test_microphone.pypython/example/test_microphone.py 是完整的实时麦克风方案。它依赖第三方库sounddevicepip install sounddevice核心思路是用sounddevice的RawInputStream以dtypeint16、单声道采集原始 PCM 数据blocksize8000通过回调函数callback把每个音频块放入线程安全队列q主循环从队列取数据并调用rec.AcceptWaveform(data)输出Result()/PartialResult()命令行参数支持-l/--list-devices列出音频设备、-d/--device指定设备、-r/--samplerate指定采样率、-m/--model指定语言模型如nl、-f/--filename把原始音频转储到文件。典型用法python test_microphone.py -m nl # 用荷兰语模型实时识别 python test_microphone.py -l # 列出可用音频设备这个示例完整演示了 Vosk 的零延迟流式 API特性每投喂一小块数据就能立即拿到部分结果适合实时字幕、语音助手、同声转写等场景。说话人识别SpkModel 与 X-vectorVosk 的说话人识别能力由SpkModel提供。从 python/vosk/init.py 可以看到SpkModel(model_path)直接加载说话人模型目录并封装vosk_spk_model_new。注意说话人模型需单独下载官方模型站点的model-spk模型python/example/test_speaker.py 在启动时会检查本地model-spk目录是否存在。python/example/test_speaker.py 演示了两种绑定方式from vosk import Model, KaldiRecognizer, SpkModel model Model(langen-us) spk_model SpkModel(model-spk) # 方式一构造时传入 # rec KaldiRecognizer(model, wf.getframerate(), spk_model) # 方式二构造后附加 rec KaldiRecognizer(model, wf.getframerate()) rec.SetSpkModel(spk_model)当识别到完整语音段时Result()的 JSON 会额外包含两个字段spk说话人的 X-vector 特征向量一个高维浮点数组作为该说话人的声纹指纹spk_frames用于计算该向量的音频帧数。示例中通过余弦距离cosine_dist比较两个 X-vector距离越小说明越可能是同一说话人从而实现说话人区分。官方注释还给出了实用建议单句过短时 X-vector 可靠性较差时长超过 4 秒的语句能产生更稳定的声纹向量因此声纹入库应优先使用较长的音频片段。GPU 批量识别BatchModel 与 BatchRecognizer对于大规模音频转写Vosk 提供基于 CUDA 的批量识别接口。相关类为BatchModel、BatchRecognizer配套初始化函数GpuInit()/GpuThreadInit()python/vosk/init.pyGpuInit()在进程内初始化 CUDA 上下文必须在创建批量模型前调用BatchModel(model_path)加载用于批量识别的模型BatchRecognizer(model, sample_rate)为每个音频文件创建一个批量识别器BatchRecognizer.AcceptWaveform(data)投喂音频数据BatchRecognizer.FinishStream()标记一个音频流结束BatchModel.Wait()等待 GPU 上当前批次的结果就绪BatchRecognizer.Result()/GetPendingChunks()取出队首结果取出即弹出与查询待处理块数。python/example/test_gpu_batch.py 给出了完整的批量转写流程从文件清单逐行读取音频文件路径 → 为每个文件创建BatchRecognizer→ 循环喂数据并调用model.Wait()等结果 → 汇总每个文件的text字段 → 最后打印总耗时并计算xRT实时倍速音频时长 / 处理耗时指标python test_gpu_batch.py filelist.txt批量模式适合离线处理大量录音例如访谈库、客服通话归档把多路音频并发提交给 GPU充分利用并行算力。vosk-transcriber开箱即用的命令行转写工具安装vosk包时会自动注册vosk-transcriber命令入口声明见 python/setup.py实现见 python/vosk/transcriber/cli.py。它把解码 模型管理 输出格式化全部封装好是最快的上手途径。命令行参数参数简写默认值说明--model-m无本地模型路径--model-name-n无按模型名选择支持自动下载--lang-len-us按语言选择模型--server-s无使用远程识别服务如ws://localhost:2700--input-i无必填输入音频文件或目录--output-o空输出文件路径为空则打印到标准输出--output-type-ttxt输出格式txt/srt/json--tasks-ts10并行识别任务数--list-models无False列出可用模型--list-languages无False列出可用语言--log-level无INFO日志级别用法示例# 列出可用模型与语言 vosk-transcriber --list-models vosk-transcriber --list-languages # 转写单个文件输出到标准输出 vosk-transcriber -i speech.wav # 转写单个文件输出 SRT 字幕到文件 vosk-transcriber -i speech.wav -o speech.srt -t srt # 批量转写目录下所有音频输出 JSON vosk-transcriber -i ./audio_dir -o ./out -t json --tasks 20从 python/vosk/transcriber/transcriber.py 的实现看其工作流程是通过ffmpeg把输入音频统一重采样为 16 kHz、单声道、s16le 裸流resample_ffmpeg使用Model(model_path..., model_name..., lang...)加载模型Transcriber.__init__每个任务创建一个KaldiRecognizer并开启SetWords(True)按 4000 字节块投喂数据recognize_stream用multiprocessing.dummy.Pool线程池并行处理任务--tasks控制并发数按输出类型格式化结果format_resulttxt把所有非空text按行拼接srt按 7 个词一行生成带时间戳的字幕复用srt库json输出符合 schemaVersion 2.0 的 monologue 结构含 speaker、时间范围、逐词 terms 与置信度若指定--server则改为通过websockets把音频流发送到远程识别服务recognize_stream_server实现本地解复用、远程识别的架构。文本后处理ITN 逆文本正规化Processor类python/vosk/init.py封装了底层vosk_text_processor_new/vosk_text_processor_itn提供**逆文本正规化Inverse Text Normalization, ITN**能力把识别出的口语化文本如 one hundred and twenty three dollars转换为书写形式如 $123。构造时传入两个字符串参数对应底层处理器所需的参数随后调用process(text)即可得到规范化后的文本。该能力常用于金融、电商、日程录入等对数字/金额格式敏感的场景。其他工具函数与模块级能力vosk包还导出以下模块级能力SetLogLevel(level)设置 C 层日志级别-1可关闭调试输出对应 C APIvosk_set_log_levelGpuInit()/GpuThreadInit()CUDA 初始化进程级 / 线程级list_models()/list_languages()从官方模型清单在线获取模型名与语言列表EndpointerMode枚举端点检测模式。仓库内配套资源一览读者可继续在仓库中查看以下资源以加深理解python/example/全部官方示例含 test_ffmpeg.py、test_ep.py 端点检测、test_itn.py、test_text.py 等未在本文展开的脚本与测试音频 test.wavpython/vosk/init.pyPython 绑定的全部类与函数实现python/vosk/transcriber/vosk-transcriber命令的实现python/setup.py 与 python/vosk_builder.py打包与 CFFI 绑定构建src/vosk_api.h 与 src/vosk_api.cc底层 C API 定义与实现src/recognizer.cc、src/model.cc、src/spk_model.cc识别器、模型、说话人模型的 C 核心实现python/test/transcribe_scp.py批量转写测试脚本。结语Vosk 的 Python 模块用简洁的类设计封装了完整的离线语音识别能力Model负责模型加载与自动下载KaldiRecognizer提供流式、逐词、候选、受限语法与字幕输出SpkModel带来说话人声纹BatchModel/BatchRecognizer支撑 GPU 批量转写vosk-transcriber则让零代码使用者也能立刻投入生产。无论是嵌入式设备上的实时唤醒词还是服务器上的大规模音频归档转写这一套 API 都提供了统一、可复用的解决方案。赞分享人工智能语音【免费下载链接】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-API语音识别指南20语言离线识别全解析终极Vosk API语音识别指南20语言离线识别全解析 Vosk API是一款强大的离线开源语音识别工具包支持20多种语言和方言的语音识别包括英语、印度人工智能语音Vosk-api新范式完全离线的多语言语音识别解决方案Vosk api新范式完全离线的多语言语音识别解决方案 你是否还在为语音识别依赖网络而烦恼是否因延迟问题影响用户体验Vosk api为你带来革命性的离线语人工智能语音终极指南如何用Vosk-api实现20语言离线语音识别终极指南如何用Vosk api实现20语言离线语音识别 Vosk api是一款强大的离线开源语音识别工具包支持20多种语言和方言的语音识别包括英语、印度人工智能语音上一篇Infer Pulse 检查器 PULSE_UNINITIALIZED_CONST检测 Hack 抽象常量未初始化读取下一篇Beads 的 Claude Code 入口文件全解从 bd prime 到 Dolt 同步的 AI Agent 工作流规范创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表