298 lines
7.8 KiB
Python
298 lines
7.8 KiB
Python
"""
|
|
Programa dia 13 - Asistente virtual
|
|
|
|
pyttsx3
|
|
speech_recognition
|
|
webbrowser
|
|
pywhatkit
|
|
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()
|