音频语言模型:从 Whisper 到 Audio Flamingo 3 的弧线 本节摘要:Whisper(Radford 等人,2022 年 12 月)终结了语音识别——68 万小时弱监督多语言语音、一个简单的编码器-解码器 Transformer、一个让此后每个 ASR 发布都引用它的基准。但识别不是推理。「这段录音里有什么乐器」「说话者在表达什么情绪」「第 3 分钟发生了什么」需要的是音频理解,而非转写。Qwen-Audio、SALMONN、LTU 与 NVIDIA 的 Audio Flamingo 3(AF3,2025 年 7 月)逐步搭起这套栈:保留 Whisper 级编码器、外挂 Q-former、在音频-文本指令数据上训练、加思维链推理。本节走这条弧线。
本节摘要:Whisper(Radford 等人,2022 年 12 月)终结了语音识别——68 万小时弱监督多语言语音、一个简单的编码器-解码器 Transformer、一个让此后每个 ASR 发布都引用它的基准。但识别不是推理。「这段录音里有什么乐器」「说话者在表达什么情绪」「第 3 分钟发生了什么」需要的是音频理解,而非转写。Qwen-Audio、SALMONN、LTU 与 NVIDIA 的 Audio Flamingo 3(AF3,2025 年 7 月)逐步搭起这套栈:保留 Whisper 级编码器、外挂 Q-former、在音频-文本指令数据上训练、加思维链推理。本节走这条弧线。
阅读完本节,你应当能够:
Whisper 解决了语音识别,「音频的 OCR」成了大宗商品。但「大宗商品」止步于转写。如果模型不能对听到的内容推理——时序、说话人、情绪、音乐结构、环境声——单靠转写无法驱动产品功能。
三条显然的路线:
每个音频编码器都从同一个特征起步:log-Mel 频谱图。
结果:形状 (T, 80) 的二维数组,T 是时间帧数。30 秒片段、100Hz 帧率:(3000, 80)。
Whisper 编码器是一个 12 层 ViT 风格 Transformer,把 log-Mel 频谱图当作时间帧序列处理,每帧输出一个隐藏状态向量。
ASR 用时,Whisper 解码器是交叉注意力 Transformer,在编码器输出条件下生成文本 token,标准编码器-解码器。
对 ALM(音频-LLM),你要把编码器输出当作另一个 LLM 的输入。模式:Whisper 编码器冻结、Q-former 可训练、LLM 冻结或微调。
Whisper 在语音主导数据上训练,对音乐与环境声较弱。
BEATs(Chen 等人,2022)是在 AudioSet 上自监督训练的 Transformer,同等参数下比 Whisper 更能抓音乐与环境声。
AF-Whisper(Audio Flamingo 3 的混合):拼接 Whisper + BEATs 特征作为音频输入。Whisper 带语言信号,BEATs 带声学信号。
与 BLIP-2 的视觉 Q-former 同模式。固定数量的可学习 query(常 32 或 64)交叉关注音频编码器的输出帧。query 成为 LLM 消费的音频 token。
对齐阶段:只训 Q-former,在音频-文本对(AudioCaps、Clotho)上跑对比 + caption 损失。指令阶段:端到端,解冻 LLM,在指令数据上训练。
AF3 还引入音频的按需思维链:模型可在最终答案前选择性地发出思考 token(「让我先识别乐器:……」)。复杂推理任务在启用思考时精度提升 3~5 分。
级联流水线:
对「总结这段播客」完美工作。对以下失效:
端到端保留声学信号,Qwen-Audio 与 AF3 原生处理音乐、环境、情绪。
对新的音频理解产品:
级联更便宜更简单,端到端更强大。
MMAU(大规模多模态音频理解)是 2024~2025 的音频推理基准:
开源 SOTA(AF3)0.72;闭源前沿约 0.78(Gemini 2.5 Pro、Claude Opus 4.7)。差距小于 VideoMME 的开源-闭源差距,说明音频-LLM 在成熟。
code/main.py:
def log_mel_spectrogram(waveform, sr=16000, win_ms=25, hop_ms=10, n_mels=80): win = int(sr * win_ms / 1000) # 400 样本 hop = int(sr * hop_ms / 1000) # 160 样本 frames = frame(waveform, win, hop) # 加窗分帧 spectrum = fft(frames) # 每帧 FFT mag = abs(spectrum) # 幅度 mel = mel_filter_bank(mag, n_mels) # 扭曲到 Mel 频率 return log(1 + mel) # 对数压缩 → (T, 80)
def audio_qformer(encoder_frames, n_queries=64): # encoder_frames: (T, D), T 个时间帧 queries = learnable(n_queries, D) # 固定数量可学习 query Q = queries @ Wq K = encoder_frames @ Wk V = encoder_frames @ Wv attn = softmax(Q @ K.T / sqrt(D)) # (n_queries, T) audio_tokens = attn @ V # (n_queries, D) → 喂 LLM return audio_tokens
💡 为何端到端扩展更好:级联把声学信息在转写那一步就丢了——「情绪在声音里不在词里」。端到端让 LLM 直接看到声学 token,保留了情绪、说话人、环境、时序,所以能在级联失效的任务上推理。
def cascaded(audio): text = whisper.transcribe(audio) # 转写 — 丢声学 return llm.reason(text) # 只在文本上推理 def end_to_end(audio): mel = log_mel_spectrogram(audio) frames = whisper_encoder(mel) audio_tokens = audio_qformer(frames) # 保留声学 return llm.reason(audio_tokens + prompt) # 直接看声学 token
工程取舍:只需转写用级联(Whisper + LLM);需音乐/情绪/多说话人/复杂推理用 AF3/Qwen-Audio;要按需推理用 AF3 的思维链;闭源前沿用 Gemini 2.5 Pro/Claude Opus 4.7。
本节产出 outputs/skill-audio-llm-pipeline-picker.md。给定音频任务(转写、音乐标注、情绪推理、多人分离、环境分类),它在级联、端到端 AF3、混合间选择。
频谱图维度:算 30 秒、16kHz、25ms 窗、10ms 步长、80 Mel bin 的 log-Mel 频谱图维度。48kHz 下如何变化?
Whisper 弱项:为什么 Whisper 在音乐上表现差?BEATs 抓住了哪些 Whisper 没抓的音频特征?
Q-former 容量:64 query vs 32 query 的音频 Q-former,什么任务复杂度下 64 才值?32 给什么省算力?
读 AF3:读 AF3 第 4 节关于按需思考,提出三个思维链帮助最大的音频任务。
分离流水线:用 AF3 输出实现一个最小分离流水线,如何标记说话人切换?
下一节,我们将进入全模态模型——Thinker-Talker 架构把推理(Thinker,慢思考)与表达(Talker,实时流式输出)解耦,是 GPT-4o 式实时全模态对话的开源范式。