Certes, tout le monde rêve de son assistant vocal, sous la coupe d'une autre implémentation de "Jarvis" du célèbre film.
Pendant longtemps, je n'ai pas laissé la pensée de mon «Jarvis» et le contrôle de l'équipement dans la maison avec ma voix. Et enfin, les mains ont atteint la création de ce miracle. Je n'ai pas eu à penser aux «cerveaux» depuis longtemps, le Raspberry Pi s'adapte parfaitement.Donc, le fer:- Raspberry Pi 3 modèle B
- Caméra USB Logitech
Implémentation
Notre assistant travaillera sur le principe d'Alexa / Hub:- Activer hors ligne pour un mot spécifique
- Reconnaître une équipe dans le cloud
- Exécuter la commande
- Rendre compte des progrès ou informer les informations de demande
Parce que mon appareil photo est pris en charge hors de la boîte, je n'ai pas eu à me soucier des pilotes, nous allons donc immédiatement à la partie logiciel.Activation hors ligne
L'activation aura lieu en utilisant CMU Sphinx, et tout irait bien, mais la reconnaissance prête à l'emploi est très lente, plus de 10 secondes, ce qui n'est absolument pas approprié, pour résoudre le problème dont vous avez besoin pour effacer le dictionnaire des mots inutiles.Installez tout ce dont vous avez besoin:pip3 install SpeechRecognition
pip3 install pocketsphinx
plus loinsudo nano /usr/local/lib/python3.4/dist-packages/speech_recognition/pocketsphinx-data/en-US
/pronounciation-dictionary.dict
supprimez tout sauf le Jarvis dont nous avons besoin: jarvis JH AA R V AH S
Maintenant pochesphinx reconnaît assez rapidement.Reconnaissance vocale
Au début, il y avait une idée d'utiliser le service Google, en plus de son support est dans SpeechRecognition. Mais il s'est avéré que Google prend de l'argent pour cela et ne fonctionne pas avec le physique. personnes.Heureusement, Yandex offre également une telle opportunité, gratuitement et extrêmement simple.Inscrivez-vous, obtenez la clé API. Tous les travaux peuvent être effectués par curl'om.curl -X POST -H "Content-Type: audio/x-wav" --data-binary "@file" «https://asr.yandex.net/asr_xml?uuid=ya_uid&key=yf_api_key&topic=queries»
Synthèse vocale
Ici, Yandex nous aidera à nouveau. Nous envoyons le texte en réponse, nous recevons le fichier avec le texte synthétisécurl «https://tts.voicetech.yandex.net/generate?format=wav&lang=ru-RU&speaker=zahar&emotion=good&key=ya_api_key» -G --data-urlencode "text=text" > file
Jarvis
Mettre tout cela ensemble et obtenir un tel script.
import os
import speech_recognition as sr
from xml.dom import minidom
import sys
import random
r = sr.Recognizer()
ya_uuid = ''
ya_api_key = ''
def convert_ya_asr_to_key():
xmldoc = minidom.parse('./asr_answer.xml')
itemlist = xmldoc.getElementsByTagName('variant')
if len(itemlist) > 0:
return itemlist[0].firstChild.nodeValue
else:
return False
def jarvis_on():
with sr.WavFile("send.wav") as source:
audio = r.record(source)
try:
t = r.recognize_sphinx(audio)
print(t)
except LookupError:
print("Could not understand audio")
return t == ("jarvis")
def jarvis_say(phrase):
os.system(
'curl "https://tts.voicetech.yandex.net/generate?format=wav&lang=ru-RU&speaker=zahar&emotion=good&key='+ya_api_key+'" -G --data-urlencode "text=' + phrase + '" > jarvis_speech.wav')
os.system('aplay jarvis_speech.wav')
def jarvis_say_good():
phrases = ["", "", "", "", "- ?", ]
randitem = random.choice(phrases)
jarvis_say(randitem)
try:
while True:
os.system('arecord -B --buffer-time=1000000 -f dat -r 16000 -d 3 -D plughw:1,0 send.wav')
if jarvis_on():
os.system('aplay jarvis_on.wav')
os.system('arecord -B --buffer-time=1000000 -f dat -r 16000 -d 3 -D plughw:1,0 send.wav')
os.system(
'curl -X POST -H "Content-Type: audio/x-wav" --data-binary "@send.wav" "https://asr.yandex.net/asr_xml?uuid='+ya_uuid+'&key='+ya_api_key+'&topic=queries" > asr_answer.xml')
command_key = convert_ya_asr_to_key()
if (command_key):
if (command_key in [‘key_word', ‘key_word1’, ‘key_word2']):
os.system(‘’)
jarvis_say_good()
continue
except Exception:
jarvis_say('- ')
Que se passe-t-il ici. Nous commençons une boucle sans fin, nous enregistrons trois secondes et envoyons le sphinx pour reconnaissance si le mot «jarvis» est trouvé dans le fichier if jarvis_on():
lire un fichier de notification d'activation préenregistré.Encore une fois, nous enregistrons 3 secondes et l'envoyons à Yandex, en réponse, nous obtenons notre équipe. Ensuite, nous effectuons des actions basées sur la commande.C'est tout. Les scripts d'exécution peuvent en proposer un grand nombre.Cas d'utilisation
Maintenant, quelques exemples de mon utilisation réelleTeinte Philips
Installerpip install phue
Dans l'application Hue, définissez une IP statique:
Exécuter:
import sys
from phue import Bridge
b = Bridge('192.168.0.100')
print (b.get_scene())
Nous écrivons l'ID des circuits nécessaires, du formulaire "470d4c3c8-on-0"La version finale du script:
import sys
from phue import Bridge
b = Bridge('192.168.0.100')
if (sys.argv[1] == 'off'):
b.set_light([1,2,3],'on', False)
else:
b.activate_scene(1,sys.argv[1])
Dans jarvis, ajoutez: if (command_key in [' ', ' ', '']):
os.system('python3 /home/pi/smarthome/hue/hue.py a1167aa91-on-0')
jarvis_say_good()
continue
if (command_key in [' ', ' ']):
os.system('python3 /home/pi/smarthome/hue/hue.py ac637e2f0-on-0')
jarvis_say_good()
continue
if (command_key in [' ', ' ']):
os.system('python3 /home/pi/smarthome/hue/hue.py "off"')
jarvis_say_good()
continue
LG TV
Nous prenons le script d'ici . Après le premier lancement et la saisie du code de couplage, le code lui-même ne change pas, vous pouvez donc couper cette partie du script et ne laisser que le contrôle.Dans jarvis, ajoutez:
if (command_key in [' ', ' ']):
os.system('python3 /home/pi/smarthome/TV/tv2.py 1')
jarvis_say_good()
continue
if (command_key in [‘ ', '']):
os.system('python3 /home/pi/smarthome/TV/tv2.py 24')
jarvis_say_good()
continue
La radio
sudo apt-get install mpg123
Dans jarvis, ajoutez:
if (command_key in ['', ‘ ’,’ ’]):
os.system(‘mpg123 URL')
continue
Vous pouvez également configurer un homebridge et gérer tout via Siri, au cas où vous ne crieriez pas à Jarvis.En ce qui concerne la qualité de la reconnaissance vocale, pas Alexa bien sûr, mais à une distance allant jusqu'à 5 mètres, le pourcentage de coups sûrs est décent. Le principal problème est que la parole du téléviseur / des haut-parleurs est enregistrée avec les commandes et interfère avec la reconnaissance.C'est tout, merci.