Spaces:
Runtime error
Runtime error
File size: 5,933 Bytes
0c6352e 5bb0a67 baa52ab 5bb0a67 0767df8 27ab8aa 8389523 0c6352e b6c0fb5 e5318fd 0c6352e e5318fd 27ab8aa 0c6352e e5318fd 15b3fd6 1915b8d 0c6352e 27ab8aa 0c6352e e5318fd 27ab8aa 5bb0a67 27ab8aa 0c6352e e5318fd 701788b 07eb64a 701788b 07eb64a 701788b 5bb0a67 b6c0fb5 701788b 1915b8d 701788b b6c0fb5 07eb64a 701788b 5bb0a67 07eb64a b6c0fb5 07eb64a b6c0fb5 07eb64a b6c0fb5 e056e32 07eb64a b6c0fb5 e056e32 b6c0fb5 e056e32 b6c0fb5 07eb64a 8568ae2 07eb64a 0ce2084 b6c0fb5 a6bff9f 07eb64a b6c0fb5 641db5e |
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 |
import streamlit as st
import os
import tempfile
from moviepy.editor import ImageSequenceClip, concatenate_videoclips
from PIL import Image
import torch
from diffusers import AudioLDMPipeline
from transformers import AutoProcessor, ClapModel, BlipProcessor, BlipForConditionalGeneration
# Charger le modèle et le processeur Blip pour la description d'images
image_caption_processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-base")
image_caption_model = BlipForConditionalGeneration.from_pretrained("Salesforce/blip-image-captioning-base")
# make Space compatible with CPU duplicates
if torch.cuda.is_available():
device = "cuda"
torch_dtype = torch.float16
else:
device = "cpu"
torch_dtype = torch.float32
# load the diffusers pipeline
repo_id = "cvssp/audioldm-m-full"
pipe = AudioLDMPipeline.from_pretrained(repo_id, torch_dtype=torch_dtype).to(device)
pipe.unet = torch.compile(pipe.unet)
# CLAP model (only required for automatic scoring)
clap_model = ClapModel.from_pretrained("sanchit-gandhi/clap-htsat-unfused-m-full").to(device)
processor = AutoProcessor.from_pretrained("sanchit-gandhi/clap-htsat-unfused-m-full")
generator = torch.Generator(device)
# Streamlit app setup
st.set_page_config(
page_title="Text to Media",
page_icon="📷 🎵",
)
st.title("Générateur de Diaporama Vidéo et Musique")
# Sélectionnez les images
uploaded_files = st.file_uploader("Sélectionnez des images (PNG, JPG, JPEG)", type=["png", "jpg", "jpeg"], accept_multiple_files=True)
# Sélection de la durée d'affichage de chaque image avec une barre horizontale (en secondes)
image_duration = st.slider("Sélectionnez la durée d'affichage de chaque image (en secondes)", 1, 10, 4)
if uploaded_files:
# Créer un répertoire temporaire pour stocker les images
temp_dir = tempfile.mkdtemp()
# Enregistrez les images téléchargées dans le répertoire temporaire
image_paths = []
descriptions = [] # Pour stocker les descriptions générées
for i, uploaded_file in enumerate(uploaded_files):
image_path = os.path.join(temp_dir, uploaded_file.name)
with open(image_path, 'wb') as f:
f.write(uploaded_file.read())
image_paths.append(image_path)
# Générer la légende pour chaque image
try:
image = Image.open(image_path).convert("RGB")
inputs = image_caption_processor(image, return_tensors="pt")
out = image_caption_model.generate(**inputs)
caption = image_caption_processor.decode(out[0], skip_special_tokens=True)
descriptions.append(caption)
except Exception as e:
descriptions.append("Erreur lors de la génération de la légende")
# Afficher les images avec leurs descriptions
for i, image_path in enumerate(image_paths):
st.image(image_path, caption=f"Description : {descriptions[i]}", use_column_width=True)
# Créer une vidéo à partir des images
if image_paths:
output_video_path = os.path.join(temp_dir, "slideshow.mp4")
# Débit d'images par seconde (calculé en fonction de la durée de chaque image)
frame_rate = 1 / image_duration
image_clips = [ImageSequenceClip([image_path], fps=frame_rate, durations=[image_duration]) for image_path in image_paths]
final_clip = concatenate_videoclips(image_clips, method="compose")
final_clip.write_videofile(output_video_path, codec='libx264', fps=frame_rate)
# Afficher la vidéo
st.video(open(output_video_path, 'rb').read())
# Supprimer le répertoire temporaire
for image_path in image_paths:
os.remove(image_path)
os.remove(output_video_path)
os.rmdir(temp_dir)
# Générez de la musique à partir des descriptions
st.header("Génération de Musique à partir des Descriptions")
# Utilisez les descriptions générées pour la musique
music_input = "\n".join(descriptions)
st.text_area("Descriptions pour la musique", music_input, height=200)
# Configuration de la musique
seed = st.number_input("Seed", value=45)
music_duration = st.slider("Durée de la musique (en secondes)", 10, 180, 60, 10)
guidance_scale = st.slider("Guidance scale", 0.0, 4.0, 2.5, 0.5)
n_candidates = st.slider("Nombre de formes d'onde à générer", 1, 3, 3, 1)
def score_waveforms(text, waveforms):
inputs = processor(text=text, audios=list(waveforms), return_tensors="pt", padding=True)
inputs = {key: inputs[key].to(device) for key in inputs}
with torch.no_grad():
logits_per_text = clap_model(**inputs).logits_per_text
probs = logits_per_text.softmax(dim=-1)
most_probable = torch.argmax(probs)
waveform = waveforms[most_probable]
return waveform
if st.button("Générer de la musique"):
waveforms = pipe(
music_input,
audio_length_in_s=music_duration,
guidance_scale=guidance_scale,
num_inference_steps=100,
num_waveforms_per_prompt=n_candidates if n_candidates else 1,
generator=generator.manual_seed(int(seed)),
)["audios"]
if waveforms.shape[0] > 1:
waveform = score_waveforms(music_input, waveforms)
else:
waveform = waveforms[0]
# Sauvegardez la musique générée dans un fichier temporaire
music_temp_path = os.path.join(temp_dir, "generated_music.wav")
waveform.save(music_temp_path)
# Afficher le lecteur audio
st.audio(open(music_temp_path, 'rb').read(), format="audio/wav", sample_rate=16000)
# Supprimer le répertoire temporaire
for image_path in image_paths:
os.remove(image_path)
os.remove(output_video_path)
os.remove(music_temp_path)
os.rmdir(temp_dir)
|