Open-source project
index-tts/index-tts avatar
index-tts/index-tts

IndexTTS-2.5: zero-shot voice cloning with emotion and speed control

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

23,990 stars2,859 forksPythonNOASSERTION

At a glance

What is it?
IndexTTS clones a voice from one reference clip and adds pinyin, CMU phoneme and Kana pronunciation control plus a duration_factor for speaking speed. Here is how to install it with uv, what the documentation does not cover, and where it stops fitting.
Who is it for?
Adopt IndexTTS-2.5 if you need a self-hosted zero-shot cloner with pronunciation control in Chinese, English, Japanese, Spanish or Arabic, and you can supply a CUDA 12.8 environment plus a reference clip. Skip it if you only need a single-language read-aloud voice, cannot accept a custom Bilibili licence, or expect a documented Python API.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 29 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

What IndexTTS-2.5 solves, and for whom

Most speech synthesis pipelines split into two jobs: pick a voice, then say the words. IndexTTS collapses the first job. The README describes it as a zero-shot text-to-speech system that clones a voice from a single reference audio clip, so the reference clip is the entire voice inventory. There is no enrolment step, no speaker embedding to train, and no per-voice fine-tune.

The intended audience is narrower than "anyone who wants speech". The pyproject classifiers list Science/Research and Developers, and the project ships a webui.py, a cli_tests directory and an examples/batch folder, which points at engineers wiring synthesis into a product or an evaluation harness rather than end users. The 2.5 release adds three controls that matter to that audience: emotion control, speaking speed via duration_factor, and pronunciation control through Chinese Pinyin, English CMU phonemes and Japanese Kana.

That last control is the real differentiator. Pinyin and CMU phoneme input is how you fix a proper noun or a heteronym without re-recording the reference clip. A generic TTS engine gives you text in and audio out; IndexTTS gives you a way to override the grapheme-to-phoneme decision for a specific word.

The architecture the repository reveals

The dependency list is the clearest description of the pipeline. It includes cn2an for Chinese number normalisation, jieba for Chinese segmentation, g2p-en for English grapheme-to-phoneme conversion, fugashi with unidic-lite for Japanese, sentencepiece and tokenizers for text tokenisation, librosa and descript-audiotools for audio handling, and bigvgan, which appears in the repository topics as the vocoder family. The model itself runs on torch 2.8 with torchaudio 2.8 and transformers 4.52.1.

So the data flow is conventional for a modern neural TTS stack: text is normalised and segmented per language, converted to phonemes or tokens, conditioned on the reference audio, and decoded to a waveform. What is unusual is the conditioning. The release notes describe timbre-emotion disentanglement and cross-lingual capability kept from IndexTTS-2, which means the reference clip supplies timbre while emotion is a separate input rather than something baked into the recording.

The repository also names vLLM as the production path, linking to a vLLM recipe for IndexTTS-2.5. That is a meaningful signal: the team expects the model to be served, not just run in a notebook. The README does not document the serving configuration, so treat the vLLM recipe as the source for deployment details.

Installing IndexTTS with uv and running the WebUI

The README is explicit that uv is required for a reliable installation, not optional. Start by cloning the repository and entering it:

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

Then install uv and sync the environment. The sync creates a .venv directory and resolves Python plus all dependencies from the lockfile:

bash
pip install -U uv
uv sync --all-extras

If the download is slow, the README offers mirror indexes. This is the Aliyun variant:

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

Two constraints are worth reading before you start the sync. The project requires Python >=3.10 and <3.12, so a system Python 3.12 will not satisfy it. And the README warns that a CUDA error during installation usually means the NVIDIA CUDA Toolkit is older than 12.8. On Windows, DeepSpeed is called out as difficult to install, and the suggested workaround is to drop --all-extras and add feature flags individually, for example --extra webui.

Models are the remaining step. The README documents downloading them via the uv tool, and notes that example audio files are fetched on demand from HuggingFace or ModelScope the first time the WebUI starts, so Git LFS is no longer required. The README section covering model download is truncated in the repository text, so follow the linked uv tool guide there rather than guessing a command. For a first real use, the webui.py entry point at the repository root is the path the README recommends through the webui extra.

Where IndexTTS-2.5 breaks down

The most concrete limitation is packaging drift. The pyproject.toml declares version = "2.0.0" with the description "IndexTTS2: A Breakthrough in Emotionally Expressive and Duration-Controlled Auto-Regressive Zero-Shot Text-to-Speech", while the release list shows v2.5.0 and v2.0.0 both dated 2026-08-13. If you pin or report a version from package metadata, you will get 2.0.0 for a 2.5 checkout. Check the release notes, not the metadata field.

Second, duration control is not where the marketing implies. The release note for IndexTTS-2 says it is "the first autoregressive TTS model with precise synthesis duration control", then adds in italics that this functionality is not yet enabled in that release. The 2.5 notes describe speaking speed control via duration_factor in the 0.5x to 2.0x duration range, which is a speed multiplier on the generated duration. That is not the same as specifying an exact target duration in seconds, and the README does not document a parameter for the latter.

