Spaces:
Runtime error
Runtime error
| #!/usr/bin/env python3 | |
| """ | |
| Script de test pour vérifier le bon fonctionnement de l'application | |
| avant le déploiement sur Hugging Face Spaces. | |
| """ | |
| import os | |
| import sys | |
| import tempfile | |
| import numpy as np | |
| import soundfile as sf | |
| from pathlib import Path | |
| def test_imports(): | |
| """Test des imports nécessaires""" | |
| print("🔍 Test des imports...") | |
| try: | |
| import gradio as gr | |
| print("✅ Gradio importé avec succès") | |
| except ImportError as e: | |
| print(f"❌ Erreur import Gradio: {e}") | |
| return False | |
| try: | |
| import torch | |
| import torchaudio | |
| print("✅ PyTorch et TorchAudio importés avec succès") | |
| except ImportError as e: | |
| print(f"❌ Erreur import PyTorch: {e}") | |
| return False | |
| try: | |
| from transformers import Wav2Vec2Processor, Wav2Vec2ForCTC | |
| print("✅ Transformers importé avec succès") | |
| except ImportError as e: | |
| print(f"❌ Erreur import Transformers: {e}") | |
| return False | |
| try: | |
| from src.transcription import SpeechEncoder | |
| from src.sentiment import TextEncoder | |
| print("✅ Modules locaux importés avec succès") | |
| except ImportError as e: | |
| print(f"❌ Erreur import modules locaux: {e}") | |
| return False | |
| return True | |
| def test_audio_generation(): | |
| """Génère un fichier audio de test""" | |
| print("🎵 Génération d'un fichier audio de test...") | |
| # Créer un signal audio simple (1 seconde de silence avec un bip) | |
| sample_rate = 16000 | |
| duration = 1.0 | |
| t = np.linspace(0, duration, int(sample_rate * duration)) | |
| # Signal simple (440 Hz) | |
| audio = 0.1 * np.sin(2 * np.pi * 440 * t) | |
| # Sauvegarder | |
| test_audio_path = "test_audio.wav" | |
| sf.write(test_audio_path, audio, sample_rate) | |
| print(f"✅ Fichier audio de test créé: {test_audio_path}") | |
| return test_audio_path | |
| def test_model_loading(): | |
| """Test du chargement des modèles""" | |
| print("🤖 Test du chargement des modèles...") | |
| try: | |
| from transformers import Wav2Vec2Processor, Wav2Vec2ForCTC | |
| # Test avec un modèle plus petit pour les tests | |
| processor = Wav2Vec2Processor.from_pretrained( | |
| "facebook/wav2vec2-base-960h", | |
| cache_dir="./test_models" | |
| ) | |
| model = Wav2Vec2ForCTC.from_pretrained( | |
| "facebook/wav2vec2-base-960h", | |
| cache_dir="./test_models" | |
| ) | |
| print("✅ Modèles chargés avec succès") | |
| return True | |
| except Exception as e: | |
| print(f"❌ Erreur chargement modèles: {e}") | |
| return False | |
| def test_app_creation(): | |
| """Test de la création de l'application Gradio""" | |
| print("🎨 Test de la création de l'application...") | |
| try: | |
| import gradio as gr | |
| # Créer une interface simple | |
| def dummy_function(audio): | |
| return "Test transcription", "Test sentiment" | |
| demo = gr.Interface( | |
| fn=dummy_function, | |
| inputs=gr.Audio(type="filepath"), | |
| outputs=[gr.Textbox(), gr.Textbox()], | |
| title="Test App" | |
| ) | |
| print("✅ Application Gradio créée avec succès") | |
| return True | |
| except Exception as e: | |
| print(f"❌ Erreur création app: {e}") | |
| return False | |
| def test_file_structure(): | |
| """Vérifie la structure des fichiers""" | |
| print("📁 Vérification de la structure des fichiers...") | |
| required_files = [ | |
| "app.py", | |
| "requirements_hf.txt", | |
| "config.yaml", | |
| "README_HF.md", | |
| ".gitattributes", | |
| "src/__init__.py", | |
| "src/transcription.py", | |
| "src/sentiment.py", | |
| "src/multimodal.py", | |
| "src/inference.py" | |
| ] | |
| missing_files = [] | |
| for file_path in required_files: | |
| if not Path(file_path).exists(): | |
| missing_files.append(file_path) | |
| else: | |
| print(f"✅ {file_path}") | |
| if missing_files: | |
| print(f"❌ Fichiers manquants: {missing_files}") | |
| return False | |
| print("✅ Tous les fichiers requis sont présents") | |
| return True | |
| def test_requirements(): | |
| """Vérifie le fichier requirements""" | |
| print("📦 Vérification du fichier requirements...") | |
| try: | |
| with open("requirements_hf.txt", "r") as f: | |
| requirements = f.read() | |
| # Vérifier les dépendances essentielles | |
| essential_deps = ["gradio", "torch", "transformers", "soundfile"] | |
| missing_deps = [] | |
| for dep in essential_deps: | |
| if dep not in requirements: | |
| missing_deps.append(dep) | |
| if missing_deps: | |
| print(f"❌ Dépendances manquantes: {missing_deps}") | |
| return False | |
| print("✅ Fichier requirements valide") | |
| return True | |
| except Exception as e: | |
| print(f"❌ Erreur lecture requirements: {e}") | |
| return False | |
| def main(): | |
| """Fonction principale de test""" | |
| print("🚀 Démarrage des tests de déploiement...\n") | |
| tests = [ | |
| ("Structure des fichiers", test_file_structure), | |
| ("Fichier requirements", test_requirements), | |
| ("Imports", test_imports), | |
| ("Chargement modèles", test_model_loading), | |
| ("Création app", test_app_creation), | |
| ] | |
| results = [] | |
| for test_name, test_func in tests: | |
| print(f"\n{'='*50}") | |
| print(f"Test: {test_name}") | |
| print('='*50) | |
| try: | |
| result = test_func() | |
| results.append((test_name, result)) | |
| except Exception as e: | |
| print(f"❌ Erreur inattendue: {e}") | |
| results.append((test_name, False)) | |
| # Résumé | |
| print(f"\n{'='*50}") | |
| print("📊 RÉSUMÉ DES TESTS") | |
| print('='*50) | |
| passed = 0 | |
| total = len(results) | |
| for test_name, result in results: | |
| status = "✅ PASS" if result else "❌ FAIL" | |
| print(f"{test_name}: {status}") | |
| if result: | |
| passed += 1 | |
| print(f"\nRésultat: {passed}/{total} tests réussis") | |
| if passed == total: | |
| print("🎉 Tous les tests sont passés ! Votre projet est prêt pour le déploiement.") | |
| return True | |
| else: | |
| print("⚠️ Certains tests ont échoué. Corrigez les problèmes avant le déploiement.") | |
| return False | |
| if __name__ == "__main__": | |
| success = main() | |
| sys.exit(0 if success else 1) |