Comments 87
Спасибо, очень круто, как раз планировал под iOS своему приложению управления умным домом добавить поддержку голоса!
Так для управления оконечными устройствами. Он формирует сеть ZWave, к которой подключаются устройства. А далее контроллер получает HTTP запросы от приложения и траслирует их в команды ZWave протокола.
«Телефончик, слушай, отправь смсочку Лене и скажи задержусь на пять минут.»

Голосовое управление станет обыденностью если дивайс сможет распозновать подобные вещи, сказанные бегло и без напряжения.
О, заминусили :)

Я имел ввиду что вы говорите довольно «роботизированным» голосом, с четкими паузами и разделениями слов. Более того, короткими командами. Это не очень практично в обычной жизни, где человек говорит бегло.
Практично? Роботизированным? Дома удобно быстро сказать два-три слова типа «телевизор, кондей, свет на кухне». А не пространными объяснениями типа «уважаемый умный дом, не могли бы вы включить мне...» И далее.
И чтобы отработало моментально. Я говорю нормальным голосом без особых пауз. Нам нужна четкая голосовая машина, а не «собеседник» типа чатбот. Вот я о таком подходе и рассказал.
Вы не поверите (с)
Голосовой ассистент Дуся: 4pda.ru/forum/index.php?showtopic=561485 там же есть несколько видеодемонстраций

К примеру фразы 'Дуся, напиши смску леночке я задержусь на пять минут' или 'Дуся, разбуди меня через три часа' будут распознаны и обработаны как ожидается. Работает offline! так как голосовой движок от google уже работает без интернета, правда чуть медленней чем онлайн вариант.
Почитал эту тему на 4pda —

Как запустить Дусю из сторонней программы с определенной фразой
Для этого нужно запустить Broadcast с Action com.dusiassistant.INPUT и в Extras передать строку с именем text

