لقد عاد جارفيس إلى العمل

بالتأكيد ، يحلم الجميع بمساعده الصوتي ، في ظل قطع تنفيذ آخر لـ "جارفيس" من الفيلم الشهير.

الصورة

لم أترك لفترة طويلة فكرة "جارفيس" الخاصة بي والتحكم في المعدات في المنزل بصوتي. وأخيرًا ، وصلت الأيدي إلى خلق هذه المعجزة. لم يكن عليّ التفكير في "العقول" لفترة طويلة ، فإن Raspberry Pi يناسب تمامًا.

لذا ، الحديد:

  • التوت بي 3 نموذج ب
  • كاميرا USB لوجيتك

التنفيذ


سيعمل مساعدنا على مبدأ Alexa / Hub:

  1. تنشيط دون اتصال بكلمة محددة
  2. تعرف على فريق في السحابة
  3. أمر تشغيل
  4. الإبلاغ عن التقدم أو إبلاغ معلومات الطلب

لأن الكاميرا الخاصة بي مدعومة من خارج الصندوق ، لم يكن عليّ أن أزعج السائقين ، لذلك نذهب على الفور إلى جزء البرنامج.

التنشيط دون اتصال


سيحدث التنشيط باستخدام CMU Sphinx ، وسيكون كل شيء على ما يرام ، ولكن التعرف على الصندوق بطيء جدًا ، أكثر من 10 ثوانٍ ، وهو غير مناسب تمامًا ، لحل المشكلة التي تحتاجها لمسح قاموس الكلمات غير الضرورية.

قم بتثبيت كل ما تحتاجه:

pip3 install SpeechRecognition
pip3 install pocketsphinx

كذلك

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

حذف كل شيء باستثناء جارفيس نحتاج:

 jarvis JH AA R V AH S

الآن يتعرف pocketsphinx بسرعة كبيرة.

التعرف على الكلام


في البداية كانت هناك فكرة لاستخدام خدمة Google ، إلى جانب دعمها في SpeechRecognition. ولكن كما اتضح ، فإن Google تأخذ المال لهذا ولا تعمل مع المادية. الأشخاص.

لحسن الحظ ، توفر Yandex أيضًا هذه الفرصة مجانًا وبسيطة للغاية.

سجل ، احصل على API KEY. يمكن القيام بجميع الأعمال عن طريق 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»

تركيب الكلام


هنا ستساعدنا Yandex مرة أخرى. نرسل النص استجابة نتلقى الملف مع النص المركب

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

جارفيس


ضع كل ذلك معًا واحصل على مثل هذا السيناريو.

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

ما الذي يحدث هنا. نبدأ حلقة لا نهائية ، arecord'om نسجل ثلاث ثوان ونرسل أبو الهول للتعرف عليها إذا تم العثور على كلمة "jarvis" في الملف

 if jarvis_on():

تشغيل ملف إعلام التنشيط المسجل مسبقًا.

مرة أخرى نسجل 3 ثوانٍ ونرسلها إلى Yandex ، ردًا على ذلك نحصل على فريقنا. بعد ذلك ، نقوم بتنفيذ الإجراءات بناءً على الأمر.

هذا كل شئ. يمكن أن تأتي نصوص التنفيذ بالكثير.

حالة الاستخدام


الآن بعض الأمثلة على استخدامي الحقيقي

فيليبس هوى


التثبيت

pip install phue

في تطبيق Hue ، قم بتعيين IP ثابت:

الصورة

تشغيل:


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

نكتب معرف الدوائر اللازمة ، من النموذج "470d4c3c8-on-0"

النسخة النهائية من البرنامج النصي:

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

يضاف في جارفيس:

                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

تلفزيون ال جي


نأخذ النص من هنا . بعد الإطلاق الأول وإدخال رمز الإقران ، لا يتغير الرمز نفسه ، لذا يمكنك قطع هذا الجزء من البرنامج النصي وترك عنصر التحكم فقط.

يضاف في جارفيس:

 
                #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

راديو


sudo apt-get install mpg123

يضاف في جارفيس:

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

يمكنك أيضًا إعداد جسر منزلي وإدارة كل شيء من خلال Siri ، في حالة عدم الصراخ على جارفيس.

أما بالنسبة لجودة التعرف على الكلام ، وليس Alexa بالطبع ، ولكن على مسافة تصل إلى 5 أمتار ، فإن النسبة المئوية للضربات المؤكدة مناسبة. المشكلة الرئيسية هي أن الكلام من التلفزيون / السماعات يتم تسجيله مع الأوامر ويتداخل مع الاعتراف.

هذا كل شيء ، شكرا.

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


All Articles