DanLeBossDeESGI commited on
Commit
b6c0fb5
·
1 Parent(s): 7c2f065

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +62 -24
app.py CHANGED
@@ -7,6 +7,10 @@ import torch
7
  from diffusers import AudioLDMPipeline
8
  from transformers import AutoProcessor, ClapModel, BlipProcessor, BlipForConditionalGeneration
9
 
 
 
 
 
10
  # make Space compatible with CPU duplicates
11
  if torch.cuda.is_available():
12
  device = "cuda"
@@ -26,10 +30,6 @@ processor = AutoProcessor.from_pretrained("sanchit-gandhi/clap-htsat-unfused-m-f
26
 
27
  generator = torch.Generator(device)
28
 
29
- # Charger le modèle et le processeur Blip pour la description d'images
30
- image_caption_processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-base")
31
- image_caption_model = BlipForConditionalGeneration.from_pretrained("Salesforce/blip-image-captioning-base")
32
-
33
  # Streamlit app setup
34
  st.set_page_config(
35
  page_title="Text to Media",
@@ -41,8 +41,11 @@ st.title("Générateur de Diaporama Vidéo et Musique")
41
  # Sélectionnez les images
42
  uploaded_files = st.file_uploader("Sélectionnez des images (PNG, JPG, JPEG)", type=["png", "jpg", "jpeg"], accept_multiple_files=True)
43
 
 
 
 
44
  if uploaded_files:
45
- # Créez un répertoire temporaire pour stocker les images
46
  temp_dir = tempfile.mkdtemp()
47
 
48
  # Enregistrez les images téléchargées dans le répertoire temporaire
@@ -55,7 +58,7 @@ if uploaded_files:
55
  f.write(uploaded_file.read())
56
  image_paths.append(image_path)
57
 
58
- # Générez la légende pour chaque image
59
  try:
60
  image = Image.open(image_path).convert("RGB")
61
  inputs = image_caption_processor(image, return_tensors="pt")
@@ -65,18 +68,31 @@ if uploaded_files:
65
  except Exception as e:
66
  descriptions.append("Erreur lors de la génération de la légende")
67
 
68
- # Créez une vidéo à partir des images
69
- st.header("Création d'une Diapositive Vidéo")
 
 
 
 
 
 
 
 
70
 
71
- # Sélectionnez la durée d'affichage de chaque image avec une barre horizontale (en secondes)
72
- image_duration = st.slider("Sélectionnez la durée d'affichage de chaque image (en secondes)", 1, 10, 4)
73
 
74
- # Débit d'images par seconde (calculé en fonction de la durée de chaque image)
75
- frame_rate = 1 / image_duration
76
 
77
- image_clips = [ImageSequenceClip([image_path], fps=frame_rate, durations=[image_duration]) for image_path in image_paths]
78
 
79
- final_clip = concatenate_videoclips(image_clips, method="compose")
 
 
 
 
 
 
 
80
 
81
  # Générez de la musique à partir des descriptions
82
  st.header("Génération de Musique à partir des Descriptions")
@@ -87,24 +103,46 @@ if uploaded_files:
87
 
88
  # Configuration de la musique
89
  seed = st.number_input("Seed", value=45)
90
- music_duration = final_clip.duration # Assurez-vous que la durée de la musique correspond à la vidéo
 
 
 
 
 
 
 
 
 
 
 
 
91
 
92
  if st.button("Générer de la musique"):
93
  waveforms = pipe(
94
  music_input,
95
  audio_length_in_s=music_duration,
96
- guidance_scale=2.5, # Vous pouvez ajuster cette valeur
97
  num_inference_steps=100,
98
- num_waveforms_per_prompt=1,
99
  generator=generator.manual_seed(int(seed)),
100
  )["audios"]
101
 
102
- # Assurez-vous que la musique générée a la même durée que la vidéo
103
- if waveforms[0].shape[0] > final_clip.fps * final_clip.duration:
104
- waveforms[0] = waveforms[0][: int(final_clip.fps * final_clip.duration)]
 
 
 
 
 
 
 
 
105
 
106
- # Intégrez la musique dans la vidéo
107
- final_clip = final_clip.set_audio(waveforms[0].numpy())
 
 
 
 
108
 
109
- # Affichez la vidéo avec la musique intégrée
110
- st.video(final_clip, format="video/mp4", start_time=0)
 
7
  from diffusers import AudioLDMPipeline
8
  from transformers import AutoProcessor, ClapModel, BlipProcessor, BlipForConditionalGeneration
9
 
10
+ # Charger le modèle et le processeur Blip pour la description d'images
11
+ image_caption_processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-base")
12
+ image_caption_model = BlipForConditionalGeneration.from_pretrained("Salesforce/blip-image-captioning-base")
13
+
14
  # make Space compatible with CPU duplicates
15
  if torch.cuda.is_available():
16
  device = "cuda"
 
30
 
31
  generator = torch.Generator(device)
32
 
 
 
 
 
33
  # Streamlit app setup
34
  st.set_page_config(
35
  page_title="Text to Media",
 
41
  # Sélectionnez les images
42
  uploaded_files = st.file_uploader("Sélectionnez des images (PNG, JPG, JPEG)", type=["png", "jpg", "jpeg"], accept_multiple_files=True)
43
 
44
+ # Sélection de la durée d'affichage de chaque image avec une barre horizontale (en secondes)
45
+ image_duration = st.slider("Sélectionnez la durée d'affichage de chaque image (en secondes)", 1, 10, 4)
46
+
47
  if uploaded_files:
48
+ # Créer un répertoire temporaire pour stocker les images
49
  temp_dir = tempfile.mkdtemp()
50
 
51
  # Enregistrez les images téléchargées dans le répertoire temporaire
 
58
  f.write(uploaded_file.read())
59
  image_paths.append(image_path)
60
 
61
+ # Générer la légende pour chaque image
62
  try:
63
  image = Image.open(image_path).convert("RGB")
64
  inputs = image_caption_processor(image, return_tensors="pt")
 
68
  except Exception as e:
69
  descriptions.append("Erreur lors de la génération de la légende")
70
 
71
+ # Afficher les images avec leurs descriptions
72
+ for i, image_path in enumerate(image_paths):
73
+ st.image(image_path, caption=f"Description : {descriptions[i]}", use_column_width=True)
74
+
75
+ # Créer une vidéo à partir des images
76
+ if image_paths:
77
+ output_video_path = os.path.join(temp_dir, "slideshow.mp4")
78
+
79
+ # Débit d'images par seconde (calculé en fonction de la durée de chaque image)
80
+ frame_rate = 1 / image_duration
81
 
82
+ image_clips = [ImageSequenceClip([image_path], fps=frame_rate, durations=[image_duration]) for image_path in image_paths]
 
83
 
84
+ final_clip = concatenate_videoclips(image_clips, method="compose")
 
85
 
86
+ final_clip.write_videofile(output_video_path, codec='libx264', fps=frame_rate)
87
 
88
+ # Afficher la vidéo
89
+ st.video(open(output_video_path, 'rb').read())
90
+
91
+ # Supprimer le répertoire temporaire
92
+ for image_path in image_paths:
93
+ os.remove(image_path)
94
+ os.remove(output_video_path)
95
+ os.rmdir(temp_dir)
96
 
97
  # Générez de la musique à partir des descriptions
98
  st.header("Génération de Musique à partir des Descriptions")
 
103
 
104
  # Configuration de la musique
105
  seed = st.number_input("Seed", value=45)
106
+ music_duration = st.slider("Durée de la musique (en secondes)", 10, 180, 60, 10)
107
+ guidance_scale = st.slider("Guidance scale", 0.0, 4.0, 2.5, 0.5)
108
+ n_candidates = st.slider("Nombre de formes d'onde à générer", 1, 3, 3, 1)
109
+
110
+ def score_waveforms(text, waveforms):
111
+ inputs = processor(text=text, audios=list(waveforms), return_tensors="pt", padding=True)
112
+ inputs = {key: inputs[key].to(device) for key in inputs}
113
+ with torch.no_grad():
114
+ logits_per_text = clap_model(**inputs).logits_per_text
115
+ probs = logits_per_text.softmax(dim=-1)
116
+ most_probable = torch.argmax(probs)
117
+ waveform = waveforms[most_probable]
118
+ return waveform
119
 
120
  if st.button("Générer de la musique"):
121
  waveforms = pipe(
122
  music_input,
123
  audio_length_in_s=music_duration,
124
+ guidance_scale=guidance_scale,
125
  num_inference_steps=100,
126
+ num_waveforms_per_prompt=n_candidates if n_candidates else 1,
127
  generator=generator.manual_seed(int(seed)),
128
  )["audios"]
129
 
130
+ if waveforms.shape[0] > 1:
131
+ waveform = score_waveforms(music_input, waveforms)
132
+ else:
133
+ waveform = waveforms[0]
134
+
135
+ # Sauvegardez la musique générée dans un fichier temporaire
136
+ music_temp_path = os.path.join(temp_dir, "generated_music.wav")
137
+ waveform.save(music_temp_path)
138
+
139
+ # Afficher le lecteur audio
140
+ st.audio(open(music_temp_path, 'rb').read(), format="audio/wav", sample_rate=16000)
141
 
142
+ # Supprimer le répertoire temporaire
143
+ for image_path in image_paths:
144
+ os.remove(image_path)
145
+ os.remove(output_video_path)
146
+ os.remove(music_temp_path)
147
+ os.rmdir(temp_dir)
148