14-1- Reconociendo Intenciones - Dar la Hora
Reconociendo Intenciones - Dar la Hora
Introducción
En el tutorial anterior construimos un asistente que escucha y repite lo que decimos. Ahora vamos a darle un propósito específico: que reconozca cuándo le preguntamos "¿qué hora es?" y nos responda con la hora actual.
🎯 Objetivo
Hacer que nuestro asistente:
Escuche continuamente
Reconozca la frase "qué hora es"
Responda con la hora actual en voz alta
Termine el bucle de escucha después de entender la pregunta
📚 Paso 1: Entendiendo el problema actual
Actualmente tenemos una función escuchar() con un bucle infinito:
def escuchar(): while True: with sr.Microphone() as source: print('Escuchando...') audio = listener.listen(source, phrase_time_limit=5) try: print('Reconociendo...') text = listener.recognize_google(audio, language='es-US') hablar(text) print(text) except Exception as e: hablar('No pude entenderlo bien, repítelo por favor') print(e)
Problema: Este bucle nunca termina. Siempre sigue escuchando. Necesitamos que termine cuando detecte una intención específica.
🔄 Paso 2: Agregar return text para salir del bucle
Vamos a modificar la función para que retorne el texto cuando reconozca algo correctamente:
def escuchar(): while True: with sr.Microphone() as source: print('Escuchando...') audio = listener.listen(source, phrase_time_limit=5) try: print('Reconociendo...') # ¡Importante! Convertimos a minúsculas con .lower() text = listener.recognize_google(audio, language='es-US').lower() print(f"Dijiste: {text}") hablar(text) # Repite lo que dijiste return text # 👈 ESTO ES CLAVE: sale del bucle y devuelve el texto except Exception as e: hablar('No pude entenderlo bien, repítelo por favor') print(e)
¿Qué cambió?
return texthace que la función termine y devuelva el texto reconocidoEl bucle
while Truese rompe cuando reconoce algo correctamenteSi hay error, sigue en el bucle pidiendo que repitan
🔍 Paso 3: Entendiendo el return
Imagina que la función escuchar() es como una persona que:
Te escucha
Procesa lo que dices
Te devuelve (return) lo que escuchó
# Así usamos el valor retornado resultado = escuchar() # La función espera hasta que digas algo print(f"La función devolvió: {resultado}")
🕐 Paso 4: Importar datetime para manejar la hora
Necesitamos una librería para obtener la hora actual. datetime viene incluida con Python:
import datetime # 👈 Añade esto al inicio del archivo
🤔 Paso 5: Crear la lógica de intención
Ahora vamos a usar el valor retornado por escuchar() para tomar decisiones:
bienvenida() # Saludo inicial # Escuchamos y guardamos lo que dijo el usuario texto_usuario = escuchar() # Verificamos si dijo "qué hora es" if 'qué hora es' in texto_usuario: # Código para dar la hora hora_actual = datetime.datetime.now().strftime('%H:%M') respuesta = f"Son las {hora_actual}" print(respuesta) hablar(respuesta)
Explicación:
escuchar()se ejecuta y espera a que hablesCuando hablas, la función retorna el texto
Guardamos ese texto en
texto_usuarioVerificamos si contiene la frase "qué hora es"
Si es así, obtenemos la hora y respondemos
🧠 Paso 6: Explicación detallada del flujo
Vamos a entender qué pasa exactamente:
Llamamos a
escuchar()El programa se detiene aquí esperando que hables
Ves el mensaje "Escuchando..." en la terminal
Hablas: "¿Qué hora es?"
El micrófono captura tu voz
Google Speech Recognition la convierte a texto
El texto se guarda en la variable
text
La función hace
return textEsto termina el bucle
while TrueDevuelve el texto a quien llamó la función
El programa continúa
texto_usuario = escuchar() # texto_usuario ahora tiene "qué hora es"
Evaluamos la condición
if 'qué hora es' in texto_usuario: # ¡Es verdadero!
Ejecutamos el código de la hora
Obtenemos la hora actual
La decimos en voz alta
📝 Paso 7: Código completo
import pyttsx3 import speech_recognition as sr import datetime # Nueva importación # Inicializar motor de voz engine = pyttsx3.init() # Inicializar reconocedor listener = sr.Recognizer() def bienvenida(): engine.say("Bienvenido de vuelta.") engine.runAndWait() def hablar(por_hablar): engine.say(por_hablar) engine.runAndWait() def escuchar(): """ Escucha hasta que entienda algo y RETORNA el texto reconocido """ while True: with sr.Microphone() as source: print('Escuchando...') audio = listener.listen(source, phrase_time_limit=5) try: print('Reconociendo...') # Convertimos a minúsculas para facilitar las comparaciones text = listener.recognize_google(audio, language='es-US').lower() print(f"Dijiste: {text}") hablar(text) # Repite lo que dijiste return text # 👈 SALIMOS Y DEVOLVEMOS EL TEXTO except Exception as e: hablar('No pude entenderlo bien, repítelo por favor') print(e) # El bucle continúa, no hay return aquí # PROGRAMA PRINCIPAL bienvenida() # Escuchamos y guardamos lo que dijo texto_usuario = escuchar() # Evaluamos la intención if 'qué hora es' in texto_usuario: # Obtenemos la hora actual hora_actual = datetime.datetime.now().strftime('%H:%M') respuesta = f"Son las {hora_actual}" print(respuesta) hablar(respuesta) else: # Si no reconoce la intención hablar("Lo siento, no entendí qué necesitas")
🧪 Paso 8: Probando el asistente
Cuando ejecutes el programa:
Escucharás: "Bienvenido de vuelta."
Verás en terminal:
Escuchando...Tú dices: "¿Qué hora es?"
El asistente repite: "qué hora es" (en voz alta)
Responde: "Son las 15:30" (hora actual)
🔄 Paso 9: Ampliando a más intenciones
Podemos agregar más preguntas fácilmente:
bienvenida() texto_usuario = escuchar() if 'qué hora es' in texto_usuario: hora = datetime.datetime.now().strftime('%H:%M') hablar(f"Son las {hora}") elif 'qué día es hoy' in texto_usuario: fecha = datetime.datetime.now().strftime('%d/%m/%Y') hablar(f"Hoy es {fecha}") elif 'cómo te llamas' in texto_usuario: hablar("Me llamo Asistente Virtual") else: hablar("No reconozco ese comando")
🎯 Conceptos clave aprendidos
| Concepto | Explicación |
|---|---|
return | Sale de la función y devuelve un valor |
| Bucle infinito | while True - nunca termina a menos que haya break o return |
| Intención | Lo que el usuario quiere lograr con su frase |
.lower() | Convierte todo a minúsculas para comparar fácilmente |
in | Operador que verifica si una cadena está dentro de otra |
⚠️ Punto importante: ¿Por qué return y no break?
Si usáramos break, solo saldríamos del bucle pero la función no devolvería nada:
# Con break - MAL PARA ESTE CASO def escuchar(): while True: # ... código ... if exito: break # Sale del bucle pero no devuelve texto # La función termina sin return → devuelve None
Con return:
Sale del bucle
Devuelve el valor
Termina la función
🏆 Resumen
Ahora nuestro asistente:
Escucha hasta entender algo
Devuelve lo que escuchó
Analiza si contiene palabras clave
Ejecuta acciones específicas
Responde en voz alta
¡Ya tienes un asistente que reconoce intenciones básicas! En el próximo tutorial podríamos agregar un bucle principal para que siga funcionando después de cada pregunta.
Comentarios
Publicar un comentario