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:

  1. Personalización: Se siente más como un compañero que como una herramienta

  2. Activación por nombre: Como "Oye Siri" o "Ok Google"

  3. Conexión emocional: Los humanos nos conectamos mejor con cosas con nombre

  4. 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:

Nombre

Significado

Para qué tipo de asistente

Alex

Protector de la humanidad

Asistente general

Luna

La luna

Asistente nocturno o creativo

Nova

Nueva estrella

Asistente moderno y brillante

Kai

Mar

Asistente tranquilo y sabio

Zoe

Vida

Asistente energético

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

  1. Elige un nombre único pero fácil de pronunciar

  2. Verifica que el comando empiece con el nombre

  3. Limpia el nombre del comando antes de procesarlo

  4. Respuestas personalizadas usando el nombre

  5. 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

  1. b) Para evitar que active por accidente - Como cuando hablas de "Alexa" sin querer activarla

  2. c) "¿qué hora es?" - El nombre se quita, queda solo el comando

  3. b) Elimina comas y espacios al inicio - Por si dicen "Alex, ¿qué hora es?"

  4. b) Agregar "robot" a la lista de alias - Permite múltiples formas de activación

  5. 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:

  1. Escucha y habla

  2. Reconoce comandos por nombre

  3. Realiza múltiples tareas

  4. Se despide educadamente

  5. ¡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

Entradas más populares de este blog

1-7. Transforma tu audio a texto

10. Haz que tu asistente hable

8. NUEVO - Solución si tu micrófono no está captando tu audio