Cómo construir un chatbot de WhatsApp con ElevenLabs y Claude en Python
Aprende a montar un chatbot de voz para WhatsApp con ElevenLabs y Claude en Python. Guía práctica, código listo y prompts funcionales.
Cómo construir un chatbot de WhatsApp con ElevenLabs y Claude en Python
Mira, colega, vamos a dejar la teoría de lado. Si estás aquí es porque quieres montar un chatbot de WhatsApp que hable, no que escriba. Y para eso necesitas dos piezas clave: ElevenLabs para la voz y Claude para el cerebro. Yo lo he probado, y te aseguro que el resultado es brutal. Aquí va el paso a paso, sin humo.
1. El esquema: qué necesitas realmente
La cosa es más sencilla de lo que parece. El flujo es este: el usuario manda un audio por WhatsApp → Twilio lo recibe → tu script en Python lo transcribe con Whisper → se lo pasas a Claude → Claude te da la respuesta → ElevenLabs la convierte en voz → Twilio la envía de vuelta.
¿Suena complejo? No lo es tanto. Vamos por partes.
2. Configuración inicial
Primero, instala las dependencias que vas a necesitar:
pip install twilio openai anthropic elevenlabs python-dotenv
Ojo: para transcribir el audio, yo uso Whisper de OpenAI (ya que Twilio te da el archivo, no el texto). Es lo más fiable que he probado.
3. El prompt maestro para Claude
Aquí es donde entra el criterio. No le pidas a Claude que "sea un asistente". Eso es de novato. Dale contexto, personalidad y límites. Este es el prompt que yo uso:
Actúa como "K0", un asistente de voz de WhatsApp para K0lateral.com.
Eres directo, con humor irónico y respondes en español de España,
sin ser un pelota. Respeta estas reglas:
- Máximo 3 frases por respuesta (es audio, no un testamento).
- Si te preguntan por temas fuera de tecnología, redirige con gracia.
- No des consejos médicos, legales ni financieros.
- Si no sabes algo, dilo claro y ofrece buscar info.
4. El código: el esqueleto del bot
Aquí tienes el script base para que funcione. No es magia, es Python:
import os
from flask import Flask, request
from twilio.twiml.messaging_response import MessagingResponse
from openai import OpenAI
from anthropic import Anthropic
from elevenlabs import generate, set_api_key
app = Flask(__name__)
client_openai = OpenAI()
claude = Anthropic()
set_api_key(os.getenv("ELEVENLABS_API_KEY"))
@app.route("/whatsapp", methods=["POST"])
def whatsapp_bot():
# 1. Recibir el audio de Twilio
media_url = request.form.get("MediaUrl0")
if not media_url:
return str(MessagingResponse().message("Envíame un audio, colega."))
# 2. Transcribir con Whisper
audio_file = client_openai.audio.transcriptions.create(
model="whisper-1",
file=("audio.mp3", requests.get(media_url).content)
)
user_text = audio_file.text
# 3. Respuesta de Claude
response = claude.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=150,
system="Eres K0, el asistente de voz de K0lateral.",
messages=[{"role": "user", "content": user_text}]
)
bot_text = response.content[0].text
# 4. Convertir a voz con ElevenLabs
audio = generate(text=bot_text, voice="21m00Tcm4TlvDq8ikWAM")
# 5. Devolver como mensaje de voz
twilio_response = MessagingResponse()
twilio_response.message("Aquí tienes mi respuesta, tio. 🔊").media(audio_url)
return str(twilio_response)
5. El prompt para refinar la voz
ElevenLabs no es solo "sube la voz". Tú controlas el tono con el prompt de voz. Yo uso este:
Voz masculina, tono desenfadado pero profesional, como un amigo
que sabe de tecnología. Evita el tono robótico. Enfatiza las
palabras clave con naturalidad. Pausas breves entre frases.
Sin muletillas ni sonidos de relleno.
6. Los ajustes que marcan la diferencia
Mira, hay un par de cosas que no te vas a encontrar en los tutoriales de turno:
- Latencia: la gente abandona si tarda más de 2 segundos en responder. Usa el modelo Turbo de ElevenLabs y optimiza la transcripción.
- Errores: Twilio te va a dar audios en formatos raros. Normaliza todo a MP3 antes de enviarlo a Whisper, o tendrás fallos raros.
- Seguridad: limita el número de peticiones por usuario. He visto bots que se vuelven locos con gente que spamea.
7. Despliegue y prueba
Para pruebas locales, usa ngrok con el puerto 5000. Para producción, yo uso Railway o Render. No te compliques con servidores físicos.
ngrok http 5000
Y en Twilio, apunta el webhook a tu URL de ngrok con POST. Fácil.
¿Y el código completo?
Si quieres el repositorio con la solución completa, con manejo de errores y todo, déjame un comentario y lo subo. Pero con esto ya tienes el 80% hecho.
Y tú, ¿qué usas para tus chatbots con voz? ¿Le metes ElevenLabs o te vas a otra opción? Cuéntame, colega.


