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