Spaces:
Running
on
Zero
Running
on
Zero
File size: 2,029 Bytes
0940c19 8b05224 0940c19 8b05224 0940c19 8b05224 0940c19 8b05224 0940c19 8b05224 c6771b3 0940c19 8b05224 0940c19 8b05224 0940c19 8b05224 0940c19 8b05224 0940c19 8b05224 0940c19 8b05224 0940c19 8b05224 0940c19 8b05224 |
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 |
# ============================
# get_footage.py (unchanged)
# ============================
# (contenu identique à la précédente version – pas de modification)
# ============================
# edit_video.py (révision => musique optionnelle et volume paramétrable)
# ============================
"""Assemble la voix IA et, si fourni, la musique de fond.
Appel :
edit_video(
video_path="./assets/video_music/video_silent.mp4",
audio_path="./assets/audio/voice.mp3",
music_path=None, # ou chemin .mp3 / .wav
output_path="./assets/output/final_video.mp4",
music_volume=0.10, # volume musique (0‑1)
)
"""
from moviepy import VideoFileClip, AudioFileClip, CompositeAudioClip
import os
def edit_video(
video_path: str,
audio_path: str,
music_path: str | None,
output_path: str,
*,
music_volume: float = 0.10,
):
video_clip = VideoFileClip(video_path)
voice_clip = AudioFileClip(audio_path)
tracks = [voice_clip]
if music_path and os.path.isfile(music_path):
try:
music_clip = (
AudioFileClip(music_path)
.with_volume_scaled(music_volume)
.with_duration(video_clip.duration)
)
tracks.insert(0, music_clip)
except Exception as err:
print(f"⚠️ Musique ignorée : {err}")
final_audio = CompositeAudioClip(tracks).with_duration(video_clip.duration)
final_clip = video_clip.with_audio(final_audio)
final_clip.write_videofile(
output_path,
codec="libx264",
audio_codec="aac",
fps=30,
threads=4,
preset="medium",
ffmpeg_params=["-pix_fmt", "yuv420p"],
)
print(f"✅ Vidéo générée : {output_path}")
video_clip.close()
voice_clip.close()
if "music_clip" in locals():
music_clip.close()
final_audio.close()
final_clip.close()
|