Sicherlich träumt jeder von seinem Sprachassistenten, unter dem Schnitt eine weitere Implementierung von "Jarvis" aus dem berühmten Film.
Lange Zeit habe ich den Gedanken an mein „Jarvis“ und die Kontrolle der Ausrüstung im Haus nicht mit meiner Stimme verlassen. Und schließlich erreichten die Hände die Erschaffung dieses Wunders. Ich musste lange nicht an das „Gehirn“ denken, der Raspberry Pi passt perfekt.Also, Eisen:- Himbeer pi 3 Modell b
- USB Logitech Kamera
Implementierung
Unser Assistent wird nach dem Prinzip von Alexa / Hub arbeiten:- Für ein bestimmtes Wort offline aktivieren
- Erkennen Sie ein Team in der Cloud
- Befehl ausführen
- Bericht über den Fortschritt oder Informationen zur Anfrage
Weil Meine Kamera wird sofort unterstützt. Ich musste mich nicht um die Treiber kümmern, daher gehen wir sofort zum Software-Teil.Offline-Aktivierung
Die Aktivierung erfolgt mit CMU Sphinx, und alles wäre in Ordnung, aber die sofortige Erkennung ist sehr langsam, mehr als 10 Sekunden, was absolut nicht geeignet ist, um das Problem zu lösen, das Sie benötigen, um das Wörterbuch von unnötigen Wörtern zu befreien.Installieren Sie alles, was Sie brauchen:pip3 install SpeechRecognition
pip3 install pocketsphinx
weitersudo nano /usr/local/lib/python3.4/dist-packages/speech_recognition/pocketsphinx-data/en-US
/pronounciation-dictionary.dict
lösche alles außer dem Jarvis, den wir brauchen: jarvis JH AA R V AH S
Jetzt erkennt Pocketsphinx ziemlich schnell.Spracherkennung
Anfangs gab es eine Idee, den Google-Dienst zu nutzen, außerdem wird er von SpeechRecognition unterstützt. Aber wie sich herausstellte, nimmt Google Geld dafür und arbeitet nicht mit physischen. Personen.Glücklicherweise bietet Yandex auch eine solche Möglichkeit, kostenlos und äußerst einfach.Registrieren Sie sich und holen Sie sich den API-SCHLÜSSEL. Alle Arbeiten können von curl'om ausgeführt werden.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»
Sprachsynthese
Hier wird uns Yandex wieder helfen. Wir senden den Text als Antwort, wir erhalten die Datei mit dem synthetisierten Textcurl «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
Alles zusammenfügen und ein solches Skript bekommen.
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('- ')
Was ist hier los? Wir starten eine Endlosschleife, zeichnen drei Sekunden auf und senden Sphinx zur Erkennung, wenn das Wort "jarvis" in der Datei gefunden wird if jarvis_on():
Spielen Sie eine zuvor aufgezeichnete Aktivierungsbenachrichtigungsdatei ab.Wieder nehmen wir 3 Sekunden auf und senden es an Yandex, als Antwort bekommen wir unser Team. Als nächstes führen wir die Aktionen basierend auf dem Befehl aus.Das ist alles Ausführungsskripte können sehr viele enthalten.Anwendungsfall
Nun einige Beispiele meiner wirklichen VerwendungPhilips Farbton
Installierenpip install phue
Legen Sie in der Hue-Anwendung eine statische IP fest:
Ausführen:
import sys
from phue import Bridge
b = Bridge('192.168.0.100')
print (b.get_scene())
Wir schreiben die ID der erforderlichen Schaltkreise in der Form "470d4c3c8-on-0" aus.Die endgültige Version des Skripts:
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])
In jarvis hinzufügen: 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
Wir nehmen das Drehbuch von hier . Nach dem ersten Start und der Eingabe des Pairing-Codes ändert sich der Code selbst nicht, sodass Sie diesen Teil aus dem Skript ausschneiden und nur den Steuerteil belassen können.In jarvis hinzufügen:
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
Radio
sudo apt-get install mpg123
In jarvis hinzufügen:
if (command_key in ['', ‘ ’,’ ’]):
os.system(‘mpg123 URL')
continue
Sie können auch eine Homebridge einrichten und alles über Siri verwalten, falls Sie Jarvis nicht anrufen.Was die Qualität der Spracherkennung betrifft, natürlich nicht Alexa, aber in einer Entfernung von bis zu 5 Metern ist der Prozentsatz sicherer Treffer anständig. Das Hauptproblem besteht darin, dass die Sprache des Fernsehgeräts / der Lautsprecher zusammen mit Befehlen aufgezeichnet wird und die Erkennung beeinträchtigt.Das ist alles, danke.