IndexTTS是一个工业级、可控且高效的零样本文本转语音(TTS)系统。它基于XTTS和Tortoise,具备汉字拼音纠正和通过标点控制停顿的功能。系统在多个模块上进行了改进,包括说话人条件特征表示的改进和BigVGAN2的集成以优化音频质量。
核心特性
- 字符-拼音混合建模:在中文场景中,引入了字符-拼音混合建模方法,可以快速纠正误读的字符。
- 改进的架构:结合了Conformer条件编码器和基于BigVGAN2的声码器,提高了训练稳定性、音色相似度和音质。
- 高效推理:提供了两种推理模式:普通推理和批次推理(infer_fast),其中批次推理对长句性能有显著提升。
- 多语言支持:支持中英文混合文本合成。
- 高性能:在WER、SS和MOS等指标上表现优异,超越了XTTS、CosyVoice2、Fish-Speech和F5-TTS等当前流行的TTS系统。 项目结构:
- README.md: 项目介绍、使用说明、评估结果等。
- requirements.txt: 项目依赖。
- setup.py: 项目安装配置。
- webui.py: Gradio Web界面。
- indextts/: 核心代码目录。
- infer.py: 核心推理类 IndexTTS。
- cli.py: 命令行接口。
- gpt/: GPT模型相关代码。
- BigVGAN/: BigVGAN声码器相关代码。
- vqvae/: VQ-VAE相关代码。
- utils/: 工具函数,如文本前端处理、特征提取等。
- assets/: 项目资源文件,如图标、架构图等。
- tests/: 测试用例和示例音频。
- tools/: 工具脚本,如国际化(i18n)支持。
- checkpoints/: 模型文件存放目录。 安装与使用
- 环境搭建:推荐使用conda创建虚拟环境,并安装PyTorch和其他依赖。
- 模型下载:通过huggingface-cli或wget从HuggingFace或ModelScope下载模型文件到checkpoints目录。
- 命令行使用: 1 indextts “大家好,…” –voice reference_voice.wav –model_dir checkpoints –config
checkpoints/config.yaml –output output.wav - Web界面: 1 pip install -e “.[webui]” –no-build-isolation
2 python webui.py
然后在浏览器中访问 http://127.0.0.1:7860。 - 代码集成: 1 from indextts.infer import IndexTTS
2 tts = IndexTTS(model_dir=”checkpoints”, cfg_path=”checkpoints/config.yaml”)
3 tts.infer(voice, text, output_path) 核心模块分析
IndexTTS
类 (indextts/infer.py
):- init: 初始化模型(GPT、BigVGAN)、分词器、文本正则化器等。
- infer: 原始推理模式,逐句合成。
- infer_fast: 快速推理模式,通过分句分桶和批量处理提升长文本合成速度。
- remove_long_silence: 用于移除过长的静音片段。
- bucket_sentences: 对句子进行分桶,以优化批量推理。
- 文本前端处理 (
indextts/utils/front.py
):- TextNormalizer: 处理文本标准化,包括中英文数字、日期、货币等。
- TextTokenizer: 使用SentencePiece进行分词,并支持拼音混合输入。
- 模型 (
indextts/gpt/model.py
,indextts/BigVGAN/models.py
):- GPT模型基于transformers库的GPT2,并加入了Conformer编码器和Perceiver重采样器。
- BigVGAN是声码器,用于将梅尔频谱转换为波形。
IndexTTS是一个功能强大、性能优异的TTS系统,特别适合需要高质量、可控性强的语音合成场景。其提供的Web界面和命令行工具
使得使用非常方便,同时其模块化的设计也便于进行二次开发和集成。
通过对IndexTTS代码的分析,特别是infer.py和相关的GPT模型代码,可以清楚地看到Personalized Voice
Cloning的实现机制。这个过程的核心在于使用参考音频(prompt audio)生成条件向量(conditioning
vector),然后在语音合成过程中利用这个条件向量来控制输出语音的音色。
以下是详细的工作流程:
- 加载和预处理参考音频 (
infer.py
):- 在IndexTTS类的infer或infer_fast方法中,首先会加载用户提供的audio_prompt(参考音频)。
- 代码使用torchaudio.load(audio_prompt)读取音频文件。
- 通过torchaudio.transforms.Resample(sr, 24000)(audio)将音频重采样到模型要求的24000Hz。
- 如果音频是多声道的,会通过torch.mean(audio, dim=0, keepdim=True)转换为单声道。
- 提取梅尔频谱图特征 (
infer.py
和utils/feature_extractors.py
):- 预处理后的音频被传递给MelSpectrogramFeatures()(来自indextts.utils.feature_extractors)。
- MelSpectrogramFeatures使用torchaudio.transforms.MelSpectrogram将波形音频转换为梅尔频谱图(Mel-spectrogram)。
这是一种将音频信号转换为更紧凑、更能代表语音特征的二维表示(时间vs频率)。 - 转换后的梅尔频谱图cond_mel被移动到指定的计算设备(如GPU),并作为后续步骤的输入。这个cond_mel就是提取自参考音
频的声学特征。
- 生成条件向量 (
gpt/model.py
):- 在UnifiedVoice类(GPT模型)的get_conditioning方法中,提取的梅尔频谱图cond_mel(在代码中作为speech_conditionin
g_input传入)被进一步处理。 - 首先,speech_conditioning_input(即cond_mel)会通过一个conditioning_encoder(如ConformerEncoder或Conditioning
Encoder)。这个编码器的作用是将原始的梅尔频谱序列压缩和编码成一个更具代表性的、维度更低的特征表示。 - 根据配置(如condition_type),这个编码后的特征可能会再通过一个perceiver_encoder(如PerceiverResampler)。Perc
eiver的作用是将编码后的特征序列进一步聚合或重采样成一个固定长度(例如32个)的向量集合。这个向量集合就是最终的
“条件向量”(conds),它高度浓缩了参考音频说话人的音色、语调等个性化信息。
- 在UnifiedVoice类(GPT模型)的get_conditioning方法中,提取的梅尔频谱图cond_mel(在代码中作为speech_conditionin
- 在推理过程中应用条件向量 (
infer.py
和gpt/model.py
):- 在infer或infer_fast方法中,生成的条件向量(存储在auto_conditioning变量中,其本质就是经过处理的cond_mel)会在
调用GPT模型进行推理时被传入。 - 例如,在调用self.gpt.inference_speech(auto_conditioning, …)时,auto_conditioning作为第一个参数传入。
- 在GPT模型内部(具体在GPT2InferenceModel的forward方法或UnifiedVoice的get_logits等方法中),这个条件向量会被拼
接到模型的输入嵌入(input embeddings)的开头部分。 - 具体来说,模型会将条件向量、目标文本的嵌入以及可能的其他输入(如正在生成的梅尔代码)拼接在一起,形成一个完整
的输入序列。这样,在自回归生成每一个新的音频token时,模型都会“看到”并参考这个包含了目标说话人特征的条件向量,
从而生成具有相似音色的语音。
- 在infer或infer_fast方法中,生成的条件向量(存储在auto_conditioning变量中,其本质就是经过处理的cond_mel)会在
- 缓存机制 (
infer.py
):- 为了提高效率,IndexTTS类中实现了缓存机制 (self.cache_audio_prompt 和
self.cache_cond_mel)。如果连续几次推理使用的是同一个参考音频文件,代码会直接使用之前计算好的cond_mel,而不会
重复进行音频加载、重采样和特征提取的计算。
IndexTTS通过将参考音频转换为梅尔频谱图,再通过专门的编码器(Conditioning Encoder + Perceiver
Resampler)将其编码为一个紧凑的条件向量。在语音合成的每一步,这个条件向量都会被提供给GPT模型,作为上下文信息,引导
模型生成具有参考音频说话人特征的语音,从而实现了Personalized Voice Cloning。 - 为了提高效率,IndexTTS类中实现了缓存机制 (self.cache_audio_prompt 和