Certamente, todo mundo sonha com seu assistente de voz, sob o corte de outra implementação de "Jarvis" do famoso filme.
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:- Ativar offline para uma palavra específica
- Reconhecer uma equipe na nuvem
- Executar comando
- 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 dissosudo 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 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
Juntando tudo e obtenha esse script.
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('- ')
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 realPhilips hue
Instalepip install phue
No aplicativo Hue, defina um IP estático:
Execute:
import sys
from phue import Bridge
b = Bridge('192.168.0.100')
print (b.get_scene())
Escrevemos o ID dos circuitos necessários, no formato "470d4c3c8-on-0".A versão final do 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])
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:
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.