SubSync / app.py
mrblackdev's picture
Update app.py
170db39 verified
raw
history blame
2.88 kB
import numpy as np
import torchaudio
import gradio as gr
from pydub import AudioSegment
import noisereduce as nr
import torch
from torchaudio.pipelines import WAV2VEC2_ASR_BASE_960H
from datetime import timedelta
# Cargar el modelo de transcripción de voz
bundle = WAV2VEC2_ASR_BASE_960H
asr_model = bundle.get_model()
labels = bundle.get_labels()
def transcribe_audio(file):
# Cargar el audio grabado usando pydub
audio_segment = AudioSegment.from_file(file)
audio_segment = audio_segment.set_frame_rate(16000) # Cambiar la frecuencia de muestreo a 16 kHz
audio_segment.export("temp.wav", format="wav")
# Cargar el archivo WAV
waveform, sample_rate = torchaudio.load("temp.wav")
# Reducir el ruido
reduced_noise = nr.reduce_noise(y=waveform.numpy()[0], sr=sample_rate)
# Convertir de nuevo a tensor
reduced_waveform = torch.tensor(reduced_noise).unsqueeze(0)
# Asegurarse de que el audio está en la frecuencia de muestreo del modelo
if sample_rate != 16000:
resampler = torchaudio.transforms.Resample(orig_freq=sample_rate, new_freq=16000)
reduced_waveform = resampler(reduced_waveform)
# Realizar la transcripción usando el modelo de ASR
with torch.no_grad():
logits = asr_model(reduced_waveform)
# Obtener las predicciones de las etiquetas
predicted_ids = torch.argmax(logits, dim=-1)
# Convertir IDs a texto
transcription = ''.join([labels[i] for i in predicted_ids[0].tolist() if i < len(labels)])
return transcription.strip()
def format_as_srt(transcription):
# Dividir la transcripción en partes de ejemplo para los subtítulos
words = transcription.split()
srt_output = []
start_time = 0
end_time = 0
for i, word in enumerate(words):
start_time = end_time
end_time = start_time + 1 # Duración fija de 1 segundo por palabra (ajustar según necesidad)
# Formato SRT
srt_output.append(f"{i + 1}")
srt_output.append(f"{str(timedelta(seconds=start_time)).split('.')[0].replace(',', '.')},000 --> {str(timedelta(seconds=end_time)).split('.')[0].replace(',', '.')},000")
srt_output.append(f"{word}\n")
return ''.join(srt_output)
def process_audio(file):
# Transcribir el audio y generar subtítulos
transcription = transcribe_audio(file)
srt_content = format_as_srt(transcription)
# Guardar el contenido SRT en un archivo
with open('subtitles.srt', 'w') as f:
f.write(srt_content)
return transcription, 'subtitles.srt'
# Crear la interfaz Gradio
iface = gr.Interface(
fn=process_audio,
inputs="audio",
outputs=["text", "file"],
title="🎤 Grabador de Audio y Transcriptor a Subtítulos SRT 📜",
description="Graba tu voz y obtén la transcripción junto con un archivo SRT de subtítulos.",
)
iface.launch()