0x07CB commited on
Commit
28363fc
·
unverified ·
1 Parent(s): 10ca27f

refactor: Amélioration de la robustesse de la transcription audio avec gestion des erreurs et fallback

Browse files
Files changed (1) hide show
  1. 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 temporaire en texte.
77
 
78
  Args:
79
- filepath Chemin vers le fichier audio temporaire à transcrire.
80
- language (Optional[str]): La langue de l'audio. Par défaut None.
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
- # Diviser l'audio en segments de taille maximale
94
- #segments = split_audio(f, max_size_mb)
95
- f.seek(0)
96
- audio = AudioSegment.from_file(f)
97
- duration_ms = len(audio)
98
- segment_duration_ms = int(
99
- (max_size_mb * 1024 * 1024 * 8) /
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
- if not( language ):
112
- response = client.audio.transcriptions.create(
113
- model="whisper-1",
114
- file=("audio.mp3", buffer),
115
- response_format="text"
116
- )
117
- else:
118
- response = client.audio.transcriptions.create(
119
- model="whisper-1",
120
- file=("audio.mp3", buffer),
121
- language=language,
122
- response_format="text"
123
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
 
125
- transcriptions.append(response)
126
-
127
- return " ".join(transcriptions)
 
 
 
 
 
 
128
  except Exception as e:
129
- print(f"Erreur lors de la transcription de l'audio : {e}")
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