Spaces:
Sleeping
Sleeping
Update tts_engine.py
Browse files- tts_engine.py +71 -70
tts_engine.py
CHANGED
|
@@ -1,70 +1,71 @@
|
|
| 1 |
-
# tts_engine.py
|
| 2 |
-
import pyttsx3
|
| 3 |
-
import os
|
| 4 |
-
import io
|
| 5 |
-
|
| 6 |
-
# Initialisation du moteur pyttsx3
|
| 7 |
-
# Attention: L'initialisation du moteur est lente. Il est préférable de le faire une seule fois.
|
| 8 |
-
_engine = None
|
| 9 |
-
|
| 10 |
-
def get_tts_engine():
|
| 11 |
-
"""Initialise et retourne le moteur pyttsx3."""
|
| 12 |
-
global _engine
|
| 13 |
-
if _engine is None:
|
| 14 |
-
try:
|
| 15 |
-
#
|
| 16 |
-
_engine = pyttsx3.init()
|
| 17 |
-
# Optimisation: Réglage des propriétés du moteur (optionnel)
|
| 18 |
-
_engine.setProperty('rate', 150) # Vitesse de lecture
|
| 19 |
-
except Exception as e:
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
engine.
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
|
|
|
|
|
| 1 |
+
# tts_engine.py
|
| 2 |
+
import pyttsx3
|
| 3 |
+
import os
|
| 4 |
+
import io
|
| 5 |
+
|
| 6 |
+
# Initialisation du moteur pyttsx3
|
| 7 |
+
# Attention: L'initialisation du moteur est lente. Il est préférable de le faire une seule fois.
|
| 8 |
+
_engine = None
|
| 9 |
+
|
| 10 |
+
def get_tts_engine():
|
| 11 |
+
"""Initialise et retourne le moteur pyttsx3."""
|
| 12 |
+
global _engine
|
| 13 |
+
if _engine is None:
|
| 14 |
+
try:
|
| 15 |
+
# S'assurer que le moteur est initialisé avec l'environnement 'espeak'
|
| 16 |
+
_engine = pyttsx3.init()
|
| 17 |
+
# Optimisation: Réglage des propriétés du moteur (optionnel)
|
| 18 |
+
_engine.setProperty('rate', 150) # Vitesse de lecture
|
| 19 |
+
except Exception as e:
|
| 20 |
+
# AFFICHAGE CLAIR DE L'ERREUR D'INITIALISATION
|
| 21 |
+
print(f"!!! FATAL ERROR: pyttsx3 initialization failed. Is eSpeak installed and runnable? Error: {e}")
|
| 22 |
+
_engine = None # S'assure qu'on ne garde pas une référence cassée
|
| 23 |
+
return _engine
|
| 24 |
+
|
| 25 |
+
def get_available_languages():
|
| 26 |
+
"""Récupère la liste des langues/voix disponibles."""
|
| 27 |
+
engine = get_tts_engine()
|
| 28 |
+
if not engine:
|
| 29 |
+
return {}
|
| 30 |
+
|
| 31 |
+
voices = engine.getProperty('voices')
|
| 32 |
+
languages = {}
|
| 33 |
+
|
| 34 |
+
# On essaie de mapper la voix eSpeak à un code de langue/nom
|
| 35 |
+
for voice in voices:
|
| 36 |
+
# L'ID de la voix eSpeak contient souvent le code de langue (ex: 'french', 'en-us')
|
| 37 |
+
voice_id = voice.id.split('+')[0].replace(' ', '').lower()
|
| 38 |
+
|
| 39 |
+
if 'en' in voice_id or 'english' in voice.name.lower():
|
| 40 |
+
languages['English'] = voice.id
|
| 41 |
+
elif 'fr' in voice_id or 'french' in voice.name.lower():
|
| 42 |
+
languages['Français'] = voice.id
|
| 43 |
+
elif 'es' in voice_id or 'spanish' in voice.name.lower():
|
| 44 |
+
languages['Español'] = voice.id
|
| 45 |
+
|
| 46 |
+
# Ajout d'une entrée par défaut pour chaque voix, si non déjà mappée
|
| 47 |
+
if voice.name not in languages and voice.name != 'default':
|
| 48 |
+
languages[voice.name] = voice.id
|
| 49 |
+
|
| 50 |
+
# S'assurer d'avoir au moins une option si le mapping est faible
|
| 51 |
+
if not languages and voices:
|
| 52 |
+
languages['Default'] = voices[0].id
|
| 53 |
+
|
| 54 |
+
return languages
|
| 55 |
+
|
| 56 |
+
def text_to_audio_file(text, voice_id, output_path="output.wav"):
|
| 57 |
+
"""Convertit le texte en fichier audio avec la voix spécifiée."""
|
| 58 |
+
engine = get_tts_engine()
|
| 59 |
+
if not engine:
|
| 60 |
+
raise Exception("Moteur TTS non initialisé.")
|
| 61 |
+
|
| 62 |
+
# 1. Sélection de la voix
|
| 63 |
+
engine.setProperty('voice', voice_id)
|
| 64 |
+
|
| 65 |
+
# 2. Sauvegarde du fichier
|
| 66 |
+
engine.save_to_file(text, output_path)
|
| 67 |
+
engine.runAndWait()
|
| 68 |
+
|
| 69 |
+
# NOTE: eSpeak génère par défaut un fichier .wav.
|
| 70 |
+
return os.path.abspath(output_path)
|
| 71 |
+
|