Skip to content
View index-tts's full-sized avatar

Block or report index-tts

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
index-tts/README.md

An Industrial-Level Controllable and Efficient Zero-Shot Text-to-Speech System

简体中文 | English | 日本語 | Español | العربية

GitHub Stars arXiv Discord

IndexTTS is a zero-shot text-to-speech system that clones a voice from a single reference audio clip. The latest release, IndexTTS-2.5, supports Chinese, English, Japanese, Spanish and Arabic, with fine-grained emotion control, speaking speed control, pronunciation control (Pinyin / CMU phonemes / Japanese Kana), and faster inference than IndexTTS-2.


🗂️ Model Zoo

Model Demos Paper ModelScope HuggingFace
IndexTTS-2.5 Demo Studio Paper ModelScope HuggingFace
IndexTTS-2 Demo Paper ModelScope HuggingFace
IndexTTS-1.5 Demo Paper ModelScope HuggingFace
IndexTTS Demo Paper ModelScope HuggingFace

📣 News

  • 2026/08/10 🔥 We release IndexTTS-2.5
    • Now supports Chinese, English, Japanese, Spanish and Arabic, with faster inference than IndexTTS-2, while keeping the cross-lingual and timbre-emotion disentanglement capabilities.
    • Improved controllability of Chinese Pinyin, English CMU phonemes and Japanese Kana.
    • Speaking speed control via duration_factor (0.5x–2.0x duration).
    • Production deployment supported via vLLM.
  • 2025/09/08 🔥 We release IndexTTS-2
    • The first autoregressive TTS model with precise synthesis duration control, supporting both controllable and uncontrollable modes. This functionality is not yet enabled in this release.
    • Highly expressive emotional speech synthesis, with emotion control through multiple input modalities.
  • 2025/05/14 🔥 We release IndexTTS-1.5, significantly improving the model's stability and its performance in English.
  • 2025/03/25 🔥 We release IndexTTS-1.0 with model weights and inference code.
  • 2025/02/12 🎉 We submitted our paper to arXiv, and released our demos and test sets.

🎬 Demos

IndexTTS-2.5: The Future of Voice, Now Generating

IndexTTS2.5 Demo

IndexTTS-2: The Future of Voice, Now Generating

IndexTTS2 Demo

🚀 Getting Started

1. Prerequisites

Make sure you have git installed, then download this repository:

git clone https://github.com/index-tts/index-tts.git && cd index-tts

Example audio files are downloaded on demand from HuggingFace/ModelScope the first time the WebUI starts, so Git LFS is no longer required.

2. Install Dependencies

We use uv to manage the project's dependency environment. It is required for a reliable installation:

pip install -U uv  # or see the link above for other install methods
uv sync --all-extras

This automatically creates a .venv project directory and installs the correct versions of Python and all required dependencies.

If the download is slow, use a local mirror, e.g. one of these mirrors in China:

uv sync --all-extras --default-index "https://mirrors.aliyun.com/pypi/simple"

uv sync --all-extras --default-index "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple"

Tip

Available Extra Features:

  • --all-extras: Automatically adds every extra feature listed below. You can remove this flag if you want to customize your installation choices.
  • --extra webui: Adds WebUI support (recommended).
  • --extra deepspeed: Adds DeepSpeed support (may speed up inference on some systems).

Important

Windows: DeepSpeed may be difficult to install. You can skip it by removing the --all-extras flag and adding the other feature flags manually.

Linux/Windows: If you see a CUDA error during installation, make sure NVIDIA's CUDA Toolkit version 12.8 (or newer) is installed on your system.

3. Download Models

Download the required models via uv tool:

Via huggingface-cli:

uv tool install "huggingface-hub"

# IndexTTS-2.5
hf download IndexTeam/IndexTTS-2.5 --local-dir=checkpoints

# IndexTTS-2
hf download IndexTeam/IndexTTS-2 --local-dir=checkpoints_2

Or via modelscope:

uv tool install "modelscope"

# IndexTTS-2.5
modelscope download --model IndexTeam/IndexTTS-2.5 --local_dir checkpoints

