ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

VibeVoice-ASR 实战指南:统一模型如何一次完成 60 分钟长音频的转写、说话人分离与时间戳标注

2026/9/6 18:20:53 拓冰建站 浏览量
VibeVoice-ASR 实战指南:统一模型如何一次完成 60 分钟长音频的转写、说话人分离与时间戳标注 VibeVoice-ASR 实战指南统一模型如何一次完成 60 分钟长音频的转写、说话人分离与时间戳标注【免费下载链接】VibeVoiceOpen-Source Frontier Voice AI项目地址: https://gitcode.com/GitHub_Trending/vib/VibeVoice本文以docs/vibevoice-asr.md为主线讲解 VibeVoice 仓库中 VibeVoice-ASR 这一统一语音识别ASR模型的核心能力、模型架构与安装使用方法并结合仓库源码剖析其长音频分块编码、热词上下文注入与结构化 JSON 输出的实现细节。读完本文你将掌握在 GPU 环境部署 VibeVoice-ASR-7B 的完整流程、两条官方推理路径Gradio 交互 Demo 与文件批处理推理的全部关键参数以及如何准备数据、用 LoRA 微调模型并加载推理。一、VibeVoice-ASR 是什么VibeVoice-ASR 是 VibeVoice 开源语音 AI 家族中的自动语音识别模型官方提供的权重为 VibeVoice-ASR-7BHugging Face 上的microsoft/VibeVoice-ASR本文命令中使用的--model_path即指向它。与传统 ASR 不同它把三件通常分离的工作合并到一次前向生成里完成ASRWhat语音转文字说话人分离Who为每段语音标注说话人 ID时间戳When给出每段语音的起止时间。最终输出是一份结构化转写说明“谁在什么时候说了什么”并原生支持自定义热词Customized Hotwords与 50 种以上语言无需显式指定语言也能处理句内与句间的双语混说code-switching。四大核心特性官方文档列出的核心特性逐条对应仓库中的具体实现60 分钟单次处理60-minute Single-Pass Processing常规 ASR 往往把长音频切成短块分别识别容易丢失全局上下文。VibeVoice-ASR 在 64K token 长度内接受最长 60 分钟的连续音频输入保证整个一小时内说话人追踪与语义连贯。从源码看音频以 24 kHz 采样、语音 token 压缩比为 3200见 VibeVoiceASRProcessor即 1 秒音频约 7.5 个语音 token60 分钟约 27,000 个 token正好落在 64K 上下文窗口内——这就是“60 分钟一次过”的 token 预算依据。自定义热词Customized Hotwords用户可传入专有名词、人名、术语或背景信息来引导识别显著提升领域内容准确率。在 Gradio Demo 中这对应transcribe()的context_info参数在批量推理脚本中则通过 processor 的context_info字段注入具体拼接方式见下文“热词如何进入提示词”一节。富转写Rich TranscriptionWho / When / What模型联合执行 ASR、说话人分离与时间戳直接产出结构化输出。模型输出为 JSON每个片段包含Start time、End time、Speaker ID、Content四个键由 post_process_transcription 解析为统一字段。多语言与代码切换Code-Switching支持 50 种以上语言不需要显式语言设置并在语料层面覆盖了多语言分布见原文档中的 Language Distribution 图。官方还配套了 vLLM 加速推理文档 与 流式识别文档分别解决高并发服务与“边听边转写”两类场景。二、模型架构与内部数据流上图为 VibeVoice-ASR 的架构图语音经声学/语义两条 token 化通路变成嵌入与文本 token 一起送入基于 Qwen2.5 的语言模型以自回归方式生成 JSON 转写。结合 modeling_vibevoice_asr.py 可以确认几个关键结构语言模型decoderVibeVoiceASRModel用AutoModel.from_config加载语言模型主干并挂接acoustic_tokenizer声学 VAE 编码器、semantic_tokenizer语义编码器以及两个SpeechConnector把 speech 特征投影到语言模型 hidden size语音编码入口encode_speech()输入[batch, samples]的 24 kHz 波形。对短音频直接走acoustic_tokenizer.encode()采样出 token 再经 connector 投影当音频长度超过分段时长默认 60 秒时从源码结构看会启用流式分段编码——按 60 秒切片借助VibeVoiceTokenizerStreamingCache维护跨块卷积缓存逐段编码后拼接从而避免超长波形一次性过卷积带来的内存与数值问题见 encode_speech特征回填模型 forward 时processor 生成的acoustic_input_mask标出输入序列中|speech_pad|占位 token 的位置编码出的语音特征直接覆写进inputs_embedsinputs_embeds[acoustic_input_mask] speech_features随后与系统/用户文本 token 一起进入语言模型做自回归生成。这条“占位 token 掩码回填”的设计让语音特征在 token 序列里拥有与文本相同的位置语义也为长音频提供了在提示词中精确表达时长信息的基础。三、输入是如何被处理的采样率、压缩比与热词提示词安装和使用前理解输入侧约定能帮你正确准备音频。VibeVoiceASRProcessor 的关键约定约定取值说明目标采样率target_sample_rate24000 Hz非 24 kHz 音频会被 resample 到 24 kHz语音 token 压缩比speech_tok_compress_ratio32001 秒音频 ≈ 7.5 个语音 token占位 token 数按ceil(samples / 3200)计算音频归一化normalize_audioTrue目标响度 -25 dBFSAudioNormalizer 先按 RMS 调整到目标 dBFS再防削波音频解码ffmpeg 优先soundfile 兜底load_audio_use_ffmpeg 用ffprobe探测采样率并转单声道 PCMCOMMON_AUDIO_EXTS 定义了支持的格式mp3/m4a/mp4/wav/m4v/aac/ogg/mov/opus/m4b/flac/wma/rm/3gp/mpeg/flv/webm/mp2/aif/aiff/oga/ogv/mpga/m3u8/amr 等提示词构造同样值得注意_process_single_audio系统提示固定为You are a helpful assistant that transcribes audio input into text output in JSON format.用户输入形如|speech_start||speech_pad|×N|speech_end|\n 一段说明文本其中 N 为语音 token 数说明文本为This is a {时长:.2f} seconds audio, please transcribe it with these keys: Start time, End time, Speaker ID, Content热词注入点当传入context_info时说明文本变为This is a {时长:.2f} seconds audio, with extra info: {context_info}\n\nPlease transcribe it with these keys: ...——即热词/背景信息以自然语言形式拼进用户提示词而不是走声学前端这解释了为什么任意专有名词都能“即插即用”。四、安装Docker pip官方推荐用 NVIDIA Deep Learning Container 管理 CUDA 环境文档验证范围PyTorch 容器 24.07 ~ 25.12更早版本也兼容# 1. 启动 NVIDIA PyTorch 容器 sudo docker run --privileged --nethost --ipchost --ulimit memlock-1:-1 --ulimit stack-1:-1 --gpus all --rm -it nvcr.io/nvidia/pytorch:25.12-py3 # 若容器内没有 flash attention需要手动安装 # pip install flash-attn --no-build-isolation# 2. 从 GitHub 克隆并安装 git clone https://github.com/microsoft/VibeVoice.git cd VibeVoice pip install -e .从两份推理脚本的依赖行为看运行环境还需注意批量推理脚本对音频解码依赖 ffmpegGradio Demo 文档也明确要求apt install ffmpeg注意力实现按设备自动选择CUDA 且装有flash_attn时用flash_attention_2否则回退sdpaMPS/CPU/XPU 一律sdpa且权重精度用float32CUDA 用bfloat16见 device 检测逻辑。五、使用方法用法 1启动 Gradio 交互 Demoapt update apt install ffmpeg -y # demo 需要 ffmpeg python demo/vibevoice_asr_gradio_demo.py --model_path microsoft/VibeVoice-ASR --shareGradio Demodemo/vibevoice_asr_gradio_demo.py适合快速验证与体验源码中可以看到它提供的完整交互能力输入上传音频文件、填入音频路径或直接用麦克风录制支持start_time/end_time参数按秒或hh:mm:ss截取片段热词context_info输入框支持填入人名、术语、主题句等透传给transcribe(context_info...)生成参数max_new_tokensDemo 默认 8192、temperature0 即贪心解码、top_p、do_sample、repetition_penalty流式输出通过TextIteratorStreamer在后台线程生成、主协程逐 token 增量展示并支持“停止”按钮自定义StopOnFlag停止条件结果展示原始 JSON 输出 解析后的分段列表时间区间、说话人、文本并按段时间戳切出每段可播放的小音频16 kHz 单声道、约 32 kbps MP3依赖pydub缺失时退回 WAV。输入 token 统计speech/text/padding 三类占比也会随结果打印方便核对 60 分钟音频的 token 占用。用法 2对文件直接做批量推理python demo/vibevoice_asr_inference_from_file.py \ --model_path microsoft/VibeVoice-ASR \ --audio_files /path/to/audio1.mp3 /path/to/audio2.wav批量推理脚本 面向批处理场景除文档给出的两条基础命令外完整参数默认值来自源码 argparse如下参数默认值说明--model_path空必填其一模型检查点路径或 Hugging Face 名称--audio_files无一个或多个音频文件路径--audio_dir无目录批量转写按COMMON_AUDIO_EXTS过滤支持的格式--dataset/--split无 /test从 Hugging Face 数据集如openslr/librispeech_asr流式拉取短音频并拼接成约 1 小时的长音频用于演示需另装datasets、torchcodec仅演示用途不用于评测--max_duration3600.0拼接长音频的目标时长秒--batch_size2批量处理大小transcribe_with_batching按该大小分块送入模型--device自动cuda/xpu/mps/cpu 探测也支持auto多卡自动分配--max_new_tokens3276860 分钟音频的长转写需要较大的生成上限--temperature0.0为 0 时强制贪心解码do_sample temperature 0--top_p1.0核采样阈值仅采样时生效--num_beams11 时切到束搜索并自动关闭采样--attn_implementationauto可选flash_attention_2/sdpa/eager/autoauto 下 CUDA 且装了 flash_attn 时优先 flash_attention_2每个样本的输出包含三部分raw_text模型原始 JSON 文本、segments经post_process_transcription解析出的结构化片段start_time/end_time/speaker_id/text与generation_time。解析逻辑支持json代码块包裹或直接数组/对象两种形态并做键名归一化Start/End/Speaker等别名统一映射解析失败时安全降级为空列表而不抛错post_process_transcription。六、基准测试与多语言结果官方文档给出三项指标的对比图说话人分离 DER、带说话人错误 cpWER、带说话人时间戳错误 tcpWERDER说话人分离cpWERtcpWER多语言基准MLC-Challenge11 语种与会议场景基准DER / cpWER / tcpWER / WER数值越低越好数据集语言DERcpWERtcpWERWERMLC-ChallengeEnglish4.2811.4813.027.99MLC-ChallengeFrench3.8018.8019.6415.21MLC-ChallengeGerman1.0417.1017.2616.30MLC-ChallengeItalian2.0815.7615.9113.91MLC-ChallengeJapanese0.8215.3315.4114.69MLC-ChallengeKorean4.5215.3516.079.65MLC-ChallengePortuguese7.9829.9131.6521.54MLC-ChallengeRussian0.9012.9412.9812.40MLC-ChallengeSpanish2.6710.5111.718.04MLC-ChallengeThai4.0914.9115.5713.61MLC-ChallengeVietnamese0.1614.5714.5714.43数据集语言DERcpWERtcpWERWERAISHELL-4Chinese6.7724.9925.3521.40AMI-IHMEnglish11.9220.4120.8218.81AMI-SDMEnglish13.4328.8229.8024.65AliMeetingChinese10.9229.3329.5127.40MLC-ChallengeAverage3.4214.8115.6612.07语种覆盖方面原文档附有一张 50 语言的训练分布图 language_distribution_horizontal.png可据此查看各语言语料占比。七、LoRA 微调领域适配与热词增强原文档指出 VibeVoice-ASR 支持 LoRALow-Rank Adaptation微调详细指引见 finetuning-asr/README.md。结合该目录与仓库结构要点如下数据格式音频文件与同名 JSON 标注放在同一目录如0.mp30.json。JSON 结构与推理输出的“Who/When/What”一一对应{ audio_duration: 351.73, audio_path: 0.mp3, segments: [ { speaker: 0, text: Hey everyone, welcome back..., start: 0.0, end: 38.68 }, { speaker: 1, text: Thanks for having me..., start: 38.75, end: 77.88 } ], customized_context: [Tea Brew, Aiden Host, The property is near Meter Street.] }其中customized_context为可选字段即领域术语或背景句训练时通过--use_customized_context默认 True拼入上下文——与推理端context_info热词机制形成训练/推理闭环。注意仓库自带的toy_dataset/是由 VibeVoice TTS 生成的合成音频仅作格式演示正式微调应准备真实录音与准确转写。训练命令1 卡与多卡两种写法# 1 GPU torchrun --nproc_per_node1 lora_finetune.py \ --model_path microsoft/VibeVoice-ASR \ --data_dir ./toy_dataset \ --output_dir ./output \ --num_train_epochs 3 \ --per_device_train_batch_size 1 \ --learning_rate 1e-4 \ --bf16 \ --report_to none # 指定 GPU 0,1,2,3 CUDA_VISIBLE_DEVICES0,1,2,3 torchrun --nproc_per_node4 lora_finetune.py \ --model_path microsoft/VibeVoice-ASR \ --data_dir ./toy_dataset \ --output_dir ./output \ --num_train_epochs 3 \ --per_device_train_batch_size 1 \ --learning_rate 1e-4 \ --bf16 \ --report_to none关键 LoRA 参数脚本基于 HuggingFaceTrainingArguments其余标准参数均可用参数默认值说明--lora_r16LoRA 秩越小参数越少越大表达力越强--lora_alpha32LoRA 缩放因子通常取秩的 2 倍--lora_dropout0.05LoRA 层 dropout--per_device_train_batch_size8单卡批大小长音频场景常需调小到 1--gradient_accumulation_steps1有效批大小 批大小 × 累积步数--learning_rate5e-5LoRA 常用 1e-4 ~ 2e-4--gradient_checkpointingFalse开启以降低显存占用--use_customized_contextTrue是否把 JSON 中的 customized_context 作为额外上下文--max_audio_lengthNone超过该时长秒的音频跳过训练依赖方面先pip install -e .再pip install peft。微调后用 inference_lora.py 验证python inference_lora.py \ --base_model microsoft/VibeVoice-ASR \ --lora_path ./output \ --audio_file ./toy_dataset/0.mp3 \ --context_info Tea Brew, Aiden Host如需合并权重获得更快的推理可按 README 给出的方式用PeftModel.from_pretrained加载后调用merge_and_unload()并save_pretrained保存为独立模型目录。八、许可与相关资源项目整体采用 MIT License 授权见 LICENSE。延伸阅读建议均在当前仓库内部署加速docs/vibevoice-vllm-asr.md 介绍 vLLM 服务化推理vllm_plugin/ 下有配套插件与 API 测试脚本流式识别docs/vibevoice-asr-streaming.md 描述“边听边转写”的流式 ASR 变体Gradio 部署细节docs/setup_gradio_demo.md。再次强调适用前提长音频60 分钟级单次转写建议放在 GPU 上以bfloat16运行并优先使用 flash-attentionCPU/MPS 环境脚本会自动切换float32sdpa但显存与耗时预算会显著变化请据此规划数据量与max_new_tokens设置。【免费下载链接】VibeVoiceOpen-Source Frontier Voice AI项目地址: https://gitcode.com/GitHub_Trending/vib/VibeVoice创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考