Woziii commited on
Commit
6e05e25
·
verified ·
1 Parent(s): a342efa

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +35 -26
app.py CHANGED
@@ -54,8 +54,11 @@ def transcribe_audio(audio_path):
54
  return "Erreur : Aucun timestamp détecté.", None, [], ""
55
 
56
  raw_transcription = " ".join([w["text"] for w in words])
 
 
57
  raw_transcription = correct_typography(raw_transcription)
58
-
 
59
  MARGIN = 0.06 # 60ms
60
  word_timestamps = []
61
 
@@ -63,9 +66,10 @@ def transcribe_audio(audio_path):
63
  start_time = w["timestamp"][0]
64
  end_time = w["timestamp"][1] if w["timestamp"][1] is not None else start_time + 0.5
65
 
 
66
  if i < len(words) - 1:
67
  next_start_time = words[i + 1]["timestamp"][0]
68
- end_time = min(end_time + MARGIN, next_start_time - 0.01)
69
 
70
  word_timestamps.append((w["text"], start_time, end_time))
71
 
@@ -115,41 +119,43 @@ def save_segments(table_data):
115
  # -------------------------------------------------
116
  def generate_zip(metadata_state, audio_path, zip_name):
117
  if isinstance(metadata_state, tuple):
118
- metadata_state = metadata_state[0]
119
 
120
  if metadata_state is None or metadata_state.empty:
121
  print("[LOG ERROR] Aucun segment valide trouvé pour la génération du ZIP.")
122
  return None
123
-
124
  zip_folder_name = f"{zip_name}_dataset"
125
  zip_path = os.path.join(TEMP_DIR, f"{zip_folder_name}.zip")
126
- metadata_csv_path = os.path.join(TEMP_DIR, "metadata.csv")
127
-
128
- metadata_state["ID"] = [f"{zip_name}_seg_{i+1:02d}" for i in range(len(metadata_state))]
129
- metadata_state["Texte"] = metadata_state["Texte"].apply(correct_typography)
130
- metadata_state["Commentaires"] = ""
131
- metadata_state.to_csv(metadata_csv_path, sep="|", index=False)
132
-
133
- with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf:
134
- zf.write(metadata_csv_path, "metadata.csv")
135
-
136
- print("[LOG] Fichier ZIP généré avec succès.")
137
- return zip_path
138
- if metadata_state is None or metadata_state.empty:
139
- return None
140
 
141
- zip_folder_name = f"{zip_name}_dataset"
142
- zip_path = os.path.join(TEMP_DIR, f"{zip_folder_name}.zip")
143
  metadata_csv_path = os.path.join(TEMP_DIR, "metadata.csv")
144
-
 
145
  metadata_state["ID"] = [f"{zip_name}_seg_{i+1:02d}" for i in range(len(metadata_state))]
146
- metadata_state["Texte"] = metadata_state["Texte"].apply(correct_typography)
 
147
  metadata_state["Commentaires"] = ""
 
 
 
 
 
148
  metadata_state.to_csv(metadata_csv_path, sep="|", index=False)
149
-
150
  with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf:
151
  zf.write(metadata_csv_path, "metadata.csv")
 
 
 
 
 
 
 
 
 
152
 
 
153
  return zip_path
154
 
155
  # -------------------------------------------------
@@ -158,17 +164,20 @@ def generate_zip(metadata_state, audio_path, zip_name):
158
  with gr.Blocks() as demo:
159
  gr.Markdown("# Application de Découpe Audio")
160
  metadata_state = gr.State(init_metadata_state())
 
161
  audio_input = gr.Audio(type="filepath", label="Fichier audio")
162
  zip_name = gr.Textbox(label="Nom du fichier ZIP", interactive=True)
163
  raw_transcription = gr.Textbox(label="Transcription", interactive=True)
164
  transcription_timestamps = gr.Textbox(label="Transcription avec Timestamps", interactive=True)
165
  table = gr.Dataframe(headers=["Texte", "Début (s)", "Fin (s)"], datatype=["str", "str", "str"], row_count=(1, "dynamic"))
166
  save_button = gr.Button("Enregistrer les segments")
 
167
  generate_button = gr.Button("Générer ZIP")
168
  zip_file = gr.File(label="Télécharger le ZIP")
 
169
 
170
- audio_input.change(transcribe_audio, inputs=audio_input, outputs=[raw_transcription, transcription_timestamps, audio_input])
171
- save_button.click(save_segments, inputs=table, outputs=[metadata_state])
172
  generate_button.click(generate_zip, inputs=[metadata_state, audio_input, zip_name], outputs=zip_file)
173
 
174
- demo.queue().launch()
 
54
  return "Erreur : Aucun timestamp détecté.", None, [], ""