и подумал, что это же отличный вектор для атаки — фигачим в какую-нибудь говноигрушку «отправь смс на <короткий номер> с текстом ...» и ловим дусеводов…
Угу, при том что Дуся обязательно при этом переспросит голосом владельца, прежде чем что-то отправлять ))
Ну уязвимости то есть ;(
Пока я игрался с Дусей, обнаружил что при любых включенных механизмах активации на экране блокировки (хоть голосом, хоть потряхиванием, хоть проведением рукой) есть возможность запустить любое приложение (это отключается, как и варианты с навигацией, курсами валют и т.п., реализованные через браузер) сказав 'Открой xxx' например браузер, он будет запущен и позволит с ним работать без снятия блокировки.
Уязвимости? Ээ… Так поставьте графический ключик. Хотя Если ваш телефон в руки взял злоумышленник — то пенять тут на ассистента без толку, ваши данные и без него станут доступны.
Кстати все виды активации можно вообще выключить. Так что об «уязвимостях» тут говорить неуместно.
Я тестировал именно при блокировки графическим ключом.
И да, это уязвимость, идеологическая, потому как при закрытии большинства механизмов активации, остается единственный надежный но неудобный — по запуску приложения.
Есть еще по тапу на виджет. Или с бт гарнитуры. Или из шторки — быстрый старт. У Дуси активаций масса. Читайте внимательнее.
Если у вас разблокируется при графическом ключе — то это уже проблемы вашей прошивки.
То, о чем вы пишете, это уже не просто распознавание речи, а интеллектуальный анализ распознанного. Разные вещи.
Это вещи на стыке разных технологий. Задача процессинга текста по сути никак не связана с распознаванием. Также как и распознавание с процессингом. Но при реализации в единой парадигме можно решать обе задачи более эффективно.
Спасибо за статью!
Но вера тут никак не обязательна. После распознавания команды можно отправлять запрос на любой контроллер (в моем случае Fibaro).
Да конечно не обязательна. Статья о том, как можно прикрутить такое голосовое управление к чему угодно. У меня есть вера3, к нему и прикрутил. Просто у фибары с верой могут быть разные http протоколы. Пожтому не могу сказать, будет ли работать с фибарой тот же код.
Уважаемый автор, подскажите, по нескольким вопросам:
1. Можно ли использовать данный API не c мобильнымb OS, к примеру с Linux установленным на мини PC.
2. Какие телефоны из дешевых можно использовать на Android (было что-то сказано против Samsung)?
3. Можно ли обойтись Vera или аналогом в 1 единственном числе, если у вас дом в несколько этажей и 10 комнат, и к примеру у вас в каждой комнате по 1 дешевому телефону ( как приемник) и как минимум в комнате до 10 устройств (розеток) под управление.
4. Из 3 вопроса выходит 4 — как локально определять однотипные названия, к примеру жалюзи? Запоминать что в этой комнате есть жалюзи и нужно называть ЖАЛЮЗИ №3 — не удобно. Интересует самоопределение по нахождению с привязкой через конкретный телефон в конкретной комнате.
5. К примеру я сделал несколько устройств с использованием микроконтроллеров (Arduino с wifi) сам и еще много всего, узкое место — роутер с его пропускной способностью? Сложно ли подружить DIY устройства?
6. Есть ли оболочка, которая устанавливается на 1 сервер, к которому можно подключиться в графическом режиме через планшет к примеру, указать что куплена новая умная розетка, задать ей имя, указать привязку к конкретному телефону (к примеру телефон № 4 — зал) и по принципу Plug&Play включить за 5 минут?
4. Не ориентируюсь в конкретных контроллерах, но разве нельзя передать вместе с фразой идентификатор телефона дополнительным параметром, и пусть контроллер реагирует соответственно?
Ух как вопросов много. Сразу видно, что вопросом владеете ))
1. Можно. На сайте pocketsphinx вы можете увидеть один из подобных проектов. Кстати на том же raspberrypi или cubieboard нормально ставится андроид. Придется поэкспериментировать с микрофонами и звуковыми платами.
2. Да в принципе любые. Ну например мегафон клик, старые htc hero и тп. Насчет самсунга — ничего против. Просто указал, что на них нельзя одновременно и слушать и синтезировать звук. Кстати у самсунгов одни из лучших микрофонов. Даже на самых дешевых моделях.
3. Ну начнем с того, что умный дом — это далеко не только розетки )) Насчет самой сети zwave — в принципе можно обойтись при особом расчете. Дело в том, что zwave — это самоорганизующаяся сеть, с функцией «черезсеть», т.е. Каждое устройство является ретранслятором радио сигнала. Если правильно расположить устройства так, чтобы каждая пара была в области видимости на несколько метров, то возможно обойтись и одним контроллером. Не будем также забывать о возможности использовать гораздо более дешевые usb контроллеры, подключаемые к пк.
4. Это уже зависит от логики работы приложения на смартфоне (пульте). Исходники я приложил — можно жкспериментировать )) В одном из проектов мы вообще делали автоматическое определение местоположения андроида по bluetooth маячкам по всему дому — работало хорошо.
5. Несложно, если вы используете те же протоколы. Но для разношерстных утсройств в одной сети интернета вещей я предлагаю использовать тот же openhab — он может объединить все устройства на более 100 протоколах. Почитайте в моей предыдущей статье.
6. Это реализовано в тех же контроллерах Vera. Посмотрите мое видео до конца.
Да, собственно, всё, кроме пункта 5. В качестве контроллера используется обычный ПК с набором донглов.
Если интересно, то код можно найти у меня в профиле в GitHub. Проект разбит на 3 приложения — ядро системы, веб-интерфейс и терминал на Android.
Второе и третье в зачаточной стадии, как раз пытаюсь прикрутить сфинкс к андроиду.
Спасибо за ответы! Но вопросом не владею )) как заметили, только только к роботу прикручивать буду голосовые команды и движок выбираю, ранее использовался другой, самопальный. Параллельно и дома хочется что-то сделать умного.
4. Сама по себе статья про определению местоположения, если возможно, была бы не менее интересна на основе вашего опыта.
Хм… А это можно… Если будет интересно. Это тема про bluetooth low energy (4-я версия).
Я один из соавторов pocketsphinx-android, могу ответить на некоторые вопросы. Есть одна проблема, с которой у всех возникают вопросы, и которая пропущена в этой статье — ресурсы приложения. Суть проблемы в том, что pocketsphinx требует путь, чтобы прочитать файл, а для Android assets возможно получить только InputStream. Поэтому для демонстрационного приложения я написал ant-скрипт, который вычисляет .md5 суммы всех файлов из директории assets/sync и создаёт список, который потом используется для синхронизации файлов между .apk и внешней памятью (обычно, SD-карта). Поэтому, если вы собираете проект через ADT плагин, то убедитесь, что включены соответствующие Ant-шаги в процесс сборки. Впрочем, есть подробное описание, несмотря на существование которого, стабильно раз в неделю кто-нибудь да и напишет в форуме, что у него проблемы с ресурсами.
У меня есть вопрос иного характера.
Не получится ли так, что подсев на данный движок, со временем он станет платным? Есть такие планы?
Нет, код полностью открытый. Библиотеку можно использовать в коммерческих и закрытых проектах.
Нет, нужно положить в assets/sync и сгенерировать .md5 для каждого файла и контрольный файл со списком ресурсов. В pocketsphinx-android-demo это делается автоматически через ant-скрипт, но вы можете использовать любой способ. Если вы хотите, чтобы все файлы из assets/ синхронизировались, то нужно изменить название директории в pocketsphinx-android.
Не совсем понял. В какой момент времени происходит синхронизация с внешней памятью? И где именно они в итоге лежат? Ни во внутренней памяти, ни на SD карте не нахожу, хотя демонстрационное приложение работает отлично.
Здравствуйте. Я только начинаю разбираться с программированием под android.
Пример из статьи не заработал, взял пример с сайта библиотеки — заработал, но там только английский язык
Можете помочь, как добавить в пример с сайта русский для активационной фразы и для распознавания двух команд?
А можно ли прикрутить управление телевизором по голосу? телевизор включить, москва24, Громкость плюс 10? По ИК или WiFi(SmartTV)
может есть статистика по зависимости ложных срабатываний от количества слов и грамматик?
Грамматики тут не принимают участия. Если вы про активацию голосом. В активации голосом нужно подбирать подходящее значение порога.
Плюс еще важно, что активационная фраза не должна быть короткой. Примерно 2 слова по 2-3 слога в каждом. Необходимо также очень аккуратно писать транскрипции.
Круто, сейчас тоже прикручиваю. Но с помощью 1 Sheeld и не совсем удачно работает распознование голоса. Какова дальность определение? Думаю пристроить к андройд девайсу микрофон ШОРОХ
У меня был очень негативный опыт работы с pockeysphinx под Ubuntu и ROS. Нужно было распознавание, которое реально совместить с ROS, быстро работающее и не как можно меньше зависящее от внешних условий, дикторонезависимое. Мне так и не удалось настроить pocketsphinx на хорошее распознавание, постоянные ошибки были. После такой оптимистичной статьи попробую еще раз при случае — может, у меня руки не из того места оказались.
Библиотеку такого типа невозможно заставить работать их коробки для абсотютно всех случаев. Есть распознавание гугла — оно работает без настроек. Но вы ничего не контролируете, кроме языка. В конфигурации pocketsphinx есть опция -rawlogdir, она задаёт путь к директории, куда сохраняются записи во время распознавания. Прослушайте записи, возможно, вы записываете не в том формате. Это очень распротранённая ошибка. Если в форматом всё хорошо, то вы можете написать в список рассылки, форум или #cmusphinx на freenode, указав ссылки на записи и вашу конфигурацию. Также, сейчас есть некоторые проблемы с версионностью. По сути, сейчас можно скачать trunk/master или 0.8, и они очень сильно различаются. Я советую скачивать первую версию. Есть не собирается — пишите, такое бывает. Разработчиков немного, но все откликаются оперативно.
Спасибо за статью. Я. правильно понимаю, что можно совместить оба метода и после «условных 3 секунд», если команда не распознана, отправлять запись на серверный движок??
Ну теоретически можно. Но на какой движок и зачем вы будете это отправлять? Тем более если вы что-то сказали, то pocketsphinx все равно вернет вам какую-то гипотезу по грамматике.
Спасибо, появился повод разобраться уже с этой библиотекой. Давно пора прикрутить её к моей Вике.
На мой згляд, было бы здорово добавить универсализма, например отправлять результаты через mqtt.
Посмотрите все же на протокол mqtt. С его помощью можно с десятками систем интегрироваться. От MySensors до node-red.
Еще раз отвечу вам — openhab. Он интегрирован и с mqtt тоже. Openhab интегрируется с сотней систем, а не с десятком.
Вы имеете ввиду протоколы взаимодействия с оборудованием(z-wave, x10, knx ...), а я про системы домашней автоматизации, такие как openhab, mysensors.
То есть, написав модуль, взаимодействующий с миром посредством mqtt вы потом без труда можете его подключить к любому продукту с поддержкой mqtt.
Тогда, возвращаясь к вашей реплике
На мой згляд, было бы здорово добавить универсализма, например отправлять результаты через mqtt.

