Jarvis está de volta aos negócios

Certamente, todo mundo sonha com seu assistente de voz, sob o corte de outra implementação de "Jarvis" do famoso filme.

imagem

Durante muito tempo não deixei o pensamento do meu "Jarvis" e o controle do equipamento em casa com a minha voz. E, finalmente, as mãos chegaram à criação deste milagre. Eu não tive que pensar nos "cérebros" por um longo tempo, o Raspberry Pi se encaixa perfeitamente.

Então, ferro:

  • Raspberry pi 3 modelo b
  • Câmera USB Logitech

Implementação


Nosso assistente trabalhará com o princípio do Alexa / Hub:

  1. Ativar offline para uma palavra específica
  2. Reconhecer uma equipe na nuvem
  3. Executar comando
  4. Relate o progresso ou informe as informações da solicitação

Porque minha câmera é suportada imediatamente, eu não precisava me preocupar com os drivers, então vamos imediatamente para a parte do software.

Ativação offline


A ativação ocorrerá usando o CMU Sphinx, e tudo ficaria bem, mas o reconhecimento imediato é muito lento, mais de 10 segundos, o que não é absolutamente adequado, para resolver o problema, você precisa limpar o dicionário de palavras desnecessárias.

Instale tudo o que você precisa:

pip3 install SpeechRecognition
pip3 install pocketsphinx

além disso

sudo nano /usr/local/lib/python3.4/dist-packages/speech_recognition/pocketsphinx-data/en-US
/pronounciation-dictionary.dict

exclua tudo, exceto o Jarvis que precisamos:

 jarvis JH AA R V AH S

Agora o pocketsphinx reconhece muito rapidamente.

Reconhecimento de fala


No início, houve uma idéia de usar o serviço do Google, além de seu suporte estar no SpeechRecognition. Mas, como se viu, o Google aceita dinheiro por isso e não funciona com recursos físicos. pessoas.

Felizmente, o Yandex também oferece essa oportunidade, de forma gratuita e extremamente simples.

Registre-se, obtenha a API KEY. Todo o trabalho pode ser feito por 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»

Síntese da fala


Aqui o Yandex nos ajudará novamente. Enviamos o texto em resposta, recebemos o arquivo com o texto sintetizado

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


Juntando tudo e obtenha esse 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('-   ')

O que está acontecendo aqui. Iniciamos um loop sem fim, em que gravamos três segundos e enviamos esfinge para reconhecimento se a palavra "jarvis" for encontrada no arquivo

 if jarvis_on():

reproduzir um arquivo de notificação de ativação pré-gravado.

Novamente, gravamos 3 segundos e enviamos para o Yandex, em resposta, recebemos nossa equipe. Em seguida, executamos as ações com base no comando.

Só isso. Os scripts de execução podem gerar muitos.

Caso de uso


Agora, alguns exemplos do meu uso real

Philips hue


Instale

pip install phue

No aplicativo Hue, defina um IP estático:

imagem

Execute:


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

Escrevemos o ID dos circuitos necessários, no formato "470d4c3c8-on-0".

A versão final do 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])

No jarvis, adicione:

                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


Nós pegamos o script daqui . Após o primeiro lançamento e a inserção do código de emparelhamento, o próprio código não muda, portanto, você pode cortar essa parte do script e deixar apenas a de controle.

No jarvis, adicione:

 
                #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

Rádio


sudo apt-get install mpg123

No jarvis, adicione:

 
               if (command_key in ['', ‘ ’,’ ’]):
                    os.system(‘mpg123 URL')
                    continue

Você também pode configurar um homebridge e gerenciar tudo através da Siri, caso não grite com Jarvis.

Quanto à qualidade do reconhecimento de fala, não o Alexa, é claro, mas a uma distância de até 5 metros, a porcentagem de acertos é decente. O principal problema é que a fala da TV / alto-falantes é gravada junto com os comandos e interfere no reconhecimento.

Isso é tudo, obrigado.

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


All Articles