Volver a proyectos

Kurai-Transcribe

Mi propio servicio de transcripción con Whisper, corriendo en mi GPU. Subes un audio y recibes el texto puntuado, con tiempos por palabra y sin mandarlo a ningún proveedor de transcripción.

  • 2026
  • Faster-Whisper
  • CTranslate2
  • FastAPI
  • CUDA
  • Transformers
  • Prometheus
  • NGINX
  • WireGuard

Probar en vivo

Lo que ves

La API es el producto, y esta página pública es la forma más rápida de probarla sin escribir código. Arrastra un audio y Whisper lo transcribe en mi GPU, con la puntuación ya restaurada, listo para copiar o descargar.

Página de Kurai-Transcribe, con el título Audio a texto y el área para arrastrar un audio.
Arrastra un audio y listo

Arquitectura

Lo pensé como infraestructura y no como una demo. La inferencia en GPU no tiene magia: es cómputo, memoria y temperatura, así que el servicio cuida los tres y los deja a la vista.

  1. Acceso públicoNGINX y WireGuard

    NGINX recibe las peticiones por HTTPS y un túnel WireGuard las lleva hasta mi equipo con GPU, que no queda expuesto directamente.

  2. APIFastAPI

    Transcribe en modo síncrono o en segundo plano con un webhook, y ofrece salud del sistema y métricas en sus propios endpoints.

  3. Preparación del audiopydub y ffmpeg

    Valida cada archivo antes de que llegue a la GPU y convierte formatos como el OGG Opus de las notas de voz de WhatsApp.

  4. InferenciaFaster-Whisper

    Corre large-v3 sobre CTranslate2 en float16, con filtrado de voz (VAD) y tiempos a nivel de palabra.

  5. PuntuaciónTransformers

    Un modelo restaura la puntuación del texto, con un respaldo por reglas si no está disponible.

  • NVIDIA CUDAInferencia acelerada por GPU
  • NVMLLectura de VRAM, uso y temperatura
  • PrometheusMétricas del servicio y de la GPU
  • WebhooksEntrega de los trabajos asíncronos
  • Una sola inferencia a la vez en la GPU

    Un semáforo protege la GPU para evitar la fragmentación de VRAM y las inferencias en paralelo inestables. Las peticiones esperan su turno en vez de competir por la memoria y tumbar el servicio.

  • El modelo se carga una vez

    Whisper se carga al arrancar y se queda residente en VRAM, así ninguna petición paga el tiempo de cargarlo.

  • No esconder el estado del sistema

    El endpoint de salud y las métricas muestran VRAM, temperatura, uso de GPU, latencia, tasa de error y velocidad frente al tiempo real. Si algo va mal, se puede ver por qué.

  • Dos formas de pedir lo mismo

    Para un audio corto, la API responde en la misma petición. Para uno largo, responde de inmediato y entrega el resultado a un webhook, sin dejar a nadie con la conexión abierta.

  • Fallar rápido y con claridad

    Los archivos que no sirven se rechazan antes de ocupar la GPU, y los errores vuelven como JSON claro.

El reto

Tener transcripción de calidad sin mandar el audio a un proveedor de transcripción. Eso significa controlar los datos y el modelo en hardware propio, sin que la memoria de la GPU tumbe el servicio y sabiendo siempre qué está pasando dentro.

Lo que hay detrás

  • El servicio no depende de ningún SaaS externo para transcribir.
  • La respuesta incluye el idioma, el texto completo, los tiempos por palabra, la latencia y la velocidad de esa transcripción.
  • La página web es solo un cliente de la API, con arrastrar y soltar, y opciones para copiar y descargar.
  • Corre como un servicio de Linux en mi propio equipo, con scripts para instalarlo y arrancarlo.

Decisiones y trade-offs

  • Primero la API. La web es solo un cliente más, así que otra aplicación puede integrarse sin cambiar el motor.
  • Hardware propio en vez de un proveedor externo. Gano control sobre los datos y el modelo, y a cambio la memoria y la disponibilidad son responsabilidad mía.
  • Una inferencia a la vez. Se atienden menos peticiones en paralelo, pero el servicio se mantiene estable en una sola GPU.
  • Modelo siempre residente. Ocupa VRAM aunque no haya trabajo, a cambio de que cada petición empiece sin esperar la carga.