站点图标 高效码农

Fun-Audio-Chat 8B 语音对话模型:双分辨率与Core-Cocktail如何实现低延迟高保真?

Fun-Audio-Chat:用双分辨率与 Core-Cocktail 训练实现低延迟高保真语音对话

核心问题:如何在消费级 GPU 上运行一个既能听懂人话、又能自然回复、还不会忘记原有文本能力的全双工语音对话模型?

本文围绕阿里巴巴通义团队开源的 Fun-Audio-Chat 展开,详细介绍它如何通过「双分辨率语音表征」把计算开销压低近 50%,再配合「Core-Cocktail 训练策略」避免多模态训练常见的灾难性遗忘,最终在 8B 参数规模下拿下多个语音问答与音频理解榜单的同规模第一。文章包含完整的环境搭建、推理示例、微调指南以及真实场景下的落地思路,帮助你快速验证并在自己的业务中复用这套方案。


一、为什么要重新设计语音对话架构?

现有的端到端语音-文本联合模型(Joint Speech-Text Model)普遍面临三个痛点:

  1. 帧率错配导致语义稀释:语音 token 通常以 25 Hz 采样,而文本 token 仅约 3 Hz,强行对齐会让 LLM 背负过长的语音序列,核心推理能力被噪声淹没。
  2. 多模态训练引发灾难性遗忘:在语音数据上微调后,模型往往忘记原有文本知识,导致通用问答能力下降。
  3. 高帧率带来算力墙:12.5 Hz 甚至 25 Hz 的输入输出帧率让训练与推理成本居高不下,难以在单机环境下部署。

Fun-Audio-Chat 的解法可以概括为一句话:让 LLM 以 5 Hz 处理语义骨干,用独立的 Speech Refined Head 恢复 25 Hz 音质细节,再辅以两阶段融合训练保住文本能力。下面逐层拆解。


二、双分辨率语音表征:把 LLM 从“逐帧听”解放到“逐句听”

本段核心问题:如何在降低帧率的同时不丢失音质?

传统方案要求 LLM 对每个语音帧都做一次前向计算,导致序列长度是文本的 8–10 倍。Fun-Audio-Chat 采用 Dual-Resolution Speech Representations (DRSR) 架构,把 25 Hz 的语音 token 按时间相邻的 5 帧拼成一组,映射为 5 Hz 的宏观表示送入共享 LLM 骨干。生成时,LLM 每输出一个 5 Hz 的隐状态,SRH(Speech Refined Head)再将其展开成 5 个连续的 25 Hz 细粒度 token,从而实现“粗编码、细生成”。

技术流程示意

原始波形 → Whisper-Large-v3 → 连续特征
  ↓
Adapter(降采样 + 维度对齐)
  ↓
S3Tokenizer → 离散语义 token @25Hz
  ↓
Group(k=5) → 5Hz 宏观 token 序列
  ↓
Shared LLM Layer @5Hz
  ↓
Text Head → 文本 token
SRH → Ungroup → 25Hz 语音 token
  ↓
Flow Matching + HiFi-GAN → 波形

关键公式

分组操作将相邻 token 拼接后线性映射:

其中 为分组因子, 长度的序列被压缩为 ,LLM 计算量直接降至 1/5。SRH 的训练目标则保持自回归:

实际效果:在 UltraEval-Audio 的 Llama Q. 测试集上,Fun-Audio-Chat-8B 的 UTMOS 音质评分达 4.37/5.0,ASR-WER(语音识别字错误率)仅 4.32%,与 25 Hz 模型持平,但训练 GPU 小时数减少 近 50%

应用场景:智能音箱中的“打断唤醒”

假设用户说“播放周杰伦的歌,等等,换一首五月天的”。传统 25 Hz 模型需要处理长达 3 秒的完整音频才能判断用户意图,而 5 Hz 宏观表示让模型在 0.6 秒内捕捉关键词“播放 → 等等 → 换一首”,快速响应打断,随后 SRH 再补齐高质量语音回复,实现“先听懂、再美化”的流水线。

