import asyncio import os from edge_tts import Communicate from moviepy.editor import AudioFileClip, CompositeVideoClip, ImageClip, TextClip import streamlit as st # Setup y'Urubuga (UI) st.set_page_config(page_title="Cartoon Video Generator", layout="centered") st.title("🎬 Cartoon Video Generator (Web Version)") st.write( "Shyiramo inyandiko z'ibiganiro bivugwa n'abantu babiri uze gukora Video!" ) # Inyandiko z'amajwi VOICE_A = "en-US-AnaNeural" VOICE_B = "en-US-ChristopherNeural" # Inputs z'urubuga (Form) text_a1 = st.text_input( "Cartoon A (Umuhungu/Umugore - Interuro 1):", "Mwaramutse! Wandikiye iki cyumweru mu kiganiro cyacu?", ) text_b1 = st.text_input( "Cartoon B (Umugabo - Interuro 1):", "Nanditse ku buryo bwo gukora amavideo ya cartoon ukoresheje kodi!", ) text_a2 = st.text_input( "Cartoon A (Interuro 2):", "Uuuh, birashoboka se? Nta bundi buhanga busabwa?", ) text_b2 = st.text_input( "Cartoon B (Interuro 2):", "Ego ko! Utanga text gusa kodi ikabyikorera!" ) # Function yo gukora amajwi async def generate_audio(script): audio_files = [] for i, item in enumerate(script): voice = VOICE_A if item["speaker"] == "A" else VOICE_B file_path = f"speech_{i}.mp3" communicate = Communicate(item["text"], voice) await communicate.save(file_path) audio_files.append((file_path, item["speaker"], item["text"])) return audio_files # Function yo guhuza Video def build_video(audio_data): video_clips = [] for file_path, speaker, text in audio_data: audio = AudioFileClip(file_path) duration = audio.duration img_name = "cartoon_a.png" if speaker == "A" else "cartoon_b.png" image_clip = ( ImageClip(img_name) .set_duration(duration) .resize(height=480) .set_position("center") ) txt_clip = TextClip( text, fontsize=24, color="white", bg_color="black", size=(640, None), method="caption", ) txt_clip = txt_clip.set_duration(duration).set_position( ("center", "bottom") ) composite = CompositeVideoClip([image_clip, txt_clip]).set_audio(audio) video_clips.append(composite) from moviepy.editor import concatenate_videoclips final_video = concatenate_videoclips(video_clips, method="compose") output_filename = "output_cartoon.mp4" final_video.write_videofile( output_filename, fps=24, codec="libx264", audio_codec="aac" ) return output_filename # Button yo gukora video ku rubuga if st.button("🚀 Gukora Video"): script = [ {"speaker": "A", "text": text_a1}, {"speaker": "B", "text": text_b1}, {"speaker": "A", "text": text_a2}, {"speaker": "B", "text": text_b2}, ] with st.spinner( "Tegereza gato... Biriko birakora amajwi n'amashusho..." ): # 1. Audio audio_data = asyncio.run(generate_audio(script)) # 2. Video video_file = build_video(audio_data) # Gusiba audio files y'agateganyo for f, _, _ in audio_data: if os.path.exists(f): os.remove(f) st.success("🎉 Video Yabonetse!") # Kwerekana Video ku rubuga st.video(video_file)