15-2- ¿Qué día es?

 

Agregando la Intención del Día y Bucle Principal

Introducción

En el tutorial anterior, nuestro asistente reconocía "qué hora es" y respondía, pero el programa terminaba después de una sola pregunta. Ahora vamos a:

  1. Agregar la intención para reconocer "qué día es"

  2. Crear funciones específicas para cada acción

  3. Implementar un bucle principal para que el asistente siempre esté escuchando

  4. Mejorar el formato de las respuestas


📚 Paso 1: El problema de tener múltiples if

Imaginemos que queremos reconocer dos frases:

  • "qué hora es"

  • "qué día es"

Un enfoque inicial podría ser:

python
if 'qué hora es' in escuchar():
    # dar hora
if 'qué día es' in escuchar():
    # dar día

Problemas:

  • Cada escuchar() espera que hables, ¡tendrías que hablar dos veces!

  • Si dices ambas cosas en una frase, se ejecutarían ambas acciones

  • Es ineficiente llamar a escuchar() múltiples veces


💡 Paso 2: Solución - Guardar el comando en una variable

La solución es llamar a escuchar() UNA SOLA VEZ y guardar el resultado:

python
comando = escuchar()  # Solo escuchamos una vez

if 'qué hora es' in comando:
    # dar hora
elif 'qué día es' in comando:
    # dar día

¿Por qué guardar en una variable?

  • escuchar() es una operación que toma tiempo (esperar a que hables)

  • Guardando el resultado, podemos usarlo múltiples veces

  • El código es más limpio y eficiente


🔤 Paso 3: Importancia de .lower()

Recordemos nuestra función escuchar() actualizada:

python
def escuchar():
    while True:
        with sr.Microphone() as source:
            print('Escuchando...')
            audio = listener.listen(source, phrase_time_limit=5)

            try:
                print('Reconociendo...')
                # 👇 CONVERTIMOS A MINÚSCULAS
                text = listener.recognize_google(audio, language='es-US').lower()
                hablar(text)
                print(text)
                return text
            except Exception as e:
                hablar('No pude entenderlo bien, repítelo por favor')
                print(e)

¿Por qué .lower()?

  • El usuario puede decir: "¿Qué hora es?", "QUÉ HORA ES", "qué hora es"

  • Sin .lower(), tendríamos que comparar con todas las variantes

  • Con .lower(), todo se convierte a minúsculas y solo comparamos con 'qué hora es'


🕐 Paso 4: Crear funciones específicas

Vamos a organizar mejor nuestro código creando funciones para cada acción:

python
import datetime

def dar_hora():
    """Función que dice la hora actual"""
    hora_actual = datetime.datetime.now().strftime('%H:%M')
    mensaje = f"La hora es {hora_actual}"
    print(mensaje)
    hablar(mensaje)

def dar_dia():
    """Función que dice la fecha actual"""
    dia = datetime.datetime.now().day
    mes = datetime.datetime.now().month
    año = datetime.datetime.now().year
    mensaje = f"La fecha actual es {dia} del {mes} de {año}"
    print(mensaje)
    hablar(mensaje)

Ventajas:

  • Código más organizado

  • Reutilizable

  • Fácil de modificar el formato


🔄 Paso 5: Implementar el bucle principal

Ahora queremos que el asistente siempre esté escuchando, no solo una vez:

python
bienvenida()

while True:  # Bucle infinito
    comando = escuchar()  # Esperamos a que hables

    if 'qué hora es' in comando:
        dar_hora()
    elif 'qué día es' in comando:
        dar_dia()
    # Podemos agregar más elif aquí

¿Por qué while True?

  • Crea un bucle que nunca termina

  • Después de responder, vuelve a escuchar

  • El asistente funciona continuamente


📝 Paso 6: Código completo

python
import pyttsx3
import speech_recognition as sr
import datetime

# Inicializar componentes
engine = pyttsx3.init()
listener = sr.Recognizer()

def bienvenida():
    """Saludo inicial"""
    engine.say("Bienvenido de vuelta.")
    engine.runAndWait()

def hablar(por_hablar):
    """Convierte texto a voz"""
    engine.say(por_hablar)
    engine.runAndWait()

def escuchar():
    """
    Escucha hasta que entiende algo y retorna el texto en minúsculas
    """
    while True:
        with sr.Microphone() as source:
            print('Escuchando...')
            audio = listener.listen(source, phrase_time_limit=5)

            try:
                print('Reconociendo...')
                # Convertir a minúsculas para facilitar comparaciones
                text = listener.recognize_google(audio, language='es-US').lower()
                print(f"Dijiste: {text}")
                hablar(text)  # Repite lo que dijiste
                return text
            except Exception as e:
                hablar('No pude entenderlo bien, repítelo por favor')
                print(f"Error: {e}")
                # El bucle continúa, no hay return aquí

def dar_hora():
    """Función que dice la hora actual"""
    hora_actual = datetime.datetime.now().strftime('%H:%M')
    mensaje = f"La hora es {hora_actual}"
    print(mensaje)
    hablar(mensaje)

