File size: 6,980 Bytes
b9de932
 
 
 
 
 
 
 
 
 
f7440f5
b9de932
 
 
 
f7440f5
b9de932
 
 
 
f7440f5
b9de932
 
f7440f5
 
b9de932
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f7440f5
 
b9de932
 
 
 
f7440f5
b9de932
 
 
 
 
 
fd154f2
f7440f5
 
b9de932
 
 
 
 
 
f7440f5
b9de932
f7440f5
b9de932
ac4b38a
f7440f5
ac4b38a
 
 
 
 
 
 
 
 
f7440f5
 
 
ac4b38a
 
 
 
 
b9de932
ac4b38a
f7440f5
ac4b38a
f7440f5
 
 
 
 
 
ac4b38a
 
 
 
 
f7440f5
 
 
 
ac4b38a
f7440f5
 
 
 
 
 
ac4b38a
f7440f5
ac4b38a
 
 
 
 
 
f7440f5
 
 
 
ac4b38a
 
 
b9de932
 
f7440f5
 
 
b9de932
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
878a227
f3dc8dc
b9de932
 
 
878a227
 
 
b9de932
 
 
878a227
 
 
f3dc8dc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#!/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
    )