File size: 4,853 Bytes
cf6ce9f bad5c84 c945b9f c887c55 844ccec 740442f a463449 9812b5d 740442f 9812b5d 740442f c887c55 844ccec c887c55 bad5c84 c887c55 bad5c84 3be443b c887c55 34fc453 bad5c84 34fc453 bad5c84 34fc453 c887c55 bad5c84 844ccec bad5c84 844ccec bad5c84 844ccec 9d418f0 844ccec 9d418f0 844ccec bad5c84 844ccec 9d418f0 bad5c84 9d418f0 bad5c84 9d418f0 844ccec bad5c84 9d418f0 844ccec 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 |
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
# Verifica el tama帽o del archivo y asegura que no supere el l铆mite de 10MB
if os.path.getsize(segment_path) > 10 * 1024 * 1024: # 10 MB
print(f"Warning: Segment {segment_path} exceeds 10MB, reducing segment duration.")
return dividir_audio(audio_path, segment_duration_ms // 2) # Recursivamente reduce el tama帽o del segmento
segments.append(segment_path)
return segments
# Funci贸n para crear el PDF
def crear_pdf(transcripcion):
pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", size=12)
# Agregar la transcripci贸n al PDF l铆nea por l铆nea
for line in transcripcion.split("\n"):
pdf.multi_cell(0, 10, line)
# Guardar el archivo PDF en la carpeta actual
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:
progress(index / len(segments)) # Actualizar el progreso
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 y permitir scroll
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 y devolver la ruta del archivo
pdf_path = crear_pdf(full_transcription)
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("# Transcriptor de Audio a Texto (con actualizaciones y PDF)")
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 (se muestra de a poco)", lines=20, interactive=False)
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])
# Ejecuta la aplicaci贸n
demo.launch()
|