# IndexTTS-2
modelscope download --model IndexTeam/IndexTTS-2 --local_dir checkpoints_2

Important

If the commands above aren't available, carefully read the uv tool output — it will tell you how to add the tools to your system's PATH.

Note

Some small models are downloaded automatically on first run. If your network has slow access to HuggingFace, set a mirror before running the code:

export HF_ENDPOINT="https://hf-mirror.com"

4. Check GPU Acceleration

To diagnose your environment and see which GPUs are detected, use the included utility:

uv run tools/gpu_check.py

💻 Usage

🌐 Web Demo

# IndexTTS-2.5 (default)
uv run webui.py

# IndexTTS-2
uv run webui.py --version 2 --model_dir ./checkpoints_2

Open your browser and visit http://127.0.0.1:7860 to see the demo.

You can adjust the settings to enable BF16 (IndexTTS-2.5) / FP16 (IndexTTS-2) inference (lower VRAM usage), DeepSpeed acceleration, compiled CUDA kernels for speed, etc. All available options can be seen via:

uv run webui.py -h

Important

FP16/BF16 (half-precision) inference is faster and uses less VRAM, with very small quality loss.

DeepSpeed may speed up inference on some systems, but it could also make it slower — it depends on your hardware, drivers and OS. Try both ways.

All uv commands automatically activate the correct per-project virtual environment. Do not manually activate any environment before running uv commands, as that can cause dependency conflicts.

🚀 Serving with vLLM

For production deployment, see the vLLM recipe for IndexTTS.

📝 Python API

To run scripts, use uv run <file.py> so the code runs inside the uv environment. You may also need to add the current directory to PYTHONPATH:

# IndexTTS2.5
PYTHONPATH="$PYTHONPATH:." uv run indextts/infer_v2_5.py \
  --cfg_path checkpoints/config.yaml \
  --model_dir checkpoints \
  --text "Hello world" \
  --lang EN

The default --prompt_wav lives in examples/, which is populated the first time the WebUI starts. To fetch it without the WebUI:

uv run python -c "from indextts.utils.examples_downloader import ensure_examples_available; ensure_examples_available()"

For IndexTTS2, use the Python API below — indextts/infer_v2.py runs a benchmark loop against a hardcoded checkpoints/ directory, not the checkpoints_2 layout from step 3.

0. Initialize IndexTTS

# IndexTTS2
from indextts.infer_v2 import IndexTTS2
tts = IndexTTS2(cfg_path="checkpoints_2/config.yaml", model_dir="checkpoints_2", use_fp16=False, use_cuda_kernel=False, use_deepspeed=False)

# IndexTTS2.5
from indextts.infer_v2_5 import IndexTTS2
tts = IndexTTS2(cfg_path="checkpoints/config.yaml", model_dir="checkpoints", use_bf16=True)

1. Voice cloning with a single reference audio

text = "Translate for me, what is a surprise!"

# IndexTTS2
tts.infer(spk_audio_prompt='examples/voice_01.wav', text=text, output_path="gen.wav", verbose=True)

# IndexTTS2.5 (multilingual, with language selection)
tts.infer(spk_audio_prompt='examples/voice_01.wav', text=text, lang="EN", output_path="gen.wav", verbose=True)

2. Emotion control with a separate emotional reference audio

text = "酒楼丧尽天良,开始借机竞拍房间,哎,一群蠢货。"

# IndexTTS2
tts.infer(spk_audio_prompt='examples/voice_07.wav', text=text, output_path="gen.wav", emo_audio_prompt="examples/emo_sad.wav", verbose=True)

# IndexTTS2.5
tts.infer(spk_audio_prompt='examples/voice_07.wav', text=text, lang="ZH", output_path="gen.wav", emo_audio_prompt="examples/emo_sad.wav", verbose=True)

3. Adjust emotion intensity with emo_alpha

When an emotional reference audio is specified, emo_alpha adjusts how much it affects the output. Valid range: 0.0 - 1.0, default: 1.0 (100%).

