Spaces:
Running
Running
import os | |
import requests | |
import textwrap | |
from moviepy.editor import * | |
from gtts import gTTS | |
import gradio as gr | |
from transformers import pipeline | |
from tempfile import NamedTemporaryFile | |
from PIL import Image | |
from io import BytesIO | |
# Single Unsplash image for speed | |
UNSPLASH_IMAGE = "https://images.unsplash.com/photo-1603398938378-7c6a282eb53b" | |
# Lightweight text generation model | |
generator = pipeline("text-generation", model="tiiuae/falcon-rw-1b") | |
# Generate remedy script | |
def generate_script(topic): | |
prompt = f"Suggest a short 30-second natural home remedy for {topic}." | |
response = generator(prompt, max_new_tokens=60) | |
return response[0]["generated_text"].strip() | |
# Generate voice using gTTS | |
def generate_voice(text, lang="en"): | |
tts = gTTS(text=text, lang=lang) | |
temp_audio = NamedTemporaryFile(delete=False, suffix=".mp3") | |
tts.save(temp_audio.name) | |
return temp_audio.name | |
# Download one image | |
def download_image(): | |
response = requests.get(UNSPLASH_IMAGE) | |
img = Image.open(BytesIO(response.content)) | |
path = "image.jpg" | |
img.save(path) | |
return path | |
# Generate subtitle | |
def create_subtitle(text, duration, size): | |
wrapped = textwrap.fill(text, width=50) | |
txt_clip = TextClip(wrapped, fontsize=24, color='white', bg_color='black', size=(size[0], 80)) | |
return txt_clip.set_duration(duration).set_position(("center", size[1] - 100)) | |
# Generate video | |
def create_video(topic, script, audio_path, image_file): | |
audio_clip = AudioFileClip(audio_path) | |
duration = audio_clip.duration | |
img_clip = ImageClip(image_file).set_duration(duration).resize(height=480) | |
subtitle = create_subtitle(script, duration, img_clip.size) | |
video = CompositeVideoClip([img_clip.set_audio(audio_clip), subtitle]) | |
output_path = f"/tmp/{topic.replace(' ', '_')}_video.mp4" | |
video.write_videofile(output_path, fps=15, codec="libx264", audio_codec="aac") | |
return output_path | |
# Main function for Gradio | |
def generate_remedy(topic, language): | |
script = generate_script(topic) | |
lang_code = "ur" if language == "Urdu" else "en" | |
audio = generate_voice(script, lang=lang_code) | |
image = download_image() | |
video = create_video(topic, script, audio, image) | |
return video, script | |
# Gradio interface | |
iface = gr.Interface( | |
fn=generate_remedy, | |
inputs=[ | |
gr.Textbox(label="Enter medical condition (e.g., cough, headache)"), | |
gr.Radio(["English", "Urdu"], label="Narration Language") | |
], | |
outputs=[ | |
gr.Video(label="Generated Remedy Video"), | |
gr.Textbox(label="Remedy Script") | |
], | |
title="RemedyReels (Fast Mode)", | |
description="Quick AI home remedy video generator with voice-over, subtitles, and Unsplash image." | |
) | |
iface.launch() | |