Metadata-Version: 2.1
Name: realtimetts
Version: 0.7.1
Summary: Stream text into audio with an easy-to-use, highly configurable library delivering voice output with minimal latency.
Home-page: https://github.com/KoljaB/realtimetts
Author: Kolja Beigel
Author-email: kolja.beigel@web.de
Keywords: real-time,text-to-speech,TTS,streaming,audio,voice,synthesis,sentence-segmentation,low-latency,character-streaming,dynamic feedback,audio-output,text-input,TTS-engine,audio-playback,stream-player,sentence-fragment,audio-feedback,interactive,python
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.9, <3.15
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: stream2sentence >=0.3.1
Requires-Dist: pydub >=0.25.1
Requires-Dist: pyaudio >=0.2.14
Requires-Dist: resampy ==0.4.3
Provides-Extra: all
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'all'
Requires-Dist: pydub >=0.25.1 ; extra == 'all'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'all'
Requires-Dist: resampy ==0.4.3 ; extra == 'all'
Requires-Dist: pyttsx3 >=2.99 ; extra == 'all'
Requires-Dist: azure-cognitiveservices-speech >=1.48.2 ; extra == 'all'
Requires-Dist: elevenlabs >=2.39.0 ; extra == 'all'
Requires-Dist: openai >=2.29.0 ; extra == 'all'
Requires-Dist: gtts >=2.5.4 ; extra == 'all'
Requires-Dist: coqui-tts >=0.27.5 ; extra == 'all'
Requires-Dist: edge-tts >=7.2.7 ; extra == 'all'
Requires-Dist: kokoro >=0.9.4 ; extra == 'all'
Requires-Dist: camb-sdk >=1.5.8 ; extra == 'all'
Requires-Dist: requests >=2.32.0 ; extra == 'all'
Requires-Dist: cartesia ==2.0.9 ; extra == 'all'
Requires-Dist: typecast-python >=0.2.0 ; extra == 'all'
Requires-Dist: faster-qwen3-tts >=0.2.4 ; extra == 'all'
Requires-Dist: snac >=1.2.1 ; extra == 'all'
Requires-Dist: omnivoice >=0.1.1 ; extra == 'all'
Requires-Dist: chatterbox-tts ; extra == 'all'
Requires-Dist: sopro >=1.5.0 ; extra == 'all'
Requires-Dist: soprano-tts >=0.2.0 ; extra == 'all'
Requires-Dist: neutts ; extra == 'all'
Requires-Dist: pocket-tts ; extra == 'all'
Requires-Dist: torch ; extra == 'all'
Requires-Dist: torchaudio ; extra == 'all'
Requires-Dist: numpy ; extra == 'all'
Requires-Dist: huggingface-hub >=0.36.0 ; extra == 'all'
Requires-Dist: safetensors ; extra == 'all'
Requires-Dist: vocos ; extra == 'all'
Requires-Dist: cn2an >=0.5.23 ; extra == 'all'
Requires-Dist: inflect ; extra == 'all'
Requires-Dist: jieba >=0.42.1 ; extra == 'all'
Requires-Dist: lhotse ; extra == 'all'
Requires-Dist: librosa ; extra == 'all'
Requires-Dist: onnxruntime ; extra == 'all'
Requires-Dist: piper-phonemize ; extra == 'all'
Requires-Dist: pypinyin >=0.55.0 ; extra == 'all'
Requires-Dist: setuptools <81 ; extra == 'all'
Requires-Dist: tensorboard ; extra == 'all'
Requires-Dist: transformers <=4.57.6 ; extra == 'all'
Requires-Dist: nltk ; extra == 'all'
Requires-Dist: munch ; extra == 'all'
Requires-Dist: PyYAML ; extra == 'all'
Requires-Dist: phonemizer ; extra == 'all'
Requires-Dist: transformers ; extra == 'all'
Requires-Dist: soundfile >=0.13.1 ; extra == 'all'
Provides-Extra: azure
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'azure'
Requires-Dist: pydub >=0.25.1 ; extra == 'azure'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'azure'
Requires-Dist: resampy ==0.4.3 ; extra == 'azure'
Requires-Dist: azure-cognitiveservices-speech >=1.48.2 ; extra == 'azure'
Provides-Extra: camb
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'camb'
Requires-Dist: pydub >=0.25.1 ; extra == 'camb'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'camb'
Requires-Dist: resampy ==0.4.3 ; extra == 'camb'
Requires-Dist: camb-sdk >=1.5.8 ; extra == 'camb'
Provides-Extra: cartesia
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'cartesia'
Requires-Dist: pydub >=0.25.1 ; extra == 'cartesia'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'cartesia'
Requires-Dist: resampy ==0.4.3 ; extra == 'cartesia'
Requires-Dist: cartesia ==2.0.9 ; extra == 'cartesia'
Provides-Extra: chatterbox
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'chatterbox'
Requires-Dist: pydub >=0.25.1 ; extra == 'chatterbox'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'chatterbox'
Requires-Dist: resampy ==0.4.3 ; extra == 'chatterbox'
Requires-Dist: chatterbox-tts ; extra == 'chatterbox'
Provides-Extra: coqui
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'coqui'
Requires-Dist: pydub >=0.25.1 ; extra == 'coqui'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'coqui'
Requires-Dist: resampy ==0.4.3 ; extra == 'coqui'
Requires-Dist: coqui-tts >=0.27.5 ; extra == 'coqui'
Provides-Extra: edge
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'edge'
Requires-Dist: pydub >=0.25.1 ; extra == 'edge'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'edge'
Requires-Dist: resampy ==0.4.3 ; extra == 'edge'
Requires-Dist: edge-tts >=7.2.7 ; extra == 'edge'
Provides-Extra: elevenlabs
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'elevenlabs'
Requires-Dist: pydub >=0.25.1 ; extra == 'elevenlabs'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'elevenlabs'
Requires-Dist: resampy ==0.4.3 ; extra == 'elevenlabs'
Requires-Dist: elevenlabs >=2.39.0 ; extra == 'elevenlabs'
Provides-Extra: gtts
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'gtts'
Requires-Dist: pydub >=0.25.1 ; extra == 'gtts'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'gtts'
Requires-Dist: resampy ==0.4.3 ; extra == 'gtts'
Requires-Dist: gtts >=2.5.4 ; extra == 'gtts'
Provides-Extra: jp
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'jp'
Requires-Dist: pydub >=0.25.1 ; extra == 'jp'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'jp'
Requires-Dist: resampy ==0.4.3 ; extra == 'jp'
Requires-Dist: mecab-python3 >=1.0.6 ; extra == 'jp'
Requires-Dist: unidic-lite >=1.0.8 ; extra == 'jp'
Requires-Dist: cutlet ; extra == 'jp'
Requires-Dist: fugashi >=1.4.0 ; extra == 'jp'
Requires-Dist: jaconv >=0.4.0 ; extra == 'jp'
Requires-Dist: mojimoji >=0.0.13 ; extra == 'jp'
Requires-Dist: pyopenjtalk >=0.4.0 ; extra == 'jp'
Provides-Extra: ko
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'ko'
Requires-Dist: pydub >=0.25.1 ; extra == 'ko'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'ko'
Requires-Dist: resampy ==0.4.3 ; extra == 'ko'
Requires-Dist: hangul-romanize ; extra == 'ko'
Provides-Extra: kokoro
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'kokoro'
Requires-Dist: pydub >=0.25.1 ; extra == 'kokoro'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'kokoro'
Requires-Dist: resampy ==0.4.3 ; extra == 'kokoro'
Requires-Dist: kokoro >=0.9.4 ; extra == 'kokoro'
Provides-Extra: luxtts
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'luxtts'
Requires-Dist: pydub >=0.25.1 ; extra == 'luxtts'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'luxtts'
Requires-Dist: resampy ==0.4.3 ; extra == 'luxtts'
Requires-Dist: cn2an >=0.5.23 ; extra == 'luxtts'
Requires-Dist: inflect ; extra == 'luxtts'
Requires-Dist: jieba >=0.42.1 ; extra == 'luxtts'
Requires-Dist: lhotse ; extra == 'luxtts'
Requires-Dist: librosa ; extra == 'luxtts'
Requires-Dist: numpy ; extra == 'luxtts'
Requires-Dist: onnxruntime ; extra == 'luxtts'
Requires-Dist: piper-phonemize ; extra == 'luxtts'
Requires-Dist: pypinyin >=0.55.0 ; extra == 'luxtts'
Requires-Dist: safetensors ; extra == 'luxtts'
Requires-Dist: setuptools <81 ; extra == 'luxtts'
Requires-Dist: tensorboard ; extra == 'luxtts'
Requires-Dist: torch ; extra == 'luxtts'
Requires-Dist: torchaudio ; extra == 'luxtts'
Requires-Dist: transformers <=4.57.6 ; extra == 'luxtts'
Requires-Dist: vocos ; extra == 'luxtts'
Provides-Extra: minimal
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'minimal'
Requires-Dist: pydub >=0.25.1 ; extra == 'minimal'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'minimal'
Requires-Dist: resampy ==0.4.3 ; extra == 'minimal'
Provides-Extra: minimax
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'minimax'
Requires-Dist: pydub >=0.25.1 ; extra == 'minimax'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'minimax'
Requires-Dist: resampy ==0.4.3 ; extra == 'minimax'
Requires-Dist: requests >=2.32.0 ; extra == 'minimax'
Provides-Extra: modelslab
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'modelslab'
Requires-Dist: pydub >=0.25.1 ; extra == 'modelslab'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'modelslab'
Requires-Dist: resampy ==0.4.3 ; extra == 'modelslab'
Requires-Dist: requests >=2.32.0 ; extra == 'modelslab'
Provides-Extra: moss
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'moss'
Requires-Dist: pydub >=0.25.1 ; extra == 'moss'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'moss'
Requires-Dist: resampy ==0.4.3 ; extra == 'moss'
Requires-Dist: numpy ; extra == 'moss'
Requires-Dist: soundfile >=0.13.1 ; extra == 'moss'
Requires-Dist: torch ; extra == 'moss'
Requires-Dist: torchaudio ; extra == 'moss'
Requires-Dist: onnxruntime ; extra == 'moss'
Requires-Dist: huggingface-hub >=0.36.0 ; extra == 'moss'
Requires-Dist: nltk ; extra == 'moss'
Provides-Extra: moss-tts
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'moss-tts'
Requires-Dist: pydub >=0.25.1 ; extra == 'moss-tts'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'moss-tts'
Requires-Dist: resampy ==0.4.3 ; extra == 'moss-tts'
Requires-Dist: numpy ; extra == 'moss-tts'
Requires-Dist: soundfile >=0.13.1 ; extra == 'moss-tts'
Requires-Dist: torch ; extra == 'moss-tts'
Requires-Dist: torchaudio ; extra == 'moss-tts'
Requires-Dist: onnxruntime ; extra == 'moss-tts'
Requires-Dist: huggingface-hub >=0.36.0 ; extra == 'moss-tts'
Requires-Dist: nltk ; extra == 'moss-tts'
Provides-Extra: neutts
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'neutts'
Requires-Dist: pydub >=0.25.1 ; extra == 'neutts'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'neutts'
Requires-Dist: resampy ==0.4.3 ; extra == 'neutts'
Requires-Dist: neutts ; extra == 'neutts'
Provides-Extra: neutts-gguf
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'neutts-gguf'
Requires-Dist: pydub >=0.25.1 ; extra == 'neutts-gguf'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'neutts-gguf'
Requires-Dist: resampy ==0.4.3 ; extra == 'neutts-gguf'
Requires-Dist: neutts[llama,onnx] ; extra == 'neutts-gguf'
Provides-Extra: omnivoice
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'omnivoice'
Requires-Dist: pydub >=0.25.1 ; extra == 'omnivoice'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'omnivoice'
Requires-Dist: resampy ==0.4.3 ; extra == 'omnivoice'
Requires-Dist: omnivoice >=0.1.1 ; extra == 'omnivoice'
Provides-Extra: openai
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'openai'
Requires-Dist: pydub >=0.25.1 ; extra == 'openai'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'openai'
Requires-Dist: resampy ==0.4.3 ; extra == 'openai'
Requires-Dist: openai >=2.29.0 ; extra == 'openai'
Provides-Extra: orpheus
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'orpheus'
Requires-Dist: pydub >=0.25.1 ; extra == 'orpheus'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'orpheus'
Requires-Dist: resampy ==0.4.3 ; extra == 'orpheus'
Requires-Dist: snac >=1.2.1 ; extra == 'orpheus'
Provides-Extra: parler
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'parler'
Requires-Dist: pydub >=0.25.1 ; extra == 'parler'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'parler'
Requires-Dist: resampy ==0.4.3 ; extra == 'parler'
Requires-Dist: torch ; extra == 'parler'
Requires-Dist: transformers ; extra == 'parler'
Provides-Extra: piper
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'piper'
Requires-Dist: pydub >=0.25.1 ; extra == 'piper'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'piper'
Requires-Dist: resampy ==0.4.3 ; extra == 'piper'
Provides-Extra: pocket
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'pocket'
Requires-Dist: pydub >=0.25.1 ; extra == 'pocket'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'pocket'
Requires-Dist: resampy ==0.4.3 ; extra == 'pocket'
Requires-Dist: pocket-tts ; extra == 'pocket'
Requires-Dist: torch ; extra == 'pocket'
Provides-Extra: pockettts
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'pockettts'
Requires-Dist: pydub >=0.25.1 ; extra == 'pockettts'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'pockettts'
Requires-Dist: resampy ==0.4.3 ; extra == 'pockettts'
Requires-Dist: pocket-tts ; extra == 'pockettts'
Requires-Dist: torch ; extra == 'pockettts'
Provides-Extra: qwen
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'qwen'
Requires-Dist: pydub >=0.25.1 ; extra == 'qwen'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'qwen'
Requires-Dist: resampy ==0.4.3 ; extra == 'qwen'
Requires-Dist: faster-qwen3-tts >=0.2.4 ; extra == 'qwen'
Provides-Extra: soprano
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'soprano'
Requires-Dist: pydub >=0.25.1 ; extra == 'soprano'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'soprano'
Requires-Dist: resampy ==0.4.3 ; extra == 'soprano'
Requires-Dist: soprano-tts >=0.2.0 ; extra == 'soprano'
Provides-Extra: sopro
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'sopro'
Requires-Dist: pydub >=0.25.1 ; extra == 'sopro'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'sopro'
Requires-Dist: resampy ==0.4.3 ; extra == 'sopro'
Requires-Dist: sopro >=1.5.0 ; extra == 'sopro'
Provides-Extra: style
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'style'
Requires-Dist: pydub >=0.25.1 ; extra == 'style'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'style'
Requires-Dist: resampy ==0.4.3 ; extra == 'style'
Requires-Dist: torch ; extra == 'style'
Requires-Dist: torchaudio ; extra == 'style'
Requires-Dist: numpy ; extra == 'style'
Requires-Dist: librosa ; extra == 'style'
Requires-Dist: nltk ; extra == 'style'
Requires-Dist: munch ; extra == 'style'
Requires-Dist: PyYAML ; extra == 'style'
Requires-Dist: phonemizer ; extra == 'style'
Provides-Extra: styletts
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'styletts'
Requires-Dist: pydub >=0.25.1 ; extra == 'styletts'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'styletts'
Requires-Dist: resampy ==0.4.3 ; extra == 'styletts'
Requires-Dist: torch ; extra == 'styletts'
Requires-Dist: torchaudio ; extra == 'styletts'
Requires-Dist: numpy ; extra == 'styletts'
Requires-Dist: librosa ; extra == 'styletts'
Requires-Dist: nltk ; extra == 'styletts'
Requires-Dist: munch ; extra == 'styletts'
Requires-Dist: PyYAML ; extra == 'styletts'
Requires-Dist: phonemizer ; extra == 'styletts'
Provides-Extra: system
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'system'
Requires-Dist: pydub >=0.25.1 ; extra == 'system'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'system'
Requires-Dist: resampy ==0.4.3 ; extra == 'system'
Requires-Dist: pyttsx3 >=2.99 ; extra == 'system'
Provides-Extra: typecast
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'typecast'
Requires-Dist: pydub >=0.25.1 ; extra == 'typecast'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'typecast'
Requires-Dist: resampy ==0.4.3 ; extra == 'typecast'
Requires-Dist: typecast-python >=0.2.0 ; extra == 'typecast'
Provides-Extra: zh
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'zh'
Requires-Dist: pydub >=0.25.1 ; extra == 'zh'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'zh'
Requires-Dist: resampy ==0.4.3 ; extra == 'zh'
Requires-Dist: pypinyin >=0.53.0 ; extra == 'zh'
Requires-Dist: ordered-set >=4.1.0 ; extra == 'zh'
Requires-Dist: jieba >=0.42.1 ; extra == 'zh'
Requires-Dist: cn2an >=0.5.23 ; extra == 'zh'
Provides-Extra: zipvoice
Requires-Dist: stream2sentence >=0.3.1 ; extra == 'zipvoice'
Requires-Dist: pydub >=0.25.1 ; extra == 'zipvoice'
Requires-Dist: pyaudio >=0.2.14 ; extra == 'zipvoice'
Requires-Dist: resampy ==0.4.3 ; extra == 'zipvoice'
Requires-Dist: torch ; extra == 'zipvoice'
Requires-Dist: torchaudio ; extra == 'zipvoice'
Requires-Dist: numpy ; extra == 'zipvoice'
Requires-Dist: huggingface-hub >=0.36.0 ; extra == 'zipvoice'
Requires-Dist: safetensors ; extra == 'zipvoice'
Requires-Dist: vocos ; extra == 'zipvoice'