Какие результаты вы бы предложили отправлять через mqtt???
Номер слова/выражения из списка(как работает EasyVR) или само слово/выражение.
Если «на той стороне» достаточно умное приложенние, то всю логику, модель языка можно там выстроить.
Простите, а зачем логика должна быть где-то?? Кокретно в данном приложении логика на клиенте и этого хватает для решения конкретной задачи…
У меня в первом приближении получилось так:
Дуся распознает Event таскера. Таскер с помощью плагина MQTT Sender отсылает сообщение с топиком, «actions/команда» и телом {'id': номер}
Поток в Node-RED слушает соответствующий топик и посылает команду устройству с соответствующим айди.
Вчера наконец-то дошли руки разобраться в этой библиотеке. Сейчас я для умного дома использую онлайновую распознавалку от Google. Надо сказать, что у Pocketsphinx есть как плюсы, так и минусы.

Минусы:

  • В «grammar-based» режиме фразы распознаются неплохо за счёт того, что используется заранее заданный список, но таким образом иногда и любой шум принимается за какую-то команду.
  • Чтобы не было вышеописанной проблемы, приходится использовать ключевое слово для активации. Как уже сказал автор, оно не должно быть коротким. Это в разы понижает удобство использования, ведь я как-то уже привык, что ночью достаточно сказать просто «открой окно» или «включи компьютер» без всяких прелюдий в виде «умный дом». При этом моё привычное необязательное обращение по имени «Вика» слишком короткое.
  • Всё-таки плохо распознаётся с большого расстояния. Или я что-то плохо настроил? Но пока я тестировал Pocketsphinx, на мои команды гораздо чаще реагировал планшет, который находится в другом конце комнаты и использует распознавание от Google.


