Fun-Audio-Chat:用双分辨率与 Core-Cocktail 训练实现低延迟高保真语音对话
核心问题:如何在消费级 GPU 上运行一个既能听懂人话、又能自然回复、还不会忘记原有文本能力的全双工语音对话模型?
本文围绕阿里巴巴通义团队开源的 Fun-Audio-Chat 展开,详细介绍它如何通过「双分辨率语音表征」把计算开销压低近 50%,再配合「Core-Cocktail 训练策略」避免多模态训练常见的灾难性遗忘,最终在 8B 参数规模下拿下多个语音问答与音频理解榜单的同规模第一。文章包含完整的环境搭建、推理示例、微调指南以及真实场景下的落地思路,帮助你快速验证并在自己的业务中复用这套方案。
一、为什么要重新设计语音对话架构?
现有的端到端语音-文本联合模型(Joint Speech-Text Model)普遍面临三个痛点:
-
帧率错配导致语义稀释:语音 token 通常以 25 Hz 采样,而文本 token 仅约 3 Hz,强行对齐会让 LLM 背负过长的语音序列,核心推理能力被噪声淹没。 -
多模态训练引发灾难性遗忘:在语音数据上微调后,模型往往忘记原有文本知识,导致通用问答能力下降。 -
高帧率带来算力墙: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 演示”小节插入一张展示实时语音波形与对话流的可视化截图,帮助读者直观理解延迟。可使用 (图片来源: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%,容易出现“抢话”或“漏听”。
九、局限与后续工作
-
长上下文记忆不稳定:在超过 6 分钟(约 2048 token)的多轮对话中,模型对最早轮次的信息回忆准确率下降 15–20%。当前最大上下文 2048 token 对复杂会议场景仍显不足。
-
指令跟随表现力波动:虽然 VStyle 总体得分领先,但在“用戏剧化语调朗读诗歌”这类高阶风格控制上,生成的 prosody 偶尔偏离预期。SRH 的风格 embedding 与文本 prompt 的耦合度仍需加强。
-
共情能力场景敏感性:在内部测试集上,模型对“愤怒”情绪的识别准确率 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 的词表覆盖度。