Third, the licence is not a standard open source licence. The pyproject sets license = "LicenseRef-Bilibili-IndexTTS" and the repository carries LICENSE, LICENSE_ZH.txt, DISCLAIMER and an INDEX_MODEL_LICENSE glob. The GitHub metadata reports NOASSERTION because the licence text is not an SPDX-recognised identifier. Model weights and code may fall under different terms, and the DISCLAIMER is separate again from the licence files. Anyone cloning a real person's voice should read those files before shipping anything.

Finally, the README documents installation, models and demos. It does not document a stable Python API surface for calling synthesis from your own code, and it does not document rollback or version pinning between model releases. If you need a supported programmatic interface, the repository layout suggests you would be reading indextts/ and cli_tests/ yourself.

IndexTTS compared with a phoneme-driven engine like F5-TTS

The comparison people search for most is against F5-TTS, and the difference is architectural rather than a quality ranking. F5-TTS is built around flow matching with a diffusion transformer, filling in masked speech from a reference and its transcript. IndexTTS-2.5 is autoregressive, which the release notes state directly, and it is the autoregressive design that makes token-by-token duration control possible at all.

That choice has consequences in both directions. An autoregressive decoder can expose duration_factor because it generates in sequence and can stop early or stretch; a flow-matching model generates the whole utterance in a fixed number of steps, so a speed multiplier has to be applied differently. On the other side, autoregressive decoding is generally the harder model to batch and serve, which is likely why the IndexTTS team points at vLLM for production rather than a plain inference loop.

The other frequently searched comparison is against commercial APIs. The difference there is not capability but control: a hosted API gives you a fixed voice list and no reference clip, while IndexTTS gives you the clip and the phoneme override but leaves the serving, GPU budget and licence review to you. If your requirement is "one pleasant voice reading articles", the hosted option is less work. If your requirement is "this specific speaker, saying this specific word correctly, at this speed", IndexTTS is the shape of tool you want.

Maintenance, upgrades and licence cost

The repository is not archived and the last push was on 2026-08-18, so it is being worked on. The release cadence is uneven rather than steady: v1.5.0 landed on 2025-09-01, then v2.0.0 and v2.5.0 both on 2026-08-13, roughly a year later, with 2.5 arriving as a point release three days before the last push. Budget for upgrades that arrive in bursts.

Upgrade cost is dominated by the pinned dependency set. torch, torchaudio and transformers are pinned to exact or narrow versions, and the pyproject carries an explicit instruction to run uv lock or uv lock --upgrade after editing dependencies, plus a warning that a local uv.toml overriding PyPI will corrupt the lockfile. That is a team telling you the lockfile is load-bearing. Moving to a newer torch means re-resolving the whole graph, not bumping one line.

The licence position needs its own review. The declared licence is a custom Bilibili identifier, the repository ships both an English and a Chinese licence file plus a DISCLAIMER and a model licence glob, and the GitHub API cannot classify it. Code and weights may not share terms. Nothing here is legal advice; the practical point is that "it is on GitHub" does not tell you what you may do with the cloned output, and the DISCLAIMER is where the project states its own position.

Editorial conclusion

Adopt IndexTTS-2.5 if you need a self-hosted zero-shot cloner with pronunciation control in Chinese, English, Japanese, Spanish or Arabic, and you can supply a CUDA 12.8 environment plus a reference clip. Skip it if you only need a single-language read-aloud voice, cannot accept a custom Bilibili licence, or expect a documented Python API. Verify first that the pyproject version still reads 2.0.0 while the release notes announce v2.5.0, that your CUDA Toolkit meets 12.8, and that your use of the cloned voice is permitted under the DISCLAIMER and LICENSE files.

Frequently asked questions

What languages does IndexTTS support?

The README states that IndexTTS-2.5 supports Chinese, English, Japanese, Spanish and Arabic. The release notes add that it keeps the cross-lingual capability from IndexTTS-2 and improves controllability of Chinese Pinyin, English CMU phonemes and Japanese Kana.

How do I install IndexTTS?

Clone the repository, install uv with pip install -U uv, then run uv sync --all-extras, which creates a .venv and installs the pinned dependency set. The project requires Python >=3.10 and <3.12, and the README warns that CUDA errors during installation mean the NVIDIA CUDA Toolkit should be version 12.8 or newer.

How do I use IndexTTS-2?

The README documents downloading the models and starting the WebUI, which is enabled through the webui extra during uv sync. Example audio files are fetched on demand from HuggingFace or ModelScope the first time the WebUI starts, so Git LFS is not required.

What is IndexTTS?

It is described in the README as an industrial-level controllable and efficient zero-shot text-to-speech system that clones a voice from a single reference audio clip. The latest release, IndexTTS-2.5, adds fine-grained emotion control, speaking speed control and pronunciation control.

How does IndexTTS compare with F5-TTS?

The release notes state that IndexTTS-2 is an autoregressive TTS model, while F5-TTS is built around flow matching. That difference is what lets IndexTTS expose duration_factor for speaking speed in the 0.5x to 2.0x range; the README does not make a quality claim against F5-TTS either way.

Official sources

  1. index-tts/index-tts on GitHub
  2. Issues
  3. README
  4. Releases
Community notes

Community notes