
Dolphin源码深度解析从模型加载到解码的完整推理流程【免费下载链接】DolphinDolphin is a multilingual, multitask ASR model jointly trained by DataoceanAI and Tsinghua University.项目地址: https://gitcode.com/gh_mirrors/dolphin22/DolphinDolphin 是由 DataoceanAI 与清华大学联合训练的多语言、多任务自动语音识别ASR模型支持 40 种东方语言与 22 种中文方言训练数据超过 21 万小时。本文将带你一步步拆解 Dolphin 源码中的完整推理流程从模型加载、音频预处理、VAD 切分到 E-Branchformer 编码器推理、CTC 与 attention rescoring 解码以及时间戳和热词增强的实现细节帮你彻底读懂这套开源 ASR 引擎。Dolphin 是什么多语言多任务 ASR 模型的核心特性Dolphin 的定位与 OpenAI Whisper 相似但在设计上做了针对语音识别的关键改动它不支持翻译任务去除了历史文本及其相关 token专注做好识别本身。核心特性包括四大任务合一语音识别ASR、语音活动检测VAD、切分Segmentation、语言识别LID两层级语言标记系统第一个 token 指定语言如zh、ja第二个 token 指定区域如CN、JP这是 Dolphin 应对语言与地区多样性差异化的关键设计️CTC-Attention 混合架构编码器基于 E-Branchformer解码器为标准 Transformer多个尺寸可选base0.1B、small0.4B已开源另有 medium0.9B、large1.7B以及中文方言系列base.cn、small.cn、small.cn.prompt、streaming 版等所有可用模型清单定义在 dolphin/model_registry.py 中包含模型 ID、SHA256 校验值等元信息。推理流程总览一条音频的完整旅程一条音频从输入到输出文字的完整链路可以概括为 7 个环节音频加载 → 特征提取LogMel-Fbank→ VAD 切分长音频→ E-Branchformer 编码 → CTC 前向 → 解码attention / attention rescoring→ 后处理与时间戳入口函数是transcribe与transcribe_long它们都定义在 dolphin/transcribe.py 中。CLI 入口 dolphin/main.py 会根据音频时长自动选择短于 30 秒走transcribe超过则走带 VAD 切分的transcribe_long阈值定义在 dolphin/constants.py 的SPEECH_LENGTH 30。第一步模型加载与初始化load_model 详解推理的第一步在dolphin.load_model()整个过程值得细看本地缓存检查默认模型目录为~/.cache/dolphin/{model_name}会比对本地.pt文件的 SHA256 是否与注册表一致不一致则自动重新下载自动下载通过modelscope.snapshot_download拉取模型权重、train.yaml配置、units.txt词表与bpe.model配置装载读取train.yaml动态修正 CMVN 统计文件与 tokenizer 词表路径权重加载与版本兼容调用init_speech_model(configs)构建模型若检测到旧版权重含normalize.mean则通过convert_v1_state_dict自动迁移热词编码器装配若权重含context_module会单独加载HotwordEncoderCPPN 结构用于后续 deep biasing 热词增强设备与模式自动检测 CUDA/CPUmodel.eval()进入推理模式这一系列逻辑集中在 dolphin/transcribe.py 的load_model函数模型结构定义则在 dolphin/model.py。第二步音频预处理与特征提取模型只接受 16kHz 单声道 WAV因此任何输入音频都要先统一格式。这一步由 dolphin/audio.py 的convert_audio调用 FFmpeg 完成转换转换逻辑见 dolphin/processor.py 的extract_feats使用torchaudio.load读入音频多声道取第一通道采样率统一重采样到 16k特征提取有两条路径优先使用DefaultFrontendSTFT → 功率谱 → LogMel-Fbank80 维否则退回 kaldi fbank最终输出(batch, frames, 80)的 fbank 特征与对应长度值得一提的是 dolphin/model.py 中的Stft类做了 ARM 兼容处理在无 MKL 的 CPU 设备上会回退到 librosa 实现。第三步VAD 语音活动检测与长音频切分长音频推理时transcribe_long会先加载 FunASR 的speech_fsmn_vad_zh-cn-16k-common-pytorchVAD 模型将音频切成若干有效语音段然后逐段提取特征、送入模型解码最后按段落返回带start/end的TranscribeSegmentResult列表。VAD 切分的好处是✅ 避免长音频一次性计算导致显存溢出✅ 每段独立预测语言、区域结果更稳定✅ 天然支持分段时间戳输出第四步编码器推理——E-Branchformer无论哪种解码方式第一步都是编码器前向。在ASRModel._forward_encoder中输入特征经过 E-Branchformer 编码器得到高层表示encoder_out和掩码encoder_mask。E-Branchformer 的结构亮点定义在 dolphin/model.py组件说明Conv2dSubsampling4卷积下采样将帧长压缩到 1/4RelPositionalEncoding相对位置编码提升泛化EBranchformerEncoderLayer并行的全局注意力分支 局部卷积分支ConvolutionalGatingMLP再融合输出GlobalCMVN全局倒谱均值方差归一化抑制信道噪声编码器输出同时供给两条分支CTC 分支通过ctc_logprobs得到每帧 token 概率分布注意力解码器分支则用编码表示做交叉注意力。第五步解码策略——从 CTC 到 attention rescoringDolphin 支持 4 种解码方法全部实现于 dolphin/search.pyctc_greedy_search每帧取 argmax再去除重复与 blank速度最快但精度最低ctc_prefix_beam_searchCTC 前缀束搜索用PrefixScore维护 blank/non-blank 两条路径得分可输出 n-bestattention纯注意力束搜索逐 token 自回归生成attention_beam_searchattention_rescoring默认先用 CTC 前缀束搜索生成 n-best 候选再用注意力解码器逐候选打分重排兼顾速度与精度解码前还有一个关键环节语言与区域 token 预测。predict_lang_region_timestamp会先在sos后依次预测语言、区域和时间戳三个特殊 token作为解码前缀强制引导生成方向。若用户在transcribe()中显式指定了lang_sym与region_sym则直接拼接进前缀跳过预测。第六步热词增强——deep biasing 与 prompt 热词人名、产品名、专业术语等冷门词是 ASR 的常见痛点Dolphin 源码内置两套热词方案dolphin/hotword.pyEncoder-biaseddeep biasing通过HotwordEncoderCPPN 网络把热词序列编码为上下文向量在解码时对编码器输出做偏置加权。热词按字符级切分因为 BPE 对中文热词不友好Prompt-based 热词把热词拼成[PROMPT_START 热词... PROMPT_END]前缀喂给解码器配合 CTC 后验的两阶段过滤two_stage_filtering只保留音频中真正出现的热词兼顾效果与显存命令行动态热词示例如下dolphin audio.wav --model small.cn --hotword_str 张三,李四 --use_deep_biasing true第七步时间戳预测与结果后处理解码完成后dolphin/search.py 会做两步后处理词级时间戳利用 CTC 强制对齐get_token_timestamp_torchaudio得到每个词在音频中的起止时间再经ctc_alignment_to_timestamp把帧号换算为秒并做异常时长修正特殊 token 过滤_filter_nonspecial_tokens剔除语言、区域、时间戳等控制 token_filter_prompt_tokens提取出模型实际命中的热词文本最终结果封装为TranscribeResult包含text、text_nospecial、language、region和word_timestamps五个字段解引用通过 dolphin/tokenizer.py 的 BPE 分词器完成。快速上手用 Python 与命令行跑通 Dolphin 推理安装前先确保系统装有 FFmpeg然后安装 Dolphinpip install -U dataoceanai-dolphin命令行一行识别dolphin audio.wav --model small.cnPython 三行搞定import dolphin from dolphin import transcribe model dolphin.load_model(small.cn, devicecuda) result transcribe(model, audio.wav, lang_symzh, region_symCN) print(result.text_nospecial) # 识别文本小结一张推理流程图看懂 Dolphin 源码回顾全文Dolphin 的推理流程可概括为load_model缓存/下载/装配置→extract_featsfbank→ VAD 切分 →ASRModel.decode→ 编码器E-Branchformer→ CTC 前向 → 解码attention rescoring→ 热词增强 → 时间戳与后处理整个链路代码清晰、模块划分合理transcribe.py调度、model.py网络、search.py解码、hotword.py热词四个文件构成核心骨架非常适合作为学习端到端 ASR 推理源码的入门项目。如果你正打算深入理解 ASR 工程的完整实现Dolphin 源码绝对值得一读。【免费下载链接】DolphinDolphin is a multilingual, multitask ASR model jointly trained by DataoceanAI and Tsinghua University.项目地址: https://gitcode.com/gh_mirrors/dolphin22/Dolphin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考