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 |
|