ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

mlx-audio 中的 Irodori-TTS:48kHz 日语 Flow Matching 语音合成,从声音克隆到自动时长预测

mlx-audio 中的 Irodori-TTS:48kHz 日语 Flow Matching 语音合成,从声音克隆到自动时长预测 mlx-audio 中的 Irodori-TTS48kHz 日语 Flow Matching 语音合成从声音克隆到自动时长预测【免费下载链接】mlx-audioA text-to-speech (TTS), speech-to-text (STT) and speech-to-speech (STS) library built on Apples MLX framework, providing efficient speech analysis on Apple Silicon.项目地址: https://gitcode.com/GitHub_Trending/ml/mlx-audioIrodori-TTS 是 mlx-audio 内置的一款日语 TTS 模型基于 Rectified Flow DiT 在 48kHz 连续 DACVAE 潜空间上做扩散采样架构与训练方式沿袭 Echo-TTS。本文以仓库内 Irodori-TTS 模块文档 为主线结合 irodori_tts.py 等源码实现完整讲解 v1 至 v4.1 各版本模型的选型、声音克隆与 VoiceDesign 的调用方式、自动时长预测与 Sway Sampling 的参数原理以及 16GB 统一内存机器上的低显存调优方案。读完本文你能够在 Apple Silicon 上跑通日语语音合成、按需求挑选模型档位并理解每个采样参数在底层代码中究竟如何生效。一、模型总览Rectified Flow DiT DACVAE 的日语 TTSIrodori-TTS 在 MLX 上的移植核心思路是文本以及可选的说话人参考音频、风格描述文本作为条件在一个 Rectified Flow直线化流DiT 中从噪声逐步去噪出连续 DACVAE 潜变量最后由 DACVAE 解码器把潜变量还原为 48kHz 波形。从 config.py 的ModelConfig可以看到关键常量采样率 48000HzDACVAE 下采样因子audio_downsample_factor1920即每 1920 个采样点压缩为 1 个 latent 帧约 25 帧/秒参考音频潜变量硬上限max_speaker_latent_length6400。模型各版本的核心差异在于条件能力与捆绑的组件README 给出的完整模型矩阵如下v4.1推荐v4.1-Small 是单一统一模型声音克隆、VoiceDesign 与自动时长预测合并在一个 checkpoint 中。模型权重来源条件能力mlx-community/Irodori-TTS-v4.1-Small-fp16HuggingFacemlx-community组织声音克隆 VoiceDesign 自动时长mlx-community/Irodori-TTS-v4.1-Small-8bitHuggingFacemlx-community组织声音克隆 VoiceDesign 自动时长v4模型权重来源条件能力mlx-community/Irodori-TTS-v4-Small-fp16HuggingFacemlx-community组织声音克隆 VoiceDesign 自动时长mlx-community/Irodori-TTS-v4-Small-8bitHuggingFacemlx-community组织声音克隆 VoiceDesign 自动时长v3模型权重来源条件能力mlx-community/Irodori-TTS-500M-v3-fp16HuggingFacemlx-community组织声音克隆 自动时长mlx-community/Irodori-TTS-500M-v3-8bitHuggingFacemlx-community组织声音克隆 自动时长mlx-community/Irodori-TTS-600M-v3-VoiceDesign-fp16HuggingFacemlx-community组织声音克隆 VoiceDesign双条件mlx-community/Irodori-TTS-600M-v3-VoiceDesign-8bitHuggingFacemlx-community组织声音克隆 VoiceDesign双条件v2模型权重来源条件能力mlx-community/Irodori-TTS-500M-v2-fp16/-8bit/-4bitHuggingFacemlx-community组织声音克隆参考音频mlx-community/Irodori-TTS-500M-v2-VoiceDesign-fp16/-8bit/-4bitHuggingFacemlx-community组织语音设计文本描述v1模型权重来源mlx-community/Irodori-TTS-500M-fp16HuggingFacemlx-community组织从源码结构看这些版本共用同一套IrodoriDiTConfigconfig.py差异由 checkpoint 内的config.json控制use_caption_condition决定是否存在 VoiceDesign 分支use_duration_predictor决定是否启用时长预测头text_encoder_typescratch/pretrained区分 v2/v3 的自训练文本编码器与 v4 的预训练编码器。DACVAE 方面v2/v3/v4 系列使用 32 维 Semantic-DACVAE-Japanese-32dim已捆绑在转换后的权重中v4 还会随 checkpoint 捆绑 ModernBERT-ja-310m 文本编码器同精度下体积比 v3 大约 1GBv1 使用facebook/dacvae-watermarked首次使用时自动下载——这一逻辑实现在 irodori_tts.py 的post_load_hook中优先加载模型目录下的本地dacvae/子目录找不到才回退到从 HuggingFace 仓库下载。二、快速上手声音克隆最直接的用法是通过 mlx-audio 统一的generate_audio入口传入参考音频generate.py 会将ref_audio列表逐项加载为与模型同采样率的波形后交给模型from mlx_audio.tts.generate import generate_audio generate_audio( modelmlx-community/Irodori-TTS-v4.1-Small-fp16, text今日はいい天気ですね。, ref_audiospeaker.wav, file_prefixoutput, )也可以走 CLI--ref_audio支持重复传参以提供多条参考对应 v4 的多片段克隆python -m mlx_audio.tts.generate \ --model mlx-community/Irodori-TTS-v4.1-Small-fp16 \ --text 今日はいい天気ですね。 \ --ref_audio speaker.wav在 irodori_tts.py 的generate()中可以看到完整的数据流文本先经normalize_text归一化再 tokenizemax_text_length256参考音频经_load_ref_waveform转为单声道 48kHz 波形后由 DACVAE 编码为 latent随后进入generate_latents决定输出长度再由sample_euler_cfg采样出 latent最后dacvae.decode还原波形。文本归一化日语专用预处理进入编码器之前输入文本会先经过 text.py 中normalize_text的归一化该函数逐条对应上游 Irodori-TTS 的text_normalization.py简单替换删除制表符、全角空格/归一为半角〇/○/◯/●统一为○正则清理移除分号、▼、♂/♀、书名号、带圈数字及各类连字符/减号全角波浪线〜/统一为长音符号ー三个及以上省略号折叠为……strip_outer_brackets以深度追踪方式剥离包裹整串的括号对「」『』【】例如「前半」と「後半」中开头的「在结尾前就闭合因此不会被误删最后做 NFKC 归一化把全角字母数字、半角假名、㈱/Ⅲ等折半并将.../..替换为…。仓库在 test_models.py 中保留了与上游normalize_text的差分测试TestIrodoriTextNormalization确保两步归一化逻辑保持一致。encode_text则复刻了上游PretrainedTextTokenizer的行为不依赖 tokenizer 的 special token手动前置 BOS右侧补 pad 到max_length并显式设置padding_sideright。三、VoiceDesign用文字描述塑造声音generate_audio的instruct参数在 irodori_tts.py 的generate()中是caption的别名caption caption or kwargs.pop(instruct, None)对应 DiT 中的 caption 条件分支最大长度max_caption_length512。注意 v2/v3/v4 各版本对 caption 的支持方式不同以下示例全部来自 README。v4 / v4.1 VoiceDesign仅凭描述词caption onlygenerate_audio( modelmlx-community/Irodori-TTS-v4.1-Small-fp16, text今日はいい天気ですね。, instruct落ち着いた女性の声で、近い距離感でやわらかく自然に読み上げてください。, file_prefixoutput, )参考语音 描述词的风格受控克隆双条件同时生效generate_audio( modelmlx-community/Irodori-TTS-v4.1-Small-fp16, text今日はいい天気ですね。, ref_audiospeaker.wav, instruct深く傷つき、今にも泣き出しそうな様子。声が震えており、悲痛なトーンで弱々しく話す。, file_prefixoutput, )v3 VoiceDesignCaption onlygenerate_audio( modelmlx-community/Irodori-TTS-600M-v3-VoiceDesign-fp16, text今日はいい天気ですね。, instruct落ち着いた女性の声で、近い距離感でやわらかく自然に読み上げてください。, file_prefixoutput, )python -m mlx_audio.tts.generate \ --model mlx-community/Irodori-TTS-600M-v3-VoiceDesign-fp16 \ --text 今日はいい天気ですね。 \ --instruct 落ち着いた女性の声で、近い距離感でやわらかく自然に読み上げてください。参考语音 caption 的风格受控克隆generate_audio( modelmlx-community/Irodori-TTS-600M-v3-VoiceDesign-fp16, text今日はいい天気ですね。, ref_audiospeaker.wav, instruct深く傷つき、今にも泣き出しそうな様子。声が震えており、悲痛なトーンで弱々しく話す。, file_prefixoutput, )python -m mlx_audio.tts.generate \ --model mlx-community/Irodori-TTS-600M-v3-VoiceDesign-fp16 \ --text 今日はいい天気ですね。 \ --ref_audio speaker.wav \ --instruct 深く傷つき、今にも泣き出しそうな様子。声が震えており、悲痛なトーンで弱々しく話す。v2 VoiceDesignv2 的 VoiceDesign 只接受描述词不支持参考音频generate_audio( modelmlx-community/Irodori-TTS-500M-v2-VoiceDesign-fp16, text今日はいい天気ですね。, instruct落ち着いた、近い距離感の女性話者, file_prefixoutput, )python -m mlx_audio.tts.generate \ --model mlx-community/Irodori-TTS-500M-v2-VoiceDesign-fp16 \ --text 今日はいい天気ですね。 \ --instruct 落ち着いた、近い距離感の女性話者双条件如何在 DiT 内部生效从 model.py 的结构看JointAttention把 latent 自注意力、文本上下文、说话人参考音频上下文、caption 上下文的 K/V 拼接在一条 key 序列上做联合注意力RoPE 只作用于 head 维度的前半half-RoPE输出端还有 sigmoid 门控。v3 VoiceDesign 的双条件模式即同时提供wk_speaker/wv_speaker与wk_caption/wv_caption两组投影。空 caption 有专门的掩码处理generate_latents中若 caption 为空串caption_mask会整体置零避免一个孤立的 BOS token 被当成真实描述喂给 DiT 和时长预测器。四、v4 / v4.1 特性共享预训练文本编码器与多片段参考音频共享预训练文本编码器v4 将 v2/v3 中两个从零训练的文本/caption 编码器替换为单个预训练 ModernBERT-ja-310m 骨干分别经独立的 projector 投射到 DiT 条件空间。modernbert.py 实现了ModernBertEncodermodel.py 中的PretrainedConditionProjector支持linear纯线性投影与residual_mlp在投影上叠加 SiLU 残差分支两种类型由pretrained_projector_type配置。骨干权重与 tokenizer 都捆绑在转换后的模型里因此推理时不会触发额外下载——irodori_tts.py 的_load_tokenizer优先读取 checkpoint 下的tokenizer/目录只有不存在时才回退到从上游仓库拉取。多片段参考音频最长 120 秒v4 训练时使用了最长 120 秒的参考音频。从源码注释看训练数据是同一说话人的多段较短录音而非单条不间断长录音因此传入列表逐段编码再拼接更贴近训练分布。ref_audio传列表即可generate_audio( modelmlx-community/Irodori-TTS-v4.1-Small-fp16, text今日はいい天気ですね。, ref_audio[speaker_1.wav, speaker_2.wav, speaker_3.wav], file_prefixoutput, )_encode_ref_audiosirodori_tts.py的执行逻辑值得注意每一段先用 DACVAE 独立编码按输入顺序拼接累计达到预算即停止拼接后统一截断到max_ref_seconds预算默认取 checkpoint 的ref_max_secondsv4 为 120s再向speaker_patch_sizev4 为 4对齐截断避免出现半个 patch 被静默丢弃若对齐后不足一个完整 patch 则直接报错并提示最短参考时长。max_ref_seconds参数可覆盖 checkpoint 的 120s 预算截断发生在拼接之后。五、v3 特性一自动时长预测v3 基座模型内置时长预测器省略seconds时输出长度由文本与参考音频自动估计。generate_audio( modelmlx-community/Irodori-TTS-500M-v3-fp16, text今日はいい天気ですね。, ref_audiospeaker.wav, file_prefixoutput, # seconds 自动预测用 duration_scale 微调 duration_scale1.0, # 1 更长1 更短 )预测器的输入特征与裁剪逻辑generate_latentsirodori_tts.py在seconds is None且use_duration_predictorTrue时调用model.predict_duration_log_frames其输入之一是由 duration.py 的build_duration_features构造的14 维手工特征向量对日语语料高度定制维度特征0文本 token 数 /max_text_length归一化1字符数log1p 缩放上限 5122token/字符 比3句号。/.计数log1p上限 84逗号、/,计数log1p上限 165长音ー计数log1p上限 86省略号…计数log1p上限 87感叹号/!计数8问号/?计数9表演标注 emoji 计数⏩、等 50 余个白名单表情10平假名占比11汉字占比12ASCII 字母数字占比13是否有说话人参考0/1预测结果以 log1p 帧数输出经expm1还原后乘以duration_scale最终钳制在[min_seconds, max_seconds] [0.5, 30] 秒之间SamplerConfig 默认值。test_models.py 中的TestIrodoriDurationFeatures与TestIrodoriDurationPredictor分别验证了 14 维特征的构造和预测器的前向形状。若模型既无时长预测器又未指定seconds则回退到sampler.sequence_length默认 750 帧约 30 秒手动指定seconds时同样被钳制在 0.5–30s 内。六、v3 特性二Sway Sampling 与采样器参数Sway Sampling更少步数的 Euler 采样为了加速推理可以把 Sway Sampling 与更少的 Euler 步数组合使用generate_audio( modelmlx-community/Irodori-TTS-500M-v3-fp16, text今日はいい天気ですね。, ref_audiospeaker.wav, file_prefixoutput, num_steps6, t_schedule_modesway, sway_coeff-1.0, )在 sampling.py 的sample_euler_cfg中时间步网格的构造为默认t_schedule_modelinear取linspace(0.999, 0, num_steps1)sway 模式先取u linspace(0, 1, num_steps1)再套用u u sway_coeff * (cos(0.5πu) u - 1)并裁剪到 [0, 1]最后t (1-u) * 0.999。sway_coeff-1.0使轨迹在中段更密从而 6 步即可逼近 40 步线性调度的收敛效果。采样器默认参数全解SamplerConfig 的完整默认值如下均可通过generate_audio的 kwargs 透传覆盖参数默认值作用num_steps40Euler 步数越大质量越好、越慢cfg_scale_text3.0文本条件的 CFG 强度cfg_scale_speaker5.0说话人参考条件的 CFG 强度cfg_scale_caption3.0caption 条件的 CFG 强度cfg_guidance_modeindependentCFG 计算方式见下cfg_min_t/cfg_max_t0.5 / 1.0仅在t ∈ [min, max]区间启用 CFGt 更低时退化为无条件前向sequence_length750输出 latent 帧数上限约 30s 音频实际会被时长逻辑动态覆盖t_schedule_modelinear时间步调度sway启用 Sway Samplingsway_coeff-1.0sway 强度系数duration_scale1.0自动时长预测结果的缩放系数min_seconds/max_seconds0.5 / 30.0输出时长钳制范围truncation_factor/rescale_k/rescale_sigmaNone初始噪声截断、temporal score rescale可选后处理context_kv_cacheTrue复用条件 KV cachespeaker_kv_scale/speaker_kv_min_t/speaker_kv_max_layersNone / 0.9 / None参考音频 KV 的增益缩放及其在t 0.9后的回退cfg_guidance_mode有三种取值实现均在sample_euler_cfg中independent默认把 [条件, 文本无条件, 说话人无条件, caption 无条件] 打包成一个最多 4 倍 batch 的前向双条件模型单条件模型则是 3 倍 batch各条件各自插值引导最精细但最耗内存joint一次完全无条件前向文本与上下文同时清零 一次条件前向两个 scale 需一致否则直接抛错alternating每个 Euler 步只在文本无条件与上下文无条件之间交替取用每步仅两次 1×batch 前向是低内存场景的推荐档位。七、内存需求与 16GB 机器调优默认sequence_length750大约需要24GB 统一内存。16GB 机器可使用缩减配置generate_audio( modelmlx-community/Irodori-TTS-500M-v3-fp16, textこんにちは。, ref_audiospeaker.wav, sequence_length300, cfg_guidance_modealternating, file_prefixoutput, )cfg_guidance_modealternating下的近似内存占用sequence_length内存音频时长100~2GB~4s300~2GB~12s400~3GB~16s若使用默认的cfg_guidance_modeindependent内存占用约为上表的3 倍——这与源码中independent模式 3×batch 前向、alternating模式每步两次 1×batch 前向的结构完全对应见第六节的分析。另一个对 16GB 机器友好的细节藏在 irodori_tts.py 的解码阶段DACVAE 解码采用chunk_size50的分块反卷积源码注释说明单步 stride-8 反卷积在 T750 时会瞬间产生约 17GB 的中间张量按 50 帧分块后峰值压到约 1.2GB。生成完成后还有一个后处理_find_silence_point以滑动窗口窗口 20 帧std 0.05 且 |mean| 0.1检测 latent 尾部的静音点把输出裁剪到预测时长与静音点的较短一侧同时防御了静音检测误判首窗口导致输出被清空为零的情况。八、工程细节与限制结合源码还有几点使用时的注意点流式生成暂不可用generate()对streamTrue直接抛出NotImplementedErrorIrodori-TTS 目前只支持整段生成后落盘。无参考音频的兜底启用说话人条件的模型若未提供ref_latentgenerate_latents会构造一个speaker_patch_size × latent_dim的全零 latent 作为占位保证 patch 后序列非空v4 的speaker_patch_size4。权重键重映射上游 PyTorch 的Sequential用整数下标MLX 的nn.Sequential用layers.NModel.sanitizeirodori_tts.py负责把cond_module.0.weight之类的键改写为cond_module.layers.0.weight并统一挂到model.命名空间下。测试覆盖test_models.py 中TestIrodoriGenerateSmoke、TestIrodoriV3GenerateSmoke用小尺寸配置对 v2 克隆与 v3 全链路做冒烟测试TestIrodoriVoiceDesignGenerate覆盖 caption 分支TestIrodoriEncodeText覆盖 tokenize 的 BOS/右填充行为可作为自改配置后的回归依据。许可证模型为 MIT License详见上游 Irodori-TTS 仓库的说明v4/v4.1 因捆绑 Semantic-DACVAE-Japanese-32dim 与现代 BERT 编码器同精度下比 v3 大约 1GB。综合来看mlx-audio 的 Irodori-TTS 提供了从 v1 单音色到 v4.1克隆 设计 自动时长一体化的清晰版本梯度追求统一体验选 v4.1-Small需要更细粒度的双条件控制可选 v3-600M VoiceDesign而低内存环境下通过sequence_length与cfg_guidance_modealternating的组合仍可在 2–3GB 内存内稳定产出约 12 秒的 48kHz 日语语音。【免费下载链接】mlx-audioA text-to-speech (TTS), speech-to-text (STT) and speech-to-speech (STS) library built on Apples MLX framework, providing efficient speech analysis on Apple Silicon.项目地址: https://gitcode.com/GitHub_Trending/ml/mlx-audio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表