FireRedAudio 上手记:一个模型搞定音频理解、生成和编辑

一个月前我在处理一段四十分钟的访谈录音,需要整理成带时间戳的文字稿,同时还要把受访者的声音克隆出来,用标准普通话重新录制其中几段被方言干扰的内容。常规做法是先跑一遍 ASR 得到文本,再用独立的 TTS 模型做克隆,中间还要手动对齐时间。来回折腾了差不多三个小时。

FireRedAudio 是小红书团队最近开源的音频语言模型,把上述流程压缩到了一个模型里。它的核心思路是:用一个 9B 参数的共享语言模型作为大脑,音频理解走 Audio Encoder 通路,音频生成走 RedAE 通路,两条通路各自优化但共享同一个推理骨干。

GitHub: https://github.com/FireRedTeam/FireRedAudio
论文: https://arxiv.org/abs/2608.24168

安装过程:uv 一把梭,但有几个前置条件

官方推荐用 uv 管理依赖,Python 版本锁定 3.10。如果你的环境不是 3.10,建议单独建一个虚拟环境再装。

uv sync --extra accel --extra accel-build --group tools

--extra accel 会拉 causal-conv1d 和 flash-attn 这两个加速库,--extra accel-build 会从源码编译它们。如果你的 CUDA 版本不是 12.8(官方 wheel 默认 cu128),需要先改 pyproject.toml 里的 PyTorch 索引 URL,比如换成 cu126 或 cu129,再执行 sync。

另外系统需要提前装好两样东西:CUDA toolkit(编译依赖)和 ffmpeg(torchaudio/torchcodec 解码音频用)。我在 Ubuntu 22.04 上缺了 ffmpeg,报错是 FileNotFoundError: ffmpeg,装完就好了:

sudo apt install ffmpeg

模型文件从 Hugging Face 拉,大约 20GB 左右:

uv run hf download FireRedTeam/FireRedAudio --local-dir pretrained_models/

如果 Hugging Face 访问慢,可以用 modelscope 替代:

uv pip install modelscope
uv run modelscope download --model FireRedTeam/FireRedAudio --local_dir pretrained_models/

核心设计:两条通路,一个大脑

FireRedAudio 最值得说的设计是「解耦连续表示」(decoupled continuous representations)。市面上多数统一音频模型把理解和生成塞进同一套 token 体系里,结果往往是两边互相妥协。FireRedAudio 的做法是两条独立的编码通路:

  • Audio Encoder:负责从音频波形中提取用于理解任务的语义特征。初始化来自 Whisper-large-v3。
  • RedAE:负责生成任务,TTS、语音编辑、声音设计都走这条通路。

两条通路输出的表示格式不同,但共享同一个 LLM 骨干做推理和条件控制。这样做的好处是理解和生成各自用最合适的表示方式,互不干扰,同时推理层又能把两者的信息融合起来。

体现在实际使用中就是:同一个模型实例可以处理 ASR、QA、TTS、语音编辑、声音设计这五种任务,切换任务只需要改变 prompt 和输入格式。

能用它做什么

语音识别(ASR)

ASR 是 FireRedAudio 支持语言最广的任务——中英文之外还能覆盖更多语种。调用方式很简单:

from inference import FireRedAudioInference

engine = FireRedAudioInference(
    model_path="pretrained_models/FireRedAudio",
    device="cuda:0",
)

res = engine.understand(
    "assets/examples/asr_zh_fleurs.wav",
    "Transcribe speech to text.",
    task="asr"
)
print(res.answer)

CLI 版本:

uv run inference.py --task asr --model pretrained_models/FireRedAudio \
    --audio assets/examples/asr_zh_fleurs.wav

实测 AISHELL-1 上 CER 0.71,AISHELL-2 test-ios 上 2.63。这个水平跟专业 ASR 模型相比不算惊艳,但考虑到它是一个统一模型顺带做的 ASR,完全够日常使用。

音频理解(带推理)

理解任务是 FireRedAudio 的强项。MMAU test-mini 上跑到了 82.0,MMSU 83.3,目前开源模型里排前列。

启用 CoT(chain-of-thought)可以让模型先输出推理过程再给答案,对复杂问题尤其有用:

res = engine.understand(
    "audio.wav",
    "What illness did Second speaker's friend suffer from?\n(A) Progressive arthritis (B) Progressive cancer (C) Acute pneumonia (D) Chronic heart disease",
    task="understand",
    enable_thinking=True,
    max_new_tokens=10240,
)
print(res.reasoning)  # 推理过程
print(res.answer)     # 最终答案

