4. Código del proyecto
Cómo Crear un Asistente Virtual con Python
💻 4. Código del Proyecto - Construyendo el Cerebro del Asistente
Explicación para principiantes:
Ahora vamos a unir todas las librerías como piezas de LEGO para crear un asistente que pueda escuchar, entender y responder. Imagina que estás construyendo un robot paso a paso: primero los sensores (oídos), luego el cerebro (lógica), y finalmente las acciones (respuestas).
Estructura del código:
text
1. Importar herramientas (librerías) ✅
2. Configurar el micrófono y altavoz 🔊
3. Crear funciones (habilidades específicas) 🛠️
4. Programa principal (escuchar y actuar) 🔄
📦 Parte 1: Importar las Librerías - "La Caja de Herramientas"
python
# Estas son nuestras herramientas principales
import speech_recognition as sr # Para ESCUCHAR (micrófono)
import pyttsx3 # Para HABLAR (altavoz)
import datetime # Para saber la hora/fecha ⏰
import wikipedia # Para buscar información 📚
import pywhatkit # Para buscar en Google/YouTube 🌐
import pyjokes # Para contar chistes 😄
import requests # Para obtener datos de internet 📡
import yfinance as yf # Para información de bolsa 📈
import pyautogui # Para controlar la computadora 🖱️
import operator # Para cálculos matemáticos 🧮
import os # Para abrir archivos 📁
Explicación visual de las importaciones:
text
┌─────────────────┬─────────────────────────────┐
│ ESCUCHAR │ HABLAR │ ACTUAR │
├─────────────────┼─────────────────┼────────────┤
│ speech_recognition │ pyttsx3 │ pyautogui │
│ │ │ os │
├─────────────────┼─────────────────┼────────────┤
│ BUSCAR │ UTILIDADES │ DATOS │
├─────────────────┼─────────────────┼────────────┤
│ wikipedia │ pyjokes │ yfinance │
│ pywhatkit │ operator │ requests │
│ │ datetime │ │
└─────────────────┴─────────────────┴────────────┘
🔧 Parte 2: Configuración Inicial - "Encender los Dispositivos"
python
# 1. Configurar el RECONOCEDOR DE VOZ (los "oídos")
listener = sr.Recognizer()
# 'listener' es como un asistente que solo escucha
# 2. Configurar el SINTETIZADOR DE VOZ (la "boca")
engine = pyttsx3.init()
# 'engine' es el motor que produce la voz
# 3. Elegir la voz (algunas computadoras tienen varias)
voces = engine.getProperty('voices')
engine.setProperty('voice', voces[2].id) # Prueba con 0, 1, o 2
🔍 ¿Qué hace cada línea?
sr.Recognizer(): Crea un objeto que puede entender voz humana
pyttsx3.init(): Inicializa el motor de texto a voz
voces[2].id: Selecciona la tercera voz disponible (índice 2)
Prueba rápida de voz:
python
# Prueba en consola para ver cuántas voces tienes
import pyttsx3
engine = pyttsx3.init()
voces = engine.getProperty('voices')
for i, voz in enumerate(voces):
print(f"Voz {i}: {voz.name}")
🗣️ Parte 3: Funciones Esenciales - "Las Habilidades Básicas"
Función 1: Hablar - "La Boca del Asistente"
python
def hablar(texto):
"""Convierte texto en voz"""
engine.say(texto) # Prepara el texto para hablar
engine.runAndWait() # Habla y espera a terminar
print(f"🤖: {texto}") # También muestra en pantalla
Ejemplo de uso:
python
hablar("Hola, ¿cómo estás?")
# Resultado: Se escucha "Hola, ¿cómo estás?" por los parlantes
Función 2: Escuchar - "Los Oídos del Asistente"
python
def escuchar():
"""Escucha y convierte voz en texto"""
while True: # Intenta continuamente hasta entender
with sr.Microphone() as source: # Usa el micrófono
print("🎤 Escuchando... (habla ahora)")
# Escucha por máximo 5 segundos
audio = listener.listen(source, phrase_time_limit=5)
try:
# Intenta entender usando Google (gratis)
texto = listener.recognize_google(audio, language='es-ES').lower()
print(f"👤 Tú dijiste: {texto}")
return texto # Devuelve lo que entendió
except Exception as e:
# Si no entendió, pide que repitas
hablar("No te entendí, ¿puedes repetirlo?")
print(f"Error: {e}")
continue # Vuelve a intentar
Visualización del proceso de escucha:
text
Tu voz → Micrófono → Audio digital → Google API → Texto → Python
🎤 🎤 01010101 🌐 Google "hola" 💻
🎯 Parte 4: Funciones Específicas - "Las Habilidades Avanzadas"
Habilidad 1: Decir la Hora
python
def dar_hora():
hora = datetime.datetime.now().strftime('%H:%M')
hablar(f"Son las {hora}")
# Si son las 14:30 → "Son las catorce treinta"
Habilidad 2: Buscar en Wikipedia
python
def busqueda_wikipedia(pregunta):
pregunta = pregunta.replace('busca en wikipedia', '').strip()
wikipedia.set_lang('es')
try:
resultado = wikipedia.summary(pregunta, sentences=2)
hablar(f"Según Wikipedia: {resultado}")
except:
hablar("No encontré información sobre eso")
Habilidad 3: Reproducir en YouTube
python
def busqueda_youtube(pedido):
cancion = pedido.replace('reproduce', '').strip()
hablar(f"Reproduciendo {cancion} en YouTube")
pywhatkit.playonyt(cancion) # Abre YouTube y reproduce
Habilidad 4: Contar un Chiste
python
def chiste():
try:
broma = pyjokes.get_joke(language='es')
hablar(broma)
except:
hablar("¿Por qué los programadores confunden Halloween con Navidad? Porque OCT 31 = DEC 25")
Habilidad 5: Calcular Operaciones
python
def calcular():
hablar("¿Qué quieres calcular? Di algo como '3 más 4'")
# Diccionario para traducir palabras a operadores
operadores = {
'más': '+', 'menos': '-',
'por': '*', 'dividido': '/'
}
operacion = escuchar()
# Convierte "3 más 4" → "3 + 4"
for palabra, simbolo in operadores.items():
operacion = operacion.replace(palabra, simbolo)
try:
resultado = eval(operacion) # ¡Cuidado! eval() puede ser peligroso
hablar(f"El resultado es {resultado}")
except:
hablar("No pude calcular eso")
⚠️ Nota de seguridad: eval() puede ejecutar código peligroso. En un proyecto real, usa una forma más segura.
🧠 Parte 5: Programa Principal - "El Cerebro que Decide"
python
def main():
hablar("¡Hola! Soy tu asistente virtual. ¿En qué puedo ayudarte?")
while True: # Bucle infinito para estar siempre disponible
print("\n" + "="*50)
print("Esperando tu comando...")
comando = escuchar()
# Si dices "Alexa" o el nombre de tu asistente
if 'asistente' in comando or 'oye' in comando:
if 'hora' in comando:
dar_hora()
elif 'wikipedia' in comando:
busqueda_wikipedia(comando)
elif 'reproduce' in comando:
busqueda_youtube(comando)
elif 'chiste' in comando:
chiste()
elif 'calcula' in comando:
calcular()
elif 'adiós' in comando or 'salir' in comando:
hablar("Hasta luego, ¡que tengas un buen día!")
break # Termina el programa
else:
hablar("No entendí ese comando. Prueba con: hora, wikipedia, reproduce, chiste o calcula")
elif 'salir' in comando: # Comando de emergencia
hablar("Cerrando el programa")
break
# Ejecutar el programa
if __name__ == "__main__":
main()
🛠️ Versión Completa Simplificada (Para Empezar)
python
"""
ASISTENTE VIRTUAL BÁSICO - VERSIÓN SIMPLIFICADA
Autor: [Tu Nombre]
Fecha: [Fecha Actual]
"""
# ========== IMPORTAR HERRAMIENTAS ==========
import speech_recognition as sr
import pyttsx3
import datetime
# ========== CONFIGURACIÓN INICIAL ==========
# 1. Oídos del asistente
listener = sr.Recognizer()
# 2. Boca del asistente
engine = pyttsx3.init()
# 3. Probar voces disponibles
voces = engine.getProperty('voices')
engine.setProperty('voice', voces[0].id) # Primera voz
# ========== FUNCIONES BÁSICAS ==========
def hablar(texto):
"""Hace que el asistente hable"""
print(f"🤖: {texto}")
engine.say(texto)
engine.runAndWait()
def escuchar():
"""Escucha lo que dice el usuario"""
try:
with sr.Microphone() as source:
print("🎤: Escuchando...")
voz = listener.listen(source)
texto = listener.recognize_google(voz, language='es-ES')
texto = texto.lower()
print(f"👤: {texto}")
return texto
except:
hablar("No te escuché, ¿puedes repetir?")
return ""
# ========== HABILIDADES DEL ASISTENTE ==========
def saludo():
"""Saluda al usuario"""
hora = datetime.datetime.now().hour
if hora < 12:
hablar("¡Buenos días!")
elif hora < 19:
hablar("¡Buenas tardes!")
else:
hablar("¡Buenas noches!")
def decir_hora():
"""Dice la hora actual"""
hora_actual = datetime.datetime.now().strftime("%H:%M")
hablar(f"Son las {hora_actual}")
# ========== PROGRAMA PRINCIPAL ==========
def main():
"""Función principal del asistente"""
saludo()
hablar("Soy tu asistente virtual. Di 'hora' para saber la hora o 'adiós' para salir.")
while True:
comando = escuchar()
if 'hora' in comando:
decir_hora()
elif 'adiós' in comando or 'salir' in comando:
hablar("¡Hasta luego! Fue un placer ayudarte.")
break
elif comando: # Si hay algún comando
hablar(f"Dijiste: {comando}. Prueba con 'hora' o 'adiós'")
# ========== EJECUTAR EL PROGRAMA ==========
if __name__ == "__main__":
main()
📋 Tabla de Comandos para tu Asistente
🔧 Personalización Importante
En el código original hay lugares que DEBES cambiar:
python
# 1. Cambia el nombre de tu asistente (línea ~92)
if 'aqui_va_el_nombre_de_tu_asistente' in comando:
# Cambia por:
if 'jarvis' in comando: # o 'alexa', 'asistente', etc.
# 2. Para el clima, necesitas API Key (obtén una gratis en openweathermap.org)
api_key = 'tu_clave_aqui' # Reemplaza esto
city_name = 'tu_ciudad' # Reemplaza esto
# 3. Para capturas de pantalla, cambia la ruta
captura.save('C://Users/TU_USUARIO/Desktop/captura.png')
❓ Cuestionario de Repaso
Pregunta 1:
En la línea engine.setProperty('voice', voces[2].id), ¿qué hace el número 2?
A) Selecciona la segunda voz de la lista disponible
B) Ajusta el volumen al nivel 2
C) Selecciona la tercera voz de la lista (índice 2)
D) Establece la velocidad de habla a 2x
Respuesta correcta: C
Explicación: En programación, las listas empiezan en 0, así que voces[0] es la primera, voces[1] la segunda, y voces[2] la tercera.
Pregunta 2:
¿Qué función se encarga de convertir tu voz en texto que Python pueda entender?
A) hablar()
B) escuchar()
C) dar_hora()
D) busqueda_wikipedia()
Respuesta correcta: B
Explicación: La función escuchar() usa speech_recognition para capturar audio y convertirlo en texto.
Pregunta 3:
Si quieres que tu asistente diga "Hola mundo", ¿qué función usarías?
A) escuchar("Hola mundo")
B) hablar("Hola mundo")
C) print("Hola mundo")
D) engine("Hola mundo")
Respuesta correcta: B
Explicación: hablar() es nuestra función personalizada que usa pyttsx3 para convertir texto a voz.
Pregunta 4:
¿Qué estructura de control mantiene el asistente funcionando continuamente?
A) if-else
B) for loop
C) while True
D) try-except
Respuesta correcta: C
Explicación: while True crea un bucle infinito que solo se rompe cuando el usuario dice "salir".
Pregunta 5:
¿Qué hace la línea if '__main__' == __name__: al final del código?
A) Verifica si el programa está siendo ejecutado directamente
B) Comprueba si el usuario es el principal
C) Pregunta el nombre del asistente
D) Es un comentario decorativo
Respuesta correcta: A
Explicación: Esta es una convención de Python que permite que el código se ejecute solo cuando el archivo se corre directamente (no cuando se importa como módulo).
Pregunta 6 (Bonus):
¿Por qué usamos try-except en la función escuchar()?
A) Para que el programa sea más rápido
B) Para manejar errores cuando no se entiende la voz
C) Para convertir texto a voz
D) Para importar más librerías
Respuesta correcta: B
Explicación: try-except captura errores (como cuando el micrófono no capta bien) y evita que el programa se cierre inesperadamente.
🚀 Próximos Pasos y Mejoras
Ejecuta el código simplificado primero para verificar que funciona
Añade una habilidad a la vez (primero hora, luego Wikipedia, etc.)
Personaliza el nombre de tu asistente
Añade más comandos según tus necesidades
Prueba en un entorno tranquilo para mejor reconocimiento de voz
💡 Consejo: Comienza con la versión simplificada y ve añadiendo funciones gradualmente. ¡Es mejor tener un asistente simple que funcione que uno complejo que no funciona!
https://www.youtube.com/watch?v=Pj9KbAKpQyk
https://www.youtube.com/watch?v=-0tIy8wWtzE
https://www.youtube.com/watch?v=YqSSId7xfwU
https://www.youtube.com/watch?v=MjK-j7YJ5YI
https://www.youtube.com/watch?v=l2G8-iQYfoA
https://www.youtube.com/watch?v=yJlVqfO2nP0
https://www.youtube.com/watch?v=t-YO0XeHczU
Comentarios
Publicar un comentario