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()
|