BOB / app.py
vic3610's picture
Update app.py
f3dc8dc verified
#!/usr/bin/env python3
"""
Application principale pour Hugging Face Space
"""
import gradio as gr
import os
import tempfile
from pathlib import Path
import sys
import traceback
# Ajouter le dossier courant au path
sys.path.append(os.path.dirname(__file__))
# Importer les modules nécessaires
try:
from transcribe_audio import transcribe_file, load_whisper_model, get_audio_files
from analyze_bob_hf import analyze_files_hf
print("✅ Modules importés avec succès")
MODULES_AVAILABLE = True
except Exception as e:
print(f"❌ Erreur d'import: {e}")
traceback.print_exc()
MODULES_AVAILABLE = False
def process_audio_file(audio_file):
"""Traite un fichier audio et retourne les résultats"""
try:
# Créer des dossiers temporaires
with tempfile.TemporaryDirectory() as temp_dir:
temp_path = Path(temp_dir)
input_dir = temp_path / "input"
output_dir = temp_path / "output"
transcriptions_dir = output_dir / "transcriptions"
input_dir.mkdir(parents=True, exist_ok=True)
output_dir.mkdir(parents=True, exist_ok=True)
transcriptions_dir.mkdir(parents=True, exist_ok=True)
print(f"📁 Dossiers créés: input={input_dir}, output={output_dir}")
# Copier le fichier audio
audio_path = input_dir / os.path.basename(audio_file)
import shutil
shutil.copy2(audio_file, audio_path)
print(f"📁 Fichier audio copié: {audio_path}")
# Configurer les variables d'environnement
os.environ["BOB_INPUT_DIR"] = str(input_dir)
os.environ["BOB_TRANSCRIPTIONS_DIR"] = str(transcriptions_dir)
os.environ["BOB_OUTPUT_FILE"] = str(output_dir / "resume_bob.txt")
os.environ["WHISPER_MODEL"] = "small" # Modèle léger pour le Space
os.environ["HF_MODEL"] = "google/gemma-3-4b-pt" # Gemma 3 4B FORCÉ
print("🔄 Début de la transcription...")
# Transcription
model = load_whisper_model("small")
success = transcribe_file(model, audio_path, transcriptions_dir)
if not success:
return "❌ Erreur de transcription", "❌ Erreur de transcription"
print("✅ Transcription terminée")
# Vérifier les fichiers de transcription
transcription_files = list(transcriptions_dir.glob("*_transcription.txt"))
print(f"📁 Fichiers de transcription trouvés: {len(transcription_files)}")
if not transcription_files:
return "✅ Transcription terminée", "❌ Aucun fichier de transcription généré"
# Lire et afficher la transcription
with open(transcription_files[0], 'r', encoding='utf-8') as f:
transcription_content = f.read()
print(f"📝 Transcription lue ({len(transcription_content)} caractères)")
print("🤖 Début de l'analyse...")
# Vérifier le contenu des dossiers avant analyse
print(f"🔍 Dossiers avant analyse:")
print(f" Input: {list(input_dir.iterdir())}")
print(f" Transcriptions: {list(transcriptions_dir.iterdir())}")
print(f" Output: {list(output_dir.iterdir())}")
# Analyse avec vérification étape par étape
try:
print("🔄 Appel de analyze_files_hf...")
result = analyze_files_hf(
transcriptions_dir=transcriptions_dir,
input_dir=input_dir,
output_file=output_dir / "resume_bob.txt",
log_fn=print
)
print(f"📊 Résultat de analyze_files_hf: {result}")
# Vérifier le contenu des dossiers APRÈS analyse
print(f"🔍 Dossiers après analyse:")
print(f" Output: {list(output_dir.iterdir())}")
# Vérifier si le fichier de résultat existe
resume_path = output_dir / "resume_bob.txt"
print(f"🔍 Recherche fichier: {resume_path}")
print(f"📁 Fichier existe: {resume_path.exists()}")
if resume_path.exists():
with open(resume_path, 'r', encoding='utf-8') as f:
resume_content = f.read()
print("✅ Fichier de résultat trouvé et lu")
else:
resume_content = f"❌ Fichier de résultat non trouvé\nChemin attendu: {resume_path}"
print("❌ Fichier de résultat non trouvé")
# Liste détaillée de tous les fichiers
print("📄 Contenu détaillé:")
for root, dirs, files in os.walk(temp_path):
for file in files:
full_path = os.path.join(root, file)
print(f" {full_path}")
return transcription_content, resume_content
except Exception as analyze_error:
error_details = f"❌ Erreur pendant l'analyse:\n{str(analyze_error)}\n\nTraceback:\n{traceback.format_exc()}"
print(error_details)
return transcription_content, error_details
except Exception as e:
error_msg = f"❌ Erreur générale:\n{str(e)}\n\nTraceback:\n{traceback.format_exc()}"
print(error_msg)
return error_msg, error_msg
# Interface Gradio
with gr.Blocks(title="BOB Processor") as demo:
gr.Markdown("# 🎵 BOB Processor")
gr.Markdown("### Transcription et analyse automatique de fichiers audio")
with gr.Row():
with gr.Column():
audio_input = gr.Audio(
label="🎤 Fichier audio à traiter",
type="filepath"
)
process_btn = gr.Button("▶️ Traiter le fichier")
with gr.Column():
transcription_output = gr.Textbox(
label="📝 Transcription",
lines=10
)
resume_output = gr.Textbox(
label="📋 Résumé analysé",
lines=10
)
process_btn.click(
process_audio_file,
inputs=[audio_input],
outputs=[transcription_output, resume_output],
show_progress=True, # Afficher la barre de progression
queue=True # Activer la queue pour éviter timeout
)
if __name__ == "__main__":
demo.launch(
max_threads=1, # Un seul thread pour éviter surcharge
show_error=True # Afficher les erreurs détaillées
)