Back to all posts
Tutorial

Reconocimiento de voz multilingüe con $0 para tu Chatbot con Cloudflare Whisper

¿Estás construyendo un Chatbot y quieres agregar entrada de voz sin pagar por Google Speech-to-Text, AWS Transcribe o la API de OpenAI Whisper? Ya tienes todo lo que necesitas — dentro del plan gratuito de Cloudflare.

En este artículo, explico detalladamente cómo integré Cloudflare Workers AI Whisper large-v3-turbo en el Chatbot de mi sitio portfolio, con reconocimiento de voz en 99 idiomas a costo absolutamente cero. También comparto los dos bugs de producción que encontré y cómo los solucioné con precisión.


¿Por qué Cloudflare Workers AI?

Cloudflare ofrece reconocimiento de voz a través de Workers AI, que se ejecuta en la red edge global de Cloudflare. El plan gratuito incluye:

  • Inferencia de Workers AI: gratuita, ver límites oficiales (más que suficiente para proyectos personales y aplicaciones pequeñas)
  • Sin cold starts: se ejecuta en nodos edge, más cerca de tus usuarios
  • Sin gestión de claves API: vinculado directamente a tu Worker mediante env.AI
  • 99 idiomas soportados: chino, japonés, coreano, francés, español, árabe, etc.

La mayor ventaja: no necesitas alojar un modelo, gestionar instancias GPU ni preocuparte por los límites de velocidad de una API de terceros. Listo para usar.


Whisper Base vs Whisper Large v3 Turbo: Comparación profunda

Cloudflare Workers AI ofrece dos variantes del modelo Whisper. Elegir el correcto es crucial.

@cf/openai/whisper (Versión base)

Es el modelo Whisper base original (≈39 millones de parámetros).

Ventajas:

  • Inferencia rápida — ideal para aplicaciones sensibles a la latencia
  • Bajo consumo de recursos por solicitud
  • Probado y estable en Cloudflare

Desventajas:

  • Mayor tasa de error de palabras (WER), especialmente para idiomas no ingleses
  • Dificultades con acentos, vocabulario técnico y entrada multilingüe
  • Formato del parámetro audio: number[] (Uint8Array expandido en array JS ordinario)

Ideal para: Aplicaciones de alto tráfico donde la velocidad importa más que la precisión, o casos de uso solo en inglés.


@cf/openai/whisper-large-v3-turbo (Versión Turbo)

Versión destilada y reducida de Whisper large-v3 (≈809 millones de parámetros), aproximadamente 2× más rápida que large-v3 conservando la mayor parte de su precisión.

Ventajas:

  • WER reducido ~50% comparado con la versión base — mejora dramática para chino, japonés, coreano, etc.
  • Excelente precisión multilingüe incluso con acentos variados
  • Parámetros opcionales: language, task (transcribe/translate), vad_filter, beam_size
  • Salida enriquecida: text, word_count, segments con timing WebVTT

Desventajas:

  • Más pesado que la versión base — latencia ligeramente mayor por solicitud
  • Formato del parámetro audio: cadena Base64 (no un array de números — causa de mi primer bug)
  • No decodifica establemente contenedores webm/opus (causa de mi segundo bug)

Ideal para: Chatbots multilingües, asistentes de voz, herramientas de accesibilidad, pipelines de transcripción donde la precisión es crítica.


Resumen comparativo

| | @cf/openai/whisper | @cf/openai/whisper-large-v3-turbo | |---|---|---| | Parámetros | ≈39M | ≈809M | | Idiomas | 99 | 99 | | Precisión | Buena | Excelente | | Velocidad | La más rápida | Rápida (≈2× más que large-v3) | | Formato audio | number[] | Cadena Base64 | | Contenedores soportados | webm, wav, mp3 | wav, mp3 (webm inestable) | | Campos de salida adicionales | solo text | text, word_count, segments | | Costo en Cloudflare | Plan gratuito | Plan gratuito |


Dos bugs de producción que encontré

Bug 1: Error 5006 — Tipo incompatible

Al cambiar de @cf/openai/whisper a whisper-large-v3-turbo, la API devolvía el error 5006.

Causa raíz: Mantenía el formato antiguo audio: [...audioBytes] (array de números), que es lo que espera el modelo base. El modelo turbo requiere una cadena Base64. Los dos modelos tienen esquemas de entrada completamente diferentes — lo cual no está claramente documentado.

Solución: En el servidor, usar btoa() por fragmentos para convertir Uint8Array en cadena Base64 antes de pasarla al modelo.


Bug 2: Error 3030 — Fallo al decodificar el archivo de audio

Tras corregir el formato Base64, apareció el error 3030.

Causa raíz: El navegador graba en formato webm/opus. Aunque la codificación Base64 era correcta, el modelo turbo no podía decodificar el contenedor webm/opus. Cloudflare Whisper turbo solo soporta establemente WAV y MP3.

Solución: Decodificar la grabación webm/opus en el navegador con AudioContext.decodeAudioData(), luego recodificar como WAV PCM 16-bit con encodeWAV() antes de subir. WAV es el formato de entrada de Whisper más universalmente soportado.


Puntos clave y consejos

  1. export const runtime = 'edge' es obligatorio. Sin esto, getRequestContext() no devuelve nada en Cloudflare Pages.

  2. No hay Buffer en Edge Runtime. No uses Buffer.from(bytes).toString('base64') — usa btoa() con fragmentación para evitar desbordamiento de pila en archivos de audio grandes.

  3. Los tipos del campo audio difieren entre turbo y base. Esta diferencia no está explícitamente documentada — la descubrí mediante errores y experimentación.

  4. Siempre cierra AudioContext. Los navegadores limitan el número de instancias simultáneas de AudioContext. Siempre llama await audioCtx.close() tras la decodificación.

  5. Protégete contra grabaciones vacías. Un toque accidental al micrófono lanzará una excepción de decodeAudioData en un blob vacío. Verifica blob.size < 1000 y retorna temprano.

  6. Base64 aumenta el tamaño ~33%. Una grabación de 10 segundos (~160KB PCM crudo) se convierte en ~215KB en Base64 — bien dentro de los límites de Cloudflare.

  7. iOS requiere un gesto de usuario para crear AudioContext. Usa onPointerDown (no un temporizador o useEffect) para satisfacer este requisito.


Resultado final

Tras implementar este pipeline, mi Chatbot soporta:

  • Mantener para hablar: Mantén presionado el botón del micrófono, habla, suelta para transcribir
  • Tap para alternar: Un tap para empezar, habla, otro tap para transcribir
  • 99 idiomas con excelente precisión en chino, japonés, coreano, inglés, etc.
  • Cero costo — completamente dentro del plan gratuito de Cloudflare
  • Sin claves API de terceros — todo se ejecuta en el edge de Cloudflare

Si estás construyendo un producto de IA multilingüe con necesidad de entrada de voz, Cloudflare Workers AI Whisper es la respuesta. Los dos bugs que encontré no están explícitamente documentados — espero que este artículo te ahorre horas de depuración.


La implementación completa está en vivo en elvisli.ca.