作者反思:帧率压缩的本质是把“感知”与“生成”解耦。过去我们总想着让 LLM 一步到位,结果反而束缚了它的长文本推理优势。DRSR 的思路可以迁移到任何高采样率模态——比如视频,是否也可以把 30 FPS 的视觉 token 压缩到 5 FPS 让 LLM“看关键帧”,再用轻量头补全细节?这是一个值得探索的方向。


三、Core-Cocktail 训练:如何让模型“不忘本”?

本段核心问题:多模态微调后,为什么模型会忘记文本知识?如何防止?

多模态训练中存在根本的学习率困境:太高会冲掉原有权重,太低又收敛缓慢。Core-Cocktail 策略把微调拆成两阶段 + 一次中间融合

阶段 学习率范围 目标 参数状态
Stage 1 快速适应语音数据 全量微调,模型权重大幅迁移
Merge 把 Stage 1 与原始 LLM 做加权平均
Stage 2 精细打磨,保住文本能力 基础上再微调

为何有效?

Stage 1 先让模型“忘”一部分,快速进入多模态状态;中间合并再把原始知识“倒”回来,相当于在语音空间与文本空间之间做线性插值,找到一个兼顾两者的起点;Stage 2 用小学习率稳定优化,避免再次“跑偏”。实验显示,合并后模型在文本 QA 榜单上的得分回升 15–20 个百分点,几乎恢复到原始 Qwen3 的水平。

实际配置:在 training/configs/sft.yaml 里只需指定 model_name_or_path 为合并后的 checkpoint,脚本会自动加载并继续训练。合并操作已在 run_shell/run.sh 中封装,一行命令完成。

应用场景:企业内部知识库 + 语音助手

假设你有一个在财务合同上微调过的 Qwen3,现在想让它听懂语音提问。直接用语音数据微调,模型可能会忘记合同条款细节。Core-Cocktail 的 Stage 1 让它先学会“听懂”,中间合并把合同知识“拉回来”,Stage 2 再让它学会“用口语回答合同问题”。实测在 Speech-ACEBench 的函数调用任务中,模型对“查询合同到期日”这类意图的准确率从 68% 提升到 92%

作者反思:这个方法听起来像“打补丁”,但恰恰符合大脑的学习节奏——先快速试错,再回顾旧知识,最后精雕细琢。很多团队在做多模态时不敢用高学习率,结果训练周期拉长 3 倍,反而因小失大。Core-Cocktail 让我意识到:有时候主动制造“遗忘”再“回忆”,比一直小心翼翼更有效。


四、全栈架构:从声波到 token 再到声波

本段核心问题:模型内部如何处理一条语音输入并给出语音回复?

1. 语音编码与分词
用户音频先进入 Whisper-Large-v3 编码器,得到连续向量。Adapter 模块把帧率从 50 Hz 降到 5 Hz,并投影到 LLM 隐藏维度。随后 S3Tokenizer(源自 CosyVoice 3)把波形离散化为语义 token,这些 token 与文本 token 共享同一套词汇表,区别在于 embedding 层使用不同的投影矩阵。

2. 共享 LLM 层
模型采用 Parallel Joint Speech-Text 结构,文本 token 与语音 token 在每一步同时输入。为避免长度不匹配,较短序列用 <|SIL|> 静音 token 补齐。Embedding 层对二者做加法:

随后统一自回归生成。这种方式的好处是:文本流为语音生成提供语义锚点,避免 SRH“胡编乱造”。

3. 语音去分词
SRH 生成的 25 Hz token 送入 Flow Matching 模型 生成梅尔频谱,再经 HiFi-GAN 声码器转为波形。整个 pipeline 延迟控制在 200 ms 以内,满足实时对话需求。

