Jarvis ist wieder im Geschäft

Sicherlich träumt jeder von seinem Sprachassistenten, unter dem Schnitt eine weitere Implementierung von "Jarvis" aus dem berühmten Film.

Bild

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:

  1. Für ein bestimmtes Wort offline aktivieren
  2. Erkennen Sie ein Team in der Cloud
  3. Befehl ausführen
  4. 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

weiter

sudo 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 Text

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


Alles zusammenfügen und ein solches Skript bekommen.

#! /usr/bin/env python
# -*-coding:utf-8-*-
import os
import speech_recognition as sr
from xml.dom import minidom
import sys
import random

r = sr.Recognizer()
ya_uuid = ''
ya_api_key = ''


# os.system('echo "+ +" |festival --tts --language russian')


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 Verwendung

Philips Farbton


Installieren

pip install phue

Legen Sie in der Hue-Anwendung eine statische IP fest:

Bild

Ausführen:


#!/usr/bin/python
import sys
from phue import Bridge

b = Bridge('192.168.0.100') # Enter bridge IP here.

#If running for the first time, press button on bridge and run with b.connect() uncommented
#b.connect()

print (b.get_scene())

Wir schreiben die ID der erforderlichen Schaltkreise in der Form "470d4c3c8-on-0" aus.

Die endgültige Version des Skripts:

#!/usr/bin/python
import sys
from phue import Bridge


b = Bridge('192.168.0.100') # Enter bridge IP here.

#If running for the first time, press button on bridge and run with b.connect() uncommented
#b.connect()


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:

 
                #1 - POWER 
                #24 - VOLUNE_UP
                #25 - VOLUME_DOWN
                #400 - 3D_VIDEO
                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.

Source: https://habr.com/ru/post/de401049/


All Articles