rick commited on
Commit
3620857
·
unverified ·
1 Parent(s): 22f4250

align to PEP8

Browse files
Files changed (1) hide show
  1. app.py +58 -51
app.py CHANGED
@@ -7,23 +7,24 @@ import re
7
  import tempfile
8
  import time
9
  from os import getenv
10
- from typing import Any, Optional, Union
11
 
12
  # Third-party libraries
13
  import streamlit as st
14
  from audiorecorder import audiorecorder
15
  from openai import OpenAI
16
  from pydub import AudioSegment
 
17
 
18
- def load_ui_language(file_path: Optional[str] = "ui_lang_support.json") -> dict:
19
  """
20
- Load UI language translations from a JSON file.
21
 
22
  Args:
23
- file_path (Optional[str]): Path to the JSON file containing translations.
24
 
25
  Returns:
26
- dict: A dictionary containing UI language translations.
27
  """
28
  try:
29
  with open(file_path, 'r', encoding='utf-8') as file:
@@ -41,30 +42,30 @@ def load_ui_language(file_path: Optional[str] = "ui_lang_support.json") -> dict:
41
  # Dictionary to store translations
42
  translations = load_ui_language()
43
 
44
- def get_translation(key):
45
  """
46
- Get translation for a given key based on the selected interface language.
47
 
48
  Args:
49
- key (str): The translation key.
50
 
51
  Returns:
52
- str: The translated text.
53
  """
54
  return translations[st.session_state.interface_language][key]
55
 
56
  # OpenAI client configuration with API key
57
  client = OpenAI(api_key=getenv("OPENAI_API_KEY"))
58
 
59
- def read_file(file_name):
60
  """
61
- Read and return the content of text files.
62
 
63
  Args:
64
- file_name (str): The name of the file to read.
65
 
66
  Returns:
67
- str: The content of the file or an error message.
68
  """
69
  try:
70
  with open(file_name, 'r', encoding='utf-8') as file:
@@ -75,16 +76,16 @@ def read_file(file_name):
75
  except IOError as e:
76
  return f"{get_translation('erreur_lecture_fichier')} {str(e)}"
77
 
78
- def split_audio(audio_file, max_size_mb=25):
79
  """
80
- Split an audio file into segments of 25 MB or less.
81
 
82
  Args:
83
- audio_file (str): Path to the audio file.
84
- max_size_mb (int): Maximum size of each segment in MB.
85
 
86
  Returns:
87
- list: List of paths to the split audio segments.
88
  """
89
  try:
90
  audio = AudioSegment.from_wav(audio_file)
@@ -111,16 +112,16 @@ def split_audio(audio_file, max_size_mb=25):
111
  return []
112
 
113
  # Fonction modifiée pour transcrire l'audio en texte
114
- def transcribe_audio(audio_file, language=None):
115
  """
116
- Transcribe audio file to text.
117
 
118
  Args:
119
- audio_file (file): The audio file to transcribe.
120
- language (str, optional): The language of the audio. Defaults to None.
121
 
122
  Returns:
123
- str: The transcribed text.
124
  """
125
  max_size_mb = 25
126
  file_size_mb = os.path.getsize(audio_file.name) / (1024 * 1024)
@@ -137,7 +138,7 @@ def transcribe_audio(audio_file, language=None):
137
  language=language
138
  )
139
  full_transcript += f"{transcript.text} "
140
- os.unlink(segment) # Delete temporary file
141
  return full_transcript.strip()
142
  else:
143
  with open(audio_file.name, "rb") as audio_file:
@@ -155,13 +156,13 @@ def transcribe_audio(audio_file, language=None):
155
  return ""
156
 
157
  # Fonction pour détecter la langue d'un texte donné
158
- def detect_language(input_text, temperature=0.01):
159
  """
160
  Détecte la langue d'un texte donné.
161
 
162
  Args:
163
  input_text (str): Le texte dont il faut détecter la langue.
164
- temperature (float, optional): La température pour le modèle de langage. Par défaut à 0.01.
165
 
166
  Returns:
167
  str: La langue détectée au format ISO-639-1.
@@ -202,15 +203,15 @@ def detect_language(input_text, temperature=0.01):
202
  except Exception as e:
203
  raise ValueError(f"Erreur inattendue lors de la détection de la langue : {str(e)}")
204
 
205
- def get_duration_pydub(audio_file):
206
  """