Плюсы:

  • Скорость. Абсолютно мгновенная реакция на команды. В случае с Google приходится ждать лишнюю секунду, а если использовать Android 4.4, то из-за костылей иногда доходит и до пяти секунд.
  • Автономность, не нужен Интернет.


Пока что минусов для меня больше :(
Первая проблема — не проблема. Решается за счет правильно написанной грамматики (garbage) и фильтрации результат по score, который можно легко посчитать. Это обычная практика для распознавания на базе контекстно-свободной грамматики.
Второе — «в разы понижает удобство»??? Я как-то не заметил этого «в разы». А вы гуглом все время слушаете эфир на предмет команды?? Ого… Гугл вас забанит или весь трафик съест )) Плюс гугл любит становиться «недоступным» — это все же облачный сервис…
Третье — еще все зависит от микрофона. Вы говорите что гугл распознает с нескольких метров?? Не поверю. Гугл распознавание рассчитано на небольшое расстояние. А в шуме вы от него вообще не добьетесь результата на расстоянии метра.
Вот пишу файл грамматики, действительно становится лучше.

Да, постоянно слушаю эфир, но при этом из общего шума вполне неплохо выделяется голос, так что запросы происходят не непрерывно. Никаких проблем.

В почти полной тишине (шум компьютера) — Google легко распознаёт с нескольких метров. В абсолютно полной тишине берёт и с пяти-семи метров. Правда, так было не всегда. Впечатление, что в последнее время они как-то оптимизировали распознавание. Меня это даже напугало немного. Pocketsphinx шум тоже как-то не очень любит
Шум не любит не покетсфинкс, а я конкретная аккустическая модель. Если натренеровать свою — будет работать и в шуме.
Если постоянно слушать эфир… Ну что тут сказать — трафик плюс гугл в конечном итоге откажет вашему приложению в обслуживании, как только вашей системой начнете пользоваться не только вы…
У API ключей Гугла вполне себе определённые ограничения по запросам в сутки, за пределы которых я не выхожу.
Ну это только вы )) и сколько же у них ограничения? )) вообще-то под андроидом ограничения нет, но все же — слушать постоянно голос в облаке… это как-то что-то странно… И гугл будет очень недоволен, если это будет делать еще хотя бы пара тысяч человек…
Называй теперь свой дом вместо Вики какой-нибудь Алефтиной и двух проблем сразу не станет)
А проблему с дистанцией, как мне кажется, можно решить исопльзованием нескольких микрофонов по всей квартире с равномерным покрытием всей площади. От этого все равно никуда не денешься, разве что на себе микрофон носить.
Добрый день!

