在 MLX 上运行 KugelAudio:24 种欧洲语言的 7B 混合自回归 + 扩散 TTS 实战指南
【免费下载链接】mlx-audioA text-to-speech (TTS), speech-to-text (STT) and speech-to-speech (STS) library built on Apple's MLX framework, providing efficient speech analysis on Apple Silicon.项目地址: https://gitcode.com/GitHub_Trending/ml/mlx-audio
KugelAudio 是一个面向 24 种欧洲语言的开源 7B 参数文本转语音(TTS)模型,本仓库(mlx-audio)直接加载其原始 bfloat16 权重,并通过统一的generate()接口在 Apple Silicon 上运行。读完本文,你将掌握在 MLX 环境中通过 CLI 与 Python API 完成 KugelAudio 语音合成、调优cfg_scale与ddpm_steps参数、理解其混合 AR + Diffusion 架构与内存占用的完整实战方案。
KugelAudio 模型概览
KugelAudio 是一个开放权重的 7B 参数 TTS 模型,专注于 24 种欧洲语言的语音合成。mlx-audio 的集成直接运行官方原始权重(不做任何权重格式转换),并对外暴露了与其他 TTS 模型一致的标准generate()接口,因此可以无缝接入仓库统一的加载、推理与音频输出流程。
| Model | Precision | 说明 |
|---|---|---|
kugelaudio/kugelaudio-0-open | bfloat16 | 官方原始权重,直接在 MLX 中加载运行 |
从 模型实现源码 的类注释可知,该模型基于 Microsoft VibeVoice,在约 200K 小时的语音数据上微调得到,覆盖 24 种欧洲语言。它采用混合自回归(AR)+ 扩散(Diffusion)架构:
- 一个 Qwen2.5 语言模型(7B)自回归地生成语音 token 序列;
- 每当生成
speech_diffusion特殊 token 时,触发一次 SDE-DPM-Solver++ 扩散采样,输出一个声学 latent; - 所有 latent 收集完成后,由卷积 VAE 解码器一次性批量解码为 24 kHz 音频。
环境准备与模型加载
通过load()加载模型
与仓库中其他 TTS 模型一致,KugelAudio 通过mlx_audio.tts.load统一入口加载,底层会自动识别模型类型并初始化对应的模型类(见 加载工具源码 中的MODEL_REMAPPING与load_model):
from mlx_audio.tts import load model = load("kugelaudio/kugelaudio-0-open")加载过程中,模型会通过post_load_hook依据解码器词表大小自动从 Qwen/Qwen2.5 系列仓库派生并加载分词器(kugelaudio.py 中post_load_hook),无需手动指定分词器。
内存需求
模型约 70 亿参数并以 bfloat16 精度加载,仓库内 模型 README 明确标注:约需 17 GB 统一内存,并已在 M4 Max 36GB 设备上完成测试验证。运行前请确认你的设备可用统一内存足够(例如 M 系列 Mac 至少 32GB 起步更稳妥)。
快速开始:生成你的第一段语音
CLI 方式
通过mlx_audio.tts.generate模块直接运行:
python -m mlx_audio.tts.generate \ --model kugelaudio/kugelaudio-0-open \ --text "Hello, this is KugelAudio." \ --cfg_scale 3.0 \ --ddpm_steps 10命令结束后会在当前目录生成audio_000.wav等音频文件(默认文件名前缀为audio)。CLI 还支持--output_path、--file_prefix、--audio_format、--play、--join_audio等通用参数,完整参数表见 生成入口源码。
Python 方式
from mlx_audio.tts import load model = load("kugelaudio/kugelaudio-0-open") result = next( model.generate( text="Hello, this is KugelAudio running on Apple Silicon.", cfg_scale=3.0, ddpm_steps=10, ) ) audio = result.audio # mlx.core.array,采样率 24 kHzgenerate()是一个生成器,每次yield一个GenerationResult对象(定义见 base.py),其中包含:
audio:一维mx.array音频数据,采样率由model.sample_rate给出(KugelAudio 为 24000 Hz);audio_duration:格式化时长字符串,如"00:00:03.214";real_time_factor:实时率(RTF),小于 1 表示生成快于实时;peak_memory_usage:峰值内存(GB);token_count/audio_samples:token 与音频采样统计信息。
拿到audio后,可以直接使用仓库的 audio_io 写入工具 保存为 WAV 文件,例如:
from mlx_audio.audio_io import write write("output.wav", audio, sample_rate=model.sample_rate)核心生成参数详解
| Parameter | Default | Description |
|---|---|---|
cfg_scale | 3.0 | 无分类器引导(Classifier-free guidance)强度 |
ddpm_steps | 10 | 扩散采样步数,用于权衡质量与速度 |
max_tokens | 2048 | 最大可生成的语音 token 数 |
cfg_scale:无分类器引导强度
- 默认值
3.0,数值越大越贴合条件(文本语义),语音更清晰; - 设为
1.0表示关闭 CFG,生成更快但质量下降; - 从源码看(kugelaudio.py 中
sample_speech_tokens),当cfg_scale > 1.0时,模型会额外维护一条"无条件(negative)"分支,将条件与无条件输入拼接后一次批量前向,再按公式guided_eps = uncond_eps + cfg_scale * (cond_eps - uncond_eps)合成引导噪声。
ddpm_steps:扩散步数与质量-速度权衡
- 默认
10步为平衡档; 5步更快但质量略降;20步接近最高质量;- 该值会覆盖模型配置中
ddpm_num_inference_steps的默认值(见 config.py,默认推理步数 10,训练步数 1000,cosine beta schedule,v_prediction预测类型)。
max_tokens:生成上限
最多生成 2048 个语音 token,作为生成循环的硬性上限,防止长文本导致的无限生成。
支持的 24 种语言
KugelAudio 支持以下 24 种欧洲语言:
English, German, French, Spanish, Italian, Portuguese, Dutch, Polish, Russian, Ukrainian, Czech, Romanian, Hungarian, Swedish, Danish, Finnish, Norwegian, Greek, Bulgarian, Slovak, Croatian, Serbian, and Turkish.
质量提示:仓库内 模型 README 明确指出,不同语言的数据覆盖度不同,其中英语、德语、法语、西班牙语的训练数据覆盖最强,合成质量最好。
架构原理:从源码看混合 AR + Diffusion 流水线
KugelAudio 的推理实现完整位于 kugelaudio.py,其中复用了 VibeVoice 的若干模块(AcousticTokenizer、DiffusionHead、Qwen2Model、SpeechConnector,见 vibevoice 模块)。
特殊 token 与解码约束
模型复用了 Qwen2.5 的视觉 token 作为语音专用 token(源码中的VALID_SPEECH_TOKENS):
SPEECH_START_ID = 151652:语音起始;SPEECH_END_ID = 151653:语音结束;SPEECH_DIFFUSION_ID = 151654:触发扩散采样;EOS_TOKEN_ID = 151643:句子结束。
生成时,每个 token 的 logits 会被约束掩码限制为仅在这 4 个合法 token 上取值(constraint_mask),保证采样过程符合模型设计。
提示词模板
_build_prompt_tokens会自动将输入文本包装为对话式提示:
Transform the text provided by various speakers into speech output, utilizing the distinct voice of each respective speaker. Text input: Speaker 0: {你的文本} Speech output:如果文本本身已以 "Speaker" 开头则不再重复添加前缀。随后追加SPEECH_START_ID作为生成起点。
生成主循环
- 语言模型对整个提示做首次前向,得到 hidden states 与 KV cache;
- 当
cfg_scale > 1.0时,额外以SPEECH_START_ID初始化一条无条件分支(neg_cache/neg_hidden); - 循环采样下一个 token:若为
SPEECH_DIFFUSION_ID,则调用sample_speech_tokens执行扩散采样获得声学 latent,通过SpeechConnector(vae_dim 64 → hidden_size 3584)映射回语言模型隐空间后继续自回归; - 遇到
SPEECH_END_ID/EOS_TOKEN_ID时,若SPEECH_DIFFUSION_ID的 logit 与结束 token 差距小于FINAL_LATENT_LOGIT_MARGIN(5.0),会额外生成一个 latent,避免最后一个音节被截断; - 所有 latent 收集完毕后一次性批量解码(而非逐块解码),源码注释明确说明这是为了避免分块独立解码产生的"咔嗒"伪音(click artifacts)。
扩散调度器
扩散部分使用仓库自定义的 SDE-DPM-Solver++ 随机变体调度器,它在每个求解步注入随机噪声,相比确定性 DPM-Solver 能产生更高质量的语音。调度器支持一阶/二阶更新,配合v_prediction类型输出,完成从噪声到声学 latent 的反向采样。
权重映射与量化转换
模型直接加载官方 PyTorch safetensors,sanitize()负责完成权重重映射:剔除推理不需要的语义编码器权重、处理 "model." 前缀、修正扩散头 Sequential 层索引、按维度转置 Linear/Conv1d/ConvTranspose1d 权重等。
如需预转换或量化保存,可使用仓库通用转换命令:
python -m mlx_audio.convert \ --hf-path kugelaudio/kugelaudio-0-open \ --mlx-path ./kugelaudio-0-open-bf16 \ --dtype bfloat16转换后的本地目录同样可以直接传给load()/--model使用。
性能与注意事项
- 实时率(RTF):仓库 README 记录,在 M4 Max 上以
cfg_scale=3.0、ddpm_steps=10配置运行时 RTF 约为5-7x(即生成 1 秒音频约需 5~7 秒计算时间),属于偏慢但可用的离线合成场景。 - 默认音色:上游发布版本未提供预编码的音色预设(voice presets),模型使用默认音色路径生成;
generate()中的voice参数当前被忽略(源码中标注pylint: disable=unused-argument)。 - 内存峰值:7B bfloat16 权重约需 17 GB 统一内存,推理过程中的中间激活与 KV cache 会进一步抬高峰值,建议预留充足内存。
- 采样率:输出音频统一为 24 kHz。
相关资源
- 模型实现:kugelaudio.py
- 模型配置:config.py
- 扩散调度器:scheduler.py
- 仓库内 README:mlx_audio/tts/models/kugelaudio/README.md
- TTS 统一加载入口:mlx_audio/tts/utils.py
- CLI 生成入口:mlx_audio/tts/generate.py
【免费下载链接】mlx-audioA text-to-speech (TTS), speech-to-text (STT) and speech-to-speech (STS) library built on Apple's MLX framework, providing efficient speech analysis on Apple Silicon.项目地址: https://gitcode.com/GitHub_Trending/ml/mlx-audio
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考