File size: 7,053 Bytes
87fd27b
 
 
 
 
7c9adee
d63c5ba
 
87fd27b
 
3267fb2
 
d0f1298
 
 
87fd27b
3267fb2
 
87fd27b
3267fb2
 
 
 
 
7c9adee
3267fb2
 
 
 
 
d63c5ba
 
 
d0f1298
 
3267fb2
 
 
 
87fd27b
3267fb2
7c9adee
3267fb2
7c9adee
 
 
3267fb2
 
 
7c9adee
 
3267fb2
7c9adee
3267fb2
 
 
 
 
 
 
 
 
 
7c9adee
 
3267fb2
7c9adee
3267fb2
 
 
 
 
 
7c9adee
3267fb2
7c9adee
 
3267fb2
 
 
 
 
d63c5ba
 
3267fb2
7c9adee
d63c5ba
 
 
 
 
3267fb2
d63c5ba
 
3267fb2
d0f1298
 
 
 
 
 
 
 
 
 
 
 
 
 
d63c5ba
3267fb2
 
7c9adee
d63c5ba
3267fb2
7c9adee
d63c5ba
 
 
 
 
 
 
 
3267fb2
d63c5ba
3267fb2
d63c5ba
 
 
 
 
7c9adee
d0f1298
 
 
 
3267fb2
 
 
d0f1298
87fd27b
 
3267fb2
 
87fd27b
 
3267fb2
87fd27b
3267fb2
 
 
87fd27b
 
d0f1298
 
87fd27b
d63c5ba
3267fb2
d63c5ba
 
 
 
7c9adee
d63c5ba
d0f1298
3267fb2
87fd27b
7c9adee
87fd27b
 
 
 
d0f1298
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
172
173
174
175
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()