207
- Get the duration of an audio file using pydub.
208
 
209
  Args:
210
- audio_file (str): Path to the audio file.
211
 
212
  Returns:
213
- float: Duration of the audio file in seconds.
214
  """
215
  try:
216
  audio = AudioSegment.from_file(audio_file)
@@ -222,15 +223,15 @@ def get_duration_pydub(audio_file):
222
  print(f"Erreur lors de la lecture du fichier audio : {str(e)}")
223
  return 0.0
224
 
225
- def text_to_speech(text):
226
  """
227
- Convert text to speech using the OpenAI API.
228
 
229
  Args:
230
- text (str): The text to convert to speech.
231
 
232
  Returns:
233
- tuple: A tuple containing the audio bytes and the duration of the audio in seconds.
234
  """
235
  try:
236
  response = client.audio.speech.create(
@@ -239,15 +240,15 @@ def text_to_speech(text):
239
  input=text
240
  )
241
 
242
- # Save the audio to a temporary file
243
  with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as temp_audio:
244
  response.stream_to_file(temp_audio.name)
245
 
246
- # Read the content of the audio file
247
  with open(temp_audio.name, "rb") as audio_file:
248
  audio_bytes = audio_file.read()
249
 
250
- # Get the duration of the audio in seconds
251
  audio_duration = get_duration_pydub(temp_audio.name)
252
 
253
  return audio_bytes, audio_duration
@@ -255,15 +256,16 @@ def text_to_speech(text):
255
  print(f"Erreur lors de la conversion texte-parole : {str(e)}")
256
  return None, 0.0
257
 
258
- def concatenate_audio_files(audio_list):
259
  """
260
  Concatène plusieurs fichiers audio avec des effets sonores.
261
 
262
  Args:
263
- audio_list (list): Une liste de tuples, chacun contenant des octets audio et la durée.
 
264
 
265
  Returns:
266
- bytes: L'audio concaténé sous forme d'octets.
267
  """
268
  # Créer un segment audio vide
269
  final_audio = AudioSegment.empty()
@@ -298,19 +300,24 @@ def concatenate_audio_files(audio_list):
298
  print(f"Une erreur inattendue s'est produite : {e}")
299
  return None
300
 
301
- def process_message(message, operation_prompt="", tts_enabled=False):
 
 
 
 
302
  """
303
- Process user messages and generate a response.
304
 
305
  Args:
306
- message (str): The user's input message.
307
- operation_prompt (str, optional): Additional prompt for operation. Defaults to "".
308
- tts_enabled (bool, optional): Whether text-to-speech is enabled. Defaults to False.
309
 
310
  Returns:
311
- tuple: A tuple containing the TTS audio and its duration, or (None, None) if TTS is disabled.
 
312
  """
313
- payload_content = '{} :\n"""\n{}\n"""'.format(operation_prompt, message)
314
 
315
  st.session_state.messages.append({"role": "user", "content": payload_content})
316
  with st.chat_message("user"):
@@ -327,11 +334,11 @@ def process_message(message, operation_prompt="", tts_enabled=False):
327
  temperature=0.1):
328
  full_response += (response.choices[0].delta.content or "")
329
  message_placeholder.markdown(full_response + "▌")
330
- # Use regex to remove the first and last three double quotes
331
  full_response = re.sub(r'^"{3}|"{3}$', '', full_response.strip())
332
  message_placeholder.markdown(full_response)
333
  except Exception as e:
334
- st.error("Une erreur s'est produite lors de la génération de la réponse : {}".format(str(e)))
335
  return None, None
336
 
337
  st.session_state.messages.append(
@@ -343,7 +350,7 @@ def process_message(message, operation_prompt="", tts_enabled=False):
343
  tts_audio, tts_duration = text_to_speech(full_response)
344
  return tts_audio, tts_duration
345
  except Exception as e:
346
- st.error("Une erreur s'est produite lors de la conversion texte-parole : {}".format(str(e)))
347
  return None, None
348
  return None, None
349
 
@@ -635,4 +642,4 @@ def main():
635
 
636
  # Point d'entrée de l'application
637
  if __name__ == "__main__":
638
- main()
 
7
  import tempfile
8
  import time
9
  from os import getenv
10
+ from typing import Any, Optional, Union, Dict, List, Tuple, IO
11
 
12
  # Third-party libraries
13
  import streamlit as st
14
  from audiorecorder import audiorecorder
15
  from openai import OpenAI
16
  from pydub import AudioSegment
17
+ import requests
18
 
19
+ def load_ui_language(file_path: Optional[str] = "ui_lang_support.json") -> Dict[str, Any]:
20
  """
