开源实时语音克隆 IndexTTS2:推理加速实测与情绪语速控制
IndexTTS2 是 B 站开源的语音克隆模型,支持情感表达和语速控制。架构包含 T2S、S2M 及 BigVGANv2 声码器。通过 vLLM 和 DeepSpeed 可实现推理加速,DeepSpeed 性价比更高但需处理并发问题。部署采用 FastAPI 串行化 GPU 推理配合 HTTP 异步请求。实测显示在 RTX 4080 上可优化至 RTF 0.5 以下。

IndexTTS2 是 B 站开源的语音克隆模型,支持情感表达和语速控制。架构包含 T2S、S2M 及 BigVGANv2 声码器。通过 vLLM 和 DeepSpeed 可实现推理加速,DeepSpeed 性价比更高但需处理并发问题。部署采用 FastAPI 串行化 GPU 推理配合 HTTP 异步请求。实测显示在 RTX 4080 上可优化至 RTF 0.5 以下。

IndexTTS 是 B 站语音团队开源的一系列语音克隆模型。
早期版本,在多场景应用中均表现惊艳,笔者也有过部署实测。
字错率和克隆相似性,均出于当时领先水平。
经过 vLLM 推理加速,RTF 可以低至 0.15,因此也是首选的语音克隆模型服务。
不过还有硬伤:
刚好最近项目中需要解决以上痛点,寻找了一圈解决方案,兜兜转转还是来到了 IndexTTS 。
因为当前市面上,无论开源 还是 闭源的语音克隆方案,上述两点都没有很好解决。
早在去年 9 月,B 站就开源了 IndexTTS-2.0 ,号称情感丰富和时长可控。
刚好借此机会,实测一番,分享给各位。
相比 v1 版本,模型架构发生了不小变化:

简言之:
IndexTTS2 由三个核心模块组成:Text-to-Semantic(T2S) 、Semantic-to-Mel(S2M) 以及 BigVGANv2 声码器。
有哪些亮点?
此外,模型还具备基于文本描述的情感控制能力。
如何实现?
首先定义 7 种标准情感,并建立对应的情感 embedding。用户输入自然语言,微调 Qwen3-0.6b 输出情感概率分布,加权得到最终的情感 embedding。
对应模型架构部分:
# 核心模块 GPT 模型 (UnifiedVoice):负责从文本和音色参考生成语义码(codes)。
# Semantic 模型(基于 w2v-BERT 2.0):提取参考音频的语义嵌入。
# - get_emb 函数:输入 w2v-bert 特征和掩码,取第 17 层隐藏状态作为语义特征
# Semantic codec:将语义嵌入量化为离散码本索引。
# S2Mel 模型:包含 length_regulator、cfm(Flow Matching 扩散模型)等,用于从语义码生成梅尔频谱。
# CampPlus:提取参考音频的风格向量(全局音色特征)。
# BigVGAN:声码器,将梅尔频谱转为波形。
# QwenEmotion:情感分析模型,可从文本生成情感向量。
# TextNormalizer & TextTokenizer:文本规范化与分词(BPE)。
# 缓存机制
# 缓存参考音频的语义条件、风格向量、梅尔频谱等,避免重复计算。
# 模型加载
self.qwen_emo = QwenEmotion(os.path.join(self.model_dir, self.cfg.qwen_emo_path)) # 会加载 qwen 模型
self.gpt = UnifiedVoice(**self.cfg.gpt, use_accel=self.use_accel) # 加载 GPT 模型,use_deepspeed 用户加速 gpt
self.s2mel = MyModel(self.cfg.s2mel, use_gpt_latent=True) # 会使用 enable_torch_compile,将模型转换为更高效的执行图,减少推理时间和显存占用
self.bigvgan = bigvgan.BigVGAN.from_pretrained # 会用 use_cuda_kernel 启用自定义 CUDA 加速。
self.normalizer = TextNormalizer(enable_glossary=True) # 文本标准化实例,启用术语表,有具体使用示例
self.tokenizer = TextTokenizer(self.bpe_path, self.normalizer) # 文本分词器,使用 BPE 分词算法和标准化器
self.emo_matrix # 加载 feat2.pt,共 8 种表情向量,每种有多条
self.spk_matrix # 加载 feat1.pt,内置的音频向量,和上面对应
self.mel_fn # 梅尔频谱计算函数(根据配置初始化)
# 语音处理工具:
# - remove_long_silence:压缩过长的静音 token,得到的还是 codecs
# - interval_silence / insert_interval_silence:在句子之间插入指定长度的静音段,前者生成静音,后者插入静音。
# - _load_and_cut_audio:加载音频,截断到 15s
# 推理函数 infer:如果是流式输出,返回迭代器;非流式输出:返回分句的音频列表
# infer_generator:
# - 先判断情感控制:qwen 大模型会输出:{'happy': 0.0, 'angry': 0.0, 'sad': 0.99, 'afraid': 0.0, 'disgusted': 0.0, 'melancholic': 0.0, 'surprised': 0.0, 'calm': 0.01};若无外部情感参考音频,则使用音色参考音频作为情感参考。
# - 从 emo_matrix 中提取向量和 emo_vector 相乘,得到 emovec_mat
# - 输入情感参考音频:得到语义嵌入 emo_cond_emb;如果没有就和参考音频一样
# - 再处理参考音频:如果参考音频变了,则重新加载
# - 16kHz 音频 → w2v-BERT 特征 → 语义嵌入 spk_cond_emb → codec 量化得到 S_ref → 经过 s2mel 得到 prompt_condition。
# - 22kHz 音频 → 梅尔频谱 ref_mel。
# - 16kHz 音频 → FBank 特征 → CampPlus → 风格向量 style
# - 开始文本分词和分句:max_text_tokens_per_segment 决定分几句
# - 循环生成每段语音:
# - GPT 生成语义码(codes):合并音色与情感 cond,再合并 emovec_mat,得到 emovec,再调用 gpt.inference_speech 生成 codes,用 self.gpt 对码和文本做一次前向,得到 latent(用于后续扩散模型条件)。
# - Flow Matching 扩散模型生成梅尔频谱:s2mel 模型得到 vc_target,其中的 target_lengths 用 1.72 控制梅尔频谱的长度,从而控制语速
# - BigVGAN 声码器合成波形:将梅尔频谱转为波形,clamp 到 int16 范围。
# - 收集波形和静音:生成一句 wav,默认生成一段 200ms 静音,生成 sampling_rate 必须是 22050
相比 v1,IndexTTS2 在音色相似度上有了质的飞跃:

