import numpy as np from PIL import Image import tempfile from moviepy.editor import ImageClip, AudioArrayClip import scipy def create_video(image: "PIL.Image", audio: tuple, duration: float) -> str: # Convert image to numpy array img_array = np.array(image) # Unpack audio data sample_rate, audio_data = audio # Ensure audio is the correct duration target_samples = int(duration * sample_rate) if audio_data.shape[1] > target_samples: audio_data = audio_data[:, :target_samples] else: # Pad audio if too short padding = target_samples - audio_data.shape[1] audio_data = np.pad(audio_data, ((0, 0), (0, padding)), mode='constant') # Create video clip img_clip = ImageClip(img_array, duration=duration) # Create audio clip audio_clip = AudioArrayClip(audio_data.T, fps=sample_rate) img_clip = img_clip.set_audio(audio_clip) # Save to temporary file with tempfile.NamedTemporaryFile(suffix=".mp4", delete=False) as tmpfile: img_clip.write_videofile( tmpfile.name, fps=24, audio_codec="aac", logger=None ) return tmpfile.name