TTS之MaskGCT:MaskGCT(基于掩码生成编解码器的零样本文本转语音模型)的简介、安装和使用方法、案例应用之详细攻略
目录
MaskGCT的简介
2024年10月19日,正式发布MaskGCT (Masked Generative Codec Transformer) 是一款完全非自回归的文本转语音 (TTS) 模型。其最显著的特点是无需文本和语音监督之间的显式对齐信息,也无需进行音素级别的时长预测。它是一个两阶段模型:第一阶段,模型利用文本预测从语音自监督学习 (SSL) 模型中提取的语义 token;第二阶段,模型根据这些语义 token 预测声学 token。MaskGCT 遵循掩码和预测的学习范式。
在训练过程中,MaskGCT 学习根据给定的条件和提示预测被掩码的语义或声学 token。
在推理过程中,模型以并行方式生成指定长度的 token。 该模型在包含 100,000 小时真实世界语音的 Emilia 数据集上进行训练,并在质量、相似性和可懂度方面优于现有的最先进的零样本 TTS 系统。
总的来说,MaskGCT 提供了一个完整的、易于使用的零样本 TTS 系统,其代码和文档清晰易懂,方便研究者和开发者进行使用和扩展。 其高性能和易用性使其成为 TTS 领域的一个重要贡献。
GitHub地址:https://github.com/open-mmlab/Amphion/tree/main/models/tts/maskgct
1、MaskGCT的特点
>> 完全非自回归:与传统的自回归模型不同,MaskGCT 并行生成语音,速度更快,更适合实时应用。
>> 零样本能力:无需显式对齐信息和音素时长预测,可以进行零样本语音合成。
>> 基于掩码和预测:采用掩码和预测的学习范式,提高了模型的鲁棒性和泛化能力。
>> 两阶段模型:将语音生成分为语义编码和声学解码两个阶段,简化了模型结构,提高了训练效率。
>> 高性能:在多个基准测试中,MaskGCT 在语音质量、相似性和可懂度方面均取得了最先进的性能。
>> 多语言支持:模型在 Emilia 数据集上训练,支持英语和中文,暗示具有多语言扩展潜力。
MaskGCT的安装和使用方法:
1、克隆代码库并创建环境:
git clone https://github.com/open-mmlab/Amphion.git
# create env
bash ./models/tts/maskgct/env.sh
env.sh 脚本会设置必要的环境变量和安装依赖项。 具体依赖项需要查看 env.sh 文件内容。
2、下载预训练模型:
MaskGCT 提供了多个预训练模型检查点,包括语义编解码器、声学编解码器、文本到语义 (T2S) 模型和语义到声学 (S2A) 模型。可以使用 Hugging Face Hub 下载:
from huggingface_hub import hf_hub_download
import safetensors
# 下载语义编解码器
semantic_code_ckpt = hf_hub_download("amphion/MaskGCT", filename="semantic_codec/model.safetensors")
# 下载声学编解码器
codec_encoder_ckpt = hf_hub_download("amphion/MaskGCT", filename="acoustic_codec/model.safetensors")
codec_decoder_ckpt = hf_hub_download("amphion/MaskGCT", filename="acoustic_codec/model_1.safetensors")
# 下载 T2S 模型
t2s_model_ckpt = hf_hub_download("amphion/MaskGCT", filename="t2s_model/model.safetensors")
# 下载 S2A 模型 (两个版本)
s2a_1layer_ckpt = hf_hub_download("amphion/MaskGCT", filename="s2a_model/s2a_model_1layer/model.safetensors")
s2a_full_ckpt = hf_hub_download("amphion/MaskGCT", filename="s2a_model/s2a_model_full/model.safetensors")
然后使用 safetensors.torch.load_model() 函数加载这些检查点到模型中。
3、模型构建和加载:
提供的 Python 代码展示了如何构建和加载 MaskGCT 的各个组件:语义模型 (w2v-bert-2.0)、语义编解码器、声学编解码器、T2S 模型和 S2A 模型 (两个不同层数的版本)。 代码中详细说明了每个组件的构建函数,并通过 safetensors.torch.load_model() 加载预训练权重。
4、推理
maskgct_inference.py 提供了推理的示例代码。 用户需要提供提示语音文件路径 (prompt_wav_path)、提示文本 (prompt_text)、目标文本 (target_text)、语言代码 ("en" 或 "zh") 以及目标时长 (target_len, 可选)。 代码会调用 maskgct_inference_pipeline.maskgct_inference() 函数进行推理,并将生成的语音保存到指定路径。
使用以下代码从文本和提示语音生成语音
from models.tts.maskgct.maskgct_utils import *
from huggingface_hub import hf_hub_download
import safetensors
import soundfile as sf
if __name__ == "__main__":
# build model
device = torch.device("cuda:0")
cfg_path = "./models/tts/maskgct/config/maskgct.json"
cfg = load_config(cfg_path)
# 1. build semantic model (w2v-bert-2.0)
semantic_model, semantic_mean, semantic_std = build_semantic_model(device)
# 2. build semantic codec
semantic_codec = build_semantic_codec(cfg.model.semantic_codec, device)
# 3. build acoustic codec
codec_encoder, codec_decoder = build_acoustic_codec(cfg.model.acoustic_codec, device)
# 4. build t2s model
t2s_model = build_t2s_model(cfg.model.t2s_model, device)
# 5. build s2a model
s2a_model_1layer = build_s2a_model(cfg.model.s2a_model.s2a_1layer, device)
s2a_model_full = build_s2a_model(cfg.model.s2a_model.s2a_full, device)
# download checkpoint
...
# load semantic codec
safetensors.torch.load_model(semantic_codec, semantic_code_ckpt)
# load acoustic codec
safetensors.torch.load_model(codec_encoder, codec_encoder_ckpt)
safetensors.torch.load_model(codec_decoder, codec_decoder_ckpt)
# load t2s model
safetensors.torch.load_model(t2s_model, t2s_model_ckpt)
# load s2a model
safetensors.torch.load_model(s2a_model_1layer, s2a_1layer_ckpt)
safetensors.torch.load_model(s2a_model_full, s2a_full_ckpt)
# inference
prompt_wav_path = "./models/tts/maskgct/wav/prompt.wav"
save_path = "[YOUR SAVE PATH]"
prompt_text = " We do not break. We never give in. We never back down."
target_text = "In this paper, we introduce MaskGCT, a fully non-autoregressive TTS model that eliminates the need for explicit alignment information between text and speech supervision."
# Specify the target duration (in seconds). If target_len = None, we use a simple rule to predict the target duration.
target_len = 18
maskgct_inference_pipeline = MaskGCT_Inference_Pipeline(
semantic_model,
semantic_codec,
codec_encoder,
codec_decoder,
t2s_model,
s2a_model_1layer,
s2a_model_full,
semantic_mean,
semantic_std,
device,
)
recovered_audio = maskgct_inference_pipeline.maskgct_inference(
prompt_wav_path, prompt_text, target_text, "en", "en", target_len=target_len
)
sf.write(save_path, recovered_audio, 24000)
MaskGCT的案例应用
提供的示例代码中,prompt_text 和 target_text 分别为:
prompt_text: "We do not break. We never give in. We never back down."
target_text: "In this paper, we introduce MaskGCT, a fully non-autoregressive TTS model that eliminates the need for explicit alignment information between text and speech supervision."
这段代码演示了如何使用一个提示语音和一段文本生成一段新的语音。 通过修改 prompt_wav_path, prompt_text, target_text 和 target_len 等参数,用户可以进行各种实验,例如:
使用不同的提示语音来改变生成的语音风格。
使用不同的目标文本生成不同的语音内容。
调整目标时长来控制生成的语音长度。
每个模块的详细内容:
语义模型 (Semantic Model): 使用 w2v-bert-2.0 模型将文本转换为语义表示。
语义编解码器 (Semantic Codec): 将语音转换为语义 token,并反向转换。
声学编解码器 (Acoustic Codec): 将语音转换为声学 token,并根据声学 token 重建波形。
T2S 模型 (T2S Model): 根据文本和提示语义 token 预测语义 token。
S2A 模型 (S2A Model): 根据语义 token 预测声学 token。 提供了单层和多层两个版本。
MaskGCT_Inference_Pipeline: 整合所有组件的推理流程。