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()