Давно не покидала мысль о своем «Jarvis» и управлении техникой в доме голосом. И вот, наконец, руки дошли до создания сего чуда. Над «мозгами» долго думать не пришлось, Raspberry Pi подходит идеально.
Итак, железо:
- Raspberry pi 3 model b
- USB камера logitech
Реализация
Работать наш ассистент будет по принципу Alexa/Hub:
- Активироваться оффлайн по определенному слову
- Распознать команду в облаке
- Выполнить команду
- Отчитаться о проделай работе либо сообщить запрашиваем информацию
Т.к. моя камера поддерживается из коробки, с драйверами возиться не пришлось, поэтому сразу переходим к программной части.
Оффлайн активация
Активация будет происходить с помощью 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 распознает довольно быстро.
Распознавание речи
Сначала была идея воспользоваться сервисом гугла, к тому же его поддержка есть в SpeechRecognition. Но как оказалось гугл берет за это деньги и не работает с физ. лицами.
Благо Яндекс тоже предоставляет такую возможность, бесплатно и предельно просто.
Регистрируемся, получаем 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»
Синтез речи
Тут нам опять поможет Яндекс. Посылаем текст в ответ получаем файл с синтезированным текстом
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
Собираем все вместе и получаем такой скрипт.
#! /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 записываем три секунды и отправляем sphinx на распознание, если в файле встречается слово «jarvis»
if jarvis_on():
проигрываем заранее записанный фаил оповещения об активации.
Опять записываем 3 секунды и отправляем Яндексу, в ответ получаем нашу команду. Далее выполняем действия исходя из команды.
На этом собственно все. Сценариев выполнения можно придумать великое множество.
Use-case
Теперь немного примеров реального моего использования
Philips Hue
Устанавливаем
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())
Выписываем ID нужных схем, вида «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
LG TV
Берем скрипт отсюда. После первого запуска и ввода кода сопряжения, сам код не меняется, поэтому можно выпилить эту часть из скрипта и оставить только управляющую.
В джарвиса добавляем:
#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
Еще можно поставить homebridge и управлять всем через Siri, в случае если до джарвиса не докричаться.
Что касается качества распознавания речи, не Alexa конечно, но на расстоянии до 5 метров процент верного попадания приличный. Главная проблема — речь из телевизора\колонок записывается вместе с командами и мешает распознаванию.
На этом все, спасибо.
Комментарии (53)
Jogger
30.01.2017 00:57>Наверняка, каждый мечтает о своем голосовом ассистенте
Только если он будет комплектоваться телом-андроидом. Я совершенно не представляю, зачем мне голосовой помошник, который не может ничего сделать. Большинством функций умного дома, как по мне, куда удобнее рулить с графического или текстового интерфейса. Вот попробовал я Кортану — ну, поигрался немного, но так и не придумал ей практического применения. Может быть об этом и мечтают люди, у которых нет навыка работы с клавиатурой (хотя опять же, в большинстве случаев хватает навыков работы с мышью или тач-панелью), но зачем такой помощник гикам — ума не приложу.toteKopf
30.01.2017 01:32Не всегда, например, мне просто лень что-то тыкать на планшете (на планшете это будет несколько нажатий, проще уж воспользоваться обычным выключателем), когда я захожу домой, проще голосом сказать свет. И далее остальные применения, по той же схеме. Можно взглянуть на это иначе — кому как удобнее.
Jogger
30.01.2017 01:36+2Опять же, мне проще щёлкнуть выключателем, чем что-то вслух произносить. И намного быстрее. И шансов что мою команду неправильно распознают чуток поменьше. И ложных срабатываний почти нет (разве что если спиной заденешь). Нет, ну пожалуй если у кого-то квартира большая, а выключатели расположены неудобно, и зайдя в комнату до выключателя надо идти — может и удобно, я ж не знаю. Но как-то слишком много условий чтобы писать «каждый мечтает».
instalator
30.01.2017 07:47Удобно активировать различные сценарии. Например: Кино, музыка, уборка и т.д. где активируется ряд действий, например чтобы у меня руками включить режим «кино». то нужно взять 3 пульта, от телевизора, ресивера и проектора, плюс встать и выключить везде свет.
gsaw
30.01.2017 10:35Я Алексу прошу
* Включить музыку пока готовлю
* Включить/выключить свет на кухне если руки заняты
* Включить/выключить монитор (на нем нет физической кнопки)
* Включить/выключить свет в зале когда мы на диване телек смотрим к примеру
* Поставить таймер на N минут
* Узнать погоду
* Включить/выключить группу приборов
* Включить отопление
В самом начале еще всякую ерунду типа «сколько лет Путину» или «какое расстояние до солнца» спрашивали. Но быстро надоело. Так да, если выключатель в пределах пары метров, то проще им щелкнуть, чем выговаривать фразу, которую надо еще правильно сформулировать. Но все же Echo dot стоит потраченных 50 Евров, хотя и нервирует иногда, своей тупостью.BurlakovSG
31.01.2017 15:08+1Включить/выключить свет в зале когда мы на диване телек смотрим к примеру
А как успехи с распознаванием голоса при работе какого-либо фонового звука?
Так же хотелось бы услышать ответ на этот вопрос от автора статьи.gsaw
31.01.2017 17:25Про Алексу. Если тишина, то голос не надо повышать, можно обычным тоном говорить. Если в соседней комнате работает телевизор, то это распознованию практически не мешает. Если в той же комнате (у меня это кухня) булькает к примеру кофеварка или работает вытяжка то приходится повышать голос. Иначе либо не понимает, либо «делает вид», что ничего не услышала. Если телевизор сделать совсем громко, то приходится громко говорить. Если алекса сама музыку воспроизводит, то достаточно, что бы она услышала свое имя, она тут же приглушает звук. У меня зал по соседству с кухней, из зала я тоже могу отдавать комманды, правда приходиться повышать голос и глушить телевизор.
В принципе неплохо работает, иногда есть какие то непонятки. Некоторые слова упорно не хочет понимать, возможно потому, что я на иностранном для меня языке говорю. Хотя в логе видно, что предложение поняла. Говорю к примеру «включи монитор», она все распознала, видно в логе, но все равно переспрашивает, какой девайс я имел ввиду. Если тут скажу «монитор» она его включает. Я обошел эту проблему переименовав монитор в «компьютер». Стала понимать слету, даже шепотом.
Но вот из-за таких непоняток невольно начинаешь повышать голос и говорить как робот. У меня такое чуство, что проблема не в распозновании речи как таковой, а понимании семантики.
xxvy
30.01.2017 04:38+3Когда я захожу домой, любой «умный дом» должен сам понимать, что мне нужен свет. И просто включить его.
spc
30.01.2017 09:39По моему личному мнению, с вероятностью в 99,9% такого не будет в ближайшие не знаю сколько лет. А то, может и никогда не будет.
Поэтому только условные сценарии, которые более-менее покрывают потребности обитателей. Ну либо мириться с приличным количеством ошибок, если полагаться на некое подобие искусственного интеллекта, который пытается силой своего скудного разума пронзить привычки человека.tmin10
30.01.2017 10:49Ну почему. Главная проблема точного детекта людей в квартире. Если решить её (например продвинутыми датчиками движения, может даже какие-то примитивные 2д лидары), то можно запустить систему в режим обучения, чтобы она изучила привычки людей и потом старалась их воспроизводить. Раз учат нейронки водить авто, то и угадывать, что если я захожу в комнату и там темно, то нужно включить свет уже не сложно.
spc
30.01.2017 11:05И вот я снова становлюсь занудой. Собственно, здесь (на ГТ) каждый, кому не лень, говорит, что то, что мы называем умным домом, это не умный дом.
Вот и я соглашусь: сейчас дома автоматические. А вот до умного нам как до Марса пешком.
Предположим, вы обклеите все датчиками и даже поставите камеры, которые будут (вместе с другим железом) распознавать пол и возраст каждого. Но вот ситуации:
а) Вы приходите домой один
б) Вы приходите домой с известной дому дамой
в) Вы приходите с неизвестной дому дамой
г) Вы приходите домой с известной дому дамой, которой неизвестно, что в пункте в) вы приходили домой с неизвестной дамой
д) Вы приходите домой с известной дому дамой, с которой романтика уже закончилась
Как дом будет понимать кого как встречать, ну или хотя бы кому какой свет — где поярче, где потише? Вот поэтому я и говорю, что пока что можно базироваться только на сценариях, которые более-менее учитывают общие алгоритмы поведения.tmin10
30.01.2017 11:44А зачем прямо идеально чтобы реагировал? Он должен кпредугадывать что-то несложное, остальное можно и руками подкрутить, благо это довольно редко. Т.е. грубо говоря работать на простых кейсах, которые покроют 90% времени: включить свет по приходу, сопровождать движение по коридорам их подсветкой, вечером закрыть жалюзи, утром их открыть, согласуясь с будильником.
xxvy
30.01.2017 11:58«Умный дом» в идеале, это слуга Беримор. Когда вы приходите домой с новой дамой, он должен включить приглушённый свет и вежливо поприветствовать вас словами «Добрый вечер, сэр. Я вижу вы с новой спутницей? Включить музыку? Или как обычно?»
:)
dadyjo
30.01.2017 17:20У меня в прохожей стоит лампа с датчиком Холла. Как вхожу включается, через 3 минуты выключается если никто не проходит мимо.
hzs
30.01.2017 08:33В принципе, ничего не мешает сделать Джарвиса для обычного ноутбука.
Ты за ноутом, микрофон на расстоянии максимум метра.
Команды типа «Включи новости/музыку», «зайди на Гиктаймс/Баш/ещё-куда-нибудь».
AllexIn
30.01.2017 10:01Я вот чего не понимаю:
телевизор, музыкальая система, вентиляция — все эти штуки являются частью системы умного дома.
Почему нигде не внедряют систему распознавания голоса для умного дома, которая из звукового потока убирает известыне ей звуки?
Звук из телевизора мешает распознавания? Да нет проблем, просто уберите из входного потока звук телевизора. У вас же есть доступ к звуковому потоку телевизора.tmin10
30.01.2017 10:50Звук-то не идеально будет идти в микрофоны, стоит учитывать переотражения от стен, поглощение и прочее.
xxvy
30.01.2017 10:28+2По моему скромному мнению управление голосом не очень комфортно в большинстве ситуаций. Вот ночью, к примеру, нужно включить свет. Как это сделать? Прокашляться и чётким голосом сказать «Компьютер, свет!»?
Как мне кажется, более естественно управлять жестами. Махнул рукой в нужном направлении — свет включился (и не важно, что в комнате кромешная тьма. Система пусть видит в темноте. ИК, например).
Так же можно управлять и бытовой техникой. Указал пальцем, затем махнул в нужном направлении, или сложил из пальцев фигу — прибор выключился.
Со стороны это будет выглядеть как магические пассы :)NoRegrets
30.01.2017 11:59Инсендио!!! В сторону люстры )
Нет уж, надо чтобы распознавание было хорошим. Мы же легко распознаем какой угодно голос и компьютер так сможет, если уже не может.xxvy
30.01.2017 12:45Меня больше напрягает сама необходимость издавания звука для включения света, например. Или переключения канала телевизора. Мне проще развалиться в кресле и делать пальцами жест, как будто я перелистываю страницы.
gsaw
30.01.2017 16:47Я вот думал — пульт ду на e-Ink, с гироскопом и может быть с компасом. К примеру настроить несколько схем. Для выключения света две кнопки, для телевизора много специфичных кнопок, для управления жалюзями тоже две кнопки и может быть контрол для диммера. А потом выбрать схему для лампочки, направить пульт на лампочку и зафиксировать положение гироскопа и компаса. Так же с телевизором и окном. Потом направил на телек, пульт сам включит схему с кнопками для телефизора. Направил вверх на лампочку и автоматически активируется схема для управления лампой.
Конечно это будет работать, если пульт всегда только на одном месте будет использоваться. У меня по крайней мере так. Грубо направления лево — окно, прямо — телевизор, вверх — лампа должно быть достаточно для выбора лайоута.xxvy
31.01.2017 04:06Предлагаю пульт в виде волшебной палочки (с гироскопом, сенсорами и одной кнопкой)
Ей можно махать, вычерчивая заклинания в воздухе.Am0ralist
31.01.2017 14:49Если отслеживать в пространстве, то в любом случае потребуется система определения куда направлено, с метками пространства какими-то.
Чтоб понятно было, что вот заклинание «светиус-медиус» вы на люстру центральную кастанули, а не на бра.
Так что было бы веселее «Джарвис», рукой на люстру, по часовой покрутили — свет прибавился. Тоже самое — на кондиционер и телевизор.
Без «пульта» или палочек, чтоб каждый раз эти костыли не искать.
А для этого нужна система распознавания жестов независимо от освещенности.xxvy
01.02.2017 04:35на палочку наносим контрастные метки и камерой(камерами) определяем положение и направление. Кинект же…
Am0ralist
01.02.2017 09:05и камерой(камерами) определяем положение и направление.
ИК камерами?
Или в темноте волшебство не случится?
Плюс необходимо уверенное опознавание во всех углах квартиры (т.е. количество камер большое).
И привязать палочку-пульт к себе.xxvy
01.02.2017 12:341. палочка с гироскопом и кнопкой
2. в качестве меток могут быть ИК-светодиоды, которые зажигаются от кнопки (и, возможно, мигают, для лучшего детектирования и передачи данных с гироскопа)
P.S. А чтобы не вешать камеры по всей квартире, поставить пару камер и нарисовать в этом месте пентаграмму и типа колдунство будет действовать только там :). шютка юмора.Am0ralist
01.02.2017 12:501. Еще раз: привязанная к вам палочка с гироскопом и кнопкой.
Вы пульт телевизора никогда не теряли? Не приходилось его находить в холодильнике?
Плюс, как точно гироскоп поможет определить, что вы сейчас показываете на левее севера на 2 градуса, а не 3?
Тогда не забудьте добавить в нее звуковой сигнализатор на команду «джарвискудамлятьделасьэтачертовапалочка»
2) Куда мигают? Сколько приемников надо ставить для каждой комнаты для уверенного приема везде? Данные через ик моргания точно передавать не стоит.xxvy
02.02.2017 08:30Это уже детали реализации.
У Любой технологии есть ограничения. Не зацикливайтесь на палочке. Изначально я начал с жестов руками. В принципе только рук достаточно.
Палочка всплыла позже. Основной посыл — улучшение распознавания жестов, т.к. рука не светится и система не всегда может понять специально вы руками машете или случайно. А на палочке есть кнопка для этого :). И в отличие от пульта — всего одна кнопка. Остальное делается жестами.
Гироскоп в палочке тоже не обязателен, но если он есть он поможет системе более точно распознавать жесты. Само собой информацию с гироскопа нужно передавать системе. Можно это делать через те же светящиеся метки (ИК), либо через синезуб, либо ещё как. Не каменный век — способов много.
Да у палочки есть недостатки. Она теряется. Но её можно сделать дешёвой и раскидать по квартире. Нашёл ближайшую палочку, черканул в воздухе — включился телевизор :).
Не нашёл — махнул просто рукой (если находишься в зоне видимости камеры)
Ну и у палочки есть некий антураж :). Вместо неё можно махать браслетом на руке, перстнем на пальце…
Но опять-таки повторюсь. Самой идее — давать команды жестами, — вполне достаточно просто рук :)
P.S.
Я же упоминал уже про Кинект. Собственно вот пример управления прибором (приставкой, игрой в приставке) без джойстиков и пультов. Ну иногда в руки берётся светящаяся палка для удобства…
noonv
30.01.2017 11:05Расскажите подробнее про качество распознавания. Какой процент ложных срабатываний?
Bluefox
30.01.2017 11:30Вот бы видео посмотреть, как это работает. Если тормоза (дольше 2 секунд), то пользователю надоест ждать.
kazenniy
30.01.2017 12:25+1Яндекс предоставляет бесплатно говорите? А в условиях использования SpeechKit Cloud пишут: «Для знакомства с технологией предусмотрен бесплатный тестовый период — 1 месяц с момента отправки первого запроса на сервер.
Чтобы продолжить использовать SpeechKit Cloud после этого, необходимо заключить договор. Можно приобрести пакет (фиксированное количество запросов в месяц) или оплачивать запросы по факту.
Стоимость лицензии зависит от количества обращений и в среднем составляет 400 рублей за 1000 запросов.»WSN3
30.01.2017 14:50+2Yandex SpeechKit Cloud — платный продукт. Тем не менее мы даём возможность использовать его бесплатно, если Ваш проект подходит под одну из этих категорий:
— для личного использования (система «Умный дом», персональный ассистент, робот, голосовое управление ПК);
— образовательный (для подготовки диплома, реферата или обучения студентов);
— благотворительный (направленный на помощь людям с ограниченными возможностями).
При этом Ваш сервис должен отправлять к серверу Яндекса не более 1000 запросов в сутки. Если Вы рассчитываете, что запросов будет больше, сообщите нам об этом на voice@support.yandex.ru.
Segmentq
30.01.2017 15:21То-то я думаю, в воздухе витает устойчивый запах яндекса, и действительно — реклама собственной персоной :)
А вообще была тут как-то статься аналогичная только с сервисом гугла.
jhonyxakep
30.01.2017 19:33Как вариант использовать встроенный в Google Chrome и Chromium голосовой движок. Он работает локально и умеет в непрерывное распознавание. Из минусов конечно сам Chrome, он тяжелый для Малинки.
Для полноценного использования можно реализовать с помощью Electron, там тоже работает распознавание
Xandrmoro
Но ведь голос (и вообще текст на естественном языке) — самый неудобный способ управления?
tmin10
Нужно, чтобы мысли читал! Ну а пока технологии так далеко не шагнули, нужно предугадывание желаний пользователя с возможностью ручной коррекции.
Bluefox
Очень даже удобно. Я реально пользуюсь управлением светом.
https://www.youtube.com/watch?v=U-6_s7yuGQE&t=28s