SY23 / app.py
brightlembo's picture
Update app.py
d0f1298 verified
import gradio as gr
import torch
from transformers import (
BlipProcessor,
BlipForQuestionAnswering,
pipeline,
AutoTokenizer,
AutoModelForCausalLM
)
from PIL import Image
import os
import logging
# Vous devez ajouter ici l'importation de ModelscopeT2V, selon la documentation officielle
# Exemple fictif :
# from modelscope import T2V # Exemple, veuillez l'adapter à la bibliothèque correcte
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class MultimodalProcessor:
def __init__(self):
self.load_models()
def load_models(self):
"""Charge les modèles avec gestion d'erreurs"""
try:
logger.info("Chargement des modèles...")
self.blip_processor = BlipProcessor.from_pretrained("Salesforce/blip-vqa-base")
self.blip_model = BlipForQuestionAnswering.from_pretrained("Salesforce/blip-vqa-base")
self.audio_transcriber = pipeline("automatic-speech-recognition",
model="openai/whisper-small")
self.text_generator = pipeline("text-generation",
model="gpt2")
# Ajouter ModelscopeT2V ici
# self.modelscope_t2v = T2V.from_pretrained("modelscope/t2v-base")
logger.info("Modèles chargés avec succès")
except Exception as e:
logger.error(f"Erreur lors du chargement des modèles: {str(e)}")
raise
def analyze_image(self, image):
"""Analyse une image et retourne une description"""
try:
if image is None:
return ""
questions = [
"What is in the picture?",
"What are the main colors?",
"What is the setting or background?",
"What is happening in the image?",
]
responses = {}
for question in questions:
inputs = self.blip_processor(images=image, text=question, return_tensors="pt")
outputs = self.blip_model.generate(**inputs)
answer = self.blip_processor.decode(outputs[0], skip_special_tokens=True)
responses[question] = answer
description = (
f"This image shows {responses['What is in the picture?']}. "
f"The main colors are {responses['What are the main colors?']}. "
f"The setting is {responses['What is the setting or background?']}. "
f"In the scene, {responses['What is happening in the image?']}"
)
return description
except Exception as e:
logger.error(f"Erreur lors de l'analyse de l'image: {str(e)}")
return "Erreur lors de l'analyse de l'image."
def transcribe_audio(self, audio_path):
"""Transcrit un fichier audio"""
try:
if audio_path is None:
return ""
return self.audio_transcriber(audio_path)["text"]
except Exception as e:
logger.error(f"Erreur lors de la transcription audio: {str(e)}")
return "Erreur lors de la transcription audio."
def generate_text(self, prompt):
"""Génère du texte à partir d'un prompt"""
try:
if not prompt:
return ""
response = self.text_generator(prompt,
max_length=200,
num_return_sequences=1)[0]["generated_text"]
return response
except Exception as e:
logger.error(f"Erreur lors de la génération de texte: {str(e)}")
return "Erreur lors de la génération de texte."
def generate_video(self, prompt):
"""Génère une vidéo à partir du texte (prompt) en utilisant ModelscopeT2V"""
try:
# Utilisation de ModelscopeT2V pour générer une vidéo à partir du texte
# Supposons que ModelscopeT2V a une méthode `generate_video_from_text`
# video_url = self.modelscope_t2v.generate_video_from_text(prompt)
# Code fictif, adaptez-le à l'API réelle de ModelscopeT2V
video_url = "URL_fictive_de_la_video_générée" # Remplacez par le véritable lien
return video_url
except Exception as e:
logger.error(f"Erreur lors de la génération de vidéo: {str(e)}")
return "Erreur lors de la génération de la vidéo."
def process_inputs(self, image, audio, text):
"""Traite les entrées multimodales"""
try:
# Analyse de l'image
image_description = self.analyze_image(image) if image is not None else ""
# Transcription audio
audio_text = self.transcribe_audio(audio) if audio is not None else ""
# Combinaison des entrées
combined_input = ""
if image_description:
combined_input += f"Visual description: {image_description}\n"
if audio_text:
combined_input += f"Audio content: {audio_text}\n"
if text:
combined_input += f"Additional context: {text}\n"
# Génération du prompt final
if combined_input:
final_prompt = self.generate_text(combined_input)
else:
final_prompt = "Aucune entrée fournie."
# Génération de la vidéo à partir du texte généré
video_url = self.generate_video(final_prompt)
return final_prompt, video_url
except Exception as e:
logger.error(f"Erreur lors du traitement des entrées: {str(e)}")
return "Une erreur est survenue lors du traitement des entrées.", None
def create_interface():
"""Crée l'interface Gradio"""
processor = MultimodalProcessor()
interface = gr.Interface(
fn=processor.process_inputs,
inputs=[
gr.Image(type="pil", label="Télécharger une image"),
gr.Audio(type="filepath", label="Télécharger un fichier audio"),
gr.Textbox(label="Entrez du texte additionnel")
],
outputs=[
gr.Textbox(label="Description générée"),
gr.Video(label="Vidéo générée")
],
title="Analyseur de Contenu Multimodal",
description="""
Cette application analyse vos contenus multimodaux :
- Images : génère une description détaillée
- Audio : transcrit le contenu
- Texte : enrichit la description
La sortie combine toutes ces informations en une description cohérente.
Elle génère également une vidéo basée sur le texte final.
"""
)
return interface
if __name__ == "__main__":
interface = create_interface()
interface.launch()