sp / app.py
GAS17's picture
Update app.py
891196b verified
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()