15-1- ¿Qué día es?
Añadiendo más intenciones y mejorando la estructura del asistente
En este tutorial vamos a ampliar las capacidades de nuestro asistente virtual, añadiendo la funcionalidad para reconocer cuándo preguntamos por la fecha actual y mejorando la estructura del código.
📝 Resumen de los puntos clave
Modificación del Código: Ajustamos el código para responder a nuevas preguntas
Estructura y Condicionales: Usamos
elifpara evitar ejecuciones múltiplesAlmacenamiento de Resultados: Guardamos el resultado de
escuchar()en una variableFormato del Texto: Convertimos a minúsculas con
.lower()para comparaciones correctasMejora en la Presentación: Damos formato más natural a las respuestas
Funciones Específicas: Creamos funciones separadas para cada funcionalidad
Implementación de Bucle: Hacemos que el programa escuche continuamente
Logros en la Organización: Código más limpio, ordenado y profesional
Paso a Paso
Paso 1: El problema con múltiples condicionales
Si usamos dos if separados, cuando digamos una frase que contenga ambas palabras clave, se ejecutarán las dos acciones simultáneamente:
# ❌ MAL - Se pueden ejecutar ambos si la frase contiene ambas palabras
if 'qué hora es' in escuchar():
hablar(datetime.datetime.now().strftime('%H:%M'))
if 'qué día es' in escuchar():
# código para dar el díaSolución: Usar elif para que solo se ejecute la primera condición que se cumpla:
# ✅ BIEN - Solo se ejecuta una opción
if 'qué hora es' in escuchar():
hablar(datetime.datetime.now().strftime('%H:%M'))
elif 'qué día es' in escuchar():
# código para dar el díaPaso 2: Almacenar el resultado en una variable
El problema de llamar a escuchar() en cada condición es que se ejecutará múltiples veces, pidiéndote que hables varias veces:
# ❌ MAL - Llama a escuchar() dos veces
if 'qué hora es' in escuchar(): # Primera llamada
hablar(...)
elif 'qué día es' in escuchar(): # Segunda llamada - ¡te pedirá hablar otra vez!
hablar(...)Solución: Guardar el resultado en una variable:
# ✅ BIEN - Solo llama a escuchar() una vez
comando = escuchar() # El resultado se almacena
if 'qué hora es' in comando:
hablar(datetime.datetime.now().strftime('%H:%M'))
elif 'qué día es' in comando:
hablar(datetime.datetime.now().day)Paso 3: Problema con mayúsculas/minúsculas
Si el usuario dice "Qué hora es" con mayúscula y buscamos 'qué hora es' en minúscula, no encontrará coincidencia:
# ❌ MAL - "Qué hora es" != "qué hora es"
text = listener.recognize_google(audio, language='es-US')
# Si el usuario dice "Qué hora es", text = "Qué hora es"Solución: Convertir todo a minúsculas:
# ✅ BIEN - Todo se convierte a minúsculas
text = listener.recognize_google(audio, language='es-US').lower()
# Ahora "Qué hora es" → "qué hora es"Paso 4: Crear funciones específicas
Para mantener el código ordenado, creamos funciones separadas:
def dar_hora():
"""Función que dice la hora actual"""
hora_actual = datetime.datetime.now().strftime('%H:%M')
hablar(f"La hora es {hora_actual}")
def dar_dia():
"""Función que dice la fecha actual"""
fecha_actual = datetime.datetime.now()
# Versión simple
# hablar(f"{fecha_actual.day}")
# Versión mejorada
hablar(f"La fecha actual es: {fecha_actual.day} del {fecha_actual.month}")Paso 5: Mejorar el formato de las respuestas
Podemos hacer las respuestas más naturales:
def dar_hora():
hora_actual = datetime.datetime.now().strftime('%H:%M')
hablar(f"La hora es {hora_actual}") # "La hora es 15:30"
def dar_dia():
fecha = datetime.datetime.now()
dia = fecha.day
mes = fecha.month
año = fecha.year
hablar(f"La fecha actual es: {dia} del {mes} de {año}")
# "La fecha actual es: 6 del 3 de 2026"O usar el formato completo:
def dar_dia():
hablar(f"La fecha actual es: {datetime.datetime.now()}")
# "La fecha actual es: 2026-03-06 15:30:45.123456"Paso 6: Implementar un bucle infinito
Para que el asistente escuche continuamente sin detenerse:
bienvenida()
while True: # Bucle infinito
comando = escuchar()
if 'qué hora es' in comando:
dar_hora()
elif 'qué día es' in comando:
dar_dia()
# Aquí puedes añadir más condiciones📁 Código completo final
import speech_recognition as sr
import pyttsx3
import datetime
# Configuración inicial
listener = sr.Recognizer()
engine = pyttsx3.init()
def hablar(texto):
"""Convierte texto a voz"""
engine.say(texto)
engine.runAndWait()
def bienvenida():
"""Da la bienvenida al usuario"""
hablar("Bienvenido de vuelta")
def escuchar():
"""Escucha y reconoce voz, 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...')
# 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
except Exception as e:
hablar('No pude entenderlo bien, repítelo por favor')
print(f"Error: {e}")
def dar_hora():
"""Informa la hora actual"""
hora = datetime.datetime.now().strftime('%H:%M')
respuesta = f"La hora es {hora}"
print(respuesta)
hablar(respuesta)
def dar_dia():
"""Informa la fecha actual"""
fecha = datetime.datetime.now()
dia = fecha.day
mes = fecha.month
año = fecha.year
respuesta = f"La fecha actual es: {dia} del {mes} de {año}"
print(respuesta)
hablar(respuesta)
# Programa principal
bienvenida()
# Bucle infinito para escuchar constantemente
while True:
comando = escuchar()
if 'qué hora es' in comando:
dar_hora()
elif 'qué día es' in comando:
dar_dia()
# Puedes agregar más condiciones aquí
# elif 'cómo te llamas' in comando:
# hablar("Me llamo Asistente Virtual")
# elif 'adiós' in comando:
# hablar("Hasta luego")
# break # Sale del bucle y termina el programa🚀 Ejecución del programa
Bienvenido de vuelta
Escuchando...
Reconociendo...
Dijiste: qué día es
La fecha actual es: 6 del 3 de 2026
Escuchando...
Reconociendo...
Dijiste: qué hora es
La hora es 15:30
Escuchando...
Reconociendo...
Dijiste: gracias
(No hay condición para "gracias", no hace nada)
Escuchando...🎯 Logros obtenidos
✅ Código más organizado: Cada funcionalidad tiene su propia función
✅ Interacción continua: El bucle while True mantiene el programa activo
✅ Respuestas naturales: Formato mejorado para hora y fecha
✅ Detección precisa: Uso de .lower() evita problemas con mayúsculas
✅ Eficiencia: Almacenamos el comando en una variable para usarlo múltiples veces
✅ Escalable: Fácil añadir nuevas intenciones con más elif
💡 Desafíos para practicar
Añadir más intenciones:
"¿qué mes es?" → responder solo el mes
"¿qué año es?" → responder solo el año
"¿qué temperatura hace?" (necesitarías API del clima)
Mejorar el reconocimiento:
Hacer que detecte variaciones como "¿me puedes decir la hora?" o "hora actual"
Añadir comandos de control:
"adiós" → salir del programa con
break
Comentarios
Publicar un comentario