Jarvis está de vuelta en el negocio

Seguramente, todos sueñan con su asistente de voz, bajo el corte otra implementación de "Jarvis" de la famosa película.

imagen

Durante mucho tiempo no dejé de pensar en mi "Jarvis" y el control del equipo en la casa con mi voz. Y finalmente, las manos alcanzaron la creación de este milagro. No tuve que pensar en los "cerebros" durante mucho tiempo, el Raspberry Pi encaja perfectamente.

Entonces, hierro:

  • Raspberry pi 3 modelo b
  • USB Logitech Camera

Implementación


Nuestro asistente trabajará según el principio de Alexa / Hub:

  1. Activar sin conexión para una palabra específica
  2. Reconocer un equipo en la nube.
  3. Ejecutar comando
  4. Informar sobre el progreso o informar la información de la solicitud

Porque mi cámara es compatible de fábrica, no tuve que molestarme con los controladores, por lo que inmediatamente pasamos a la parte del software.

Activación sin conexión


La activación se llevará a cabo con CMU Sphinx, y todo estaría bien, pero el reconocimiento inmediato es muy lento, más de 10 segundos, lo cual no es absolutamente adecuado, para resolver el problema que necesita para limpiar el diccionario de palabras innecesarias.

Instala todo lo que necesitas:

pip3 install SpeechRecognition
pip3 install pocketsphinx

más allá

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

borra todo excepto el Jarvis que necesitamos:

 jarvis JH AA R V AH S

Ahora pocketsphinx reconoce bastante rápido.

Reconocimiento de voz


Al principio surgió la idea de utilizar el servicio de Google, además su soporte está en SpeechRecognition. Pero resultó que Google toma dinero para esto y no funciona con el físico. personas.

Afortunadamente, Yandex también brinda esa oportunidad, de forma gratuita y extremadamente simple.

Regístrese, obtenga la CLAVE API. Todo el trabajo puede hacerse 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íntesis de voz


Aquí Yandex nos ayudará nuevamente. Enviamos el texto en respuesta recibimos el archivo con el 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


Poner todo junto y obtener tal guión.

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

¿Qué está pasando aquí? Comenzamos un ciclo sin fin, registramos tres segundos y enviamos a la esfinge para su reconocimiento si la palabra "jarvis" se encuentra en el archivo

 if jarvis_on():

reproducir un archivo de notificación de activación pregrabado.

Nuevamente registramos 3 segundos y lo enviamos a Yandex, en respuesta recibimos a nuestro equipo. A continuación, realizamos las acciones basadas en el comando.

Eso es todo Los scripts de ejecución pueden llegar a muchos.

Caso de uso


Ahora algunos ejemplos de mi uso real

Philips hue


Instalar

pip install phue

En la aplicación Hue, configure una IP estática:

imagen

Ejecutar:


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

Escribimos la identificación de los circuitos necesarios, de la forma "470d4c3c8-on-0"

La versión final del 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])

En jarvis agregue:

                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

TV LG


Tomamos el guión desde aquí . Después del primer lanzamiento e ingresando el código de emparejamiento, el código en sí no cambia, por lo que puede cortar esta parte del script y dejar solo el control.

En jarvis agregue:

 
                #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

En jarvis agregue:

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

También puede configurar un puente base y administrar todo a través de Siri, en caso de que no le grite a Jarvis.

En cuanto a la calidad del reconocimiento de voz, no Alexa, por supuesto, pero a una distancia de hasta 5 metros, el porcentaje de golpes seguros es decente. El principal problema es que el discurso de la TV / altavoces se graba junto con los comandos e interfiere con el reconocimiento.

Eso es todo, gracias.

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


All Articles