Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .python-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.13
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,15 @@ Let me know if you need any adjustments or additional languages!

## Updates

- **New Engine:** PocketTTSEngine
- **Installation:** `pip install pocket-tts`
- Kyutai Labs' lightweight 100M parameter TTS, CPU-optimized (~6x real-time)
- Voice cloning via WAV files, ~200ms latency, 8 built-in voices

- **New Engine:** NeuTTSEngine
- On-device voice cloning TTS with 3-second reference audio
- **Installation:** Clone from https://github.com/neuphonic/neutts

- **New Engine:** ZipoVoiceEngine
- **Installation:** `pip install RealtimeTTS
- **Test File Example:** [zipvoice_test.py](https://github.com/KoljaB/RealtimeTTS/blob/master/tests/zipvoice_test.py)
Expand Down Expand Up @@ -131,6 +140,8 @@ This library uses:
- **OrpheusEngine** 🏠: Llama‑powered TTS with emotion tags
- **CambEngine** 🌐: CAMB AI MARS models with 140+ languages
- **ZipVoiceEngine** 🏠: 123M zero‑shot model, state‑of‑the‑art quality
- **PocketTTSEngine** 🏠: Kyutai Labs 100M model, CPU-optimized with voice cloning
- **NeuTTSEngine** 🏠: Voice cloning with 3-second reference audio

🏠 Local processing (no internet required)
🌐 Requires internet connection
Expand Down
31 changes: 31 additions & 0 deletions RealtimeTTS/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
"KokoroEngine", "KokoroVoice",
"OrpheusEngine", "OrpheusVoice",
"ZipVoiceEngine", "ZipVoiceVoice",
"PocketTTSEngine", "PocketTTSVoice",
"NeuTTSEngine", "NeuTTSVoice",
"CambEngine", "CambVoice",
]

Expand Down Expand Up @@ -193,6 +195,31 @@ def _load_zipvoice_engine():
return ZipVoiceEngine


def _load_pocket_engine():
try:
from .engines.pocket_engine import PocketTTSEngine, PocketTTSVoice
except ImportError as e:
raise ImportError(
"Failed to load PocketTTSEngine and PocketTTSVoice. "
"Please install with: pip install pocket-tts"
) from e
globals()["PocketTTSEngine"] = PocketTTSEngine
globals()["PocketTTSVoice"] = PocketTTSVoice
return PocketTTSEngine


def _load_neutts_engine():
try:
from .engines.neutts_engine import NeuTTSEngine, NeuTTSVoice
except ImportError as e:
raise ImportError(
"Failed to load NeuTTSEngine and NeuTTSVoice. "
"Install NeuTTS from: https://github.com/neuphonic/neutts"
) from e
globals()["NeuTTSEngine"] = NeuTTSEngine
globals()["NeuTTSVoice"] = NeuTTSVoice
return NeuTTSEngine

def _load_camb_engine():
try:
from .engines.camb_engine import CambEngine, CambVoice
Expand Down Expand Up @@ -233,6 +260,10 @@ def _load_camb_engine():
"OrpheusVoice": _load_orpheus_engine,
"ZipVoiceEngine": _load_zipvoice_engine,
"ZipVoiceVoice": _load_zipvoice_engine,
"PocketTTSEngine": _load_pocket_engine,
"PocketTTSVoice": _load_pocket_engine,
"NeuTTSEngine": _load_neutts_engine,
"NeuTTSVoice": _load_neutts_engine,
"CambEngine": _load_camb_engine,
"CambVoice": _load_camb_engine,
}
Expand Down
20 changes: 20 additions & 0 deletions RealtimeTTS/engines/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
"KokoroEngine", "KokoroVoice",
"OrpheusEngine", "OrpheusVoice",
"ZipVoiceEngine", "ZipVoiceVoice",
"PocketTTSEngine", "PocketTTSVoice",
"NeuTTSEngine", "NeuTTSVoice",
"CambEngine", "CambVoice",
"ModelsLabEngine", "ModelsLabVoice",
]
Expand Down Expand Up @@ -124,6 +126,20 @@ def _load_modelslab_engine():
return ModelsLabEngine


def _load_pocket_engine():
from .pocket_engine import PocketTTSEngine, PocketTTSVoice
globals()["PocketTTSEngine"] = PocketTTSEngine
globals()["PocketTTSVoice"] = PocketTTSVoice
return PocketTTSEngine


def _load_neutts_engine():
from .neutts_engine import NeuTTSEngine, NeuTTSVoice
globals()["NeuTTSEngine"] = NeuTTSEngine
globals()["NeuTTSVoice"] = NeuTTSVoice
return NeuTTSEngine


# Map attribute names to lazy loader functions.
_lazy_imports = {
"AzureEngine": _load_azure_engine,
Expand Down Expand Up @@ -152,6 +168,10 @@ def _load_modelslab_engine():
"OrpheusVoice": _load_orpheus_engine,
"ZipVoiceEngine": _load_zipvoice_engine,
"ZipVoiceVoice": _load_zipvoice_engine,
"PocketTTSEngine": _load_pocket_engine,
"PocketTTSVoice": _load_pocket_engine,
"NeuTTSEngine": _load_neutts_engine,
"NeuTTSVoice": _load_neutts_engine,
"CambEngine": _load_camb_engine,
"CambVoice": _load_camb_engine,
"ModelsLabEngine": _load_modelslab_engine,
Expand Down
Loading