Spaces:
Paused
Paused
Download app.py from Easyworkstation/caspr: direct link, hf CLI and curl.
- Browser
- Download file 2.16 kB
-
https://huggingface.co/spaces/Easyworkstation/caspr/resolve/3219df34571d758c329fd60f95e08da8c8179c47/app.py
- Command line
-
hf download hf://spaces/Easyworkstation/caspr@3219df34571d758c329fd60f95e08da8c8179c47/app.py
-
curl -L -o app.py https://huggingface.co/spaces/Easyworkstation/caspr/resolve/3219df34571d758c329fd60f95e08da8c8179c47/app.py
2.16 kB
| import gradio as gr | |
| from transformers import AutoModelForSeq2SeqLM, AutoTokenizer | |
| from subprocess import run | |
| from faster_whisper import WhisperModel | |
| import json | |
| import tempfile | |
| # Carregar mapeamento de idiomas | |
| with open('language_codes.json', 'r') as f: | |
| lang_codes = json.load(f) | |
| # Inicializar modelos | |
| tokenizer = AutoTokenizer.from_pretrained("facebook/nllb-200-distilled-600M") | |
| model = AutoModelForSeq2SeqLM.from_pretrained("facebook/nllb-200-distilled-600M") | |
| whisper_model = WhisperModel("large-v2", device="cuda", compute_type="float16") | |
| def process_video(radio, video, target_language, use_wav2lip): | |
| # 1. Extrair áudio | |
| audio_file = tempfile.NamedTemporaryFile(suffix=".wav").name | |
| run(["ffmpeg", "-i", video.name, audio_file]) | |
| # 2. Transcrição | |
| segments, _ = whisper_model.transcribe(audio_file) | |
| transcript = " ".join([segment.text for segment in segments]) | |
| # 3. Tradução | |
| flores_code = lang_codes.get(target_language, "eng_Latn") | |
| inputs = tokenizer(transcript, return_tensors="pt") | |
| translated_tokens = model.generate(**inputs, forced_bos_token_id=tokenizer.lang_code_to_id[flores_code], max_length=100) | |
| translated_text = tokenizer.batch_decode(translated_tokens, skip_special_tokens=True)[0] | |
| # 4. Criar arquivo de legenda | |
| subtitle_file = tempfile.NamedTemporaryFile(suffix=".srt", delete=False).name | |
| with open(subtitle_file, "w") as f: | |
| f.write("1\n00:00:00,000 --> 00:00:10,000\n" + translated_text) | |
| # 5. Incorporar legenda | |
| output_video = tempfile.NamedTemporaryFile(suffix=".mp4", delete=False).name | |
| run(["ffmpeg", "-i", video.name, "-vf", f"subtitles={subtitle_file}", output_video]) | |
| return output_video | |
| # Interface Gradio | |
| iface = gr.Interface( | |
| fn=process_video, | |
| inputs=[ | |
| gr.Radio(["Upload", "Record"], value="Upload", show_label=False), | |
| gr.Video(), | |
| gr.Dropdown(choices=list(lang_codes.keys()), label="Target Language for Dubbing", value="English"), | |
| gr.Checkbox(label="Video has a close-up face. Use Wav2lip.", value=False) | |
| ], | |
| outputs=gr.Video(), | |
| live=False, | |
| title="AI Video Dubbing" | |
| ) | |
| iface.launch() | |