- Pequena alteração no código para otimização do tempo de resposta. O comando FFmpeg é executado como um subprocesso PIPE, isto evita o carregamento do código do programa para a memória a cada execução em um bloco de áudio.
import os
import subprocess
import vosk
import pysrt
import json
# Caminho do arquivo de vídeo
video_file = "movie.mp4"
# Caminho do arquivo de saída (legendas em pt-BR)
output_file = "legendatraduzidaveloz.srt"
# Comando FFmpeg para extrair o áudio e converter para WAV
ffmpeg_command = f"ffmpeg -y -i {video_file} -vn -acodec pcm_s16le -ar 16000 -ac 1 -f wav -"
ffmpeg_process = subprocess.Popen(ffmpeg_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
# Carregar o modelo de idioma Vosk
model_path = "vosk-model-small-en-us-0.15"
model = vosk.Model(model_path)
sample_rate = 16000
# Inicializar o reconhecedor de fala Vosk
rec = vosk.KaldiRecognizer(model, sample_rate)
rec.SetWords(True)
# Configurações do bloco de áudio
block_size = 9 # Duração em segundos de cada bloco de áudio
# Realizar o reconhecimento de fala por blocos de áudio
subtitles = pysrt.SubRipFile()
start_time = 0
while True:
# Ler o próximo bloco de áudio do processo ffmpeg
audio_data = ffmpeg_process.stdout.read(sample_rate * 2 * block_size)
if len(audio_data) == 0:
break
# Realizar o reconhecimento de fala no bloco atual
rec.AcceptWaveform(audio_data)
result = rec.Result()
# Extrair o texto reconhecido do resultado
if result:
transcript = json.loads(result)["text"]
if transcript.strip(): # Verificar se o texto não está vazio
print(f"{start_time:.2f}s - {transcript}")
# Traduzir o texto para o português usando o translate-shell
translation_command = ["trans", "-b", "-no-ansi", "-no-warn", "-no-auto", "-no-bidi", "-s", "en", "-t", "pt-br"]
translation_process = subprocess.Popen(translation_command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
translation, _ = translation_process.communicate(input=transcript.strip().encode())
translation = translation.decode().strip()
print(f"{start_time:.2f}s - {translation}")
# Adicionar legenda traduzida ao arquivo de legendas
start_timestamp = pysrt.SubRipTime(seconds=start_time)
end_timestamp = pysrt.SubRipTime(seconds=start_time + block_size)
subtitles.append(pysrt.SubRipItem(index=len(subtitles) + 1, start=start_timestamp, end=end_timestamp, text=translation))
# Atualizar o tempo de início para o próximo bloco
start_time += block_size
# Fechar o processo ffmpeg
ffmpeg_process.stdout.close()
ffmpeg_process.wait()
# Salvar legendas em pt-BR
subtitles.save(output_file, encoding="utf-8")
print("Processo concluído. Legenda em pt-BR gerada em", output_file)