26. Ponle un nombre a tu asistente
26. Ponle un Nombre a tu Asistente: Tutorial para Principiantes
🏷️ Introducción: ¡Bautiza a tu creación!
¡Llegó el momento más emocionante! Vas a ponerle nombre a tu asistente virtual, darle identidad y personalidad. Es como cuando nombras a una mascota: ya no es solo "el perro", ahora es "Max" o "Luna". Tu asistente dejará de ser "el programa" para convertirse en un compañero con nombre propio.
Analoǵía: Nombrar tu asistente es como:
Para un barco: ¡Lo bautizas antes de su primer viaje!
Para un robot: Le das identidad antes de activarlo
Para una app: Le pones un nombre que los usuarios recordarán
🎭 ¿Por qué es importante ponerle nombre?
Beneficios clave:
Personalización: Se siente más como un compañero que como una herramienta
Activación por nombre: Como "Oye Siri" o "Ok Google"
Conexión emocional: Los humanos nos conectamos mejor con cosas con nombre
Claridad: Sabes exactamente cuándo estás hablando con él/ella
Esquema de interacción con nombre:
text
ANTES: Tú dices "¿qué hora es?" → Asistente responde
DESPUÉS: Tú dices "Alexa, ¿qué hora es?" → Solo responde si dices su nombre
✍️ Código paso a paso explicado
Paso 1: Elegir un nombre
Primero, decide el nombre de tu asistente. Algunas ideas:
Mi recomendación: Elige un nombre de 2-3 sílabas, fácil de pronunciar y recordar.
Paso 2: Implementación básica
python
def procesar_con_nombre(comando, nombre_asistente="Alex"):
"""
Procesa comandos solo si empiezan con el nombre del asistente
"""
# Convertir todo a minúsculas para comparación
comando_lower = comando.lower()
nombre_lower = nombre_asistente.lower()
# Verificar si el comando empieza con el nombre
if comando_lower.startswith(nombre_lower):
# Quitar el nombre del comando
comando_sin_nombre = comando[len(nombre_asistente):].strip()
# También quitar posibles comas o espacios
comando_sin_nombre = comando_sin_nombre.lstrip(", ").lstrip()
return True, comando_sin_nombre
else:
return False, comando
Paso 3: Integración con tu asistente existente
python
def asistente_con_nombre():
"""
Versión del asistente que requiere decir su nombre primero
"""
nombre = "Alex" # Tu nombre elegido
hablar(f"Hola, soy {nombre}, tu asistente virtual. Llámame por mi nombre para ayudarte.")
while True:
# Escuchar comando
comando_completo = escuchar()
if not comando_completo:
continue
# Verificar si me llamó por mi nombre
me_llamo, comando_limpio = procesar_con_nombre(comando_completo, nombre)
if me_llamo:
print(f"🔊 {nombre} activado: '{comando_limpio}'")
# Procesar el comando (sin el nombre)
if 'hora' in comando_limpio:
decir_hora()
elif 'clima' in comando_limpio:
obtener_clima()
elif 'chiste' in comando_limpio:
contar_chiste()
# ... otros comandos
elif 'salir' in comando_limpio or 'adiós' in comando_limpio:
hablar(f"Hasta luego, fue un placer ayudarte")
quit()
else:
# Si no dijo mi nombre, ignorar o responder educadamente
if any(palabra in comando_completo.lower() for palabra in
['hola', 'oye', 'dime', 'escucha']):
hablar(f"Por favor, di mi nombre '{nombre}' primero. Por ejemplo: '{nombre}, ¿qué hora es?'")
🎯 Código completo mejorado
python
# ASISTENTE VIRTUAL - ASISTENTE CON NOMBRE
import random
import pyttsx3
# Configuración de voz
engine = pyttsx3.init()
def hablar(texto):
engine.say(texto)
engine.runAndWait()
class AsistenteVirtual:
"""
Clase para manejar un asistente con personalidad y nombre
"""
def __init__(self, nombre="Alex"):
self.nombre = nombre
self.saludos = [
f"Hola, soy {nombre}. ¿En qué puedo ayudarte?",
f"¡Hola! {nombre} a tu servicio.",
f"¡Hola! Soy {nombre}, tu asistente virtual.",
f"{nombre} aquí. Listo para ayudarte.",
f"¡Hola humano! Soy {nombre}. ¿Qué necesitas?"
]
self.respuestas_sin_nombre = [
"Por favor, di mi nombre primero para que pueda ayudarte.",
f"Si quieres que te ayude, por favor di '{self.nombre}' antes de tu pregunta.",
f"¡Hola! Recuerda decir '{self.nombre}' cuando quieras hablar conmigo.",
f"Estoy aquí, pero necesito que digas '{self.nombre}' para activarme.",
f"Dime '{self.nombre}' seguido de lo que necesites."
]
self.contador_comandos = 0
print(f"🤖 Asistente {self.nombre} inicializado")
def presentarse(self):
"""Presentación inicial del asistente"""
saludo = random.choice(self.saludos)
hablar(saludo)
print(f"🤖 {saludo}")
print(f"💡 Ejemplo: Di '{self.nombre}, ¿qué hora es?'")
def procesar_comando(self, comando_completo):
"""
Procesa un comando, verificando primero si se dijo el nombre
"""
# Limpiar y estandarizar
comando_limpio = comando_completo.strip().lower()
nombre_min = self.nombre.lower()
# Opción 1: Comando empieza con el nombre
if comando_limpio.startswith(nombre_min):
# Extraer el comando real (sin el nombre)
comando_real = comando_completo[len(self.nombre):].strip()
comando_real = comando_real.lstrip(", ").lstrip()
self.contador_comandos += 1
print(f"🎯 Comando #{self.contador_comandos}: '{comando_real}'")
# Responder al reconocimiento
if self.contador_comandos == 1:
hablar("¡Sí, dime!")
elif self.contador_comandos % 5 == 0:
hablar("¿Sí? ¿En qué más puedo ayudarte?")
return True, comando_real
# Opción 2: El nombre está en medio del comando
# Ejemplo: "¿Puedes decirme Alex qué hora es?"
elif nombre_min in comando_limpio:
# Buscar el nombre y tomar lo que viene después
indice = comando_limpio.find(nombre_min)
comando_real = comando_completo[indice + len(self.nombre):].strip()
comando_real = comando_real.lstrip(", ").lstrip()
self.contador_comandos += 1
print(f"🎯 Comando #{self.contador_comandos}: '{comando_real}'")
return True, comando_real
# Opción 3: Saludo directo al asistente
elif any(saludo in comando_limpio for saludo in ['hola', 'oye', 'holi', 'buenas']):
if self.nombre.lower() not in comando_limpio:
respuesta = random.choice(self.respuestas_sin_nombre)
hablar(respuesta)
print(f"💬 {respuesta}")
return False, None
# Opción 4: Pregunta por el nombre
elif any(pregunta in comando_limpio for pregunta in
['cómo te llamas', 'cuál es tu nombre', 'quién eres']):
hablar(f"Me llamo {self.nombre}, soy tu asistente virtual")
return False, None
# Opción 5: Cambiar nombre
elif 'llámate' in comando_limpio or 'cambia tu nombre a' in comando_limpio:
# Extraer nuevo nombre
partes = comando_limpio.split()
for i, parte in enumerate(partes):
if 'llámate' in parte or 'nombre' in parte:
if i + 1 < len(partes):
nuevo_nombre = partes[i + 1].capitalize()
self.nombre = nuevo_nombre
hablar(f"De acuerdo, ahora me llamo {self.nombre}")
return False, None
return False, None
def ejecutar_comando(self, comando_real):
"""
Ejecuta el comando una vez extraído el nombre
"""
comando_lower = comando_real.lower()
# Comandos básicos
if any(palabra in comando_lower for palabra in ['hora', 'qué hora']):
from datetime import datetime
ahora = datetime.now().strftime("%H:%M")
hablar(f"Son las {ahora}")
elif any(palabra in comando_lower for palabra in ['fecha', 'qué día']):
from datetime import datetime
fecha = datetime.now().strftime("%d de %B de %Y")
hablar(f"Hoy es {fecha}")
elif any(palabra in comando_lower for palabra in ['cómo estás', 'qué tal']):
estados = [
"¡Muy bien, gracias por preguntar!",
"Excelente, listo para ayudarte",
"Estoy funcionando al 100%",
"Contento de poder ayudarte",
"Un poco cansado de tanto calcular, pero bien"
]
hablar(random.choice(estados))
elif 'repite' in comando_lower:
# Repetir lo que dijo el usuario (sin "repite")
texto_a_repetir = comando_lower.replace('repite', '').strip()
if texto_a_repetir:
hablar(f"Dijiste: {texto_a_repetir}")
else:
hablar("¿Qué quieres que repita?")
elif 'gracias' in comando_lower:
agradecimientos = [
"¡De nada! Es un placer ayudarte",
"¡Gracias a ti por usar mis servicios!",
"No hay de qué, para eso estoy aquí",
"¡Claro! Siempre a tu disposición"
]
hablar(random.choice(agradecimientos))
elif any(palabra in comando_lower for palabra in ['adiós', 'hasta luego', 'chao', 'nos vemos']):
despedidas = [
f"Hasta luego, ¡que tengas un excelente día!",
f"Adiós, {self.nombre} se despide",
f"Nos vemos pronto, ¡cuídate!",
f"Hasta la próxima, fue un placer ayudarte"
]
hablar(random.choice(despedidas))
print(f"\n📊 Resumen: {self.contador_comandos} comandos procesados")
quit()
else:
hablar(f"Lo siento, no entiendo '{comando_real}'. Prueba con: hora, fecha, cómo estás, repite, gracias")
# Función principal
def main():
"""
Programa principal del asistente con nombre
"""
# Configurar nombre (puedes cambiarlo)
nombre_asistente = "Alex" # ¡Cambia esto por el nombre que prefieras!
# Crear instancia del asistente
asistente = AsistenteVirtual(nombre=nombre_asistente)
# Presentación inicial
asistente.presentarse()
# Bucle principal
while True:
print(f"\n{'─'*50}")
print(f"🎤 Esperando comando (di '{asistente.nombre}' primero)...")
print(f"{'─'*50}")
# Escuchar
comando = escuchar() # Tu función de reconocimiento de voz
if not comando:
continue
print(f"👤 Tú: {comando}")
# Procesar comando
es_para_mi, comando_real = asistente.procesar_comando(comando)
if es_para_mi:
# Ejecutar comando
asistente.ejecutar_comando(comando_real)
# Diagrama visual del flujo:
"""
🎤 TÚ DICES: "Alex, ¿qué hora es?"
↓
🤖 PROCESAR: Detecta "Alex" al inicio
↓
✂️ LIMPIAR: Quita "Alex," → queda "¿qué hora es?"
↓
✅ RECONOCER: Es un comando válido para el asistente
↓
⏰ EJECUTAR: Función de decir hora
↓
🔊 RESPONDER: "Son las 15:30"
↓
🔄 ESPERAR: Otro comando que empiece con "Alex"
🎤 TÚ DICES: "¿Qué hora es?" (sin nombre)
↓
🤖 PROCESAR: No detecta "Alex" al inicio
↓
💬 RESPONDER: "Por favor, di 'Alex' primero"
↓
🔄 ESPERAR: Comando correcto
"""
✨ Personalización avanzada
1. Múltiples nombres/alias:
python
def __init__(self, nombre_principal="Alex"):
self.nombre_principal = nombre_principal
self.alias = [
nombre_principal.lower(),
nombre_principal[:3].lower(), # "Alex" → "ale"
"asistente",
"robot",
"ayudante"
]
def reconoce_nombre(self, comando):
"""Reconoce múltiples formas de llamar al asistente"""
for alias in self.alias:
if comando.lower().startswith(alias):
return True
return False
2. Personalidad configurable:
python
class Personalidad:
def __init__(self, tipo="amigable"):
self.tipo = tipo
if tipo == "amigable":
self.saludos = ["¡Hola!", "¿Cómo estás?", "¡Buenos días!"]
self.despedidas = ["¡Hasta luego!", "Que tengas buen día"]
elif tipo == "formal":
self.saludos = ["Buenos días", "A sus órdenes"]
self.despedidas = ["Hasta la próxima", "Que le vaya bien"]
elif tipo == "gracioso":
self.saludos = ["¡Holi, caracoli!", "¿Qué pasa, calabaza?"]
self.despedidas = ["¡Adiós, adiós, marinero!"]
3. Aprendizaje del nombre del usuario:
python
def aprender_nombre_usuario(self):
"""Pregunta y recuerda el nombre del usuario"""
hablar("Por cierto, ¿cómo te llamas tú?")
nombre_usuario = escuchar()
if nombre_usuario:
self.usuario = nombre_usuario.capitalize()
hablar(f"Mucho gusto, {self.usuario}")
# Guardar en archivo para recordarlo
with open("usuario.txt", "w") as f:
f.write(self.usuario)
🚨 Solución de problemas comunes
Problema 1: No reconoce el nombre si hay ruido
python
# Solución: Usar coincidencia aproximada
import difflib
def nombre_coincide(comando, nombre):
"""Coincidencia flexible del nombre"""
# Buscar la mejor coincidencia
opciones = [nombre, nombre.lower(), nombre[:2], nombre[:3]]
for opcion in opciones:
if opcion in comando.lower():
return True
# Coincidencia por similitud
similitud = difflib.SequenceMatcher(None, comando.lower(), nombre.lower()).ratio()
return similitud > 0.7 # 70% de similitud
Problema 2: Falsos positivos
python
# Ejemplo: "Alex" en "Alexandre" o "alexandría"
# Solución: Verificar límites de palabra
import re
def es_nombre_exacto(comando, nombre):
"""Verifica que el nombre aparezca como palabra completa"""
# Busca "nombre" seguido de espacio, coma o fin de texto
patron = rf'\b{re.escape(nombre.lower())}\b[,\s]'
return re.search(patron, comando.lower()) is not None
Problema 3: Nombre muy común
python
# Si el nombre es muy común como "Alex"
# Solución: Usar nombre más único o prefijo
nombre_unico = "AsistenteAlex" # Menos probable en conversación normal
# O usar activación doble: "Oye Alex" en vez de solo "Alex"
🎨 Ideas creativas para nombres
Nombres temáticos:
python
temas = {
"espacial": ["Nova", "Orion", "Luna", "Cosmo", "Estrella"],
"tecnológico": ["Byte", "Chip", "Pixel", "Code", "Data"],
"mitológico": ["Atlas", "Hermes", "Atenea", "Thor", "Loki"],
"naturaleza": ["Rio", "Bosque", "Montaña", "Oceano", "Cielo"]
}
# Elige un tema y un nombre al azar
import random
tema_elegido = "tecnológico"
nombre = random.choice(temas[tema_elegido])
Generador de nombres:
python
def generar_nombre():
"""Genera un nombre único para el asistente"""
prefijos = ["Cyber", "Meta", "Hyper", "Neo", "Digi"]
sufijos = ["Bot", "Nex", "Lix", "Tor", "Ron"]
return random.choice(prefijos) + random.choice(sufijos)
nombre_generado = generar_nombre() # Ej: "CyberTor" o "MetaLix"
✅ Resumen clave
Elige un nombre único pero fácil de pronunciar
Verifica que el comando empiece con el nombre
Limpia el nombre del comando antes de procesarlo
Respuestas personalizadas usando el nombre
Maneja educadamente cuando no dicen el nombre
📝 Cuestionario de repaso
Pregunta 1
¿Por qué es útil que el asistente requiera decir su nombre primero?
a) Para hacerlo más difícil de usar
b) Para evitar que active por accidente
c) Para que el código sea más largo
d) Porque es obligatorio en todos los asistentes
Pregunta 2
Si el usuario dice "Alex, ¿qué hora es?", ¿qué parte es el "comando real"?
a) "Alex"
b) "Alex, ¿qué hora es?"
c) "¿qué hora es?"
d) "hora"
Pregunta 3
¿Qué hace .lstrip(", ") en el código?
a) Añade comas al texto
b) Elimina comas y espacios al inicio
c) Convierte texto a minúsculas
d) Cuenta las palabras
Pregunta 4
Si quieres que tu asistente también responda a "oye robot", ¿qué deberías hacer?
a) Cambiar su nombre a "robot"
b) Agregar "robot" a la lista de alias
c) Eliminar la verificación de nombre
d) Hacer un asistente separado
Pregunta 5
¿Por qué usar una clase para el asistente con nombre?
a) Porque se ve más profesional
b) Para organizar mejor el código y datos del asistente
c) Porque es obligatorio en Python
d) Para hacerlo más lento
Respuestas del cuestionario
b) Para evitar que active por accidente - Como cuando hablas de "Alexa" sin querer activarla
c) "¿qué hora es?" - El nombre se quita, queda solo el comando
b) Elimina comas y espacios al inicio - Por si dicen "Alex, ¿qué hora es?"
b) Agregar "robot" a la lista de alias - Permite múltiples formas de activación
b) Para organizar mejor el código y datos del asistente - Clases agrupan datos y funciones relacionadas
🎁 Reto final: Personaliza completamente tu asistente
Desafío 1: Voz única
python
def configurar_voz_unica(nombre):
"""Configura voz diferente según el nombre"""
voces_disponibles = engine.getProperty('voices')
# Asignar voces por nombre
voces_por_nombre = {
"Alex": 0, # Voz masculina
"Luna": 1, # Voz femenina
"Nova": 0, # Voz masculina
"Zoe": 1 # Voz femenina
}
if nombre in voces_por_nombre:
engine.setProperty('voice', voces_disponibles[voces_por_nombre[nombre]].id)
Desafío 2: Saludo personalizado por hora
python
def saludo_segun_hora(nombre):
"""Saluda diferente según la hora del día"""
from datetime import datetime
hora = datetime.now().hour
if 5 <= hora < 12:
return f"¡Buenos días! Soy {nombre}"
elif 12 <= hora < 19:
return f"¡Buenas tardes! Soy {nombre}"
else:
return f"¡Buenas noches! Soy {nombre}"
Desafío 3: Modo conversación
python
def modo_conversacion(nombre):
"""Permite conversar más naturalmente"""
hablar(f"Soy {nombre}, ¿y tú cómo te llamas?")
nombre_usuario = escuchar()
if nombre_usuario:
hablar(f"Mucho gusto, {nombre_usuario}. ¿De qué quieres hablar?")
# Mantener contexto de conversación
temas_hablados = []
while True:
respuesta = escuchar()
if "adiós" in respuesta:
break
# Continuar conversación inteligente...
🎉 ¡Felicidades! ¡Tienes un asistente con nombre!
Ahora tu asistente tiene:
✅ Nombre e identidad propia
✅ Activación por nombre
✅ Personalidad configurable
✅ Respuestas personalizadas
✅ Manejo profesional de interacciones
¡Has completado tu asistente virtual! 🎊
Tienes un programa completamente funcional que:
Escucha y habla
Reconoce comandos por nombre
Realiza múltiples tareas
Se despide educadamente
¡Tiene personalidad!
Siguientes pasos posibles:
Conectarlo a servicios en la nube
Agregar inteligencia artificial
Crear una interfaz gráfica
Hacerlo controlar dispositivos IoT
¡Disfruta de tu nuevo asistente personal! 🚀
Crea un tutorial para principiantes de un
https://www.youtube.com/watch?v=Pj9KbAKpQyk
https://www.youtube.com/watch?v=-0tIy8wWtzE
https://www.youtube.com/watch?v=YqSSId7xfwU
https://www.youtube.com/watch?v=MjK-j7YJ5YI
https://www.youtube.com/watch?v=l2G8-iQYfoA
https://www.youtube.com/watch?v=t-YO0XeHczU
Comentarios
Publicar un comentario