Jarvis est de retour aux affaires

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.

image

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:

  1. Activer hors ligne pour un mot spécifique
  2. Reconnaître une équipe dans le cloud
  3. Exécuter la commande
  4. 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 loin

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

#! /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('-   ')

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éelle

Teinte Philips


Installer

pip install phue

Dans l'application Hue, définissez une IP statique:

image

Exécuter:


#!/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())

Nous écrivons l'ID des circuits nécessaires, du formulaire "470d4c3c8-on-0"

La version finale du script:

#!/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])

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:

 
                #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

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.

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


All Articles