CLI:

uv run inference.py --task understand --model pretrained_models/FireRedAudio \
    --audio audio.wav \
    --prompt "What illness did Second speaker's friend suffer from?\n(A) Progressive arthritis (B) Progressive cancer (C) Acute pneumonia (D) Chronic heart disease" \
    --enable-thinking --max-new-tokens 4096

长音频理解是 FireRedAudio 的另一个重点方向。官方宣称支持一小时长度的录音,输出可以带时间戳。实际测试一段 35 分钟的多人会议录音,模型能按话题切分段落并给出每个段落的时间区间,基本接近人工整理访谈素材的水平。

零样本 TTS(声音克隆)

TTS 需要额外加载 RedAE 解码器权重:

engine = FireRedAudioInference(
    model_path="pretrained_models/FireRedAudio",
    vae_decoder_path="pretrained_models/RedAE_decoder/model.pt",
    device="cuda:0",
)

res = engine.tts(
    prompt_text="同时,他强调微调要科学有序。",
    prompt_audio="assets/examples/tts_zh_prompt.wav",
    target_text="安徽淮南秦师傅发现,停在小区的爱车右前驾驶窗玻璃被砸。",
    language="zh",
)
torchaudio.save("tts.wav", res.audio.cpu(), sample_rate=24000)

CLI:

uv run inference.py --task tts --model pretrained_models/FireRedAudio \
    --vae-decoder pretrained_models/RedAE_decoder/model.pt \
    --prompt-audio ref.wav --prompt-text "参考音频的转录文本" \
    --target-text "要合成的目标文本" --language zh --output tts.wav

音色相似度在 Seed-TTS-Eval 上 SIM 值 0.74(中文)/ 0.68(英文),略低于 Seed-TTS 的 0.80/0.76,但词错误率更低(中文 0.83%,英文 1.56%)。实际听感上,克隆出的声音能保留原说话人的音色底色,但语调和韵律有时会偏中性——如果你需要高度还原原始情感,可能需要多试几次或调整随机种子。

注意:TTS 生成不是确定性的,因为 flow-matching 解码器会采样随机噪声。要复现结果需要固定随机种子:

from inference import set_seed
set_seed(42)

CLI 加 --seed 42。

另外 TTS 只支持中文和英文,通过 --language zh / en 选择。

语音编辑

这是 FireRedAudio 比较有特色的功能。编辑分两种类型:

语义编辑:改写、替换、插入、删除说话内容。模型会先输出 <|sot|>{修改后的文本}<|eot|> 再生成音频。

res = engine.edit(
    "edit_semantic_zh_ref.wav",
    "delete '比普通的茶叶要'",
    edit_type="semantic"
)
print(res.text)  # 修改后的文本
torchaudio.save("edit_semantic.wav", res.audio.cpu(), sample_rate=24000)

CLI:

uv run inference.py --task edit --model pretrained_models/FireRedAudio \
    --vae-decoder pretrained_models/RedAE_decoder/model.pt \
    --audio ref.wav --instruction "delete '比普通的茶叶要'" --edit-type semantic \
    --output edit_semantic.wav

声学编辑:调整音高、语速、音量。指令必须使用官方训练时用的模板(不支持自由描述):

  • 音高:"shift the pitch by N step(s)",N ∈ {-6, …, -1, 1, …, 6}
  • 语速:"adjust the speed to X",X ∈ [0.5, 2.0],步长 0.1
  • 音量:"adjust the volume to X",X ∈ [0.3, 2.0],步长 0.1
res = engine.edit(
    "edit_acoustic_zh_ref.wav",
    "shift the pitch by 3 steps",
    edit_type="acoustic"
)

CLI:

uv run inference.py --task edit --model pretrained_models/FireRedAudio \
    --vae-decoder pretrained_models/RedAE_decoder/model.pt \
    --audio ref.wav --instruction "shift the pitch by 3 steps" --edit-type acoustic \
    --output edit_acoustic.wav

语义编辑在开源模型中比较少见。官方在 Ming-Freeform-Audio-Edit 基准上,替换任务中文准确率 87.42%,英文 75.98%,比之前的 Ming-UniAudio-Edit 高出不少。

声音设计(自然语言描述生成声音)

不需要参考音频,直接用文字描述想要的音色特征,模型合成对应的声音:

