Jarvis kembali berbisnis

Tentunya, semua orang memimpikan asisten suaranya, di bawah cut implementasi lain "Jarvis" dari film terkenal.

gambar

Untuk waktu yang lama saya tidak meninggalkan pikiran tentang "Jarvis" saya dan kontrol peralatan di rumah dengan suara saya. Dan akhirnya, tangan-tangan mencapai penciptaan keajaiban ini. Saya tidak harus berpikir tentang "otak" untuk waktu yang lama, Raspberry Pi sangat cocok.

Jadi, besi:

  • Raspberry pi 3 model b
  • USB Logitech Camera

Implementasi


Asisten kami akan bekerja berdasarkan prinsip Alexa / Hub:

  1. Aktifkan offline untuk kata tertentu
  2. Kenali tim di cloud
  3. Jalankan perintah
  4. Laporkan kemajuan atau informasikan informasi permintaan

Karena kamera saya didukung di luar kotak, saya tidak perlu repot dengan driver, jadi kami segera pergi ke bagian perangkat lunak.

Aktivasi Offline


Aktivasi akan terjadi menggunakan CMU Sphinx, dan semuanya akan baik-baik saja, tetapi pengenalan di luar kotak sangat lambat, lebih dari 10 detik, yang sama sekali tidak cocok, untuk menyelesaikan masalah Anda perlu menghapus kamus kata-kata yang tidak perlu.

Instal semua yang Anda butuhkan:

pip3 install SpeechRecognition
pip3 install pocketsphinx

selanjutnya

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

hapus semua kecuali Jarvis yang kita butuhkan:

 jarvis JH AA R V AH S

Sekarang pocketsphinx mengenali dengan cepat.

Pengenalan ucapan


Pada awalnya ada ide untuk menggunakan layanan Google, selain itu dukungannya ada di SpeechRecognition. Tetapi ternyata, Google mengambil uang untuk ini dan tidak bekerja dengan fisik. orang.

Untungnya, Yandex juga memberikan kesempatan seperti itu, gratis dan sangat sederhana.

Daftar, dapatkan KUNCI API. Semua pekerjaan bisa dilakukan oleh 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»

Sintesis ucapan


Di sini Yandex akan membantu kami lagi. Kami mengirim teks sebagai tanggapan, kami menerima file dengan teks yang disintesis

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


Menyatukan semuanya dan mendapatkan skrip seperti itu.

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

Apa yang sedang terjadi di sini. Kami memulai loop tanpa akhir, arecord'om kami merekam tiga detik dan mengirim sphinx untuk pengakuan jika kata "jarvis" ditemukan dalam file

 if jarvis_on():

memutar file notifikasi aktivasi yang direkam sebelumnya.

Sekali lagi kami merekam 3 detik dan mengirimkannya ke Yandex, sebagai tanggapan kami mendapatkan tim kami. Selanjutnya, kami melakukan tindakan berdasarkan perintah.

Itu saja. Skrip eksekusi dapat menghasilkan banyak sekali.

Kasus penggunaan


Sekarang beberapa contoh penggunaan nyata saya

Rona Philips


Instal

pip install phue

Di aplikasi Hue, atur IP statis:

gambar

Jalankan:


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

Kami menulis ID dari sirkuit yang diperlukan, dari bentuk "470d4c3c8-on-0"

Versi terakhir dari skrip:

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

Dalam jarvis tambahkan:

                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


Kami mengambil skrip dari sini . Setelah peluncuran pertama dan memasukkan kode penyandingan, kode itu sendiri tidak berubah, sehingga Anda dapat memotong bagian ini dari skrip dan hanya menyisakan satu kontrol.

Dalam jarvis tambahkan:

 
                #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

Dalam jarvis tambahkan:

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

Anda juga dapat menyiapkan pembuat rumah dan mengelola semuanya melalui Siri, jika Anda tidak berteriak kepada Jarvis.

Adapun kualitas pengenalan ucapan, bukan Alexa tentu saja, tetapi pada jarak hingga 5 meter persentase hit pasti layak. Masalah utama adalah bahwa pidato dari TV / speaker direkam bersama dengan perintah dan mengganggu pengakuan.

Itu saja, terima kasih.

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


All Articles