Sélectionner une révision Git
-
Kubat a rédigé
Try to force the window creation before passing the WID to MPV to fix the possibility where the window is not already created and thus everything crashes.
Kubat a rédigéTry to force the window creation before passing the WID to MPV to fix the possibility where the window is not already created and thus everything crashes.
Jarvis.py 20,50 Kio
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 12 14:43:00 2017
@author: Utilisateur
Projet Jarvis
"""
from myimports import *
def tts_custom(text, file, lang='fr-CA'): # plus rapide que gtts mais meme resultat
with open(file, 'w') as f:
f.write('') # on vide le fichier avant
with open(file, 'ab') as f:
for i in text.split('. '):
params = {'ie': 'UTF-8', 'q': i + '.', 'tl': 'fr-CA', 'client': 'gtx'}
r = requests.get(url, params=params)
f.write(r.content)
def get_speech(message="entrée"):
if voix:
print('[-] %s (voix) : ' % message)
understand = False
while not understand:
try:
with mic as source:
r.adjust_for_ambient_noise(source, duration=2)
audio = r.listen(source, timeout=1)
print('[speech_detected]')
# play_compris_sound()
entre = r.recognize_google(audio, language="fr")
understand = True
print(entre)
# play_compris_sound()
except:
print("[!] impossible de comprendre votre charabia [!]")
# play_pascompris_sound()
entre = ''
else:
entre = input('[-] %s (clavier) :' % message)
return entre
def parle(texte, save=True, lang='fr-CA'):
global compris, tts_bool, engine, google_bool
compris = 1
print("[+] {} : {}".format(bot_name.upper(), texte))
if not tts_bool:
return None # si pas de tts on s'arrete là dans la fonction
texte = texte.split('\n')[0]
if not google_bool:
engine.say(texte)
engine.runAndWait()
else:
with open("database.txt") as f:
lines = f.readlines()
test_list = [i.replace('\n', '') for i in '\n'.join(lines).split("\n|")]
# print(test_list)
try:
line_no = test_list.index(texte.replace('\n', ''))
except ValueError:
line_no = len(lines) - 1 if len(lines) != 0 else 0
# tts = gTTS(text=texte, lang=lang)
# tts.save("saved_voice/{}.mp3".format(line_no))
tts_custom(texte, "saved_voice/{}.mp3".format(line_no), lang=lang)
if save:
with open("database.txt", 'a') as f:
f.writelines(['{}\n|'.format(texte)])
print(line_no)
# mp3 = mutagen.mp3.MP3('saved_voice/{}.mp3'.format(line_no))
# frequency = mp3.info.sample_rate
if pygame.mixer.music.get_busy():
pygame.mixer.music.stop()
# pygame.mixer.quit()
# pygame.mixer.init(frequency=frequency)
try:
# sound = pygame.mixer.Sound('saved_voice/{}.mp3'.format(line_no))
pygame.mixer.music.load('saved_voice/{}.mp3'.format(line_no))
pygame.mixer.music.play()
pygame.mixer.music.set_endevent()
except:
print("ERROR: can't play audio")
def deverouillage(entre):
global jarvis, compris
if jarvis or (mdp in entre and ("pass" in entre or "deverouillage" in entre)):
jarvis = True
elif mdp not in entre and "deverouillage" in entre:
parle("Vous n'avez pas donner le mot de passe.")
compris = 0
return jarvis
def envoimail(boitemail, _from, password, to, objet, contenu):
try:
fp = open("mail.txt", "w")
fp.write(contenu)
fp.close()
msg = MIMEMultipart()
msg["subject"] = objet
msg["from"] = _from
msg["To"] = to
msg.preamble = '{} MAIL'.format(bot_name.upper())
fp = open("mail.txt", "r")
msg = MIMEText(fp.read())
fp.close()
if boitemail == "gmx":
server = smtplib.SMTP("smtp.gmx.com", 587)
elif boitemail == "gmail":
server = smtplib.SMTP("smtp.gmail.com", 587)
elif boitemail == "orange":
server = smtplib.SMTP("smtp.orange.fr", 587)
elif boitemail == "hotmail":
server = smtplib.SMTP("smtp.live.com", 587)
elif boitemail == "yahoo":
server = smtplib.SMTP("smtp.mail.yahoo.fr", 587)
server.ehlo()
server.starttls()
server.login(_from, password)
server.sendmail(_from, to, msg.as_string())
server.quit()
parle("Mail envoyé.")
except:
parle("Je n'ai pas pu envoyer l'email correctement. Peut-être parceque mon créateur n'a pas penser à votre boite mail...")
def mail(): # si pas encore de mail attribué
global boitemail, password, _from, voix
try:
parle("Avec qu'elle boite mail voulez vous envoyer votre email ?")
entre1 = get_speech('boitemail')
if entre1 not in ["gmail", "hotmail", "yahoo", "orange", "gmx"]:
parle("Je ne prends pas en charge cette boite mail, désolé.")
else:
boitemail = entre1
parle("Donnez moi votre adresse mail")
entre1 = get_speech('mail')
if "annule" in entre1 or "annulation" in entre1:
raise BreakoutException
else:
parle("Ecrivez votre mot de passe au clavier")
entre2 = str(input("[-] password (clavier):")) # si vous voulez utiliser le clavier
if "annule" in entre2 or "annulation" in entre2:
raise BreakoutException
else:
_from = entre1
password = entre2
message()
except:
parle("l'Envoi du mail est annulé.")
def message():
global boitemail, _from, password, voix
try:
parle("A qui voulez-vous envoyer ce mail ?")
to = get_speech("to")
if "annule" in to or "annulation" in to:
raise BreakoutException
else:
parle("Quel est l'objet du message ?")
objet = get_speech("objet")
parle("Quel sera le contenu du message ?")
contenu = get_speech("contenu")
parle("Vous confirmer l'envoi du message : {}, ayant pour objet : {}, à {}, sur une boite {} ?".format(
contenu, objet, to, boitemail))
confirmer = get_speech("confirmer")
if "annule" in confirmer or "annulation" in confirmer:
raise BreakoutException
elif "oui" in confirmer or ("confirme" in confirmer and "pas" not in confirmer):
parle("Veuillez patienter")
envoimail(boitemail, _from, password, to, objet, contenu)
except BreakoutException:
parle("l'Envoi du mail est annulé.")
def location(entre):
'''ouvre maps pour montrer un lieu'''
if "ou est " in entre:
location = entre.split("ou est ")[1]
elif "ou se situe " in entre:
location = entre.split("ou se situe ")[1]
elif "ou se trouve " in entre:
location = entre.split("ou se trouve ")[1]
elif 'est ou ' in entre:
location = entre.split("est ou ")[1]
parle("Je vais vous montrer où se trouve " + location)
location = ("+").join(location.split(" "))
os.system("firefox https://www.google.nl/maps/place/" + location + "/& >/dev/null")
def meteo(entre):
'''donne la meteo de l'endroit demandé'''
dans_n_heures = None
try:
if all(word in entre for word in [' dans ', ' heure']):
dans_n_heures = int(entre.split(' dans ')[-1].split(' heure')[0])
elif all(word in entre for word in [' dans ', 'h']):
dans_n_heures = int(entre.split(' dans ')[-1].split('h')[0])
except:
pass
if "meteo de" in entre:
entre1 = entre.split('meteo de ')[-1].split(' dans')[0]
entre1 = entre1.split(" ")
villes = entre1[0]
villes = villes + entre1[1] if len(entre1) == 3 else villes
pays = entre1[-1] if len(entre1) > 1 else ''
# parle('je vais donner la météo {} de {} {}.'.format('dans %dh' % dans_n_heures if dans_n_heures is not None else 'actuelle', villes, pays), False)
try:
parle(usefull.meteo_de(villes, pays.upper()[:2], all_data=False, dans_n_heures=dans_n_heures), False)
except Exception as e:
parle(random.choice(truc_casse) + str(e) + 'Vous avez donné le bon pays ?')
elif "meteo" in entre:
# parle('je vais donner la météo {} de {} {}.'.format('dans %dh' % dans_n_heures if dans_n_heures is not None else 'actuelle', ville_actuelle, pays_actuel), False)
try:
parle(usefull.meteo_de(ville_actuelle, pays_actuel.upper()[:2], all_data=False, dans_n_heures=dans_n_heures), False)
except Exception as e:
parle(random.choice(truc_casse) + str(e))
def dire_un_truc_en_mode_random(verbosity):
if random.randint(0, 100) < verbosity:
parle(random.choice([useless.chuck(), useless.genererSujet(), useless.useless()]), False)
def tests(entre):
'''
Fonction principale de tests
'''
global entrepreced, comprispreced, jarvis, compris, voix, reconnaissance, topics, _from, password, boitemail, verbosity, currently_playing
compris = 0
merci = 0
# allume la lumière
if all(word in entre for word in ['allume', 'lumiere']):
for device in chacon_device_list:
try:
device.switch_on()
parle('Le switch {} est alumé'.format(device.get_name()))
except:
parle('Le switch {} est déjà alumé'.format(device.get_name()))
if all(word in entre for word in ['etein', 'lumiere']):
for device in chacon_device_list:
try:
device.switch_off()
parle('Le switch {} est éteint'.format(device.get_name()))
except:
parle('Le switch {} est déjà éteint'.format(device.get_name()))
# location
# if any(ext in entre for ext in ['ou est ', 'ou se situe ', 'ou se trouve ', 'est ou ']):
# location(entre)
# reponses basiques
if "et vous" in entre or "et toi" in entre:
parle(random.choice(etats_jarvis) + " Que puis-je faire pour vous ?")
elif "salut" in entre or "bonjour" in entre:
parle("Que puis-je faire pour vous ?")
if ("comment" in entre and "va" in entre) or ("allez" in entre and "bien" in entre) or ("allez" in entre and "vous" in entre):
parle(random.choice(etats_jarvis) + " et vous ?")
# deverouillage
if mdp in entre and ("pass" in entre or "deverouillage" in entre):
parle("Je suis dévérouillé.")
# meteo
if "meteo" in entre:
meteo(entre)
# verrouillage jarvis
if "verouillage" in entre and "deverouillage" not in entre:
parle("Mise en veille")
jarvis = False
# mode clavier/voix
# if "mode clavier" in entre:
# voix = False
# parle("Je suis passé en mode clavier")
# elif "mode voi" in entre and reconnaissance:
# parle("Attention je doit vous avertir que le mode voix peut ne pas fonctionner correctement si vous ne portez pas de micro externe à l'ordinateur.")
# parle("Voulez vous vraiment passer en mode voix ?")
# if "mode voi" in entrepreced and "oui" in entre:
# voix = True
# parle("Je suis passé en mode voix.")
# répond à merci si on lui a demandé quelquechose avant
if ("merci" in entre or "Merci" in entre) and comprispreced == 1 and ("et vous" not in entre and "et toi" not in entre):
merci = 1
parle(random.choice(("A votre service.", "De rien", "Il n'y a pas de quoi !", 't\'inquiètes, je suis payé pour ça')))
# fait une recherche sur wikipédia
if "cherche" in entre and "sur wiki" in entre:
texte = " ".join((entre.replace("cherche", "").replace("sur wikipedia", "")).split(" "))
parle("je vais chercher :" + texte, False)
parle(usefull.wiki(texte), False)
elif "cherche" in entrepreced and "sur wikipedia" in entrepreced and topics != []:
try:
parle(usefull.wiki(entre), False)
except:
pass
# ouvre une application
# if "ouvre" in entre and ("application" in entre or "programme" in entre):
# texte = entre.replace("ouvre le programme ", "").replace("ouvre l'application ", "")
# parle("Je vais executer " + texte)
# os.system(texte)
# if entre.split(" ")[0] == "lance":
# parle("Je vais executer " + entre.split(" ")[-1])
# os.system(entre.split(" ")[-1] + ">/dev/null")
# donne la date
if (("date" in entre or "jour" in entre) and ("on est" in entre)):
now = time.localtime(time.time())
year, month, day, hour, minute, second, weekday, yearday, daylight = now
date = "On est le " + \
("lundi ", "mardi ", "mercredi ", "jeudi ", "vendredi ", "samedi ", "dimanche ")[weekday] + \
str(day) + (" janvier ", " février ", " mars ", " avril ", " mai ", " juin ", " juillet ", " aout ", " septembre ", " octobre ", " novembre ", " decembre ")[month - 1] +\
str(year) + '.'
parle(date, False)
# donne l'heure
if ("heure" in entre and "il est" in entre) or ("donne" in entre and "l'heure" in entre): # donne l'heure
now = time.localtime(time.time())
parle(time.strftime("il est %H heure %M.", now), False)
# envoie mail
# if "envoi" in entre and "mail" in entre:
# if _from == "" and password == "":
# mail()
# else:
# try:
# parle("Utiliser la même adresse :" + _from + " ?")
# entre1 = get_speech()
# if "annuler" in entre1 or "annulation" in entre1:
# raise BreakoutException
# elif "non" in entre1:
# mail()
# elif "oui" in entre1:
# message()
# else:
# raise BreakoutException
# except:
# parle("l'Envoi du mail est annulé.")
# if "redemarre" and "ordinateur" in entre: # redémarre l'ordinateur
# parle("Je vais redémarrer votre ordinateur.")
# os.system("shutdown -r")
# ferme jarvis
if ("etein" in entre and "toi" in entre) or "au revoir" in entre:
parle(random.choice(["Au revoir !", "Goodbye !", "A la revoyure !", "Ouais, c'est ça, allez à plus !"]))
for i in range(5, 0, -1):
sys.stdout.write("{} vas s'éteindre dans ".format(bot_name.upper()) + str(i) + "s")
sys.stdout.flush()
time.sleep(1)
sys.stdout.write(chr(13))
sys.stdout.write("" * len("{} vas s'éteindre dans ".format(bot_name.upper()) + str(i) + "s"))
sys.stdout.write(chr(13))
sys.exit()
# gestion de la musique
'''
TODO: pygame music player
mixer_1 = pygame.mixer.Channel(1)
sound = pygame.mixer.Sound(filename)
methodes sur mixer_1 :
play(sound)
pause()
unpause()
stop()
fadeout(time)
set_volume(value)
get_volume()
get_busy()
get_sound()
queue(sound)
get_queue()
set_endevent()
get_endevent()
'''
if "play" in entre or "joue de la musique" in entre or "mets de la musique" in entre:
process = Popen(["sound_player/player-client.py", "play"], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()
parle("j'ai lancé " + stdout.decode().split(":")[-1].strip(), False)
if "pause" in entre:
process = Popen(["sound_player/player-client.py", "pause"], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()
if "musique suivante" in entre:
process = Popen(["sound_player/player-client.py", "next"], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()
parle("j'ai lancé " + stdout.decode().split(":")[-1].strip(), False)
if "musique precedente" in entre:
process = Popen(["sound_player/player-client.py", "previous"], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()
parle("j'ai lancé " + stdout.decode().split(":")[-1].strip(), False)
if "nom de la musique" in entre:
process = Popen(["sound_player/player-client.py", "get_sound"], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()
parle(stdout.decode().split(":")[-1].strip(), False)
# gestion du volume
if "monte" in entre and any(e in entre for e in ["son", "volume"]):
process = Popen(["sound_player/player-client.py", "volume_up"], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()
parle("volume : " + str(int(float(stdout.decode().split(":")[-1].strip()) * 100)), False)
if "baisse" in entre and any(e in entre for e in ["son", "volume"]):
process = Popen(["sound_player/player-client.py", "volume_down"], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()
parle("volume : " + str(int(float(stdout.decode().split(":")[-1].strip()) * 100)), False)
# éteind le pc
# if "eteint" in entre and "ordinateur" in entre: # Eteint l'ordinateur
# parle("je vais éteindre votre ordinateur.")
# os.system("shutdown -s -c\"{} : Au revoir.\"".format(bot_name.upper()))
# dit ce qu'il peut faire
if any(ext in entre for ext in ['sais faire', 'peux faire']) or ('autre ' in entre and any(ext in entrepreced for ext in ['sais faire', 'peux faire'])):
parle(random.choice(['Je sais par exemple ', 'Je peux entre autre ']) + random.choice(fonctionnalites) + '.')
if "chuck norris" in entre:
parle(useless.chuck(), False)
if "donne une info" in entre:
parle(usefull.francetv().replace("\n", ". "), False)
if "donne les info" in entre:
res = usefull.francetv(False).replace("\n", ". ")
parle(res, False)
if "donne l'horoscope" in entre:
parle(usefull.horoscope("vierge"), False)
if 'moins bavard' in entre:
verbosity -= 1
parle('D\'accord chef je parlerais un peu moins')
elif 'plus bavard' in entre:
verbosity += 1
parle('Pas de prob\'s je dirai plus de trucs random')
if any(ext in entre for ext in ['pipo', 'pipeau']) and 'joue' in entre:
parle(useless.pipo('useless/pipotron.txt'), False)
if 'une intox' in entre and any(ext in entre for ext in ["donne", "dit"]):
parle(useless.nordpresse(), False)
if 'philo' in entre:
parle(useless.genererSujet(), False)
if 'dis quelque-chose' in entre:
parle('quelque-chose')
if any(ext in entre for ext in ['dis', 'raconte']) and any(ext in entre for ext in ['quelque-chose', 'un truc']):
parle(useless.useless(), False)
if 'je t\'aime' in entre:
parle(useless.getRateau(), False)
"""le reste du code de la fonction doit toujours être à la fin de la fonction !!!"""
# repond lorsque l'on annonce son nom sans rien demander de spécial
if (compris == 0) and (bot_name in entre):
parle("Oui ?")
if compris == 0:
if not tts_bool:
parle("je n'ai pas compris.")
else:
print("je n'ai pas compris")
# play_pascompris_sound()
# if not currently_playing:
# dire_un_truc_en_mode_random(verbosity)
compris = 0
entrepreced = entre
if merci == 0:
comprispreced = compris
else:
comprispreced = 0
"""programme principal"""
if __name__ == "__main__":
parle("Bonjour ! " + random.choice(["", "Vous allez bien aujourd'hui ?"]))
get_busy = pygame.mixer.music.get_busy()
currently_playing = get_busy
"""boucle principale"""
while True:
get_busy = pygame.mixer.music.get_busy()
# booléen qui indique si l'ia est en train de parler
# end_event = pygame.mixer.music.get_endevent() # booléen indique si l'ia a fini de parler
currently_playing = get_busy
# sys.stdout.write('[DEBUG] is_talking={}'.format(currently_playing))
# sys.stdout.flush()
# sys.stdout.write(chr(13))
# sys.stdout.write('[DEBUG] is_talking={}'.format(currently_playing))
# sys.stdout.write(chr(13))
if not currently_playing or True: # oui ne sert à rien là
entre = get_speech()
entre = entre.lower() # met tout en minuscule
entre = unicodedata.normalize('NFKD', entre).encode('ascii', 'ignore').decode() # enlève les accents
if currently_playing:
print('[!]talkin...', end='')
print('vol:', pygame.mixer.music.get_volume())
if currently_playing and 'stop' in entre:
pygame.mixer.music.stop()
elif deverouillage(entre):
tests(entre)