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.
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
- Descargar el audio del servidor de Meta (el enlace caduca en <5 min — tiene que ser inmediato).
- Transcribir a texto en ~3-5 segundos.
- Entender la intención (la misma IA que responde texto).
- Responder en texto corto, citando lo que escuchó si el caso es ambiguo.
- 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)
- Costo: US$ 0,006 por minuto (~US$ 0,009 por un audio típico de 90s).
- Latencia: 1-3s para audios <30s, 3-6s para 1-2 min.
- Calidad en español: excelente — entiende modismos, acentos, ruido moderado.
- Límites: 25MB por archivo (cubre audios hasta ~25 min — suficiente para el 99% de los casos).
Opción 2: Gemini Audio (Google)
- Costo: US$ 0,0003 por minuto (10× más barato que Whisper).
- Latencia: 2-4s.
- Calidad en español: buena, pierde un poco con modismos regionales.
- Ventaja: entiende audio + responde directo (transcribe + procesa en 1 sola llamada).
Opción 3: Whisper auto-hospedado (open source)
- Costo: solo servidor (CPU/GPU). Sale ~US$ 0,0002 por minuto en CPU, ~US$ 0,0001 en GPU.
- Latencia: 5-15s en CPU, 1-3s en GPU.
- Ventaja: los datos no salen de tu infraestructura (LGPD/HIPAA/GDPR-sensitive).
- Desventaja: mantener el modelo actualizado y la infra es trabajo real.
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
| Etapa | Tiempo |
|---|---|
| Webhook de Meta → tu servidor | 0,5-1s |
| Descarga del audio | 0,5-1,5s |
| Transcripción Whisper (90s) | 2-3s |
| IA procesa + genera respuesta | 1-2s |
| Envío de respuesta vía API | 0,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)
- Whisper API: 5.000 × 90s = 7.500 min × US$ 0,006 = US$ 45/mes.
- Gemini Audio: 5.000 × 90s = 7.500 min × US$ 0,0003 = US$ 2,25/mes.
- Auto-hospedado: servidor US$ 20-60/mes (costo fijo, vale la pena solo desde +10k 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
- 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.
- 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?"
- 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:
- Aviso en la 1ª interacción: "Tu conversación puede ser procesada por IA para atención."
- Retención controlable: elimina el audio crudo tras la transcripción si no necesitas el original (mantén solo el texto).
- Whisper OpenAI: no entrena con datos de API (política actual). Gemini, igual.
- Sector regulado (salud, financiero): auto-hospedar es más seguro.
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 →