text = "酒楼丧尽天良,开始借机竞拍房间,哎,一群蠢货。"

# IndexTTS2
tts.infer(spk_audio_prompt='examples/voice_07.wav', text=text, output_path="gen.wav", emo_audio_prompt="examples/emo_sad.wav", emo_alpha=0.9, verbose=True)

# IndexTTS2.5
tts.infer(spk_audio_prompt='examples/voice_07.wav', text=text, output_path="gen.wav", lang="ZH", emo_audio_prompt="examples/emo_sad.wav", emo_alpha=0.9, verbose=True)

4. Emotion control with an emotion vector

You can omit the emotional reference audio and instead provide an 8-float list specifying the intensity of each emotion, in the order [happy, angry, sad, afraid, disgusted, melancholic, surprised, calm]. Use use_random to introduce stochasticity during inference (default: False).

Note

Enabling random sampling reduces the voice cloning fidelity.

text = "对不起嘛!我的记性真的不太好,但是和你在一起的事情,我都会努力记住的~"

# IndexTTS2
tts.infer(spk_audio_prompt='examples/voice_09.wav', text=text, output_path="gen.wav", emo_vector=[0, 0, 0.8, 0, 0, 0, 0, 0], use_random=False, verbose=True)

# IndexTTS2.5
tts.infer(spk_audio_prompt='examples/voice_09.wav', text=text, lang="ZH", output_path="gen.wav", emo_vector=[0, 0, 0.8, 0, 0, 0, 0, 0], use_random=False, verbose=True)

5. Emotion control from the text itself (use_emo_text)

Enable use_emo_text to automatically convert your text script into emotion vectors. An emo_alpha around 0.6 (or lower) is recommended for more natural speech. Randomness can be introduced with use_random (default: False).

Important

For IndexTTS-2.5, use_emo_text=True requires constructing IndexTTS2 with use_qwen_emo=True (e.g. tts = IndexTTS2(..., use_qwen_emo=True)), otherwise it raises a RuntimeError. (IndexTTS-2 does not require this flag.)

text = "快躲起来!是他要来了!他要来抓我们了!"

# IndexTTS2
tts.infer(spk_audio_prompt='examples/voice_12.wav', text=text, output_path="gen.wav", emo_alpha=0.6, use_emo_text=True, use_random=False, verbose=True)

# IndexTTS2.5
tts.infer(spk_audio_prompt='examples/voice_12.wav', text=text, lang="ZH", output_path="gen.wav", emo_alpha=0.6, use_emo_text=True, use_random=False, verbose=True)

6. Emotion control with an explicit emotion description (emo_text)

Provide a specific text emotion description via emo_text, which is converted into emotion vectors — giving you separate control of the text script and the emotion description:

text = "快躲起来!是他要来了!他要来抓我们了!"
emo_text = "你吓死我了!你是鬼吗?"

# IndexTTS2
tts.infer(spk_audio_prompt='examples/voice_12.wav', text=text, output_path="gen.wav", emo_alpha=0.6, use_emo_text=True, emo_text=emo_text, use_random=False, verbose=True)

# IndexTTS2.5
tts.infer(spk_audio_prompt='examples/voice_12.wav', text=text, lang="ZH", output_path="gen.wav", emo_alpha=0.6, use_emo_text=True, emo_text=emo_text, use_random=False, verbose=True)

7. Speaking speed control (duration_factor)

A value greater than 1.0 slows down the speech, a value less than 1.0 speeds it up. Default: 1.0 (normal speed). Valid range: 0.5 - 2.0.

text = "大家好,欢迎来到IndexTTS的语速控制演示。"

# IndexTTS2.5
# Slow down (1.2x duration)
tts.infer(spk_audio_prompt='examples/voice_01.wav', text=text, lang="ZH", output_path="gen_slow.wav", duration_factor=1.2, verbose=True)

# Speed up (0.8x duration)
tts.infer(spk_audio_prompt='examples/voice_01.wav', text=text, lang="ZH", output_path="gen_fast.wav", duration_factor=0.8, verbose=True)