res = engine.voice_design(
    instruction="以女性高音区的清亮音色,表现出青年阶段的特质,音量略强,语速适中稍快,语调带有解释意味和急切的情感流露,确保语音流畅自然。",
    text="是我请他来的,可他什么也不知道,他来只是想打听一下,你们厂是不是有旧锅炉?",
)
torchaudio.save("voice_design.wav", res.audio.cpu(), sample_rate=24000)

CLI:

uv run inference.py --task voice_design --model pretrained_models/FireRedAudio \
    --vae-decoder pretrained_models/RedAE_decoder/model.pt \
    --instruction "以女性高音区的清亮音色..." \
    --text "是我请他来的..." --output voice_design.wav

这个功能适合快速生成配音或绕过版权问题的声音原型,不需要先找一段参考音频。合成结果对指令的遵循度比较高,中文 Instruct TTS 上 APS/DSD/RP 三项指标分别为 86.0/84.1/70.1。

性能表现速览

任务 测试集 结果
音频理解 MMAU test-mini 82.0
音频理解 MMSU 83.3
ASR AISHELL-1 CER 0.71
ASR LibriSpeech clean WER 0.67
TTS (ZH) Seed-TTS-Eval CER 0.83 / SIM 0.74
TTS (EN) Seed-TTS-Eval WER 1.56 / SIM 0.68
声音设计 (ZH) InstructTTSEval APS 86.0 / DSD 84.1 / RP 70.1
声音设计 (EN) InstructTTSEval APS 81.1 / DSD 83.6 / RP 70.3

数据来自官方 README,带 * 的为 FireRed 团队自己评估的结果,其余来自各 benchmark 公开榜单。

已知限制

  • 生成任务(TTS、编辑、声音设计)仅支持中文和英文。ASR 是唯一支持多语言的。
  • 长音频理解支持到约一小时,超过这个长度未经测试。
  • TTS 每次输出不同,需要固定 seed 才能复现。
  • 声音克隆能力仅供学术研究使用,官方明确禁止用于任何非法活动。

操作速查

# 安装
uv sync --extra accel --extra accel-build --group tools

# 下载模型
uv run hf download FireRedTeam/FireRedAudio --local-dir pretrained_models/

# ASR
uv run inference.py --task asr --model pretrained_models/FireRedAudio --audio input.wav

# 音频理解(带 CoT)
uv run inference.py --task understand --model pretrained_models/FireRedAudio \
    --audio input.wav --prompt "问题" --enable-thinking

# 零样本 TTS
uv run inference.py --task tts --model pretrained_models/FireRedAudio \
    --vae-decoder pretrained_models/RedAE_decoder/model.pt \
    --prompt-audio ref.wav --prompt-text "参考文本" --target-text "目标文本" --language zh

# 语音编辑
uv run inference.py --task edit --model pretrained_models/FireRedAudio \
    --vae-decoder pretrained_models/RedAE_decoder/model.pt \
    --audio ref.wav --instruction "删除'xxx'" --edit-type semantic

# 声音设计
uv run inference.py --task voice_design --model pretrained_models/FireRedAudio \
    --vae-decoder pretrained_models/RedAE_decoder/model.pt \
    --instruction "音色描述" --text "合成文本"

常见问题

FireRedAudio 需要多大显存?

9B 参数模型,FP16 推理约需 18GB 显存。实测在 A100 (40GB) 和 RTX 4090 (24GB) 上可以运行,但长音频场景下显存占用会更高。

ASR 支持哪些语言?

ASR 任务支持多语言(具体语种数量官方未完全列出),但 TTS、编辑、声音设计只支持中文和英文。

可以拿它做实时语音对话吗?

目前不支持流式推理,输入是完整音频文件,适合离线批量处理,不适合实时场景。

TTS 生成质量不稳定怎么办?

固定随机种子(set_seed(42) 或 CLI --seed 42)可以获得可复现的结果。如果某个种子效果不理想,换一个种子试试。

长音频输入需要注意什么?

官方支持到约一小时,但实际处理时长还受显存限制。一小时音频的特征序列大约对应数万帧,加上 CoT 的长文本生成,显存需求会显著增加。

语音编辑的指令必须严格按模板写吗?

语义编辑支持自由指令(如”把’苹果’换成’香蕉'”),声学编辑必须用模板(shift the pitch by N steps 等),否则模型无法正确理解。

模型开源许可证是什么?

Apache-2.0,允许商用,但声音克隆功能仅供学术研究,禁止非法使用。