File size: 3,608 Bytes
c598cb8
 
da7fa56
170db39
da7fa56
c598cb8
 
 
87b2f37
c598cb8
 
 
 
 
 
 
170db39
 
 
 
 
 
 
c598cb8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
170db39
3a1c0f5
 
 
87b2f37
 
 
3a1c0f5
 
 
 
b186a04
3a1c0f5
 
 
87b2f37
 
3a1c0f5
170db39
2b3778e
c598cb8
 
 
3a1c0f5
c598cb8
 
3a1c0f5
 
c598cb8
b186a04
c598cb8
da7fa56
c598cb8
170db39
c598cb8
 
170db39
da7fa56
 
87b2f37
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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)