21
+ Charge les traductions de l'interface utilisateur à partir d'un fichier JSON.
22
 
23
  Args:
24
+ file_path (Optional[str]): Chemin vers le fichier JSON contenant les traductions.
25
 
26
  Returns:
27
+ Dict[str, Any]: Un dictionnaire contenant les traductions de l'interface utilisateur.
28
  """
29
  try:
30
  with open(file_path, 'r', encoding='utf-8') as file:
 
42
  # Dictionary to store translations
43
  translations = load_ui_language()
44
 
45
+ def get_translation(key: str) -> str:
46
  """
47
+ Obtient la traduction pour une clé donnée basée sur la langue d'interface sélectionnée.
48
 
49
  Args:
50
+ key (str): La clé de traduction.
51
 
52
  Returns:
53
+ str: Le texte traduit.
54
  """
55
  return translations[st.session_state.interface_language][key]
56
 
57
  # OpenAI client configuration with API key
58
  client = OpenAI(api_key=getenv("OPENAI_API_KEY"))
59
 
60
+ def read_file(file_name: str) -> str:
61
  """
62
+ Lit et retourne le contenu des fichiers texte.
63
 
64
  Args:
65
+ file_name (str): Le nom du fichier à lire.
66
 
67
  Returns:
68
+ str: Le contenu du fichier ou un message d'erreur.
69
  """
70
  try:
71
  with open(file_name, 'r', encoding='utf-8') as file:
 
76
  except IOError as e:
77
  return f"{get_translation('erreur_lecture_fichier')} {str(e)}"
78
 
79
+ def split_audio(audio_file: str, max_size_mb: int = 25) -> List[str]:
80
  """
81
+ Divise un fichier audio en segments de 25 Mo ou moins.
82
 
83
  Args:
84
+ audio_file (str): Chemin vers le fichier audio.
85
+ max_size_mb (int): Taille maximale de chaque segment en Mo.
86
 
87
  Returns:
88
+ List[str]: Liste des chemins vers les segments audio divisés.
89
  """
90
  try:
91
  audio = AudioSegment.from_wav(audio_file)
 
112
  return []
113
 
114
  # Fonction modifiée pour transcrire l'audio en texte
115
+ def transcribe_audio(audio_file: IO, language: Optional[str] = None) -> str:
116
  """
117
+ Transcrit un fichier audio en texte.
118
 
119
  Args:
120
+ audio_file (IO): Le fichier audio à transcrire.
121
+ language (Optional[str]): La langue de l'audio. Par défaut None.
122
 
123
  Returns:
124
+ str: Le texte transcrit.
125
  """
126
  max_size_mb = 25
127
  file_size_mb = os.path.getsize(audio_file.name) / (1024 * 1024)
 
138
  language=language
139
  )
140
  full_transcript += f"{transcript.text} "
141
+ os.unlink(segment) # Supprime le fichier temporaire
142
  return full_transcript.strip()
143
  else:
144
  with open(audio_file.name, "rb") as audio_file:
 
156
  return ""
157
 
158
  # Fonction pour détecter la langue d'un texte donné
159
+ def detect_language(input_text: str, temperature: float = 0.01) -> str:
160
  """
161
  Détecte la langue d'un texte donné.
162
 
163
  Args:
164
  input_text (str): Le texte dont il faut détecter la langue.
165
+ temperature (float): La température pour le modèle de langage. Par défaut à 0.01.
166
 
167
  Returns:
168
  str: La langue détectée au format ISO-639-1.
 
203
  except Exception as e:
204
  raise ValueError(f"Erreur inattendue lors de la détection de la langue : {str(e)}")
205
 
