segunda-feira, 24 de julho de 2023

Gerador de Legendas - 2.0

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

Nenhum comentário:

Postar um comentário