新手上手 AuK 语音克隆只要 3 步:参考音频一放、指令一输,声音当场换人
传统语音克隆的门槛一直很高:要么为每个新音色准备几十条语料做微调,要么在推理时手工拼接声学特征、反复调参。腾讯混元开源的AuK把这件事压缩到了极致——它是一个 1.5B 参数的开源语音基础模型,所有任务(零样本 TTS、语音编辑、增强、分离等 16 类)都统一走"自然语言指令 + 可选音频"这一个接口。对新手而言,做一次声音克隆只需要三步:下载模型、准备一段参考音频、写一句指令。本文基于仓库真实源码与官方 Cookbook,给出可直接照抄的完整流程,并拆解"一句指令为什么能换人"背后的架构原理与调参要点。
为什么"换人"只需 3 步:零样本 TTS 一句话讲清
零样本(zero-shot)TTS 的核心思想是:不再为每个说话人单独训练模型,而是在推理时直接注入一段参考音频,让模型"听着这个人的声音"说出目标文本。模型在训练阶段见过海量说话人(AuK 在数百万小时多样音频数据上训练,见 README.md),因此能够把"音色"与"文本内容"解耦——参考音频负责提供音色与韵律条件,指令负责提供"说什么",二者在生成时重新组合。
AuK 的两大变体(README.md):
| 模型 | 定位 | 推理特点 |
|---|---|---|
| AuK | 高质量生成基础模型 | NFE 与 CFG 可配置 |
| AuK-Flash | 蒸馏加速版 | 固定 4 步采样、CFG=0,推理提速约 4.5 倍 |
代码与权重采用 MIT 协议开放(LICENSE),可商用。它还被 ICASSP 2027 音频编辑挑战赛"单模型赛道"选为端到端基线,社区热度与工程可信度兼备。
第 1 步:装环境、拉权重、备好参考音频
安装。官方推荐用 uv 或 Conda 建一个 Python 3.10 隔离环境,然后按需选择安装目标:
# uv 方式 uv venv --python 3.10 source .venv/bin/activate uv pip install -e . # 仅核心推理与 CLI uv pip install -e ".[gradio]" # 额外支持 Gradio 网页 Demo # 或 Conda 方式 conda create -n auk python=3.10 -y conda activate auk pip install -e .默认安装包含 PyTorch、TorchAudio、TorchVision;若平台需要特定 CUDA 版本,先装好匹配的 PyTorch 再执行上述命令。
拉权重。除了 AuK 本体,还需要其配套的 3B 多模态编码器 Qwen2.5-Omni-3B(README.md):
# AuK-Base hf download tencent/AuK --local-dir ./ckpts/AuK # MLLM 指令编码器 hf download Qwen/Qwen2.5-Omni-3B --local-dir ./ckpts/Qwen2.5-Omni-3B # 国内网络可用 ModelScope modelscope download --model Tencent-Hunyuan/AuK --local_dir ./ckpts/AuK权重加载时,config.yaml、auk_base.safetensors(扩散主干)、vae.safetensors(声码器)三者在同一目录即可被自动识别;仓库根目录已内置这三份文件,text_encoder相关 key 缺失属于正常现象,因为编码器在运行时单独加载。
准备参考音频。这一步的质量直接决定克隆效果:
- 长度 3~10 秒:官方基准常用 5 秒参考音频;过短会导致音色信息不足。
- 干净:单说话人、无背景音乐、无混响与明显噪声——这是零样本克隆效果的"隐形开关"。
- 语言与内容相关:参考音频与目标文本同语言时效果最稳;若参考音频包含目标文本片段,克隆一致性会更高。
第 2 步:把"想说的话"写进一条指令
AuK 的输入统一为 ChatML 风格消息:text字段放自然语言指令,audio字段放参考音频路径(COOKBOOK 模板,仓库内文档说明)。零样本 TTS 的指令模板中英文通用:
Say the following with the same voice: "{目标文本}"
把参考音频和指令拼在一起,就是模型收到的全部输入:
content = [ {"type": "text", "text": "Say the following with the same voice: '欢迎来到语音克隆体验'"}, {"type": "audio", "audio": "./ref.wav"}, ] messages = [{"role": "user", "content": content}]关键点在于:音色、情绪、语速全部用自然语言描述,不需要任何手工特征。比如想换一种情绪或语速,只需替换指令:
- 情绪:
Change the emotion to happy.(官方模板含开心/愤怒/悲伤/恐惧/惊讶/厌恶/平静/兴奋八类) - 语速:
Adjust the speech speed to 1.5x.(支持 0.5x~2.0x) - 音色:
Keep the spoken content unchanged and change the timbre to: "a deep, calm male voice". - 甚至可以完全不要参考音频:Instruct TTS 只凭一段声音描述就能生成语音("一位二十多岁的女性,声音柔和亲密,语速稍缓……")。
注意模型存在约 30 秒的输入音频预算,长文本建议拆分生成或缩短参考音频。
第 3 步:一行命令出音频
CLI 方式——参考音频、指令、输出路径、目标时长四个参数即可:
auk-infer \ --audio ./ref.wav \ --instruction "Say the following with the same voice: 'Ladies and gentlemen, it's an honor to have the opportunity to address such a distinguished audience'" \ --output out_zeroshot_tts.wav \ --gen_seconds 6.0Python API 方式——初始化一次引擎后反复调用:
from auk.infer.infer_auk import AukInfer, save_audio engine = AukInfer( "ckpts/AuK/config.yaml", "ckpts/AuK/auk_base.safetensors", ) audio, sr = engine.generate(messages, gen_seconds=6.0) save_audio(audio, sr, "out_zeroshot_tts.wav")零代码方式——装好[gradio]后直接起网页 Demo:
auk-gradio --base_ckpt ckpts/AuK/auk_base.safetensors --base_device cuda:0如果不想手写指令,官方还提供 Prompt Enhancer(PE):输入一句口语化需求,它会自动生成规范指令、估算目标时长并输出可直接运行的auk-infer命令。从自由需求到出音频,全程不超过 3 条命令。
原理拆解:一段参考音频 + 一句指令,内部发生了什么
从 config.yaml 可以看到 AuK 的三段式架构:
- 指令理解层:Qwen2.5-Omni-3B 多模态 LLM 编码器同时理解文本指令与参考音频,把"说什么、像谁、什么情绪"统一编码为条件表征(
text_encoder.text_encoder_path: ckpts/Qwen2.5-Omni-3B)。 - 生成主干:双流扩散 Transformer(
backbone: Flux2Edit+ 条件流匹配cfm_class: CFMEdit),配置为dim: 1536、heads: 24、10 层双流 + 20 层单流,配合logistic_normal时间采样调度,逐步去噪生成声学潜变量。模型后训练还融合了人评 DPO 与 Flow-GRPO 奖励优化,让生成更贴合听感偏好。 - 波形解码层:BigVGANFlow VAE 声码器(
vae_name: BigVGANFlowVAE)以 480 倍下采样率把潜变量解码为24kHz高质量波形。
零样本克隆能成立的关键,在于扩散主干以"条件注入"而非"参数微调"的方式引入参考音频——说话人表征与文本指令并行约束生成过程,因此换人只需换参考音频,换内容只需换指令。这也解释了为什么同一套权重能同时覆盖 TTS、内容编辑、副语言编辑、增强与分离等十几类任务:它们本质都是"指令 + 音频条件 → 重新生成/编辑声学序列"。
调参要点:音色、情绪、语速与显存
"调参"在 AuK 里主要是改指令,但有几个工程参数值得新手注意:
- 时长估计:TTS 必须显式给出目标时长。可用
--gen_seconds 6.0直接指定秒数,或改用--gen_text(可加--ref_text参考转写)让模型自动估算。估算偏短是新手最常见的翻车点。 - 换 Flash 提速:把
--ckpt指向ckpts/AuK-Flash/auk_flash.safetensors,固定 4 步、CFG=0,即可获得约 4.5 倍加速,适合批量生成。 - 显存不足:加
--cpu_offload。官方在 A800-SXM4-80GB 上的 bf16 实测(README.md):纯文本 1.5s 输出从 24.78 GiB 降到 16.75 GiB(省 32.4%),5 秒参考音频场景从 25.00 GiB 降到 16.98 GiB(省 32.1%);社区 PR 也通过降低编码器显存占用约 7.5 GiB 进一步放宽了消费级 GPU 门槛。 - 质量与速度的取舍:AuK Base 的 NFE 与 CFG 可调,追求音质时提高采样步数,追求速度时降低;Flash 则固定 4 步不可调。
客观看待边界。技术报告与社区实测反馈了两点:一是输入音频存在约 30 秒的预算限制,长音频处理需分段;二是副语言编辑中最难的情绪编辑成功率仅约 9.94%(Seed-TTS-Eval 等基准上生成与编辑任务整体领先,但情绪维度仍是短板)。也就是说,做"换人"这类任务 AuK 已经足够顺手,但若想靠一句指令精准改出特定情绪,目前仍需多试几种指令措辞。
小结
回顾这 3 步:备好一段干净参考音频 → 套用Say the following with the same voice: "{text}"模板 → 跑一条auk-infer命令。没有微调、没有特征工程,声音当场换人。AuK 的价值不止于零样本 TTS——它用同一个指令接口覆盖编辑、增强、分离等十几类任务,MIT 协议允许自由商用,且已获得 SGLang-Omni 首发支持、vLLM-Omni 与 ComfyUI 集成以及 audio.cpp 的 GGUF 离线推理支持。对想做语音产品原型、配音工作流或研究语音编辑的人来说,这可能是目前上手成本最低的统一入口。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考