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:
Agregar la intención para reconocer "qué día es"
Crear funciones específicas para cada acción
Implementar un bucle principal para que el asistente siempre esté escuchando
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:
if 'qué hora es' in escuchar():
# dar hora
if 'qué día es' in escuchar():
# dar díaProblemas:
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:
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:
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 variantesCon
.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:
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:
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
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:
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íaPodríamos usar
datetime.date.today()para solo la fecha sin hora
Alternativa más elegante con nombres de meses:
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
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
| Enfoque | Ventajas | Desventajas |
|---|---|---|
Sin variable if 'x' in escuchar(): | Código corto | Llama a escuchar() múltiples veces |
Con variable comando = escuchar() | Una sola llamada, eficiente | Requiere una línea extra |
| Sin bucle | Simple | Termina después de una pregunta |
Con bucle while True | Siempre activo | Hay que manejar salida (break) |
🧪 Paso 10: Probando el asistente
Cuando ejecutes el programa:
Bienvenida: "Bienvenido de vuelta."
Bucle: Aparece "Escuchando..." esperando tu comando
Dices: "¿Qué día es?"
Responde: "La fecha actual es 6 del 3 de 2026" (ejemplo)
Sigue escuchando: Aparece "Escuchando..." nuevamente
Dices: "¿Qué hora es?"
Responde: "La hora es 16:45"
Sigue escuchando: El ciclo continúa
Dices: "Adiós"
Responde: "Hasta luego..." y termina
🎯 Conceptos clave aprendidos
| Concepto | Explicación |
|---|---|
Variable comando | Almacena lo que dijo el usuario para usarlo múltiples veces |
.lower() | Convierte todo a minúsculas para comparar sin importar mayúsculas |
while True | Crea un bucle infinito para que el asistente nunca deje de escuchar |
elif | Encadena condiciones para evaluar múltiples posibilidades |
| Funciones específicas | dar_hora(), dar_dia() organizan y reutilizan código |
break | Sale del bucle cuando decimos "adiós" |
🚀 Paso 11: Para practicar
Intenta agregar estos comandos por tu cuenta:
"qué mes es" - Que diga solo el mes actual
"qué año es" - Que diga solo el año
"qué temperatura hace" - (requiere API de clima)
"reproduce música" - Que abra tu reproductor
# 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
Publicar un comentario