import sounddevice as sd import numpy as np import torchaudio import gradio as gr from scipy.io.wavfile import write import noisereduce as nr import torch from torchaudio.pipelines import WAV2VEC2_ASR_BASE_960H from datetime import timedelta # Configuración duration = 5 # Duración de la grabación en segundos sample_rate = 44100 # Frecuencia de muestreo # Cargar el modelo de transcripción de voz bundle = WAV2VEC2_ASR_BASE_960H asr_model = bundle.get_model() labels = bundle.get_labels() def record_audio(): # Grabar audio print("Grabando...") audio = sd.rec(int(duration * sample_rate), samplerate=sample_rate, channels=1, dtype='float64') sd.wait() # Esperar a que termine la grabación print("Grabación terminada.") # Guardar como archivo WAV write('recorded_audio.wav', sample_rate, audio) return 'recorded_audio.wav' def transcribe_audio(file): # Cargar el audio grabado waveform, sample_rate = torchaudio.load(file) # 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 # Esto puede ajustarse según sea necesario para definir la duración de 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(): # Grabar audio y luego transcribir audio_file = record_audio() transcription = transcribe_audio(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 ejemplos para la interfaz examples = [ ["Graba un saludo", "Hola, ¿cómo estás?"], ["Graba una presentación", "Soy un apasionado de la programación."], ["Graba una explicación", "El reconocimiento de voz es fascinante."], ] # Crear la interfaz Gradio iface = gr.Interface( fn=process_audio, inputs=None, outputs=["text", "file"], title="🎤 Grabador de Audio y Transcriptor a Subtítulos SRT 📜", description="👋 Bienvenido a nuestra aplicación de grabación y transcripción de audio a subtítulos. Graba tu voz y obtén la transcripción junto con un archivo SRT de subtítulos.", examples=examples, theme="default", layout="vertical", css=""" .title { color: #4A90E2; font-weight: bold; } .description { font-size: 16px; color: #555; } .footer { text-align: center; font-size: 12px; color: #777; } """, ) iface.launch()