File size: 7,436 Bytes
87fd27b
 
 
 
 
7c9adee
 
87fd27b
e70c7c9
7c9adee
87fd27b
3267fb2
 
e70c7c9
7c9adee
87fd27b
3267fb2
 
87fd27b
3267fb2
 
 
7c9adee
3267fb2
 
7c9adee
3267fb2
 
 
 
 
e70c7c9
7c9adee
 
e70c7c9
 
7c9adee
 
e70c7c9
7c9adee
3267fb2
 
 
 
87fd27b
7c9adee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3267fb2
7c9adee
3267fb2
7c9adee
 
 
3267fb2
 
 
7c9adee
 
3267fb2
7c9adee
3267fb2
 
 
 
 
 
 
 
 
 
7c9adee
 
3267fb2
7c9adee
3267fb2
 
 
 
 
 
7c9adee
3267fb2
7c9adee
 
3267fb2
 
 
 
 
e70c7c9
7c9adee
3267fb2
7c9adee
 
 
 
e70c7c9
 
 
 
 
7c9adee
 
 
c3a1adc
 
3267fb2
e70c7c9
 
3267fb2
7c9adee
3267fb2
 
7c9adee
3267fb2
7c9adee
e70c7c9
 
7c9adee
3267fb2
7c9adee
e70c7c9
 
7c9adee
 
 
 
 
 
e70c7c9
7c9adee
3267fb2
7c9adee
3267fb2
7c9adee
 
e70c7c9
7c9adee
e70c7c9
7c9adee
e70c7c9
3267fb2
 
 
e70c7c9
87fd27b
 
3267fb2
 
87fd27b
 
3267fb2
87fd27b
3267fb2
 
7c9adee
3267fb2
87fd27b
 
e70c7c9
7c9adee
87fd27b
e70c7c9
3267fb2
7c9adee
 
 
 
 
 
 
3267fb2
87fd27b
7c9adee
87fd27b
 
 
 
 
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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
import gradio as gr
import torch
from transformers import (
    BlipProcessor, 
    BlipForQuestionAnswering,
    pipeline,
    AutoTokenizer 
)
from modelscope.pipelines import pipeline as ms_pipeline
from modelscope.outputs import OutputKeys
from PIL import Image
import os
import logging
import tempfile
import moviepy.editor as mp

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class MultimodalProcessor:
    def __init__(self):
        self.load_models()
        self.temp_dir = tempfile.mkdtemp()
    
    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-base")
            
            # Initialisation du pipeline text-to-video ModelScope
            self.video_pipeline = ms_pipeline(
                'text-to-video-synthesis',
                model='damo/text-to-video-synthesis',
                model_revision='v1.0.0'
            )
            
            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 transcribe_video(self, video_path):
        """Transcrit une vidéo en utilisant Whisper"""
        try:
            if video_path is None:
                return ""
            
            # Extraction de l'audio de la vidéo
            video = mp.VideoFileClip(video_path)
            audio_path = os.path.join(self.temp_dir, "temp_audio.wav")
            video.audio.write_audiofile(audio_path, logger=None)
            
            # Transcription avec Whisper
            transcription = self.audio_transcriber(audio_path)["text"]
            
            # Nettoyage
            os.remove(audio_path)
            video.close()
            
            return transcription
        except Exception as e:
            logger.error(f"Erreur lors de la transcription vidéo: {str(e)}")
            return "Erreur lors de la transcription vidéo."

    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_video(self, prompt):
        """Génère une vidéo à partir d'un prompt"""
        try:
            if not prompt:
                return None
                
            output_path = os.path.join(self.temp_dir, "generated_video.mp4")
            result = self.video_pipeline({
                'text': prompt,
                'output_path': output_path
            })
            
            if os.path.exists(output_path):
                return output_path
            else:
                raise Exception("La vidéo n'a pas été générée correctement")
                
        except Exception as e:
            logger.error(f"Erreur lors de la génération de vidéo: {str(e)}")
            return None

    def process_inputs(self, image, audio, video, text):
        """Traite les entrées multimodales"""
        try:
            combined_input = []
            
            # Analyse de l'image
            if image is not None:
                image_desc = self.analyze_image(image)
                combined_input.append(f"Visual description: {image_desc}")
            
            # Transcription audio
            if audio is not None:
                audio_text = self.transcribe_audio(audio)
                combined_input.append(f"Audio content: {audio_text}")
            
            # Transcription vidéo
            if video is not None:
                video_text = self.transcribe_video(video)
                combined_input.append(f"Video content: {video_text}")
            
            # Ajout du texte additionnel
            if text:
                combined_input.append(f"Additional context: {text}")
            
            # Création du prompt final
            final_prompt = " ".join(combined_input) if combined_input else "Empty scene"
            
            # Génération de la vidéo
            output_video = self.generate_video(final_prompt)
            
            return output_video, final_prompt
            
        except Exception as e:
            logger.error(f"Erreur lors du traitement des entrées: {str(e)}")
            return None, "Une erreur est survenue lors du traitement des entrées."

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.Video(label="Télécharger une vidéo"),
            gr.Textbox(label="Entrez du texte additionnel")
        ],
        outputs=[
            gr.Video(label="Vidéo générée"),
            gr.Textbox(label="Prompt généré")
        ],
        title="Générateur de Vidéo Multimodal",
        description="""
        Cette application combine vos entrées multimodales pour générer une vidéo :
        - Images : analyse et description
        - Audio : transcription
        - Vidéo : transcription
        - Texte : contexte additionnel
        
        Le résultat est une nouvelle vidéo générée à partir de la description combinée.
        """
    )
    
    return interface

if __name__ == "__main__":
    interface = create_interface()
    interface.launch()