File size: 4,854 Bytes
cf6ce9f
bad5c84
c945b9f
c887c55
844ccec
740442f
9951904
 
 
 
 
 
 
844ccec
c887c55
9cf7fd7
c887c55
9951904
9cf7fd7
 
 
 
 
 
c887c55
9951904
c887c55
bad5c84
9951904
5c66e9e
844ccec
 
9951904
844ccec
5c66e9e
9951904
 
5c66e9e
844ccec
9951904
 
9cf7fd7
844ccec
 
9cf7fd7
844ccec
 
9951904
5c66e9e
9cf7fd7
bad5c84
9cf7fd7
 
 
 
 
bad5c84
9cf7fd7
bad5c84
9cf7fd7
bad5c84
 
9cf7fd7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bad5c84
9cf7fd7
 
5c66e9e
9d418f0
bad5c84
9951904
bad5c84
891196b
9cf7fd7
 
 
 
 
 
 
844ccec
9cf7fd7
 
844ccec
bad5c84
9cf7fd7
 
 
 
 
 
 
 
 
 
bad5c84
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import os
import gradio as gr
import replicate
from pydub import AudioSegment
from fpdf import FPDF

# Aseg煤rate de que REPLICATE_API_TOKEN est茅 configurado en las variables de entorno
replicate_token = os.getenv("REPLICATE_API_TOKEN")

if not replicate_token:
    raise ValueError("No se ha encontrado el token de API de Replicate.")

# Funci贸n para dividir el archivo de audio en segmentos de duraci贸n definida (en milisegundos)
def dividir_audio(audio_path, segment_duration_ms=5*60*1000):
    audio = AudioSegment.from_file(audio_path)
    audio_length = len(audio)
    segments = []

    # Divide el audio en fragmentos de la duraci贸n especificada
    for i in range(0, audio_length, segment_duration_ms):
        segment = audio[i:i + segment_duration_ms]  # Cada fragmento de hasta la duraci贸n especificada
        segment_path = f"segment_{i // (60 * 1000)}.wav"  # Nombre del archivo con el 铆ndice del minuto
        segment.export(segment_path, format="wav")  # Exporta el fragmento como un archivo WAV
        
        segments.append(segment_path)
    
    return segments

# Funci贸n para crear el PDF con barra de progreso
def crear_pdf(transcripcion, progress=gr.Progress()):
    pdf = FPDF()
    pdf.add_page()

    pdf.set_font("Arial", size=12)
    lines = transcripcion.split("\n")

    # Agregar la transcripci贸n al PDF l铆nea por l铆nea con progreso
    for i, line in enumerate(lines):
        pdf.multi_cell(0, 10, line)
        progress(i / len(lines))  # Actualiza la barra de progreso

    # Guardar el archivo PDF
    pdf_path = "/mnt/data/transcripcion_audio.pdf"
    pdf.output(pdf_path)
    
    return pdf_path

# Funci贸n para transcribir los segmentos de audio y generar el PDF
def transcribe_audio_y_pdf(audio_file, progress=gr.Progress()):
    # Cargar el archivo de audio completo
    audio = AudioSegment.from_file(audio_file)
    audio_duration_minutes = len(audio) / (1000 * 60)  # Duraci贸n en minutos

    # Si el audio dura m谩s de 5 minutos, dividirlo en segmentos de 5 minutos
    if audio_duration_minutes > 5:
        segments = dividir_audio(audio_file, segment_duration_ms=5 * 60 * 1000)  # 5 minutos en milisegundos
    else:
        segments = [audio_file]  # Si es menor de 5 minutos, no dividir

    # Almacenar todas las transcripciones
    all_transcriptions = []

    # Procesar cada segmento individualmente y mostrar progresivamente
    for index, segment_path in enumerate(segments):
        with open(segment_path, "rb") as audio:
            try:
                output = replicate.run(
                    "vaibhavs10/incredibly-fast-whisper:3ab86df6c8f54c11309d4d1f930ac292bad43ace52d10c80d87eb258b3c9f79c",
                    input={
                        "task": "transcribe",
                        "audio": audio,  # El archivo de audio cargado
                        "language": "None",  # Detecta autom谩ticamente el idioma
                        "timestamp": "chunk",  # Incluye marcas de tiempo
                        "batch_size": 64,
                        "diarise_audio": False
                    }
                )
                transcription = output['text']
                all_transcriptions.append(f"Segment {index + 1}:\n{transcription}")
                
                # Actualizar la transcripci贸n en tiempo real
                yield "\n".join(all_transcriptions), None

            except Exception as e:
                yield f"Error transcribiendo el segmento {index + 1}: {e}", None

    # Combina todas las transcripciones en una sola cadena
    full_transcription = "\n".join(all_transcriptions)

    # Crear PDF con progreso y devolver la ruta del archivo
    pdf_path = crear_pdf(full_transcription, progress)
    yield full_transcription, pdf_path

# Crea la interfaz de Gradio con scroll autom谩tico en el campo de texto
with gr.Blocks() as demo:
    gr.Markdown("")

    with gr.Row():
        audio_input = gr.Audio(type="filepath", label="Sube tu archivo de audio")
        transcribe_button = gr.Button("Transcribir y Crear PDF")

    # Caja de texto con scroll para ver la transcripci贸n progresivamente
    output_text = gr.Textbox(label="Transcripci贸n (scroll autom谩tico y manual)", lines=20, interactive=True, elem_id="transcripcion")
    output_pdf = gr.File(label="Descarga el PDF")

    # Bot贸n de transcripci贸n y conexi贸n con las funciones
    transcribe_button.click(fn=transcribe_audio_y_pdf, inputs=audio_input, outputs=[output_text, output_pdf])

    # JavaScript para hacer el scroll autom谩tico de la caja de texto
    demo.load(js="""
        function autoScroll() {
            const textbox = document.getElementById('transcripcion');
            textbox.scrollTop = textbox.scrollHeight;
        }
        document.addEventListener('gradio:output', autoScroll);
    """)

# Ejecuta la aplicaci贸n
demo.launch()