Spaces:
Build error
Build error
File size: 2,632 Bytes
11296df |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
import gradio as gr
import whisper
import torch
from transformers import MarianMTModel, MarianTokenizer
import ffmpeg
import requests
import os
import tempfile
# Configuração do Hugging Face e ElevenLabs
HF_MODEL = "Helsinki-NLP/opus-mt-mul-en"
ELEVENLABS_API_KEY = os.getenv("ELEVENLABS_API_KEY") # Defina essa variável no Hugging Face Spaces
# Carregar modelos
whisper_model = whisper.load_model("small")
translator = MarianMTModel.from_pretrained(HF_MODEL)
tokenizer = MarianTokenizer.from_pretrained(HF_MODEL)
# Função para transcrever áudio
def transcribe_audio(video_path: str) -> str:
result = whisper_model.transcribe(video_path)
return result["text"]
# Função para traduzir texto
def translate_text(text: str, target_lang="pt") -> str:
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
translated_tokens = translator.generate(**inputs)
return tokenizer.decode(translated_tokens[0], skip_special_tokens=True)
# Função para gerar áudio em português (usando ElevenLabs)
def synthesize_speech(text: str, voice="Antônio") -> str:
url = "https://api.elevenlabs.io/v1/text-to-speech"
headers = {"Authorization": f"Bearer {ELEVENLABS_API_KEY}"}
response = requests.post(url, json={"text": text, "voice": voice}, headers=headers)
temp_audio = tempfile.NamedTemporaryFile(delete=False, suffix=".mp3")
with open(temp_audio.name, "wb") as f:
f.write(response.content)
return temp_audio.name
# Função para substituir o áudio no vídeo
def replace_audio(video_path: str, new_audio_path: str) -> str:
output_path = video_path.replace(".mp4", "_translated.mp4")
ffmpeg.input(video_path).output(
output_path,
audio=new_audio_path,
codec="copy"
).run(overwrite_output=True)
return output_path
# Pipeline completo
def process_video(video_file):
with tempfile.NamedTemporaryFile(delete=False, suffix=".mp4") as temp_video:
temp_video.write(video_file.read())
video_path = temp_video.name
transcript = transcribe_audio(video_path)
translated_text = translate_text(transcript)
new_audio_path = synthesize_speech(translated_text)
output_video_path = replace_audio(video_path, new_audio_path)
return output_video_path
# Interface Gradio
iface = gr.Interface(
fn=process_video,
inputs=gr.File(label="Carregar Vídeo (MP4)"),
outputs=gr.File(label="Baixar Vídeo Traduzido"),
title="Tradutor de Vídeos para Português",
description="Faz a transcrição, tradução e substituição de áudio em vídeos automaticamente."
)
iface.launch()
|