跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
|注册
博客列表

目录

  1. 1. IndexTTS-2 简介
  2. 1.1 模型架构
  3. 1.2 亮点介绍
  4. 1.3 核心代码解读
  5. 核心模块 GPT 模型 (UnifiedVoice):负责从文本和音色参考生成语义码(codes)。
  6. Semantic 模型(基于 w2v-BERT 2.0):提取参考音频的语义嵌入。
  7. - get_emb 函数:输入 w2v-bert 特征和掩码,取第 17 层隐藏状态作为语义特征
  8. Semantic codec:将语义嵌入量化为离散码本索引。
  9. S2Mel 模型:包含 length_regulator、cfm(Flow Matching 扩散模型)等,用于从语义码生成梅尔频谱。
  10. CampPlus:提取参考音频的风格向量(全局音色特征)。
  11. BigVGAN:声码器,将梅尔频谱转为波形。
  12. QwenEmotion:情感分析模型,可从文本生成情感向量。
  13. TextNormalizer & TextTokenizer:文本规范化与分词(BPE)。
  14. 缓存机制
  15. 缓存参考音频的语义条件、风格向量、梅尔频谱等,避免重复计算。
  16. 模型加载
  17. 语音处理工具:
  18. - removelongsilence:压缩过长的静音 token,得到的还是 codecs
  19. - intervalsilence / insertinterval_silence:在句子之间插入指定长度的静音段,前者生成静音,后者插入静音。
  20. - loadandcutaudio:加载音频,截断到 15s
  21. 推理函数 infer:如果是流式输出,返回迭代器;非流式输出:返回分句的音频列表
  22. infer_generator:
  23. - 先判断情感控制: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};若无外部情感参考音频,则使用音色参考音频作为情感参考。
  24. - 从 emomatrix 中提取向量和 emovector 相乘,得到 emovec_mat
  25. - 输入情感参考音频:得到语义嵌入 emocondemb;如果没有就和参考音频一样
  26. - 再处理参考音频:如果参考音频变了,则重新加载
  27. - 16kHz 音频 → w2v-BERT 特征 → 语义嵌入 spkcondemb → codec 量化得到 Sref → 经过 s2mel 得到 promptcondition。
  28. - 22kHz 音频 → 梅尔频谱 ref_mel。
  29. - 16kHz 音频 → FBank 特征 → CampPlus → 风格向量 style
  30. - 开始文本分词和分句:maxtexttokenspersegment 决定分几句
  31. - 循环生成每段语音:
  32. - GPT 生成语义码(codes):合并音色与情感 cond,再合并 emovecmat,得到 emovec,再调用 gpt.inferencespeech 生成 codes,用 self.gpt 对码和文本做一次前向,得到 latent(用于后续扩散模型条件)。
  33. - Flow Matching 扩散模型生成梅尔频谱:s2mel 模型得到 vctarget,其中的 targetlengths 用 1.72 控制梅尔频谱的长度,从而控制语速
  34. - BigVGAN 声码器合成波形:将梅尔频谱转为波形,clamp 到 int16 范围。
  35. - 收集波形和静音:生成一句 wav,默认生成一段 200ms 静音,生成 sampling_rate 必须是 22050
  36. 1.4 效果展示
  37. 2. 推理加速测试
  38. 2.1 vLLM 加速推理
  39. 2.2 Deepspeed 加速推理
  40. 3. 推理服务部署
  41. 3.1 方案选型
  42. 3.2 请求示例
  43. 写在最后
PythonAI算法

开源实时语音克隆 IndexTTS2:推理加速实测与情绪语速控制

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

赛博行者发布于 2026/3/290 浏览
开源实时语音克隆 IndexTTS2:推理加速实测与情绪语速控制

IndexTTS 是 B 站语音团队开源的一系列语音克隆模型。

早期版本,在多场景应用中均表现惊艳,笔者也有过部署实测。

字错率和克隆相似性,均出于当时领先水平。

经过 vLLM 推理加速,RTF 可以低至 0.15,因此也是首选的语音克隆模型服务。

不过还有硬伤:

  • 情感表达不够,AI 味依旧浓郁;
  • 不支持语速控制,更像在读稿。

刚好最近项目中需要解决以上痛点,寻找了一圈解决方案,兜兜转转还是来到了 IndexTTS 。

因为当前市面上,无论开源 还是 闭源的语音克隆方案,上述两点都没有很好解决。

早在去年 9 月,B 站就开源了 IndexTTS-2.0 ,号称情感丰富和时长可控。

刚好借此机会,实测一番,分享给各位。

1. IndexTTS-2 简介

官方仓库:https://github.com/index-tts/index-tts

1.1 模型架构

相比 v1 版本,模型架构发生了不小变化:

架构图

简言之:

IndexTTS2 由三个核心模块组成:Text-to-Semantic(T2S) 、Semantic-to-Mel(S2M) 以及 BigVGANv2 声码器。

  • T2S 模块:
    • 输入:源文本、风格提示、音色提示、目标语音 token 数;
    • 输出:语义 token 序列。
    • 模型:GPT2 自回归模型
  • S2M 模块:
    • 输入:语义 token、音色提示;
    • 输出:梅尔频谱图。
    • 模型:基于流匹配的非回归生成框架
  • BigVGANv2 声码器:
    • 输入:梅尔频谱图
    • 输出:高质量的语音波形。
1.2 亮点介绍

论文:https://arxiv.org/abs/2506.21619

有哪些亮点?

  • 支持语速控制:提出一种'时间编码'机制,首次解决了传统 AR 模型难以精确控制语音时长的问题。允许用户显式指定生成的 token 数量,从而实现语速控制。
  • 支持情感表达:提出音色与情感解耦机制,也就是支持用户同时指定音色参考与情感参考,实现更加灵活、细腻的情感表达。

此外,模型还具备基于文本描述的情感控制能力。

如何实现?

首先定义 7 种标准情感,并建立对应的情感 embedding。用户输入自然语言,微调 Qwen3-0.6b 输出情感概率分布,加权得到最终的情感 embedding。

1.3 核心代码解读

对应模型架构部分:

# 核心模块 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 
1.4 效果展示

相比 v1,IndexTTS2 在音色相似度上有了质的飞跃:

音色对比

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

情感对比

2. 推理加速测试

以下均在 RTX 4080 显卡上进行实测。

在不进行任何推理加速的情况下,模型加载后的显存占用:

显存占用

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

RTF 测试

多次测试:

>> RTF: 5.8614 >> RTF: 3.6096 >> RTF: 3.6241 >> RTF: 3.2211 >> RTF: 3.8663 

显然,无法满足实时应用需求。

这里最耗时的有两个部分:

  • 最重的是 GPT2 推理
  • 其次是 s2mel

后者可通过 torch.compile 将模型转换为优化的执行图,减少运行时开销,实测提速 2x。

下面重点解决 GPT2 推理。

2.1 vLLM 加速推理

IndexTTS2 的 T2S 模块是 GPT2,因此可通过 vLLM 引擎进行加载,从而实现推理加速,实测加速效果如下:

vLLM 加速

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

vLLM 显存

2.2 Deepspeed 加速推理

官方仓库采用 uv 管理环境,安装 deepspeed:

uv sync --extra deepspeed 

同时需要安装 flash_attn:

flash_attn 安装坑比较多,推荐找到对应版本的安装包进行本地安装:

https://github.com/Dao-AILab/flash-attention/releases/

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 

加速效果如下:

DeepSpeed 加速

GPT2 推理部分,加速效果相比 vLLM 更有性价比。

显存占用如下:

DeepSpeed 显存

3. 推理服务部署

3.1 方案选型

尽管 vLLM 支持并发,但单发都无法做到实时,根本不可用啊。

而 DeepSpeed 加速,可以将 RTF 干到 0.5 以下,却不支持并发。因为 DeepSpeed 的 KV 缓存机制为单个推理流程服务,在多线程并发访问时会产生内存冲突。

所以,只能选择在 FastAPI 这一层实施:

  • GPU 推理串行化
  • HTTP 请求异步化

也就是服务层面支持并发调用,但推理还是队列化处理的,确保不把服务打崩。

举例而言,假设同时来了 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 

先抢到资源的先推理,服务不忙的时候,可满足实时推理需求。

3.2 请求示例

请求示例如下:

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 速度更快,支持语种更多:

https://index-tts.github.io/index-tts2-5.github.io

极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog

更多推荐文章

查看全部
  • Effective Modern C++ 条款 35:基于任务与基于线程编程的对比与实践
  • 嵌入式 C/C++ 核心知识点整理
  • 招商银行信用卡 AI 客服系统:从 0 到 1 实战
  • GitHub 热榜日选:AI 智能体、终端工具及视频生成项目汇总
  • KLayout 开源版图工具高效实战指南
  • 基于 Fast_LIO 架构将局部规划从 Pure Pursuit 迁移至 TEB 算法的实践
  • Ubuntu 24.04 虚拟机安装教程
  • Git 版本控制常用命令与场景指南
  • Microi 吾码开源低代码平台技术架构与功能解析
  • VSCode Cline 插件 Git 锁文件冲突解决方案
  • MySQL 登录报错 ERROR 1045 (28000) 解决方案
  • C++ STL 算法实战指南
  • C++ IDE 选型指南:主流工具对比与新手避坑建议
  • Linux 进程地址空间与虚拟内存机制解析
  • 普通 PC 安装 macOS 系统实战指南
  • 使用 FastAPI 和 HTML/CSS/JavaScript 构建博客系统示例
  • C++ Tarjan 算法详解:点双连通分量与割点
  • Nginx njs 模块简介与实践
  • IDEA 与 VSCode Git 标准操作规范:更新、提交、分支及标签管理
  • 嵌入式 C/C++ 面试:STL 容器与算法详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online