Подскажите пожалуйста такой вопрос по приведённым исходникам, как поменять ключевую фразу активации?
Нашёл, что она прописана в strings.xml как «Умный дом», так же в файле hotwords как два слова:
умный uu m n ay j
дом d oo m
пытался менять на свою фразу, но что-то ничего не получилось. нужно ли менять её в обоих местах (в каком-то особенном формате?) или как-то ещё по-другому?

P.S. может кому-нибудь пригодится — у меня не получалось запустить движок без добавления двух файлов-библиотек в проект:
libs\armeabi\libpocketsphinx_jni.so
libs\armeabi-v7a\libpocketsphinx_jni.so
Если в этой статье ещё найдутся живые люди, помогите понять, что есть score?
Рискну предположить, что score это коэффициент похожести распознанного с активационной фразой.
Это я тоже рискнул предположить.
Score, кстати, указывается не только для активационной фразы, но и для любой распознанной (включая распознанную по грамматике).
Вот только как с ним правильно работать и от чего конкретно он зависит, это уже более сложный вопрос.
А что с оффлайн-распознаванием под Windows?
Был Realspeeker, но сейчас не работает, обещают новую версию.
Да и работал он онлайн, судя по тому, что сейчас не действуют старые дистрибутивы.

Был когда-то горыныч, но давно он был так себе.

Что рекомендуется сейчас для набора текстов?
библиотека собирается под большинство архитектур и операционных систем, windows в их числе
Совсем никак он не распознаёт мой английский, даже если я говорю те же фразы что в демо-файлах (их он распознаёт). При этом я уверен в том, что формат моих записей правильный. В общем, сразу как-то не заладилось.
Сегодня мне ответили на форуме, причина была в том, что алгоритм не успевает адаптироваться к распознаванию коротких фраз. Эту адаптацию надо провести самому, что не должно быть ни долго, ни сложно — по идее, около минуты поговорить надо, извлечь получившиеся коэффициенты и поместить их в конфигурацию.

Спасибо вам! Очень ценное дополнение, у меня тоже были подобные проблемы. Пойду достану проект из шкафчика и попробую еще раз.
Я правильно понимаю, что для распознавания речи в текст (длинный, на несколько часов, аудиофайл) эта библиотека не подходит?
Статья 5ти летней давности, однако помогла, спасибо.
Правда пришлось много чего поменять, тк библиотека обновилась и android studio тоже.
Only those users with full accounts are able to leave comments. Log in, please.