roboforum.ru

Технический форум по робототехнике.

Простой пульт голосового управления роботом на базе Android

Раздел создан специально для людей которым интересна робототехника, но в силу разных причин они не знают с чего начать.
Задавайте ваши вопросы, какими бы простыми они не казались, постоянные посетители форума постараются ответить на них по мере своих сил.
Робот своими руками. Самодельный робот.

Простой пульт голосового управления роботом на базе Android

Сообщение Scorpio » 17 май 2014, 02:37

Не знаю, как вам, а мне всегда хотелось, чтобы робот реагировал на голосовые команды.
Для этого существует немало программных и аппаратных средств. Все они имеют свои недостатки. И не очень просты в применении. На форуме уже много раз это обсуждалось, так что не буду повторяться. Скажу только, что очень важное значение имеет качество самого звукозаписывающего устройства, т.е. микрофонов, усилителей, шумоподавителей. Смартфон, в этом отношении, идеально подходит, т.к. все эти аппаратные средства в него уже встроены.
Нашей задачей будет научиться использовать андроид – смартфон, для управления роботом, например, на базе ардуино с блютузом, посредством голоса. Причем сделать это максимально быстро и просто.
Сформулируем требования к программе на смартфоне:
- При запуске, программа включает BT, если это необходимо;
- Коннектится с роботом;
- Ожидает фразу на русском языке;
- Распознает ее средствами Google;
- Передает полученный текст по BT дуне (или что там у нас на том конце)
- И, собственно, выходит.
Програмить будем на Python, поскольку это проще пареной репы, и не требует, практически, никаких специальных навыков.
Для начала проверим аппаратную часть. Т.е. соединим наш смартфон с ВТ- модулем робота через меню настроек ВТ- соединения, авторизируем связь с роботом, чтобы смартфон смог соединяться с ним в любой момент, без поиска и запроса пин-кода. (пишу без подробностей, т.к. рассчитываю на продвинутых пользователей андроида.)
Далее, качаем и устанавливаем с Play Market «Sl4a» и «Python for Android», если до сих пор этого не сделано. Если хотим писать прямо на смартфоне/планшете, то качаем также “DroidEdit” или любой удобный редактор. Но, проще написать сценарий на компе, в Notepad++, например.
Пишем:
Магическая строчка, разрешающая скрипту понимать русские буквы
Код: Выделить всёРазвернуть
#_*_ coding: utf-8 _*_

Загрузим необходимые библиотеки и объявим главный объект управления.
Код: Выделить всёРазвернуть
import android
import sys
droid = android.Android()

Пригодится для открытия профиля последовательного порта в BT устройстве смартфона
Код: Выделить всёРазвернуть
SPP_ID='00001101-0000-1000-8000-00805F9B34FB'

ID ВТ модуля робота. Можно посмотреть в свойствах соединения в меню настроек ВТ, можно и позже.
Код: Выделить всёРазвернуть
BT_DEVICE_ID = '11:11:11:11:11:11'

повибрируем телефоном, чтобы подтвердить, что программа заработала
Код: Выделить всёРазвернуть
droid.vibrate()

Включим ВТ на всякий случай. Если ВТ в данный момент выключен, то смартфон попросит разрешить включение.
Код: Выделить всёРазвернуть
droid.toggleBluetoothState(True)

Устанавливаем соединение с роботом, в режиме последовательного порта
Код: Выделить всёРазвернуть
droid.bluetoothConnect(SPP_ID, BT_DEVICE_ID)

В случае, если, нам лень смотреть BT_DEVICE_ID, напишем команду иначе:
Код: Выделить всёРазвернуть
droid.bluetoothConnect(SPP_ID)

Получим список всех авторизованных устройств с их ID, тяпнем по нужному, предварительно записав BT_DEVICE_ID, чтобы в следующий раз не выводить меню.
Следующая строчка, собственно, делает всю магию распознавания русской речи (смартфон д.б. соответственно настроен в меню «язык и ввод»).
Код: Выделить всёРазвернуть
results = droid.recognizeSpeech("test",None,None)

Отправим результат роботу (передается в Юникоде, надо это учитывать при расшифровке)
Код: Выделить всёРазвернуть
droid.bluetoothWrite(results.result)

на всякий случай выведем результат на экран
Код: Выделить всёРазвернуть
droid.makeToast(results.result)

Прекращаем работу программы.
Код: Выделить всёРазвернуть
sys.exit('Bay!')


