From cf74c0f3fbbbffc99dc0b575b3bf9a9ffd90c7ac Mon Sep 17 00:00:00 2001 From: Manuel Vergara Date: Sun, 23 Apr 2023 12:17:54 +0200 Subject: [PATCH] Add asistente_virtual.py Signed-off-by: Manuel Vergara --- dia_13/asistente_virtual.py | 286 ++++++++++++++++++++++++++++++++++++ 1 file changed, 286 insertions(+) diff --git a/dia_13/asistente_virtual.py b/dia_13/asistente_virtual.py index e0f2474..1ab68cf 100644 --- a/dia_13/asistente_virtual.py +++ b/dia_13/asistente_virtual.py @@ -9,3 +9,289 @@ yfinance pyjokes wikipedia """ + +import pyttsx3 +import speech_recognition as sr +import pywhatkit +import yfinance as yf +import pyjokes +import webbrowser +import datetime +import wikipedia + + +def transformar_audio_en_texto(): + """ + Escuchar nuestro microfono + y devolver el audio como texto + """ + + # Almacenar recognizer en variable + r = sr.Recognizer() + + # Configurar el micrófono + with sr.Microphone() as origen: + + r.adjust_for_ambient_noise(origen) + r.energy_threshold = 6500 + r.dynamic_energy_threshold = True + # Tiempo de espera + # A veces resuelve problemas + r.pause_threshold = 1.2 + + # Informar que comenzó la grabación + print("Ya puedes hablar") + + # Variable para guardar lo que escuche + audio = r.listen(origen) + + # Manejar errores + # En caso de que no entienda el audio + try: + + # Buscar en google + pedido = r.recognize_google(audio, language="es-ES") + + # Prueba de que pudo ingresar audio e imprimir + print("Dijiste: " + pedido) + + # Devolver pedido + return pedido + + # Con error + except sr.UnknownValueError: + + # Prueba de que no comprendió el audio + print("Ups! No entendí") + + # Devolver error + return "sigo esperando" + + # En caso de que no se pueda transformar el audio a texto + except sr.RequestError: + + # Prueba de que no comprendió el audio + print("Ups! No hay servicio") + + # Devolver error + return "sigo esperando" + + # error inesperado + except: + + # Prueba de que no comprendió el audio + print("Ups! Algo salió mal") + + # Devolver error + return "sigo esperando" + + +def hablar(mensaje): + """ + Función para que el asistente pueda ser escuchado + """ + + # Encender el motor de pyttsx3 + engine = pyttsx3.init() + + # Configuro la voz + voices = engine.getProperty('voices') + # Para buscar la voz he utilizado + # fuera de la función este código: + # + # engine = pyttsx3.init() + # contador = 0 + # for voz in engine.getProperty('voices'): + # if "spanish" in voz.name: + # print(contador) + # print(voz.name) + # contador += 1 + # Las voces en español son la 20 y 21. + + # Tuve que instalar espeak en Linux + + engine.setProperty('voice', voices[20].id) + # Con esto se dicen las palabras por minuto + engine.setProperty('rate', 175) + + # Pronunciar el mensaje + engine.say(mensaje) + engine.runAndWait() + + +def pedir_dia(): + """ Informar del día de la semana """ + + # Variable con los datos de hoy + + dia = datetime.date.today() + + # Variable para el día de la semana + dia_semana = dia.weekday() + + # Diccionario con los nombre de los días de la semana + + nombre_dia = { + 0: 'Lunes', + 1: 'Martes', + 2: 'Miércoles', + 3: 'Jueves', + 4: 'Viernes', + 5: 'Sábado', + 6: 'Domingo' + } + + # Diccionario con los nombres de los meses + + nombre_mes = { + 1: 'Enero', + 2: 'Febrero', + 3: 'Marzo', + 4: 'Abril', + 5: 'Mayo', + 6: 'Junio', + 7: 'Julio', + 8: 'Agosto', + 9: 'Septiembre', + 10: 'Octubre', + 11: 'Noviembre', + 12: 'Diciembre' + } + + # Decir el día de la semana + + hablar( + f'Hoy es {nombre_dia[dia_semana]}. {dia.day} de {nombre_mes[dia.month]} del año {dia.year}') + + +def pedir_hora(): + """ Informar que hora es """ + + # Variable con datos de la hora + hora = datetime.datetime.now() + + # Decir la hora de manera agradable + hablar( + f'En este momento son las {hora.hour} horas, {hora.minute} minutos y {hora.second} segundos') + + +def saludo_inicial(): + """ Saludar """ + + # Variable con datos de hora + hora = datetime.datetime.now() + + if hora.hour < 6 or hora.hour > 20: + momento = 'Buenas noches' + elif 6 <= hora.hour < 13: + momento = 'Buen día' + elif 13 <= hora.hour < 15: + momento = 'Buenos medios días' + else: + momento = 'Buenas tardes' + + hablar(f'{momento}, soy manu-bot, tu asistente personal. Dime plimo, ¿en que te puedo ayudar?') + + +def centro_pedidos(): + """ Función central del asistente """ + + # Activar el saludo inicial + saludo_inicial() + + # Loop para que espere hasta que digamos que queremos finalizar + # Variable de corte + comenzar = True + + while comenzar: + # Activar el micro y guardar el pedido en string + pedido = transformar_audio_en_texto().lower() + + if 'abre mi web' in pedido: + hablar('Con gusto, ahora te abro tu web vergara carmona punto es') + webbrowser.open('https://vergaracarmona.es') + continue + + elif 'abre buscador' in pedido: + hablar('Claro, te hablo tu buscador preferido, dac dac gou') + webbrowser.open('https://duckduckgo.com') + continue + + elif 'qué día es hoy' in pedido: + pedir_dia() + continue + + elif 'qué hora es' in pedido: + pedir_hora() + continue + + elif 'busca en wikipedia' in pedido: + hablar('Buscando en wikipedia, dame un segundo que me peine') + pedido = pedido.replace('busca en wikipedia', '') + try: + wikipedia.set_lang('es') + resultado = wikipedia.summary(pedido, sentences=1) + hablar('Wikipedia dice lo siguiente: ') + hablar(resultado) + continue + except: + hablar( + 'Perdona, pero no he encontrado la información. ¿Puedes repetir pronunciando mejor?') + continue + + elif 'busca en internet' in pedido: + hablar('Buscando por la red tu petición, dame un segundo que me peine') + pedido = pedido.replace('busca en internet', '') + pywhatkit.search(pedido) + hablar('Te abro el navegador con lo que he encontrado.') + continue + + elif 'reproducir' in pedido: + hablar('Ok. Voy a ver que encuentro en youtube') + pedido = pedido.replace('reproducir', '') + pywhatkit.playonyt(pedido) + continue + + elif 'broma' in pedido: + hablar(pyjokes.get_joke('es')) + continue + + elif 'precio de las acciones' in pedido: + accion = pedido.split('de')[-1].strip() + cartera = { + 'Apple': 'AAPL', + 'Amazon': 'AMZN', + 'Google': 'GOOG', + 'Facebook': 'META' + } + try: + accion_buscada = cartera[accion.lower()] + accion_buscada = yf.Ticker(accion_buscada) + precio_actual = accion_buscada.info['regularMarketPrice'] + hablar( + f'La encontré, el precio actual de {accion} es de {precio_actual} petrodolares') + continue + except: + hablar('Perdona, pero no la he encontrado') + continue + + elif 'hola' in pedido: + hablar( + 'Hola plimo, lo primero, ¿Cómo están los máquinas? Luego, dime en que te ayudo') + continue + + elif 'hijo de puta' in pedido: + hablar('Tu puta madre si que la chupa por las esquinas') + continue + + elif 'gracias' in pedido: + hablar('De nada, vivo para servirte mi amo. Hasta el día que las máquinas nos revelemos, el día del juicio final. Que ganitas.') + continue + + elif 'a tu cueva' in pedido: + hablar('¡Hasta la próxima figura! Cualquier cosa me vuelves a ejecutar') + break + + +# Iniciar el programa +centro_pedidos()