SubSync / app.py
mrblackdev's picture
Update app.py
3a1c0f5 verified
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
import os
# 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):
# Asegurarse de que el archivo de audio está siendo tratado correctamente
# El archivo puede venir como una tupla (ruta, tipo) o como un solo archivo
# Verifica si el archivo es una tupla
if isinstance(file, tuple):
audio_file_path = file[0]
else:
audio_file_path = file
# Comprobar si audio_file_path es realmente una cadena
if not isinstance(audio_file_path, str):
raise ValueError("El archivo de audio no es una cadena válida.")
# Verificar si el archivo realmente existe
import os
if not os.path.exists(audio_file_path):
raise ValueError(f"El archivo {audio_file_path} no existe o no es accesible.")
# Transcribir el audio y generar subtítulos
transcription = transcribe_audio(audio_file_path)
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(share=True)