🗣️ Pronunciation Control

IndexTTS2.5 — Pinyin / CMU phonemes / Japanese Kana:

IndexTTS2.5 supports these character replacements with better instruction-following capability. For the full list of valid entries, see checkpoints/pinyin.vocab for Pinyin and the CMU dictionary for English phonemes.

他在银<行|XING2>里<行|HANG2>走了半天,发现这笔业务办不<行|HANG2>。

He had a <minute|M IH1 . N AH0 T> to examine the <minute|M AY0 . N UW1 T> details of the contract.

彼は料理が<上手|じょうず>だが、囲碁では<上手|うわて>に負けた。

IndexTTS2 — Pinyin:

IndexTTS2 supports mixed modeling of Chinese characters and Pinyin. To activate Pinyin control, provide text with specific Pinyin annotations. Note that Pinyin control does not work for every possible consonant–vowel combination; only valid Chinese Pinyin cases are supported (see checkpoints/pinyin.vocab).

之前你做DE5很好,所以这一次也DEI3做DE2很好才XING2,如果这次目标完成得不错的话,我们就直接打DI1去银行取钱。

🕰️ IndexTTS-1.5 (Legacy)

You can also use the previous IndexTTS1 model by importing a different module:

from indextts.infer import IndexTTS
tts = IndexTTS(model_dir="checkpoints", cfg_path="checkpoints/config.yaml")
voice = "examples/voice_07.wav"
text = "大家好,我现在正在bilibili 体验 ai 科技,说实话,来之前我绝对想不到!AI技术已经发展到这样匪夷所思的地步了!比如说,现在正在说话的其实是B站为我现场复刻的数字分身,简直就是平行宇宙的另一个我了。如果大家也想体验更多深入的AIGC功能,可以访问 bilibili studio,相信我,你们也会吃惊的。"
tts.infer(voice, text, 'gen.wav')

For more details, see README_INDEXTTS_1_5, or visit the IndexTTS1 repository at index-tts:v1.5.0.

📊 Evaluation

Table 1: Zero-shot TTS on CV3-Eval (Arabic uses an in-house test set). †Cited from the original paper.

Model Params zh en es ja ar Avg
WER↓SS↑ WER↓SS↑ WER↓SS↑ WER↓SS↑ WER↓SS↑ WER↓SS↑
VoxCPM22B3.8874.995.1371.575.4974.676.6972.9014.9465.997.2272.02
OmniVoice0.8B3.4172.993.6270.133.5274.145.3870.4917.8864.226.7670.39
Moss-TTS 1.58B4.0272.684.4567.463.8371.7510.9768.7123.7162.219.4068.56
CosyVoice3-0.5B0.5B3.8480.014.8874.164.0478.85-76.36----
CosyVoice3-1.5B1.5B3.91†-4.99†-4.47†-7.57†-----
FireRedTTS-21.5B8.2268.1014.9256.93--------
Fish Audio S2 Pro4B3.6267.793.8361.662.9367.445.1566.1514.1559.435.9464.49
Qwen3-TTS1.7B3.2773.025.0667.172.8773.175.8970.18----
IndexTTS2.50.8B4.3677.105.1268.063.7576.395.6674.6214.8869.746.7573.18
IndexTTS2.5-RL0.8B3.9377.923.8967.793.3376.685.3075.4113.5870.366.0073.63

Table 2: Cross-lingual TTS on CV3-Eval (Chinese prompt → target language, Arabic uses an in-house test set).

Model Params zh→en zh→es zh→ja zh→ar Avg
WER↓SS↑ WER↓SS↑ WER↓SS↑ WER↓SS↑ WER↓SS↑
VoxCPM22B4.4864.2516.3864.8911.8471.5411.0967.6210.9567.08
OmniVoice0.8B3.7464.915.8462.089.0969.0619.8065.279.6265.33
Moss-TTS 1.58B6.1359.234.3256.6311.5265.5417.0362.939.7561.08
CosyVoice3-0.5B0.5B3.2362.794.5864.04------
CosyVoice3-1.5B1.5B4.32---13.70-----
FireRedTTS-21.5B9.3453.1912.2558.3119.0564.12----
Fish Audio S2 Pro4B4.1455.894.4655.5710.4861.7414.4959.808.3958.25
Qwen3-TTS1.7B5.7463.045.1568.0236.0965.71----
IndexTTS2.50.8B3.6263.835.1765.486.5774.169.5171.026.2268.62
IndexTTS2.5-RL0.8B3.5567.474.8664.476.3875.829.8973.056.1770.20

