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:

  1. Escuche continuamente

  2. Reconozca la frase "qué hora es"

  3. Responda con la hora actual en voz alta

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

python
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:

python
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 text hace que la función termine y devuelva el texto reconocido

  • El bucle while True se rompe cuando reconoce algo correctamente

  • Si 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:

  1. Te escucha

  2. Procesa lo que dices

  3. Te devuelve (return) lo que escuchó

python
# 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:

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:

python
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 hables

  • Cuando hablas, la función retorna el texto

  • Guardamos ese texto en texto_usuario

  • Verificamos 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:

  1. Llamamos a escuchar()

    • El programa se detiene aquí esperando que hables

    • Ves el mensaje "Escuchando..." en la terminal

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

  3. La función hace return text

    • Esto termina el bucle while True

    • Devuelve el texto a quien llamó la función

  4. El programa continúa

    python
    texto_usuario = escuchar()  # texto_usuario ahora tiene "qué hora es"
  5. Evaluamos la condición

    python
    if 'qué hora es' in texto_usuario:  # ¡Es verdadero!
  6. Ejecutamos el código de la hora

    • Obtenemos la hora actual

    • La decimos en voz alta


📝 Paso 7: Código completo

python
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:

  1. Escucharás: "Bienvenido de vuelta."

  2. Verás en terminalEscuchando...

  3. Tú dices: "¿Qué hora es?"

  4. El asistente repite: "qué hora es" (en voz alta)

  5. Responde: "Son las 15:30" (hora actual)


🔄 Paso 9: Ampliando a más intenciones

Podemos agregar más preguntas fácilmente:

python
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

ConceptoExplicación
returnSale de la función y devuelve un valor
Bucle infinitowhile True - nunca termina a menos que haya break o return
IntenciónLo que el usuario quiere lograr con su frase
.lower()Convierte todo a minúsculas para comparar fácilmente
inOperador 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:

python
# 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:

  1. Escucha hasta entender algo

  2. Devuelve lo que escuchó

  3. Analiza si contiene palabras clave

  4. Ejecuta acciones específicas

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

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