Audio8 ASR Infinite 配置详解:逐行读懂 config.json 里的全部流式参数
【免费下载链接】Audio8-ASR-Infinite项目地址: https://ai.gitcode.com/hf_mirrors/Edge0/Audio8-ASR-Infinite
Audio8 ASR Infinite 是一个原生流式语音识别模型,支持 80/120/160 ms 音频时钟与 240–560 ms 可配置转写延迟,可借助滚动 KV 缓存实现 24/7 不间断转写而不漂移。想调好它,关键就是读懂 config.json 里的流式参数。本文带你逐行拆解每一个字段,帮你快速完成流式语音识别配置。
先认识这个仓库:每个文件是干什么的 🗂️
| 文件 | 作用 |
|---|---|
| config.json | 模型主配置:音频塔、文本解码器、全部流式参数(本文主角) |
| configuration_audio8_asr_infinite.py | 配置类定义与参数校验逻辑(trust_remote_code时加载) |
| modeling_audio8_asr_infinite.py | 模型本体实现 |
| preprocessor_config.json | 音频特征提取参数(16 kHz、128 mel) |
| tokenizer_config.json | 分词器与流式专用特殊 token |
| generation_config.json | 生成行为默认值 |
| model.safetensors / model.safetensors.index.json | 主权重(8.17 GB,bfloat16)与权重索引 |
| semantic_vad_heads.safetensors | 语义 VAD 分类头权重 |
| chat_template.jinja | Qwen 对话模板 |
| README.md | 项目说明、评测与部署方式 |
加载时 config.json 的auto_map会自动挂载上面两个 Python 文件,所以这个 checkpoint 必须以"完整权重目录 + 信任远程代码"的方式加载。
config.json 三大区块:音频塔、投影器、文本解码器
打开 config.json,可以把它分成三层理解:
{ "model_type": "audio8_asr_infinite", "audio_config": { ... }, // 音频编码器(Voxtral Realtime 风格) "text_config": { ... }, // 文本解码器(Qwen2.5-3B-Instruct) ... // 顶层:流式参数集中营 }audio_config:音频塔参数
| 参数 | 值 | 含义 |
|---|---|---|
hidden_size | 1280 | 音频塔隐层宽度,32 层(config.json) |
num_mel_bins | 128 | 梅尔频谱维度,与特征提取器一致 |
max_position_embeddings | 1500 | 约 30 秒原生上下文(1500 token × 20 ms) |
sliding_window | 750 | 滑动窗口注意力,省显存 |
streaming_n_left_pad_tokens | 18 | 流式推理时的左侧历史保留 token 数 |
rope_theta | 1000000 | 旋转位置编码基频,利于长序列外推 |
text_config:Qwen2.5-3B 解码器
解码器继承自Qwen2.5-3B-Instruct(config.json):36 层、隐层 2048、16 个查询头 / 2 个 KV 头(GQA 结构),max_position_embeddings为 32768,词表 151936。tie_word_embeddings: true表示词嵌入与输出层共享权重,更省内存。
💡 音频塔负责"听懂声音",解码器负责"写出文字",中间靠一个投影器(projector)衔接,下一节的顶层参数大多是给这条流水线服务的。
顶层流式参数逐行拆解 🔍
这是全文最核心的部分。这些字段共同定义了"模型多久做一次决策、看多远、延迟多少"。
音频时钟:audio_tower_frame_ms与supported_frame_lens
| 参数 | 值 | 说明 |
|---|---|---|
audio_tower_frame_ms | 20 | 音频塔的最小时间分辨率(20 ms/token) |
supported_frame_lens | 4 / 6 / 8 | 支持每 4、6、8 个音频 token 做一次文本决策 |
audio_length_per_tok | 8 | 每个文本 token 默认对应的音频 token 数 |
把frame_len乘以 20 ms,就得到三种可选的音频时钟:
| frame_len | 音频时钟 | 每秒决策次数 | 定位 |
|---|---|---|---|
| 4 | 80 ms | 12.5 次 | 最灵敏,资源开销最高 |
| 6 | 120 ms | 8.3 次 | 均衡 |
| 8 | 160 ms | 6.25 次 | 最省资源 |
校验逻辑在 configuration_audio8_asr_infinite.py 的resolve_frame_len中:你传入的streaming_frame_ms必须是 20 ms 的整数倍,且换算出的frame_len必须落在[4, 6, 8]里,否则直接报错。
转写延迟:target_delay_ms与num_delay_tokens_by_frame_len
这是流式识别里"延迟换准确率"的调节旋钮:
target_delay_ms列出240 / 320 / 480 / 560四档可选延迟。num_delay_tokens_by_frame_len是一张"延迟换算表":把毫秒延迟换算成延迟 token 数。例如 80 ms 时钟下480 ms ÷ 80 ms = 6个延迟 token;120 ms 时钟下240 ms ÷ 120 ms = 2个。
换算与合法性校验的源码在 configuration_audio8_asr_infinite.py 的resolve_num_delay_tokens中,规则只有一条:target_delay_ms必须是所选时钟的整数倍。
⚠️ 注意default_num_delay_tokens为null,意味着推理时必须显式传入num_delay_tokens,模型不会替你猜(见 modeling_audio8_asr_infinite.py)。
优化运行点速查表 🎯
不是所有组合都经过后训练调优。以下是官方推荐的frame_len+target_delay_ms组合(摘自 README.md):
| 音频时钟 | frame_len | streaming_n_left_pad_tokens | 推荐 target_delay_ms |
|---|---|---|---|
| 80 ms | 4 | 18 | 240 / 320 / 480 / 560 |
| 120 ms | 6 | 12 | 240 / 480 |
| 160 ms | 8 | 9 | 320 / 480 |
对应streaming_n_left_pad_tokens_by_frame_len:左侧保留的音频上下文 token 数随时钟变长而递减——时钟越长,每步看到的信息越多,需要的历史反而越少。
帧长嵌入:use_frame_len_embedding与projection_size
| 参数 | 值 | 说明 |
|---|---|---|
use_frame_len_embedding | true | 开启"帧长条件化":告诉模型当前跑在哪个时钟上 |
max_frame_len | 8 | 最大帧长(取supported_frame_lens的最大值) |
projection_size | 10240 | = 音频塔 hidden 1280 × 最大帧长 8 |
自动推导逻辑见 configuration_audio8_asr_infinite.py:投影器会把最多 8 个音频 token 拍平成一段再投影到文本空间,所以1280 × 8 = 10240。帧长嵌入则让同一套权重在三种时钟下都能精准工作。
语义 VAD:semantic_vad_horizons_seconds与semantic_vad_num_classes
这是 Audio8 区别于传统声学 VAD 的亮点 👂:
semantic_vad_horizons_seconds为[0.5, 1.0, 2.0, 3.0]:四个前瞻窗口。每个窗口配一个分类头,预测"未来这段时间内还会出现多少个语义单元"。semantic_vad_num_classes为8:分类取值 0–7,其中类别 0 代表"本轮结束",实时客户端靠对它设阈值来判断用户是否真正说完。
这样模型能区分"思考中的停顿、口吃、真正的结束"——传统声学 VAD 恰恰在这些场景下会失效。对应权重独立存放在 semantic_vad_heads.safetensors 中,头部的挂载与输出逻辑在 modeling_audio8_asr_infinite.py。设计契约(类 0 为结束轮)写在 configuration_audio8_asr_infinite.py 的注释里。
如果配置中这两个字段为
null,就表示这是一个纯转写 checkpoint,不带 VAD 头——纯转写权重完全不受影响。
其余字段:格式版本与精度
| 参数 | 值 | 说明 |
|---|---|---|
weight_format_version | 2 | 权重格式版本号,加载校验 不匹配会要求先转换 checkpoint |
dtype/audio_config.dtype | bfloat16 | 训练与推理精度,显存友好 |
bos/eos/pad_token_id | 151644 / 151645 / 151643 | 特殊 token 位置,与 Qwen2 词表一致 |
tokenizer_class | Qwen2Tokenizer | 分词器类型 |
配套文件里的隐藏流式细节 🔎
preprocessor_config.json:16 kHz、128 mel
preprocessor_config.json 定义了音频预处理:采样率 16000 Hz、n_fft400、hop_length160(每帧正好 10 ms × 2 = 20 ms,与音频塔对齐)、feature_size128 与音频塔的num_mel_bins完全一致。padding_side: right保证流式场景下历史始终左对齐。
tokenizer_config.json:四个流式专用特殊 token
tokenizer_config.json 中的extra_special_tokens藏着流式机制的线索:
[STREAMING_PAD]/[STREAMING_WORD]:流式解码中"这步无新词"与"产出词"的占位信号[LANGUAGE_ZH]/[LANGUAGE_EN]:中英双语标记,推理时指定语言
generation_config.json:极简但有用
generation_config.json 只有use_cache: true、EOS 等默认值——流式场景的实际生成参数(延迟 token 数、语言)由调用方显式控制,而不是靠这里。
常见问题 FAQ ❓
Q1:推理时num_delay_tokens可以省略吗?不行。default_num_delay_tokens为null,必须显式给出(如 80 ms 时钟 + 480 ms 延迟 →480 ÷ 80 = 6)。
Q2:streaming_frame_ms可以填 100 ms 吗?不行。它必须能被 20 ms 整除且换算出的 frame_len 落在 4/6/8 中,否则resolve_frame_len会抛出异常。
Q3:为什么target_delay_ms只能是 80/120/160 的整数倍?延迟以"延迟 token"为单位实现,1 个 token = 1 个时钟步长,所以毫秒延迟必须恰好对应整数个时钟步。
Q4:改了 config.json 里的时钟参数能换模型吗?不建议。表中的组合是后训练过的优化运行点,随意组合虽然不报错,但效果无法保证最优。
写在最后 ✍️
读懂 config.json 的关键在于抓住三条主线:音频时钟(frame_len)→ 延迟换算(target_delay_ms → num_delay_tokens)→ 左侧上下文(streaming_n_left_pad_tokens),再叠加语义 VAD 的四个前瞻头。把 80 ms 时钟 + 480 ms 延迟作为默认起点,再按延迟预算和硬件资源在三种时钟间取舍,就能充分发挥 Audio8 ASR Infinite 又快又稳的流式语音识别能力。
完整参数校验逻辑可对照 configuration_audio8_asr_infinite.py 阅读,部署方式(vLLM Docker Compose、Torch 模拟流式解码)见 README.md。
【免费下载链接】Audio8-ASR-Infinite项目地址: https://ai.gitcode.com/hf_mirrors/Edge0/Audio8-ASR-Infinite
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考