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

  1. Modificación del Código: Ajustamos el código para responder a nuevas preguntas

  2. Estructura y Condicionales: Usamos elif para evitar ejecuciones múltiples

  3. Almacenamiento de Resultados: Guardamos el resultado de escuchar() en una variable

  4. Formato del Texto: Convertimos a minúsculas con .lower() para comparaciones correctas

  5. Mejora en la Presentación: Damos formato más natural a las respuestas

  6. Funciones Específicas: Creamos funciones separadas para cada funcionalidad

  7. Implementación de Bucle: Hacemos que el programa escuche continuamente

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

python
# ❌ 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ía

Solución: Usar elif para que solo se ejecute la primera condición que se cumpla:

python
# ✅ 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ía

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

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

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

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

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

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

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

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

python
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

python
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

text
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

  1. 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)

  2. Mejorar el reconocimiento:

    • Hacer que detecte variaciones como "¿me puedes decir la hora?" o "hora actual"

  3. Añadir comandos de control:

    • "adiós" → salir del programa con break

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