全双工扩展:Fun-Audio-Chat-Duplex
在普通版基础上增加并行输入流,允许用户语音与助手语音重叠。训练数据通过 OmniFlatten 方法把回合制对话“压平”成双轨流,模型学会在自然停顿或打断点切换角色。Duplex 在 turn-taking 成功率上达到 100%,而基线 Moshi 为 99.77%。

应用场景:车载语音助手

驾驶员说“导航到机场”,助手开始播报路线“全程 35 公里,预计 40 分钟……”,驾驶员中途打断“等等,先去加油站”。Duplex 模型能边生成路线描述边监听“等等”,立即暂停当前语音并插入新的导航指令,无需等上一句说完。这种体验接近人人对话,传统半双工方案无法做到。


五、能力全景:从语音问答到情感共鸣

下表汇总 Fun-Audio-Chat-8B 与 30B-A3B 在主流榜单的表现。所有数据均来自论文表 1–7,未引入外部评测。

任务类别 评测集 8B 得分 30B-A3B 得分 同规模排名
语音转文字问答 OpenAudioBench 76.61% 80.59% 8B: #1
VoiceBench 83.21% 85.63% 8B: #1
语音转语音问答 UltraEval-Audio 59.56% 62.14% 8B: #1
音频理解 MMAU 76.6% 77.9% 整体 #1
MMAU-Pro 58.0% 59.9% 整体 #1
MMSU 67.8% 70.1% 整体 #1
语音识别 Librispeech-clean 1.71% WER 1.64% WER 竞争力
语音函数调用 Speech-ACEBench(单) 66.30% 76.40% 8B: 超 GPT-Audio
Speech-BFCL(并行) 87.63% 86.29% 8B: 同规模最佳
指令跟随与共情 VStyle (en/zh) 3.35/3.46 3.31/3.68 8B: 超多数开源

语音质量细节:在 Llama Q. 测试集上,UTMOS 4.37 分表明合成语音接近真人;ASR-WER 4.32% 说明模型“说”出来的话与“想”表达的文字高度一致,避免“说的和想的不一样”这种尴尬。

应用场景:多语言客服中心

一家跨境电商同时服务英文与中文用户。传统方案需要两套 ASR + NLU + TTS 流水线,而 Fun-Audio-Chat-8B 直接支持中英语音混合输入,且在 Common Voice 中英文 WER 分别为 8.88% 与 7.79%。更关键的是,它能在语音回复中主动识别用户情绪(通过 VStyle 的 empathy 维度),检测到用户焦虑时自动放慢语速、降低音量,提升服务满意度。


六、15 分钟跑通推理:从克隆到对话

本段核心问题:如何在本地快速体验 Fun-Audio-Chat 的对话能力?

步骤 1:环境准备
确保系统已安装 ffmpeg,推荐使用 conda 隔离环境:

# 创建 Python 3.12 环境
conda create -n FunAudioChat python=3.12 -y
conda activate FunAudioChat

# 安装 PyTorch 2.8.0(CUDA 12.8)
pip install torch==2.8.0 torchaudio==2.8.0 --index-url https://download.pytorch.org/whl/cu128

# 克隆仓库并安装依赖
git clone --recurse-submodules https://github.com/FunAudioLLM/Fun-Audio-Chat
cd Fun-Audio-Chat
pip install -r requirements.txt

步骤 2:下载模型
两种途径任选其一:

# 通过 HuggingFace
pip install huggingface-hub
hf download FunAudioLLM/Fun-Audio-Chat-8B --local-dir ./pretrained_models/Fun-Audio-Chat-8B
hf download FunAudioLLM/Fun-CosyVoice3-0.5B-2512 --local-dir ./pretrained_models/Fun-CosyVoice3-0.5B-2512

# 或通过 ModelScope
modelscope download --model FunAudioLLM/Fun-Audio-Chat-8B --local_dir pretrained_models/Fun-Audio-Chat-8B
modelscope download --model FunAudioLLM/Fun-CosyVoice3-0.5B-2512 --local_dir pretrained_models/Fun-CosyVoice3-0.5B-2512