206
+ def get_duration_pydub(audio_file: str) -> float:
207
  """
208
+ Obtient la durée d'un fichier audio en utilisant pydub.
209
 
210
  Args:
211
+ audio_file (str): Chemin vers le fichier audio.
212
 
213
  Returns:
214
+ float: Durée du fichier audio en secondes.
215
  """
216
  try:
217
  audio = AudioSegment.from_file(audio_file)
 
223
  print(f"Erreur lors de la lecture du fichier audio : {str(e)}")
224
  return 0.0
225
 
226
+ def text_to_speech(text: str) -> Tuple[Optional[bytes], float]:
227
  """
228
+ Convertit du texte en parole en utilisant l'API OpenAI.
229
 
230
  Args:
231
+ text (str): Le texte à convertir en parole.
232
 
233
  Returns:
234
+ Tuple[Optional[bytes], float]: Un tuple contenant les octets audio et la durée de l'audio en secondes.
235
  """
236
  try:
237
  response = client.audio.speech.create(
 
240
  input=text
241
  )
242
 
243
+ # Sauvegarde l'audio dans un fichier temporaire
244
  with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as temp_audio:
245
  response.stream_to_file(temp_audio.name)
246
 
247
+ # Lit le contenu du fichier audio
248
  with open(temp_audio.name, "rb") as audio_file:
249
  audio_bytes = audio_file.read()
250
 
251
+ # Obtient la durée de l'audio en secondes
252
  audio_duration = get_duration_pydub(temp_audio.name)
253
 
254
  return audio_bytes, audio_duration
 
256
  print(f"Erreur lors de la conversion texte-parole : {str(e)}")
257
  return None, 0.0
258
 
259
+ def concatenate_audio_files(audio_list: List[Tuple[bytes, float]]) -> Optional[bytes]:
260
  """
261
  Concatène plusieurs fichiers audio avec des effets sonores.
262
 
263
  Args:
264
+ audio_list (List[Tuple[bytes, float]]): Une liste de tuples, chacun contenant
265
+ des octets audio et la durée.
266
 
267
  Returns:
268
+ Optional[bytes]: L'audio concaténé sous forme d'octets, ou None en cas d'erreur.
269
  """
270
  # Créer un segment audio vide
271
  final_audio = AudioSegment.empty()
 
300
  print(f"Une erreur inattendue s'est produite : {e}")
301
  return None
302
 
303
+ def process_message(
304
+ message: str,
305
+ operation_prompt: str = "",
306
+ tts_enabled: bool = False
307
+ ) -> Tuple[Optional[bytes], Optional[float]]:
308
  """
309
+ Traite les messages des utilisateurs et génère une réponse.
310
 
311
  Args:
312
+ message (str): Le message d'entrée de l'utilisateur.
313
+ operation_prompt (str, optional): Prompt supplémentaire pour l'opération. Par défaut "".
314
+ tts_enabled (bool, optional): Si la synthèse vocale est activée. Par défaut False.
315
 
316
  Returns:
317
+ Tuple[Optional[bytes], Optional[float]]: Un tuple contenant l'audio TTS et sa durée,
318
+ ou (None, None) si TTS est désactivé ou en cas d'erreur.
319
  """
320
+ payload_content = f'{operation_prompt} :\n"""\n{message}\n"""'
321
 
322
  st.session_state.messages.append({"role": "user", "content": payload_content})
323
  with st.chat_message("user"):
 
334
  temperature=0.1):
335
  full_response += (response.choices[0].delta.content or "")
336
  message_placeholder.markdown(full_response + "▌")
337
+ # Utiliser regex pour supprimer les trois premiers et derniers guillemets doubles
338
  full_response = re.sub(r'^"{3}|"{3}$', '', full_response.strip())
339
  message_placeholder.markdown(full_response)
340
  except Exception as e:
341
+ st.error(f"Une erreur s'est produite lors de la génération de la réponse : {e}")
342
  return None, None
343
 
344
  st.session_state.messages.append(
 
350
  tts_audio, tts_duration = text_to_speech(full_response)
351
  return tts_audio, tts_duration
352
  except Exception as e:
353
+ st.error(f"Une erreur s'est produite lors de la conversion texte-parole : {e}")
354
  return None, None
355
  return None, None
356
 
 
642
 
643
  # Point d'entrée de l'application
644
  if __name__ == "__main__":
645
+ main()