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)