Spaces:
Sleeping
Sleeping
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() |