To install realtimetts, you need to specify the TTS engine(s) you wish to use.

For example, to install all supported engines:

    pip install realtimetts[all]

To install with the Coqui TTS engine:

    pip install realtimetts[coqui]

Available engine options include:

- **all**: Install all supported engines
- **system**: Local system TTS via `pyttsx3`
- **azure**: Azure Speech Services support
- **elevenlabs**: ElevenLabs API integration
- **openai**: OpenAI TTS services
- **gtts**: Google Text-to-Speech
- **edge**: Microsoft Edge TTS
- **coqui**: Coqui TTS engine
- **camb**: CAMB AI MARS TTS
- **minimax**: MiniMax Cloud TTS
- **cartesia**: Cartesia API integration
- **modelslab**: ModelsLab API integration
- **orpheus**: Orpheus TTS support
- **qwen**: Faster Qwen3 TTS integration
- **omnivoice**: Omnivoice TTS integration
- **luxtts**: LuxTTS integration
- **chatterbox**: Chatterbox Turbo integration
- **sopro**: SoproTTS integration
- **soprano**: SopranoTTS integration
- **neutts**: NeuTTS integration
- **zipvoice**: ZipVoice dependency support
- **moss**: MOSS-TTS dependency support
- **pockettts**: PocketTTS integration
- **parler**: Parler TTS integration
- **styletts**: StyleTTS integration
- **piper**: Piper executable engine support
- **typecast**: Typecast API integration
- **minimal**: Core package only (for custom engine development)

You can install multiple engines by separating them with commas. For example:

    pip install realtimetts[azure,elevenlabs,openai]

# RealtimeTTS

[![PyPI](https://img.shields.io/pypi/v/RealtimeTTS)](https://pypi.org/project/RealtimeTTS/)
[![Downloads](https://static.pepy.tech/badge/RealtimeTTS)](https://www.pepy.tech/projects/realtimetts)
[![GitHub release](https://img.shields.io/github/release/KoljaB/RealtimeTTS.svg)](https://github.com/KoljaB/RealtimeTTS/releases/)

RealtimeTTS is a Python text-to-speech library for applications that need to
turn strings, generators, and LLM token streams into audio with low latency. It
can play speech locally, stream chunks to another process, write WAV files, and
fall back across multiple engines.

The project supports a broad engine matrix: local system voices, cloud APIs,
free service wrappers, local neural models, and voice-cloning stacks.

## Install

For the fastest local smoke test, install the system engine:

```bash
pip install "realtimetts[system]"
```

On Linux, install PortAudio headers before installing PyAudio:

```bash
sudo apt-get update
sudo apt-get install python3-dev portaudio19-dev
```

On macOS:

```bash
brew install portaudio
```

For cloud engines, local neural engines, CUDA, `mpv`, and current packaging
caveats, see [docs/installation.md](docs/installation.md).

## First Audio

```python
from RealtimeTTS import TextToAudioStream, SystemEngine


if __name__ == "__main__":
    stream = TextToAudioStream(SystemEngine())
    stream.feed("Hello from RealtimeTTS.")
    stream.play()
```

Use the `if __name__ == "__main__":` guard in scripts, especially on Windows and
when using engines that start worker processes.

## Streaming Text

`feed()` accepts an iterator, so text can arrive while audio is already playing:

```python
from RealtimeTTS import TextToAudioStream, SystemEngine


def text_chunks():
    yield "This starts speaking quickly. "
    yield "More text can arrive while audio is already playing."


if __name__ == "__main__":
    stream = TextToAudioStream(SystemEngine())
    stream.feed(text_chunks())
    stream.play()
```

Use the same pattern with an LLM client by yielding only non-empty text chunks.
See [docs/llm-streaming.md](docs/llm-streaming.md).

## Output

Write audio to a WAV file without local speaker playback:

```python
from RealtimeTTS import TextToAudioStream, SystemEngine


if __name__ == "__main__":
    stream = TextToAudioStream(SystemEngine())
    stream.feed("Save this speech to a file.")
    stream.play(output_wavfile="speech.wav", muted=True)
```

For output devices, `mpv` playback, muted mode, callbacks, and chunk formats,
see [docs/output-and-files.md](docs/output-and-files.md).

## Features

- Low-latency playback from strings, generators, and streamed model output.
- Multiple engines with local, cloud, free-service, and neural model options.
- Fallback engines for more resilient synthesis.
- Sync and async playback with pause, resume, stop, and state inspection.
- Text, audio, sentence, character, word-timing, and audio-chunk callbacks.
- WAV output, muted synthesis, selected output devices, and volume control.
- Voice switching and voice-cloning workflows where supported by the engine.

## Engine Overview

| Engine | Type | Install/status note | Best first use |
| --- | --- | --- | --- |
| [`SystemEngine`](docs/engines/system.md) | Local | `realtimetts[system]` | First local audio smoke test. |
| [`GTTSEngine`](docs/engines/gtts.md) | Free service | `realtimetts[gtts]` | Simple network-backed speech. |
| [`EdgeEngine`](docs/engines/edge.md) | Free service | `realtimetts[edge]`, needs `mpv` | Free streamed voices. |
| [`OpenAIEngine`](docs/engines/openai.md) | Cloud API | `realtimetts[openai]` | OpenAI TTS voices. |
| [`AzureEngine`](docs/engines/azure.md) | Cloud API | `realtimetts[azure]` | Azure voices and word timings. |
| [`ElevenlabsEngine`](docs/engines/elevenlabs.md) | Cloud API | `realtimetts[elevenlabs]`, needs `mpv` | High-quality API voices. |
| [`CambEngine`](docs/engines/camb.md) | Cloud API | `realtimetts[camb]` | CAMB MARS API voices. |
| [`MiniMaxEngine`](docs/engines/minimax.md) | Cloud API | `realtimetts[minimax]` | MiniMax cloud voices. |
| [`CartesiaEngine`](docs/engines/cartesia.md) | Cloud API | `realtimetts[cartesia]` | Cartesia API voices. |
| [`TypecastEngine`](docs/engines/typecast.md) | Cloud API | `realtimetts[typecast]` | Typecast API voices. |
| [`ModelsLabEngine`](docs/engines/modelslab.md) | Cloud API | `realtimetts[modelslab]`, root export pending | ModelsLab API voices. |
| [`CoquiEngine`](docs/engines/coqui.md) | Local neural | `realtimetts[coqui]` | Local XTTS voice cloning. |
| [`PiperEngine`](docs/engines/piper.md) | Local executable | `realtimetts[piper]`, external Piper setup | Fast local executable TTS. |
| [`StyleTTSEngine`](docs/engines/styletts.md) | Local neural | `realtimetts[styletts]`, local checkout/assets | StyleTTS experiments. |
| [`ParlerEngine`](docs/engines/parler.md) | Local neural | `realtimetts[parler]` | GPU local model experiments. |
| [`KokoroEngine`](docs/engines/kokoro.md) | Local neural | `realtimetts[kokoro]` | Local voices and timing support. |
| [`OrpheusEngine`](docs/engines/orpheus.md) | Local/API-style | `realtimetts[orpheus]` | Orpheus model workflows. |
| [`FasterQwenEngine`](docs/engines/faster-qwen.md) | Local neural | `realtimetts[qwen]` | Qwen voice cloning. |
| [`OmniVoiceEngine`](docs/engines/omnivoice.md) | Local neural | `realtimetts[omnivoice]` | Multilingual voice cloning. |
| [`PocketTTSEngine`](docs/engines/pockettts.md) | Local lightweight | `realtimetts[pockettts]` | CPU-oriented voice cloning. |
| [`NeuTTSEngine`](docs/engines/neutts.md) | Local neural | `realtimetts[neutts]`, optional `neutts-gguf` | Reference-audio voice cloning. |
| [`ZipVoiceEngine`](docs/engines/zipvoice.md) | Local neural | `realtimetts[zipvoice]`, external checkout | ZipVoice cloning/server demos. |
| [`LuxTTSEngine`](docs/engines/luxtts.md) | Local neural | `realtimetts[luxtts]` | LuxTTS voice cloning. |
| [`ChatterboxEngine`](docs/engines/chatterbox.md) | Local neural | `realtimetts[chatterbox]` | Chatterbox prompt-audio voices. |
| [`SoproTTSEngine`](docs/engines/sopro.md) | Local neural | `realtimetts[sopro]` | Sopro reference-audio voices. |
| [`SopranoEngine`](docs/engines/soprano.md) | Local neural | `realtimetts[soprano]` | Soprano local synthesis. |
| [`MossTTSEngine`](docs/engines/moss-tts.md) | Local neural | `realtimetts[moss]`, runtime assets | MOSS-TTS experiments. |

See [docs/engine-selection.md](docs/engine-selection.md) before choosing an
engine for an application. The engine-specific docs are being split out from the
old README and source audit.

## Documentation

- [Quick start](docs/quick-start.md): shortest working examples.
- [Installation](docs/installation.md): extras, platform setup, external tools,
  API keys, and known packaging mismatches.
- [Engine selection](docs/engine-selection.md): engine matrix and selection
  guidance.
- [Feed and playback](docs/feed-and-playback.md): `feed()`, `play()`,
  `play_async()`, pause, resume, stop, text state, and inline tags.
- [LLM streaming](docs/llm-streaming.md): provider-neutral streamed text
  patterns and latency tuning.
- [Output and files](docs/output-and-files.md): WAV files, audio chunks, muted
  mode, output devices, mpv, buffering, and volume.
- [Engine setup pages](docs/engine-selection.md) now link one focused page for
  each concrete engine source.
- [FAQ](FAQ.md): legacy troubleshooting page while topic docs are being split
  out.

Legacy translated docs remain under `docs/<locale>/` while English is refactored
as the canonical source.

## Server Example

The browser and WebSocket server example lives in `example_fast_api/`:

```bash
python -m pip install fastapi uvicorn websockets pyaudio
python example_fast_api/async_server.py
```

Open `http://localhost:8000` or connect to `ws://localhost:8000/ws`.

## Related Project

[RealtimeSTT](https://github.com/KoljaB/RealtimeSTT) is the speech-to-text
counterpart for realtime voice input.

## Contributing

Focused docs, tests, and engine fixes are easiest to review. During the docs
refactor, keep English docs canonical and note mismatches between source,
packaging, examples, and tests rather than hiding them.

## License

RealtimeTTS source code is MIT licensed. Engine providers, model weights, voice
data, datasets, generated audio, and third-party services can have separate
terms. Read [LICENSING_ADDENDUM.md](LICENSING_ADDENDUM.md) and the relevant
provider or model licenses before commercial use.

Audio samples derived from the EARS dataset by Meta are licensed under CC BY-NC
4.0. See the original dataset terms for details.

## Author

Kolja Beigel
