Seguramente, todos sueñan con su asistente de voz, bajo el corte otra implementación de "Jarvis" de la famosa película.
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:- Activar sin conexión para una palabra específica
- Reconocer un equipo en la nube.
- Ejecutar comando
- 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 sintetizadocurl «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.
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('- ')
¿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 realPhilips hue
Instalarpip install phue
En la aplicación Hue, configure una IP estática:
Ejecutar:
import sys
from phue import Bridge
b = Bridge('192.168.0.100')
print (b.get_scene())
Escribimos la identificación de los circuitos necesarios, de la forma "470d4c3c8-on-0"La versión final del script:
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])
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:
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.