Spaces:
Paused
Paused
0x07CB
commited on
refactor: Amélioration de la robustesse de la transcription audio avec gestion des erreurs et fallback
Browse files- core/speech_to_text.py +50 -46
core/speech_to_text.py
CHANGED
@@ -13,6 +13,8 @@ from typing import List
|
|
13 |
from typing import Optional
|
14 |
#from typing import Tuple
|
15 |
from typing import Union
|
|
|
|
|
16 |
|
17 |
from core.DetectLanguage import detect_language
|
18 |
|
@@ -73,60 +75,62 @@ def transcribe_audio(
|
|
73 |
language: Optional[str] = None
|
74 |
) -> str:
|
75 |
"""
|
76 |
-
Transcrit un fichier audio
|
77 |
|
78 |
Args:
|
79 |
-
filepath Chemin vers le fichier audio
|
80 |
-
language (Optional[str]):
|
81 |
|
82 |
Returns:
|
83 |
-
str: Le texte transcrit.
|
84 |
-
"""
|
85 |
-
max_size_mb = 25
|
86 |
-
client = OpenAI(api_key=getenv("OPENAI_API_KEY"))
|
87 |
-
try:
|
88 |
-
transcriptions = []
|
89 |
-
with open(filepath if isinstance(filepath, str) else filepath.name, "rb") as f:
|
90 |
-
# filepath peut etre un chemin vers un fichier audio ou un objet IO
|
91 |
-
# verifier si le fichier audio fait plus de 25 Mo
|
92 |
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
(audio.frame_rate * audio.sample_width * audio.channels)
|
101 |
-
)
|
102 |
-
|
103 |
-
for start in range(0, duration_ms, segment_duration_ms):
|
104 |
-
end = min(start + segment_duration_ms, duration_ms)
|
105 |
-
segment = audio[start:end]
|
106 |
-
|
107 |
-
buffer = BytesIO()
|
108 |
-
segment.export(buffer, format="mp3")
|
109 |
-
buffer.seek(0)
|
110 |
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
124 |
|
125 |
-
|
126 |
-
|
127 |
-
return "
|
|
|
|
|
|
|
|
|
|
|
|
|
128 |
except Exception as e:
|
129 |
-
|
130 |
return ""
|
131 |
|
132 |
|
|
|
13 |
from typing import Optional
|
14 |
#from typing import Tuple
|
15 |
from typing import Union
|
16 |
+
import os
|
17 |
+
import streamlit as st
|
18 |
|
19 |
from core.DetectLanguage import detect_language
|
20 |
|
|
|
75 |
language: Optional[str] = None
|
76 |
) -> str:
|
77 |
"""
|
78 |
+
Transcrit un fichier audio en texte.
|
79 |
|
80 |
Args:
|
81 |
+
filepath (Union[str, IO]): Chemin vers le fichier audio ou objet IO.
|
82 |
+
language (Optional[str]): Code de langue ISO 639-1 pour la transcription.
|
83 |
|
84 |
Returns:
|
85 |
+
str: Le texte transcrit ou une chaîne vide en cas d'erreur.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
|
87 |
+
Raises:
|
88 |
+
ValueError: Si le fichier audio est invalide ou vide.
|
89 |
+
IOError: Si une erreur se produit lors de la lecture du fichier.
|
90 |
+
"""
|
91 |
+
if not filepath:
|
92 |
+
st.error("Erreur : Aucun fichier audio fourni")
|
93 |
+
return ""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
94 |
|
95 |
+
try:
|
96 |
+
# Vérifier si le fichier existe et est accessible
|
97 |
+
if isinstance(filepath, str) and not os.path.exists(filepath):
|
98 |
+
raise FileNotFoundError(f"Le fichier {filepath} n'existe pas")
|
99 |
+
|
100 |
+
# Vérifier la taille du fichier
|
101 |
+
file_size = os.path.getsize(filepath) if isinstance(filepath, str) else filepath.tell()
|
102 |
+
if file_size == 0:
|
103 |
+
raise ValueError("Le fichier audio est vide")
|
104 |
+
|
105 |
+
# Transcription avec Hugging Face
|
106 |
+
try:
|
107 |
+
transcription = huggingface_endpoints_stt(filepath)
|
108 |
+
if transcription:
|
109 |
+
return transcription
|
110 |
+
except Exception as hf_error:
|
111 |
+
st.warning(f"Erreur avec l'endpoint Hugging Face, tentative avec OpenAI : {hf_error}")
|
112 |
+
|
113 |
+
# Transcription avec OpenAI comme fallback
|
114 |
+
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
|
115 |
+
audio_file = open(filepath if isinstance(filepath, str) else filepath.name, "rb")
|
116 |
+
transcription = client.audio.transcriptions.create(
|
117 |
+
model="whisper-1",
|
118 |
+
file=audio_file,
|
119 |
+
language=language
|
120 |
+
)
|
121 |
+
return transcription.text
|
122 |
|
123 |
+
except FileNotFoundError as e:
|
124 |
+
st.error(f"Erreur : {e}")
|
125 |
+
return ""
|
126 |
+
except ValueError as e:
|
127 |
+
st.error(f"Erreur : {e}")
|
128 |
+
return ""
|
129 |
+
except IOError as e:
|
130 |
+
st.error(f"Erreur lors de la lecture du fichier audio : {e}")
|
131 |
+
return ""
|
132 |
except Exception as e:
|
133 |
+
st.error(f"Une erreur inattendue s'est produite lors de la transcription : {e}")
|
134 |
return ""
|
135 |
|
136 |
|