Сохраняем полученный скрипт в папку …\Phone\sl4a\scripts и запускаем с помощью Sl4a.
С целью тестирования, лучше сначала, вместо робота, соединяться по ВТ с ПК, с запущенной любой терминальной программой, способной отображать Юникод, либо HEX представление полученных байт.
Распознавалка гуглом, на мой взгляд, является лучшим «для применения в быту», из понимающих русский язык инструментов. Тем более, что в новых версиях Андроид, сервис может работать в режиме OFFLINE. Точность распознавания 80-90%, по крайней мере на мой голос. Причем, в отличии, от других сервисов, не требует обучения на голос и задания словаря.
Поговорим немного о «принимающей стороне». Получив фразу, робот должен выделить из нее ключевые слова и как-то на них отреагировать. Например, говорим: «Мигни светодиодом пять раз». Ключевое слово для команды: «мигни» и «5» (хорошо, что числительные гугл возвращает цифрами), в качестве параметра. Т.е напрашиваются словари команд, в которых робот будет искать соответствие с каждым из слов, в полученной фразе. Если гугл распознал не совсем точно, и вернул «огни», например, вместо «мигни». То все эти варианты надо просто добавить в словарь, и назначить для них одинаковые действия. Есть и более продвинутый способ: каждое слово кодируется, в соответствии с его звучанием, и робот получает набор чисел вместо слов, в котором «огни» и «мигни» имеют одинаковые числовые значения. Но это уже лишнее.
Понятно, что, при желании, анализ фразы можно произвести и в самом питоновском скрипте, на смарте. В этом случае, роботу передается только код соответствующей команды.
Попробуем изменить скрипт, на случай, если не собираемся ограничиваться одной фразой, а хотим поговорить с роботом. В этом случае надо, чтобы распознавание работало постоянно, а не однократно. Как я понимаю, при запуске распознавалки, и появлении на экране значка красного микрофона, сервис ждет превышения определенного порога, сигналом с микрофона. Затем начинает аудиозапись. Если сигнала нет какое-то время, то запись останавливается и скармливается движку распознавалки. После окончания обработки, процесс можно запускать заново.
Код: Выделить всёРазвернуть
while (1):   
results = ""   
results = droid.recognizeSpeech("test",None,None)   
if (results.result==u'выход'):     
  sys.exit('Bay!') 
droid.bluetoothWrite(results.result) 
droid.makeToast(results.result)

Т.о. программа будет работать пока не получит команду «выход».

Конечно, было бы не удобно каждый раз запускать Sl4a, затем выбирать свой скрипт, затем выбирать явный или фоновый режим запуска и, наконец, запустить свою программу. В старых версиях андроида, можно было легко сделать ярлык для запуска скрипта прямо с главного экрана. Для этого достаточно было долго тяпнуть по экрану, выбрать из появившегося меню «опции» - «запуск сценария»…
Однако, в Андроид 4.3 (а может это виноват Samsung Galaxy S3) никаких «опций» в настройках главного экрана нет! Кроме того, в самом Sl4a исчез пункт меню «сделать ярлык на главный экран». Что за отстой!? Я гуглил полдня, но так и не нашел решение.
Если на форуме найдется добрый человек, который поможет вернуть возможность создания ярлыков для запуска сценариев, я буду ему очень благодарен.
Результирующий код целиком:
Код: Выделить всёРазвернуть
#_*_ coding: utf-8 _*_ 
import android
import sys 
droid = android.Android()

SPP_ID='00001101-0000-1000-8000-00805F9B34FB'
BT_DEVICE_ID = '11:11:11:11:11:11'   

droid.vibrate() 
droid.toggleBluetoothState(True) 
droid.bluetoothConnect(SPP_ID, BT_DEVICE_ID)   
while (1):   
results = ""   
results = droid.recognizeSpeech("test",None,None)   
if (results.result==u'выход'):     
  sys.exit('Bay!') 
droid.bluetoothWrite(results.result) 
droid.makeToast(results.result)
Аватара пользователя
Scorpio
 
Сообщения: 2683
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Re: Простой пульт голосового управления роботом на базе Andr

Сообщение Angel71 » 17 май 2014, 04:16

в большинстве ардуин запаяна хилая мега, а вы её текстом помучать хотите. :)
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Простой пульт голосового управления роботом на базе Andr

Сообщение Scorpio » 17 май 2014, 17:40

