Tecnología · UX

Audios en WhatsApp: transcripción automática + IA respondiendo en texto

En Latinoamérica, entre el 40 y el 55% de los mensajes que los clientes envían a una empresa son notas de voz (EE. UU./Europa rondan 5-15%). Tu agente está en una reunión — no puede escuchar 8 audios de 2 minutos seguidos. El cliente espera respuesta. Resultado: backlog que se vuelve churn. Este post muestra cómo configurar transcripción automática (Whisper / Gemini) + IA que entiende y responde, con costos reales (~US$ 0,0002 por minuto), tiempo de respuesta <5 segundos y los 3 errores que destruyen esta función en la práctica.

16 de mayo de 2026 · 9 min de lectura · MercaBot

El problema que nadie mide bien

Entra al panel de tu operación de WhatsApp. Cuenta cuántos de los últimos 100 mensajes entrantes son audio. Probablemente entre 40 y 55% — es el patrón latino (EE. UU./EU está en 5-15%). Y pregunta: ¿el equipo los escucha todos? Respuesta honesta: no. El audio se acumula, el agente lo posterga, el cliente desiste.

Lo que el bot tiene que hacer con audio

  1. Descargar el audio del servidor de Meta (el enlace caduca en <5 min — tiene que ser inmediato).
  2. Transcribir a texto en ~3-5 segundos.
  3. Entender la intención (la misma IA que responde texto).
  4. Responder en texto corto, citando lo que escuchó si el caso es ambiguo.
  5. Guardar la transcripción en el historial para que el humano la lea después.

Stack técnico (que funciona en producción)

Opción 1: OpenAI Whisper API (la más usada)

Opción 2: Gemini Audio (Google)

Opción 3: Whisper auto-hospedado (open source)

Implementación en Cloudflare Worker + Whisper

// Cloudflare Worker — recibe el webhook de WhatsApp
export default {
  async fetch(req, env) {
    const body = await req.json();
    const msg = body.entry[0].changes[0].value.messages?.[0];
    if (msg?.type !== 'audio') return new Response('ok');

    // 1. Obtiene la URL del audio (¡caduca en 5 min!)
    const mediaId = msg.audio.id;
    const mediaInfo = await fetch(
      `https://graph.facebook.com/v18.0/${mediaId}`,
      {headers: {Authorization: `Bearer ${env.META_TOKEN}`}}
    ).then(r => r.json());

    // 2. Descarga el audio (ogg/opus)
    const audioBlob = await fetch(mediaInfo.url, {
      headers: {Authorization: `Bearer ${env.META_TOKEN}`}
    }).then(r => r.blob());

    // 3. Transcribe vía Whisper
    const formData = new FormData();
    formData.append('file', audioBlob, 'audio.ogg');
    formData.append('model', 'whisper-1');
    formData.append('language', 'es');

    const transcript = await fetch('https://api.openai.com/v1/audio/transcriptions', {
      method: 'POST',
      headers: {Authorization: `Bearer ${env.OPENAI_KEY}`},
      body: formData
    }).then(r => r.json());

    // 4. Guarda en historial + procesa como mensaje de texto
    await saveTranscript(msg.from, transcript.text);
    await procesarMensaje({from: msg.from, text: transcript.text, source: 'audio'});

    return new Response('ok');
  }
}

Tiempo total: cliente envía audio → bot responde

EtapaTiempo
Webhook de Meta → tu servidor0,5-1s
Descarga del audio0,5-1,5s
Transcripción Whisper (90s)2-3s
IA procesa + genera respuesta1-2s
Envío de respuesta vía API0,5s
TOTAL~5-8s

Cómo debe responder el bot al audio (buena UX)

✅ Bien — confirma el entendimiento implícito

Cliente: [audio: "quería saber el precio del alisado
para cabello largo"]
Bot: "Alisado para cabello largo: US$ 44 (sesión única).
¿Quieres agendar? ¿Tienes preferencia de día?"

❌ Mal — pide que reescriba en texto

Cliente: [audio]
Bot: "No escucho audios. Por favor, escríbelo."

El cliente pierde la paciencia. Métrica real: 35% no responde después de ese "no escucho".

✅ Excelente — cita solo si es ambiguo

Cliente: [audio con ruido + 2 preguntas mezcladas]
Bot: "Capto: quieres saber el precio del alisado Y la
disponibilidad para el sábado, ¿correcto? Si es así:
alisado US$ 44, sábado tiene 14h y 16h libres."

Costos reales en producción (operación 5.000 audios/mes)

Recomendación real: empieza con Whisper (calidad > costo a esta escala). Migra a Gemini Audio cuando pases los 20k audios/mes.

3 errores que destruyen esta función

  1. No descargar de inmediato. El enlace de Meta caduca en 5 min. Si el webhook se demora, el audio se va al vacío. Hay que procesar de forma síncrona.
  2. No manejar errores de transcripción. Whisper falla ~2% de las veces (audio cortado, ruido extremo). El bot necesita fallback: "No pude escuchar bien. ¿Puedes intentar de nuevo o escribirlo?"
  3. Bot procesando audio del propio bot. Si usas audio también en la respuesta, asegúrate de que el webhook ignora mensajes del propio bot (loop infinito).

Privacidad / LGPD / GDPR

El audio es dato personal. Algunas consideraciones:

Transcripción automática en MercaBot

Whisper integrado nativo en el panel. El bot recibe audio, transcribe en <5s, responde en texto, guarda en historial. Sin desarrollo.

Probar gratis →