本地语音合成实战:IndexTTS 部署指南,一段音频克隆你的声音,让 AI 开口说话
上个月我们聊了 Whisper,让 AI 把…
上个月我们聊了 Whisper,让 AI 把会议录音、视频字幕“听”明白。今天反其道而行之,聊聊怎么让 AI“开口说话”——也就是本地文本转语音(TTS)。主角是 B 站 Index Team 开源的 IndexTTS,一个零样本语音合成系统:你只需丢给它一段十几秒的参考音频,它就能克隆出这个音色,念出你写的任意文字。GitHub 上 2.3 万 star,2026 年 8 月刚发布 2.5 版本,支持中英日西阿五种语言,还带细粒度情感控制。关键是——全程本地跑,声音数据不出门。
为什么偏偏是 IndexTTS
开源 TTS 不少,XTTS、CosyVoice、Fish-Speech、GPT-SoVITS 各有拥趸。IndexTTS 值得单独写一篇,是因为它在“可控性”上做得最细。2.5 版本只有 0.8B 参数,消费级显卡就能跑,在 CV3-Eval 评测里中文错词率低到 3.6% 上下,说话人相似度领先一批同档模型。更重要的是这几个能力:情感与音色解耦(音色一套,情绪单独指定)、8 维情感向量、拼音/音素级发音控制、语速 0.5–2.0 倍可调。对做配音、播客、口播视频的朋友来说,这几个控制项是刚需。
环境准备
部署前先对齐环境:一台带 NVIDIA 显卡的机器(消费级就够,我在自己 PVE 节点上分出的 24G 卡跑得很顺),系统装好 git,再装一个 uv。官方现在强烈建议用 uv 管理这个项目的 Python 环境,别再手动 pip 了——依赖锁得死死的,装得还快。另外,后面如果遇到 CUDA 报错,先检查 CUDA Toolkit 是不是 12.8 以上。
安装与下载模型
git clone https://github.com/index-tts/index-tts && cd index-tts
uv sync --all-extras
然后下载模型,二选一。HuggingFace 方式:
uv tool install "huggingface_hub[cli]"
hf download IndexTeam/IndexTTS-2 --local-dir=checkpoints
国内直连 HF 慢的话,走 ModelScope 或者设镜像:
uv tool install modelscope
modelscope download --model IndexTeam/IndexTTS-2 --local_dir checkpoints
# 或者给 HuggingFace 设国内镜像
export HF_ENDPOINT=https://hf-mirror.com
模型有几个 G,下载完会放在项目根目录的 checkpoints 文件夹里。
启动 WebUI 先跑通
uv run tools/gpu_check.py # 先确认显卡被正确识别
uv run webui.py # 启动后浏览器打开 http://127.0.0.1:7860
WebUI 上手就三步:上传一段参考音频 → 输入要合成的文字 → 点生成下载 wav。想先体验效果的,直接走这条路最快。
用 Python 脚本做批量调用
WebUI 适合尝鲜,真要做自动化(批量为短视频配音、给文章生成音频版),还是得上 Python 脚本。项目自带推理接口,一个文件搞定:
from indextts.infer_v2 import IndexTTS2
tts = IndexTTS2(
cfg_path="checkpoints/config.yaml",
model_dir="checkpoints",
use_fp16=True, # 半精度,更快更省显存
use_cuda_kernel=False,
use_deepspeed=False,
)
tts.infer(
spk_audio_prompt="examples/voice_01.wav", # 你的参考音频
text="你好,欢迎来到IT大叔的频道,今天聊聊本地语音合成。",
output_path="gen.wav",
verbose=True,
)
保存成 gen.py 后用 uv run gen.py 跑。如果 import 报找不到模块,把项目根目录加进 PYTHONPATH:export PYTHONPATH=$PYTHONPATH:.。用 2.5 版本就把 import 换成 from indextts.infer_v2_5 import IndexTTS2,并在 infer 里加 lang="ZH" 参数。
情感控制才是精髓
IndexTTS 最让我惊喜的是情感控制。它有四种玩法:默认跟参考音频走、单独给一段情感参考音频(emo_audio_prompt)、直接喂 8 维情感向量、或用文字描述情绪。情感向量按 [高兴, 愤怒, 悲伤, 害怕, 厌恶, 忧郁, 惊讶, 平静] 排列。比如想合成一句带着明显悲伤的话:
tts.infer(
spk_audio_prompt="examples/voice_01.wav",
text="对不起嘛,我的记性真的不太好。",
output_path="gen_sad.wav",
emo_vector=[0, 0, 0.8, 0, 0, 0, 0, 0], # 悲伤拉满
verbose=True,
)
配合 emo_alpha(0–1,情感强度)和 duration_factor(0.5–2.0,语速)能调出很细的层次。发音控制更绝,中文可以直接在文本里标拼音:比如“他在银行里行走了半天”里的多音字,写成 <行|XING2> 和 <行|HANG2> 就能精确指定读音,念错字基本不可能。
避坑清单
最后把部署时最容易踩的几个坑一次性列出来:
- HF 模型下不动:设
export HF_ENDPOINT=https://hf-mirror.com,或直接走 ModelScope。 - CUDA 报错:检查 CUDA Toolkit 是否 12.8 以上,Windows 上尤其常见。
- Windows 装 DeepSpeed 难:去掉
--all-extras,手动只装 webui 等必要项。 - 别手动激活 .venv 后再跑 uv 命令,会导致依赖冲突,直接
uv run即可。 - 显存吃紧就开半精度:2.5 用 BF16、2.0 用 FP16,质量几乎无损。
- 首次运行会自动下载一些小的前端模型,别当成卡死了。
写在最后
把 IndexTTS 和之前的 Whisper 串起来,本地就凑齐了一条完整的语音链路:录音进去 → 转成文字(Whisper)→ 处理后 → 合成语音(IndexTTS),全程不出内网。对看重隐私、又经常做内容的朋友来说,这套组合拳很实用。提醒一句:项目用的是 bilibili 的模型使用许可,商用前先读一下 LICENSE 和免责声明。下次我们聊聊怎么把这两个模型挂到 vLLM 上,做成生产级服务。