Не такая уж она и хилая, если текст, конечно, не "Евгений Онегин". Но, если действительно не будет хватать ресурсов, то
Scorpio писал(а):Понятно, что, при желании, анализ фразы можно произвести и в самом питоновском скрипте, на смарте. В этом случае, роботу передается только код соответствующей команды.
Аватара пользователя
Scorpio
 
Сообщения: 2683
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Re: Простой пульт голосового управления роботом на базе Andr

Сообщение AndreiSk » 18 май 2014, 15:06

Вспомнилось...
=============
Напротив чувак сидит
— Он голосовое управление пишет
— И чтобы начать работу с термостатом нужно сказать hello thermostat
— И он это раз по 200 повторяет
— С утра когда здороваются все друг другу говорят ахой
—. А ему хэлло термостат
— И когда мимо проходят тоже говорят, у него активируется и он бесится
==============
Аватара пользователя
AndreiSk
 
Сообщения: 2639
Зарегистрирован: 23 апр 2009, 17:03
Откуда: Москва, Самара
прог. языки: C#

Re: Простой пульт голосового управления роботом на базе Andr

Сообщение Scorpio » 19 май 2014, 00:56

:)
Аватара пользователя
Scorpio
 
Сообщения: 2683
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Re: Простой пульт голосового управления роботом на базе Andr

Сообщение Angel71 » 19 май 2014, 01:47

Scorpio писал(а):Не такая уж она и хилая, если текст, конечно, не "Евгений Онегин". Но, если действительно не будет хватать ресурсов, то
Scorpio писал(а):Понятно, что, при желании, анализ фразы можно произвести и в самом питоновском скрипте, на смарте. В этом случае, роботу передается только код соответствующей команды.

не усложняйте
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Простой пульт голосового управления роботом на базе Andr

Сообщение Scorpio » 19 май 2014, 18:01

Ну, сударь, вам не угодишь!
Аватара пользователя
Scorpio
 
Сообщения: 2683
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Re: Простой пульт голосового управления роботом на базе Andr

Сообщение Angel71 » 19 май 2014, 18:30

это не так. делайте конечно как хотите, но самым оптимальным вариантом как по мне это создание протокола и анализ текста на планшете, а на робота отсылаются только команды. проще обновлять по, проще редактировать базу команд, можно очень гибко создавать последовательности команд и т.д. если вам достаточно очень простого варианта "стоп", "ехать вперёд", "поверни на лево на n градусов",... с ростом кол-ва команд растут и затраты на такты/память. и/или если всё-таки планируете заменить распознование речи с гугли на какой аппаратный модуль, тогда да, есть смыл делать на меге.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Простой пульт голосового управления роботом на базе Andr

Сообщение Scorpio » 19 май 2014, 19:40

Так я вроде на планшете и предлагаю, как вариант. Тем более, что у питона есть весьма удобные средства для анализа текста. Я использую для управления "домашним помощником" на ПК. Поэтому, мне проще было сделать анализ на принимающей стороне. Но, в случае с ардуино, вероятно, проще на планшете.
Вот, чтобы не быть голословным про удобства питона:
Код: Выделить всёРазвернуть
instring =u'а ну мигни светодиодом 5 раз'
cmd=""
#зададим словарь команд
comands={
   u"мигни":"LED",
   u"огни":"LED",
   u"икни":"LED"
}
#преобразуем исходную строку в список входящих в нее слов
string=instring.split(" ")

#проверим совпадение с командой для каждого слова, до первого совпадения
for x in string:
    if x in comands:
        cmd=comands[x]
        break
#поищем числовой параметр, до первого найденного
if cmd:
    for x in string:
        try:
            i=int(x) #проверка, является ли числом
            cmd+=str(i) #если удалось преобразовать в число, добавляем к команде
            break
        except Exception:
            continue
else: cmd='NONE'
print (cmd)

Т.е исходная фраза: "а ну мигни светодиодом 5 раз", после обработки превратиться в "LED5", что и передаем ардуине.
Аватара пользователя
Scorpio
 
Сообщения: 2683
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Re: Простой пульт голосового управления роботом на базе Andr

Сообщение Scorpio » 21 май 2014, 00:38

Scorpio писал(а):Однако, в Андроид 4.3 (а может это виноват Samsung Galaxy S3) никаких «опций» в настройках главного экрана нет!

Вопрос снят, оказывается есть там специальный виджет для запуска скриптов.
Аватара пользователя
Scorpio
 
Сообщения: 2683
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке


Вернуться в Новичкам или основы основ роботостроения.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3