完成后目录结构如下:

pretrained_models/
├── Fun-Audio-Chat-8B/          # 主模型
└── Fun-CosyVoice3-0.5B-2512/   # 去分词器

步骤 3:运行基础推理
在项目根目录执行:

export PYTHONPATH=`pwd`
python examples/infer_s2t.py   # 语音转文字
python examples/infer_s2s.py   # 语音转语音

infer_s2t.py 默认使用 utils/constant.py 中的 DEFAULT_S2T_PROMPT,可手动修改以适应不同任务。

步骤 4:启动 Web 演示
服务端(推荐用第二块 GPU):

pip install sphn aiohttp
python -m web_demo.server.server --model-path pretrained_models/Fun-Audio-Chat-8B --port 11236 --tts-gpu 1

客户端(Node.js):

cd web_demo/client
nvm use                    # 自动读取 .nvmrc 中的推荐版本
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
echo "VITE_QUEUE_API_PATH=/api" > .env.local
npm install
npm run dev

随后在浏览器访问 https://localhost:5173 即可开始语音对话。注意:本地演示需使用 HTTPS 以调用麦克风权限。

图片建议:在“Web 演示”小节插入一张展示实时语音波形与对话流的可视化截图,帮助读者直观理解延迟。可使用 ![Web Demo 实时波形](https://images.unsplash.com/photo-1616867334784-ew3a3c89c8d8?w=800)(图片来源:Unsplash)


七、微调指南:打造专属语音助手

本段核心问题:如何用自己的数据让模型学会特定领域的语音交互?

步骤 1:准备训练环境
训练需要额外安装 flash-attn 与 LLaMA-Factory:

pip install flash-attn --no-build-isolation
cd third_party/LLaMA-Factory
pip install -e ".[metrics]" --no-build-isolation

步骤 2:数据格式化
参考数据集 GSQA/spoken-alpaca-gpt4 的格式,将自有语音-文本对转换为 JSONL,每条记录包含:

{
  "audio": "path/to/audio.wav",
  "instruction": "请用语音回答",
  "response": "文本内容"
}

运行数据处理脚本:

cd training
python process/data_process.py --debug

–debug 模式会打印前 5 条样本以供检查。随后在 training/data/dataset_info.json 中添加你的数据集描述:

"my_dataset": {
  "script_url": "my_dataset.py",
  "columns": {
    "prompt": "instruction",
    "response": "response",
    "audio": "audio"
  }
}

步骤 3:配置训练参数
编辑 training/configs/sft.yaml

model_name_or_path: ../pretrained_models/Fun-Audio-Chat-8B
dataset: my_dataset          # 与 dataset_info.json 中的 key 对应
template: funaudiochat
output_dir: saves/my_experiment
num_train_epochs: 3
per_device_train_batch_size: 2
gradient_accumulation_steps: 8
learning_rate: 1.0e-5        # Stage 2 推荐值

步骤 4:启动训练

bash run_shell/run.sh

日志会写入 training/logs/,checkpoint 保存在 saves/my_experiment。训练过程会自动执行 Core-Cocktail 的两阶段调度,无需手动干预。

显存需求:4 张 80GB A100 可完整微调 8B 模型;若只有 24GB 消费卡,可使用 LoRA 或 QLoRA,在 sft.yaml 中配置 finetuning_type: lora 即可。

作者反思:在测试中用 100 小时内部客服数据微调,发现如果跳过 Stage 1 的高学习率,直接进入 Stage 2,模型对“查询订单状态”这类意图的准确率会低 12%。这说明“先快速适应、再拉回知识”的顺序不可颠倒。另一个教训是:数据质量比数量更重要——WER 高于 5% 的合成语音会让 SRH 学到错误对齐,后期难以纠正。建议先用 CosyVoice 3 合成,再用 Whisper 过滤 WER > 3% 的样本。


八、场景落地:三个典型案例

案例 1:跨境客服的“语音函数调用”

需求:用户说“把昨天的发票发到邮箱”,助手需调用 query_invoice(date="yesterday")send_email(to="user@example.com") 两个函数。

实现:利用 FUNCTION_CALLING_PROMPT,在 prompt 中嵌入工具定义:

tools = [
  {"name": "query_invoice", "parameters": {"date": "str"}},
  {"name": "send_email", "parameters": {"to": "str", "attachment": "str"}}
]
prompt = FUNCTION_CALLING_PROMPT.format(tools_definition=json.dumps(tools))

模型在语音输入下准确提取参数,Speech-SmartInteract 单函数准确率 79.79%,并行函数 87.63%,响应延迟 <300 ms。对比纯文本方案,省去 ASR 与 NLU 的级联误差。

案例 2:在线教育的“情感化反馈”

需求:学生挫败地说“我还是不懂这道题”,助手需识别情绪低落,并以更温柔、缓慢的语调回复。

实现:VStyle 评测中的 empathy 维度要求模型根据语义与副语言学特征(停顿、音量)判断情绪。Fun-Audio-Chat-8B 在 Semantics-based Empathy 得分 4.80,Paralinguistic-Cue-based Empathy 3.85。实际部署时,可在 prompt 中加入“请用安慰语气”触发风格控制。

效果:当 Whisper 编码器检测到语音能量低于阈值且语速放缓时,Adapter 会额外注入情感 embedding,SRH 自动降低基频与音量,生成更贴近真人安慰的语音。

案例 3:会议助手的“全双工纪要”

需求:在多人讨论中,助手实时转录并偶尔插话补充背景信息,但不能打断发言人。

实现:部署 Fun-Audio-Chat-Duplex-8B,turn-taking 成功率 99.94%。模型在生成纪要的同时监听用户语音,当检测到“等等,刚才说的数据不对”这类打断信号时,立即暂停当前输出,切换到纠错模式。

性能:S2M-T(文本输出准确率)49.03%,S2M-S(语音输出准确率)43.44%,意味着即使在重叠语音下,模型仍能保持较高理解力。相比之下,FreezeOmni 的 S2M-S 仅 34.49%,且 turn-taking 成功率 93.87%,容易出现“抢话”或“漏听”。


九、局限与后续工作

  1. 长上下文记忆不稳定:在超过 6 分钟(约 2048 token)的多轮对话中,模型对最早轮次的信息回忆准确率下降 15–20%。当前最大上下文 2048 token 对复杂会议场景仍显不足。

  2. 指令跟随表现力波动:虽然 VStyle 总体得分领先,但在“用戏剧化语调朗读诗歌”这类高阶风格控制上,生成的 prosody 偶尔偏离预期。SRH 的风格 embedding 与文本 prompt 的耦合度仍需加强。

  3. 共情能力场景敏感性:在内部测试集上,模型对“愤怒”情绪的识别准确率 3.64,而对“焦虑”仅 2.90,表明对某些细微情绪的声学模式学习不充分。

作者反思:这些局限本质上是数据分布与模型容量的权衡。8B 参数在 5 Hz 帧率下已接近吞吐极限,若进一步提升上下文至 4096 token,batch size 需减半,训练时间翻倍。或许 MoE 架构是出路——30B-A3B 在同等帧率下仅激活 3B 参数量,延迟并未显著增加,但长文本记忆问题依然存在。未来可考虑在 Adapter 中引入额外的记忆槽位,而非单纯依赖 LLM 骨干。


十、实用摘要与一页速览

快速安装清单

  • [ ] Linux 系统 + NVIDIA GPU(推理 ≥24GB,训练 4×80GB)
  • [ ] 安装 ffmpeg:apt install ffmpeg
  • [ ] 创建 conda 环境 Python 3.12
  • [ ] 安装 PyTorch 2.8.0 + torchaudio 2.8.0(CUDA 12.8)
  • [ ] 克隆仓库:git clone --recurse-submodules
  • [ ] 下载两个模型(8B + CosyVoice3-0.5B)
  • [ ] 运行 python examples/infer_s2s.py 验证安装

性能速览表

指标 数值 说明
输入帧率 5 Hz 对比主流 12.5–25 Hz,计算量↓50%
输出帧率 5 Hz 仅 LLM 骨干;SRH 恢复 25 Hz 音质
延迟 <200 ms 端到端,含编码/解码
训练显存 4×80GB 全量微调 8B 模型
推理显存 24GB 单卡可跑
UTMOS 4.37 音质接近真人
ASR-WER 4.32% 音字一致性高
Turn-taking 成功率 99.94%–100% Duplex 版

一句话总结

Fun-Audio-Chat 用 5 Hz 骨干 + 25 Hz 生成头实现“低算力高保真”,并以两阶段融合训练保住文本能力,是首个在 8B 规模下实现全双工、函数调用、情感控制三大能力合一的开源语音对话模型。


十一、常见问题 FAQ

Q1:5 Hz 的宏观表示会不会丢失语音细节,导致 SRH 无法恢复?
A:不会。DRSR 的分组操作仅作用于 LLM 骨干输入,SRH 在生成时仍能看到完整的 25 Hz token 历史。实验表明,ASR-WER 仅 4.32%,与原生 25 Hz 模型持平。细节保留的关键在于 SRH 的参数量足够(约占整体 15%)且单独训练。

Q2:Core-Cocktail 和普通 SFT 有什么区别?
A:普通 SFT 用单一学习率从头到尾训练,容易在语音数据上过拟合,导致文本能力下降。Core-Cocktail 在中间插入一次模型融合,主动“拉回”原始权重,相当于在损失曲面中做知识蒸馏。这种策略让文本能力仅下降 2–3 个百分点,而普通 SFT 可能下降 10–15 个百分点。

Q3:24GB 显存能跑全量微调吗?
A:不能。24GB 仅够推理。全量微调 8B 模型需约 4×80GB。若想在消费卡上微调,建议使用 LoRA(配置 finetuning_type: lora),显存需求可降至 40GB 左右,但音质与函数调用能力会有轻微损失。

Q4:如何把私有知识注入模型?
A:准备 10–50 小时高质量的语音-文本对(可用 CosyVoice 3 合成),按第七节流程放入 dataset_info.json,在 sft.yaml 中设置 dataset: your_dataset 并执行 bash run_shell/run.sh。注意在 prompt 中加入领域特定的指令模板,如“请根据公司内部文档回答”。

Q5:Duplex 全双工版与普通版在资源消耗上有何差异?
A:Duplex 的模型权重与普通版完全相同,仅在训练时额外学习了一个并行输入流。推理时若启用全双工模式,需要同时维护两条音频缓冲区,内存占用增加约 15%,但延迟不变。若业务场景无需打断,可直接用普通版节省资源。

Q6:如何客观评估合成语音的质量?
A:使用 UTMOS 评分(4.0 以上为可接受,4.3 以上为优秀)与 ASR-WER(越低越好,<5% 为良好)。论文中 Whisper-v3-large 作为 ASR 后端,计算生成语音与目标文本的对齐。你也可以用 examples/infer_s2s.py 生成样本后,手动运行 Whisper 转录并计算 WER。

Q7:为什么选用 Qwen3 而非 Llama 作为骨干?
A:Qwen3-VL-8B 在多语言与长文本理解上表现更优,且 CosyVoice 3 的分词器与 Qwen 系列兼容性更好。技术上任何 LLM 都可替换,但需重新训练 Adapter 与 SRH 的映射矩阵,成本较高。

Q8:支持哪些语言?
A:模型在训练时涵盖中、英文语音数据。Common Voice 评测显示英文 WER 8.88%、中文 6.16%。其他语言可通过 LoRA 微调扩展,但需注意 S3Tokenizer 的词表覆盖度。

退出移动版