在情感控制上,相比 CosyVoice2 也强不少:

以下均在 RTX 4080 显卡上进行实测。
在不进行任何推理加速的情况下,模型加载后的显存占用:

IndexTTS2 的 T2S 模块依旧采用的是 GPT2 自回归模型架构,不过层数更多,因此极大增加了推理延时,实测 RTF 值如下:

多次测试:
>> RTF: 5.8614 >> RTF: 3.6096 >> RTF: 3.6241 >> RTF: 3.2211 >> RTF: 3.8663
显然,无法满足实时应用需求。
这里最耗时的有两个部分:
后者可通过 torch.compile 将模型转换为优化的执行图,减少运行时开销,实测提速 2x。
下面重点解决 GPT2 推理。
IndexTTS2 的 T2S 模块是 GPT2,因此可通过 vLLM 引擎进行加载,从而实现推理加速,实测加速效果如下:

在 gpu_memory_utilization 设置为 0.25 的情况下,显存占用:

官方仓库采用 uv 管理环境,安装 deepspeed:
uv sync --extra deepspeed
同时需要安装 flash_attn:
flash_attn 安装坑比较多,推荐找到对应版本的安装包进行本地安装:
wget https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.3/flash_attn-2.8.3+cu12torch2.8cxx11abiFALSE-cp310-cp310-linux_x86_64.whl
uv pip install flash_attn-2.8.3+cu12torch2.8cxx11abiFALSE-cp310-cp310-linux_x86_64.whl
加速效果如下:

GPT2 推理部分,加速效果相比 vLLM 更有性价比。
显存占用如下:

尽管 vLLM 支持并发,但单发都无法做到实时,根本不可用啊。
而 DeepSpeed 加速,可以将 RTF 干到 0.5 以下,却不支持并发。因为 DeepSpeed 的 KV 缓存机制为单个推理流程服务,在多线程并发访问时会产生内存冲突。
所以,只能选择在 FastAPI 这一层实施:
也就是服务层面支持并发调用,但推理还是队列化处理的,确保不把服务打崩。
举例而言,假设同时来了 10 个请求:
[请求 1] 成功 - 耗时:3.63s [请求 2] 成功 - 耗时:5.99s [请求 6] 成功 - 耗时:9.20s [请求 3] 成功 - 耗时:12.32s [请求 0] 成功 - 耗时:14.61s [请求 4] 成功 - 耗时:17.14s [请求 7] 成功 - 耗时:19.65s [请求 8] 成功 - 耗时:22.03s [请求 5] 成功 - 耗时:24.44s [请求 9] 成功 - 耗时:26.87s
先抢到资源的先推理,服务不忙的时候,可满足实时推理需求。
请求示例如下:
class TTSRequest(BaseModel):
voice_id: Optional[str] = None # 参考语音的 id
tts_text: Optional[str] = None # 待合成的文本
emo_vec: Optional[list] = [0] * 8 # 情绪向量
max_tokens: Optional[int] = 80 # 单句文本最大长度
speed: Optional[float] = 1.0
voice_id 会提取注册为音色,进行缓存,避免每次请求都要重新提取特征;tts_text 待合成的文本,支持无限长,服务内部会进行分句;max_tokens 分句做到最大长度;emo_vec 情绪向量,输入范围[0-1]:代表["喜", "怒", "哀", "惧", "厌恶", "低落", "惊喜", "平静"]本文分享了 实时语音克隆 IndexTTS2 的技术方案,对两种推理加速方案进行了实测。
另外,IndexTTS2.5 的技术报告已出,相比 IndexTTS2 速度更快,支持语种更多:

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online