Notas de voz con IA: así convierte BillableMe el audio en texto con Whisper

Como freelance, las mejores ideas llegan en el coche o en la obra, justo cuando no se puede teclear. Por eso BillableMe incorporó notas de voz: se dicta una tarea, un recordatorio o una nota, y medio minuto después el texto está ahí, listo para buscar. Así lo resolví.

Los requisitos

  • El audio se queda en mi propio servidor, sin servicio externo de transcripción.
  • Neerlandés e inglés, con detección automática del idioma.
  • Sin GPU: debe funcionar en el Docker Swarm existente.
  • El usuario nunca espera a la transcripción.

Paso 1: grabar en Flutter

La app graba con el paquete record en AAC (m4a), solicita el permiso del micrófono y permite elegir de inmediato una categoría, una marca y un título. El archivo se envía como carga multipart a la API de NestJS. Desde ese momento la nota aparece en la lista, con el estado «procesando».

Paso 2: una cola en lugar de esperar

La API guarda el archivo de audio en un volumen compartido, crea un registro en PostgreSQL y pone un trabajo en una cola Bull en Redis. Con eso, la llamada HTTP termina en una fracción de segundo. Un worker recoge el trabajo, llama al servicio de transcripción y, si hay un error, lo reintenta hasta tres veces con un tiempo de espera creciente. El estado pasa de pending a processing y a completed o failed.

Paso 3: un servicio Whisper propio en Python

La transcripción en sí se hace en un pequeño servicio FastAPI con OpenAI Whisper. Elegí el modelo base: 74 MB, unos 30 segundos por minuto de audio en una CPU, y más que suficiente para notas habladas en neerlandés e inglés. El tamaño del modelo es una variable de entorno, así que puedo pasar a small o medium si el hardware lo permite. ffmpeg va incluido en el contenedor para decodificar m4a.

Paso 4: de vuelta en la app

En cuanto el texto está en la base de datos, la app lo muestra debajo de la nota. Se puede reproducir la grabación a entre 0,75 y 1,5 veces la velocidad, editar la nota, filtrar por categoría o periodo y buscar en las transcripciones.

Lo que aprendí

  • Elija el modelo más pequeño que sea suficiente. El modelo small es tres veces más lento que base en CPU; para notas habladas cortas, base era más que suficiente.
  • Lo asíncrono no es un lujo. Treinta segundos de espera en una app móvil parecen una eternidad. Una cola con un estado visible lo hace natural.
  • Mantenga el audio en local. Basta un volumen compartido entre la API y el servicio Whisper. Las grabaciones nunca salen del servidor.

¿Quiere una función de IA similar en su propia app? Póngase en contacto.