roboforum.ru

Технический форум по робототехнике.
Текущее время: 20 фев 2025, 22:12

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Простой пульт голосового управления роботом на базе Android
СообщениеДобавлено: 17 май 2014, 02:37 
Не в сети
Аватара пользователя

Зарегистрирован: 30 сен 2008, 18:49
Сообщения: 2683
Откуда: Где-то в Латинской Америке
Не знаю, как вам, а мне всегда хотелось, чтобы робот реагировал на голосовые команды.
Для этого существует немало программных и аппаратных средств. Все они имеют свои недостатки. И не очень просты в применении. На форуме уже много раз это обсуждалось, так что не буду повторяться. Скажу только, что очень важное значение имеет качество самого звукозаписывающего устройства, т.е. микрофонов, усилителей, шумоподавителей. Смартфон, в этом отношении, идеально подходит, т.к. все эти аппаратные средства в него уже встроены.
Нашей задачей будет научиться использовать андроид – смартфон, для управления роботом, например, на базе ардуино с блютузом, посредством голоса. Причем сделать это максимально быстро и просто.
Сформулируем требования к программе на смартфоне:
- При запуске, программа включает 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)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Простой пульт голосового управления роботом на базе Andr
СообщениеДобавлено: 17 май 2014, 04:16 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Простой пульт голосового управления роботом на базе Andr
СообщениеДобавлено: 17 май 2014, 17:40 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Простой пульт голосового управления роботом на базе Andr
СообщениеДобавлено: 18 май 2014, 15:06 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Простой пульт голосового управления роботом на базе Andr
СообщениеДобавлено: 19 май 2014, 00:56 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Простой пульт голосового управления роботом на базе Andr
СообщениеДобавлено: 19 май 2014, 01:47 
Не в сети
Аватара пользователя

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

не усложняйте


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Простой пульт голосового управления роботом на базе Andr
СообщениеДобавлено: 19 май 2014, 18:01 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Простой пульт голосового управления роботом на базе Andr
СообщениеДобавлено: 19 май 2014, 18:30 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Простой пульт голосового управления роботом на базе Andr
СообщениеДобавлено: 19 май 2014, 19:40 
Не в сети
Аватара пользователя

Зарегистрирован: 30 сен 2008, 18:49
Сообщения: 2683
Откуда: Где-то в Латинской Америке
Так я вроде на планшете и предлагаю, как вариант. Тем более, что у питона есть весьма удобные средства для анализа текста. Я использую для управления "домашним помощником" на ПК. Поэтому, мне проще было сделать анализ на принимающей стороне. Но, в случае с ардуино, вероятно, проще на планшете.
Вот, чтобы не быть голословным про удобства питона:
Код:
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", что и передаем ардуине.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Простой пульт голосового управления роботом на базе Andr
СообщениеДобавлено: 21 май 2014, 00:38 
Не в сети
Аватара пользователя

Зарегистрирован: 30 сен 2008, 18:49
Сообщения: 2683
Откуда: Где-то в Латинской Америке
Scorpio писал(а):
Однако, в Андроид 4.3 (а может это виноват Samsung Galaxy S3) никаких «опций» в настройках главного экрана нет!

Вопрос снят, оказывается есть там специальный виджет для запуска скриптов.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 4 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO