From b5f90781014cc51754ba881e42533eef01444238 Mon Sep 17 00:00:00 2001 From: Amith Date: Mon, 6 Jul 2026 16:00:49 +0530 Subject: [PATCH] Allow using the system espeak-ng instead of the bundled one Respect the standard PHONEMIZER_ESPEAK_LIBRARY environment variable: when set, phonemizer is pointed at that library and the one bundled with espeakng_loader is not loaded. A user-provided ESPEAK_DATA_PATH is no longer overwritten. espeakng_loader import failure is tolerated so the package is not required when a system espeak-ng is configured. Fixes #149 --- README.md | 11 +++++++++++ kittentts/onnx_model.py | 20 +++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6d8bb73..70ef158 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,17 @@ m = KittenTTS("KittenML/kitten-tts-mini-0.8", backend="cuda") Check out `example_cuda.py` +### Using the system espeak-ng + +By default, KittenTTS uses the espeak-ng library bundled with `espeakng_loader`. If you already have espeak-ng installed on your system and prefer to use it, point KittenTTS to it via the standard phonemizer environment variables before importing: + +```bash +export PHONEMIZER_ESPEAK_LIBRARY=/usr/lib/libespeak-ng.so # path to your espeak-ng shared library +export ESPEAK_DATA_PATH=/usr/share/espeak-ng-data # optional: path to your espeak-ng data +``` + +When `PHONEMIZER_ESPEAK_LIBRARY` is set, the bundled library is not loaded and `espeakng_loader` does not need to be installed. + ## API Reference ### `KittenTTS(model_name, cache_dir=None)` diff --git a/kittentts/onnx_model.py b/kittentts/onnx_model.py index b368e4f..37a571f 100644 --- a/kittentts/onnx_model.py +++ b/kittentts/onnx_model.py @@ -1,8 +1,22 @@ import os -import espeakng_loader + +try: + import espeakng_loader +except ImportError: + espeakng_loader = None + from phonemizer.backend.espeak.wrapper import EspeakWrapper -EspeakWrapper.set_library(espeakng_loader.get_library_path()) -os.environ['ESPEAK_DATA_PATH'] = espeakng_loader.get_data_path() + +# Use the system espeak-ng if the user points to it via the standard +# PHONEMIZER_ESPEAK_LIBRARY / ESPEAK_DATA_PATH environment variables, +# otherwise fall back to the library bundled with espeakng_loader. +if os.environ.get('PHONEMIZER_ESPEAK_LIBRARY'): + EspeakWrapper.set_library(os.environ['PHONEMIZER_ESPEAK_LIBRARY']) +elif espeakng_loader is not None: + EspeakWrapper.set_library(espeakng_loader.get_library_path()) + +if espeakng_loader is not None: + os.environ.setdefault('ESPEAK_DATA_PATH', espeakng_loader.get_data_path()) import numpy as np import phonemizer import soundfile as sf