Spaces:
Paused
Paused
| import os | |
| import uuid | |
| from flask import Flask, request, render_template, redirect, url_for | |
| from gtts import gTTS | |
| from moviepy.editor import VideoFileClip, AudioFileClip | |
| from tqdm import tqdm | |
| import requests | |
| app = Flask(__name__) | |
| app.secret_key = os.environ.get('SECRET_KEY') or str(uuid.uuid4()) | |
| def index(): | |
| if request.method == 'POST': | |
| if 'video_file' in request.files: | |
| video_file = request.files['video_file'] | |
| elif 'video_url' in request.form: | |
| video_url = request.form['video_url'] | |
| response = requests.get(video_url) | |
| video_file = response.content | |
| language = request.form['language'] | |
| dubbed_video_file = generate_dubbed_video(video_file, language) | |
| return redirect(url_for('download', video_id=dubbed_video_file)) | |
| return render_template('index.html') | |
| def download(video_id): | |
| return render_template('download.html', video_id=video_id) | |
| def generate_dubbed_video(video_file, language): | |
| video_id = str(uuid.uuid4()) | |
| video = VideoFileClip(video_file) | |
| audio = video.audio | |
| text = audio.to_soundarray().tobytes() | |
| try: | |
| tts = gTTS(text=text.decode(), lang=language) | |
| except UnicodeDecodeError: | |
| tts = gTTS(text=text.decode(errors='ignore'), lang=language) | |
| tts.save(f'{video_id}.mp3') | |
| audio_clip = AudioFileClip(f'{video_id}.mp3') | |
| with tqdm(total=100, desc="Dubbing Progress", unit="%") as progress_bar: | |
| for i, frame in enumerate(video.iter_frames()): | |
| video.set_frame(i) | |
| audio_frame = audio_clip.get_frame(i / video.fps) | |
| video.audio = audio_frame | |
| progress_bar.update(i / len(video.iter_frames()) * 100) | |
| video.write_videofile(f'{video_id}.mp4', fps=video.fps) | |
| return video_id | |
| if __name__ == '__main__': | |
| app.run(host="0.0.0.0",port=7860,debug=True) |