⚡ Inference Speed

RTF (wall-clock time / generated audio duration, lower is faster) on an NVIDIA RTX 4090, kv_cache=True.

Text 2.0 fp16 2.0 fp32 2.5 bf16 2.5 fp32
7 chars 0.4004 0.3748 0.2871 0.2547
16 chars 0.3322 0.3389 0.2155 0.1981
28 chars 0.3257 0.3480 0.2065 0.1927
80 chars 0.3229 0.3754 0.1997 0.2060
200 chars 0.3244 0.3990 0.1997 0.2144
overall 0.3257 0.3748 0.2065 0.2060

🤝 Community & Contact

You are welcome to join our community! 🌏 欢迎大家来交流讨论!

Caution

Thank you for your support of the bilibili IndexTTS project! Please note that the only official channel maintained by the core team is: https://github.com/index-tts/index-tts. Any other websites or services are not official, and we cannot guarantee their security, accuracy, or timeliness. For the latest updates, please always refer to this official repository.

For commercial usage and cooperation, please contact indexspeech@bilibili.com.

📚 Citation

🌟 If you find our work helpful, please leave us a star and cite our papers.

IndexTTS2.5:

@misc{li2026indextts25technicalreport,
      title={IndexTTS 2.5 Technical Report},
      author={Yunpei Li and Xun Zhou and Jinchao Wang and Lu Wang and Yong Wu and Siyi Zhou and Yiquan Zhou and Yining Wang and Yaogen Yang and Zhetao Hu and Shiyao Duan and Jiacheng Xu and Bin Xia and Jingchen Shu},
      year={2026},
      eprint={2601.03888},
      archivePrefix={arXiv},
      primaryClass={cs.SD},
      url={https://arxiv.org/abs/2601.03888},
}

IndexTTS2:

@article{zhou2025indextts2,
  title={IndexTTS2: A Breakthrough in Emotionally Expressive and Duration-Controlled Auto-Regressive Zero-Shot Text-to-Speech},
  author={Siyi Zhou and Yiquan Zhou and Yi He and Xun Zhou and Jinchao Wang and Wei Deng and Jingchen Shu},
  journal={arXiv preprint arXiv:2506.21619},
  year={2025}
}

IndexTTS:

@article{deng2025indextts,
  title={IndexTTS: An Industrial-Level Controllable and Efficient Zero-Shot Text-To-Speech System},
  author={Wei Deng and Siyi Zhou and Jingchen Shu and Jinchao Wang and Lu Wang},
  journal={arXiv preprint arXiv:2502.05512},
  year={2025},
  doi={10.48550/arXiv.2502.05512},
  url={https://arxiv.org/abs/2502.05512}
}

🙏 Acknowledgements

  1. tortoise-tts
  2. XTTSv2
  3. BigVGAN
  4. wenet
  5. icefall
  6. maskgct
  7. seed-vc

📄 License

This project is released under the bilibili Model Use License Agreement. Please also read the DISCLAIMER before use.

Popular repositories Loading

  1. index-tts index-tts Public

    An Industrial-Level Controllable and Efficient Zero-Shot Text-To-Speech System

    Python 22.7k 2.8k

  2. index-tts2.github.io index-tts2.github.io Public

    The showcase page of IndexTTS2

    HTML 182 18

  3. index-tts2-5.github.io index-tts2-5.github.io Public

    index-tts2.5 website

    HTML 18 1

  4. index-tts.github.io index-tts.github.io Public

    The showcase page of Index-TTS

    HTML 6 1