55
 
56
  raw_transcription = " ".join([w["text"] for w in words])
57
+
58
+ # 🔄 Correction typographique AVANT affichage
59
  raw_transcription = correct_typography(raw_transcription)
60
+
61
+ # 🔄 Ajout des timestamps de fin avec marge de sécurité
62
  MARGIN = 0.06 # 60ms
63
  word_timestamps = []
64
 
 
66
  start_time = w["timestamp"][0]
67
  end_time = w["timestamp"][1] if w["timestamp"][1] is not None else start_time + 0.5
68
 
69
+ # Vérifier qu'on ne dépasse pas le début du mot suivant
70
  if i < len(words) - 1:
71
  next_start_time = words[i + 1]["timestamp"][0]
72
+ end_time = min(end_time + MARGIN, next_start_time - 0.01) # On laisse 10ms de sécurité
73
 
74
  word_timestamps.append((w["text"], start_time, end_time))
75
 
 
119
  # -------------------------------------------------
120
  def generate_zip(metadata_state, audio_path, zip_name):
121
  if isinstance(metadata_state, tuple):
122
+ metadata_state = metadata_state[0] # Extraire le DataFrame si c'est un tuple
123
 
124
  if metadata_state is None or metadata_state.empty:
125
  print("[LOG ERROR] Aucun segment valide trouvé pour la génération du ZIP.")
126
  return None
 
127
  zip_folder_name = f"{zip_name}_dataset"
128
  zip_path = os.path.join(TEMP_DIR, f"{zip_folder_name}.zip")
129
+ if os.path.exists(zip_path):
130
+ os.remove(zip_path)
 
 
 
 
 
 
 
 
 
 
 
 
131
 
 
 
132
  metadata_csv_path = os.path.join(TEMP_DIR, "metadata.csv")
133
+
134
+ # Assurer que les ID et fichiers audio correspondent
135
  metadata_state["ID"] = [f"{zip_name}_seg_{i+1:02d}" for i in range(len(metadata_state))]
136
+
137
+ # Ajouter une colonne "Commentaires" vide
138
  metadata_state["Commentaires"] = ""
139
+
140
+ # Réorganiser l’ordre des colonnes
141
+ metadata_state = metadata_state[["ID", "Texte", "Début (s)", "Fin (s)", "Commentaires"]]
142
+
143
+ # Sauvegarde du fichier CSV
144
  metadata_state.to_csv(metadata_csv_path, sep="|", index=False)
145
+
146
  with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf:
147
  zf.write(metadata_csv_path, "metadata.csv")
148
+ original_audio = AudioSegment.from_file(audio_path)
149
+
150
+ for _, row in metadata_state.iterrows():
151
+ start_ms, end_ms = int(row["Début (s)"] * 1000), int(row["Fin (s)"] * 1000)
152
+ segment_audio = original_audio[start_ms:end_ms]
153
+ segment_filename = f"{row['ID']}.wav"
154
+ segment_path = os.path.join(TEMP_DIR, segment_filename)
155
+ segment_audio.export(segment_path, format="wav")
156
+ zf.write(segment_path, segment_filename)
157
 
158
+ print("[LOG] Fichier ZIP généré avec succès.")
159
  return zip_path
160
 
161
  # -------------------------------------------------
 
164
  with gr.Blocks() as demo:
165
  gr.Markdown("# Application de Découpe Audio")
166
  metadata_state = gr.State(init_metadata_state())
167
+
168
  audio_input = gr.Audio(type="filepath", label="Fichier audio")
169
  zip_name = gr.Textbox(label="Nom du fichier ZIP", interactive=True)
170
  raw_transcription = gr.Textbox(label="Transcription", interactive=True)
171
  transcription_timestamps = gr.Textbox(label="Transcription avec Timestamps", interactive=True)
172
  table = gr.Dataframe(headers=["Texte", "Début (s)", "Fin (s)"], datatype=["str", "str", "str"], row_count=(1, "dynamic"))
173
  save_button = gr.Button("Enregistrer les segments")
174
+ save_message = gr.Markdown(label="📢 **Message de confirmation**")
175
  generate_button = gr.Button("Générer ZIP")
176
  zip_file = gr.File(label="Télécharger le ZIP")
177
+ word_timestamps = gr.State()
178
 
179
+ audio_input.change(transcribe_audio, inputs=audio_input, outputs=[raw_transcription, word_timestamps, transcription_timestamps, audio_input])
180
+ save_button.click(save_segments, inputs=table, outputs=[metadata_state, save_message])
181
  generate_button.click(generate_zip, inputs=[metadata_state, audio_input, zip_name], outputs=zip_file)
182
 
183
+ demo.queue().launch()