ernestmindres commited on
Commit
978d539
·
verified ·
1 Parent(s): 9570534

Update tts_engine.py

Browse files
Files changed (1) hide show
  1. 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
- # Utilise 'espeak' comme moteur par défaut sur Linux (via Docker)
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
- print(f"Erreur d'initialisation pyttsx3: {e}")
21
- _engine = None # S'assure qu'on ne garde pas une référence cassée
22
- return _engine
23
-
24
- def get_available_languages():
25
- """Récupère la liste des langues/voix disponibles."""
26
- engine = get_tts_engine()
27
- if not engine:
28
- return {}
29
-
30
- voices = engine.getProperty('voices')
31
- languages = {}
32
-
33
- # On essaie de mapper la voix eSpeak à un code de langue/nom
34
- for voice in voices:
35
- # L'ID de la voix eSpeak contient souvent le code de langue (ex: 'french', 'en-us')
36
- voice_id = voice.id.split('+')[0].replace(' ', '').lower()
37
-
38
- if 'en' in voice_id or 'english' in voice.name.lower():
39
- languages['English'] = voice.id
40
- elif 'fr' in voice_id or 'french' in voice.name.lower():
41
- languages['Français'] = voice.id
42
- elif 'es' in voice_id or 'spanish' in voice.name.lower():
43
- languages['Español'] = voice.id
44
-
45
- # Ajout d'une entrée par défaut pour chaque voix, si non déjà mappée
46
- if voice.name not in languages and voice.name != 'default':
47
- languages[voice.name] = voice.id
48
-
49
- # S'assurer d'avoir au moins une option si le mapping est faible
50
- if not languages and voices:
51
- languages['Default'] = voices[0].id
52
-
53
- return languages
54
-
55
- def text_to_audio_file(text, voice_id, output_path="output.wav"):
56
- """Convertit le texte en fichier audio avec la voix spécifiée."""
57
- engine = get_tts_engine()
58
- if not engine:
59
- raise Exception("Moteur TTS non initialisé.")
60
-
61
- # 1. Sélection de la voix
62
- engine.setProperty('voice', voice_id)
63
-
64
- # 2. Sauvegarde du fichier
65
- engine.save_to_file(text, output_path)
66
- engine.runAndWait()
67
-
68
- # NOTE: eSpeak génère par défaut un fichier .wav.
69
- return os.path.abspath(output_path)
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
+