def dar_dia():
    """Función que dice la fecha actual"""
    ahora = datetime.datetime.now()
    dia = ahora.day
    mes = ahora.month
    año = ahora.year
    
    # Versión 1: Formato simple
    mensaje = f"La fecha actual es {dia} del {mes} de {año}"
    
    # Versión 2: Con nombre del mes (opcional)
    # nombres_meses = ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio',
    #                 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre']
    # mensaje = f"La fecha actual es {dia} de {nombres_meses[mes-1]} de {año}"
    
    print(mensaje)
    hablar(mensaje)

# PROGRAMA PRINCIPAL
bienvenida()

# Bucle principal - El asistente siempre está activo
while True:
    comando = escuchar()
    
    if 'qué hora es' in comando:
        dar_hora()
    
    elif 'qué día es' in comando:
        dar_dia()
    
    # Podemos agregar más comandos aquí
    elif 'adiós' in comando or 'hasta luego' in comando:
        hablar("Hasta luego, fue un placer ayudarte")
        break  # Sale del bucle y termina el programa
    
    else:
        hablar("Lo siento, no reconozco ese comando")

🔍 Paso 7: Explicación detallada de la función dar_dia()

Analicemos la función que da el día:

python
def dar_dia():
    ahora = datetime.datetime.now()  # Obtiene fecha y hora actual
    dia = ahora.day                   # Extrae el día (1-31)
    mes = ahora.month                  # Extrae el mes (1-12)
    año = ahora.year                   # Extrae el año (ej: 2026)
    
    mensaje = f"La fecha actual es {dia} del {mes} de {año}"
    hablar(mensaje)

¿Por qué datetime.datetime.now().day?

  • datetime.datetime.now() → Obtiene el momento actual completo

  • .day → Extrae solo el número del día

  • Podríamos usar datetime.date.today() para solo la fecha sin hora

Alternativa más elegante con nombres de meses:

python
def dar_dia_elegante():
    nombres_meses = ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio',
                    'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre']
    
    ahora = datetime.datetime.now()
    dia = ahora.day
    mes = nombres_meses[ahora.month - 1]  # -1 porque los índices empiezan en 0
    año = ahora.year
    
    mensaje = f"Hoy es {dia} de {mes} de {año}"
    hablar(mensaje)

🔄 Paso 8: Visualizando el flujo del programa

text
INICIO
  │
  ▼
bienvenida() ──► "Bienvenido de vuelta"
  │
  ▼
┌─────────────────────┐
│ while True:         │
│   │                 │
│   ▼                 │
│ comando = escuchar()│──► Espera a que hables
│   │                 │       │
│   ▼                 │       ▼
│ Analizar comando    │   "qué hora es"
│   │                 │   "qué día es"
│   ▼                 │   "adiós"
│ Ejecutar acción     │
│   │                 │
│   ▼                 │
│ Volver al inicio    │
└─────────────────────┘

📊 Paso 9: Comparativa de enfoques

EnfoqueVentajasDesventajas
Sin variable if 'x' in escuchar():Código cortoLlama a escuchar() múltiples veces
Con variable comando = escuchar()Una sola llamada, eficienteRequiere una línea extra
Sin bucleSimpleTermina después de una pregunta
Con bucle while TrueSiempre activoHay que manejar salida (break)

🧪 Paso 10: Probando el asistente

Cuando ejecutes el programa:

  1. Bienvenida: "Bienvenido de vuelta."

  2. Bucle: Aparece "Escuchando..." esperando tu comando

  3. Dices: "¿Qué día es?"

  4. Responde: "La fecha actual es 6 del 3 de 2026" (ejemplo)

  5. Sigue escuchando: Aparece "Escuchando..." nuevamente

  6. Dices: "¿Qué hora es?"

  7. Responde: "La hora es 16:45"

  8. Sigue escuchando: El ciclo continúa

  9. Dices: "Adiós"

  10. Responde: "Hasta luego..." y termina


🎯 Conceptos clave aprendidos

ConceptoExplicación
Variable comandoAlmacena lo que dijo el usuario para usarlo múltiples veces
.lower()Convierte todo a minúsculas para comparar sin importar mayúsculas
while TrueCrea un bucle infinito para que el asistente nunca deje de escuchar
elifEncadena condiciones para evaluar múltiples posibilidades
Funciones específicasdar_hora()dar_dia() organizan y reutilizan código
breakSale del bucle cuando decimos "adiós"

🚀 Paso 11: Para practicar

Intenta agregar estos comandos por tu cuenta:

  1. "qué mes es" - Que diga solo el mes actual

  2. "qué año es" - Que diga solo el año

  3. "qué temperatura hace" - (requiere API de clima)

  4. "reproduce música" - Que abra tu reproductor

python
# Ejemplo de cómo agregar "qué mes es"
elif 'qué mes es' in comando:
    mes = datetime.datetime.now().month
    nombres_meses = ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio',
                    'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre']
    hablar(f"Estamos en {nombres_meses[mes-1]}")

🏆 Resumen final

¡Ahora tienes un asistente mucho más completo! Lo que hemos logrado:

✅ Reconoce "qué hora es" y responde con la hora actual
✅ Reconoce "qué día es" y responde con la fecha completa
✅ Está siempre activo gracias al bucle while True
✅ Guarda el comando en una variable para eficiencia
✅ Usa .lower() para facilitar las comparaciones
✅ Tiene funciones organizadas para cada acción

En el próximo tutorial podríamos agregar reconocimiento de contexto, integración con APIs externas, o una interfaz gráfica. ¡El límite es tu imaginación! 

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