Управление голосовыми командами на базе модуля распознавания голоса FZ0475. Система распознавания и слежения за лицами на Arduino

Управление голосовыми командами на базе модуля распознавания голоса FZ0475. Система распознавания и слежения за лицами на Arduino

  • Processing ,
  • Разработка веб-сайтов
  • Идея:

    Пришла как-то идея сделать голосовое управление Arduino, но одного Arduino мало, т.к. для системы умного дома нужно еще и общение с компьютером и его системами.

    Поиск решения:

    BitVoicer
    Натыкался на разного рода статьи с применением BitVoicer в связке с Arduino, но вся проблема в том, что BitVoicer работает только на Windows, а это не позволяет использовать систему на простых устройствах типа Rasberry Pi под управлением Unix.
    Arduino Voice Recognition
    Так же Arduino можно управлять голосом благодаря модулю распознавания голоса , но пока у меня нет срадств на его приобретение и есть ряд неудобств при использовании этого модуля: ограниченное количество команд, нудное обучение, для новых команд требуется перепрошивка модуля, что уже является минусом, если система отлажена и установлена.

    Решение

    Начал искать кросплатформенное решение, которое позволяло бы работать системе на множестве операционных систем. Нашлось такое: Speech to Text Library for Java/Processing . Комплекс реализован на базе языка Processing (Java) и Google Speach API о котом уже ранее писали. Данное решение позволяет отслеживать голос в реальном времени enableAutoRecord() , указывать лимит громкости enableAutoThreshold() , подключать внешние микрофоны getLineIn() , указывать язык распознавания setLanguage(String) . Полный перечень возможностей и специфика есть на сайте разработчика: http://stt.getflourish.com . Для работы нам понадобиться Google Speech API Key. Как его получить описано тут: www.chromium.org/developers/how-tos/api-keys . Единственный негативный момент в том, что Google Speech позволяет обрабатывать лишь 50 запросов в сутки, но на практике проходят больше 500 запросов.

    Для того, чтобы в дальнейшем было проще ориентироваться по тексту, я прикладываю все исходники, в которых уже прописаны голосовые команды, подключение к плате Arduino, скетч для платы Arduino, голосовое подтверждение фраз и все остальное, что сейчас уже есть и работает: исходники . После скачивание папку GoogleTTS помещаем в библиотеки Processing"a. Скетч для Arduino лежит в папке GoogleTTS/ArduinoSerial. Все писалось на Processing 3.0a4, доступный в пре-релизе на официальном сайте .

    Реализация («Слушай мою команду!»):
    С распознаванием определились. Теперь нужно отлавливать нужные нам команды и по ним принимать решения. За это отвечает секция:
    void commands() { if (result.equals("arduino")) { // Ищем соответствие // Выполняющая команда при получении соответсвия } else if (result.equals("сколько время")) { // Выполняющая команда при получении соответсвия } }
    Голосовой ответ
    Теперь нам нужен инструмент, который будет нам отвечать человеческим голосом в случае найденного соответствия. В качестве инструмента реализации был выбран Google Translate, а вернее модуль, который конвертирует текст в голос. Текст оправляется запросом на сервер Google, преобразуется в звуковой файл и отправляется нам обратно в формате mp3. За это отвечает секция:
    void googleTTS(String txt, String language) { // преобразование текста в звук происходит командой googleTTS("текст", "язык") String u = "http://translate.google.com/translate_tts?tl="; u = u + language + "&q=" + txt; u = u.replace(" ", "%20"); try { URL url = new URL(u); try { URLConnection connection = url.openConnection(); connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 1.2.30703)"); connection.connect(); InputStream is = connection.getInputStream(); File f = new File(sketchPath + "/" + txt + ".mp3"); OutputStream out = new FileOutputStream(f); byte buf = new byte; int len; while ((len = is.read(buf)) > 0) { out.write(buf, 0, len); } out.close(); is.close(); println("File created: " + txt + ".mp3"); } catch (IOException e) { e.printStackTrace(); } } catch (MalformedURLException e) { e.printStackTrace(); } }

    За обработку непосредственно текстовых фраз отвечает секция:
    void voicer(String s) { // Выполняется командой voicer("текст") println(s); // применяется для мониторинга текста File f = new File(sketchPath + "/" + s + ".mp3"); // Проверка файла // Если файл уже есть - проигрывть файл if(f.exists()){ println("Файл уже есть! Проигрываю Файл!"); player = minim.loadFile(s + ".mp3"); player.play(); } // Если файла еще нет - создаем его else { println("Файла еще нет! Создаю!"); googleTTS(s, "ru"); player = minim.loadFile(s + ".mp3"); player.play(); } }

    Пример реализации распознавания и голосового подтверждения:
    void commands() { if (result.equals("компьютер")) { // Ищем соответствие voicer("Слушаю"); // Получаем голосовое подтверждение // Выполняющая команда при получении соответсвия } }
    He is alive!

    Processing + Arduino

    Ну вот вроде и заработало, но чего-то не хватает. Теперь «подружим» это все с Arduino.
    Инициализируем serial подключение в Processing для отправки данных на Arduino (для пользователей Mac и Unix):
    String portName = Serial.list(); myPort = new Serial(this, portName, 9600); myPort.bufferUntil("\n");

    Для Windows пользователей:
    String myPort = new Serial(this, "Ваш COM-порт", 9600); myPort.bufferUntil("\n");

    И отправим туда команду при найденном голосовом соответствии:
    void commands() { if (result.equals("включи свет")) { // Если голосовая фраза распозналась как "включи свет", то выполняем запрос myPort.write("High"); // Отправляет команду High в Serial подключение voicer("Включаю свет"); // Голосовое подтверждение о выполнении команды } else if (result.equals("выключи свет")) { myPort.write("Low"); // Отправляет команду Low в Serial подключение voicer("Выключаю свет"); // Подтверждение // Выполняющая команда при получении соответсвия } }

    Теперь займемся платой Arduino. Нам нужно слушать Serial порт и при нахождении команды из списка, выполнять требуемое действие согласно команде. Скетч очень прост:
    int led = 13; // Пин светодиода на плате void setup() { Serial.begin(9600); // Инициализируем серийное подключение pinMode(led, OUTPUT); // Пин светодиода передает данные } void loop() { int i=0; // переменная для загона строки в буффер char buffer; // массив буфера для загона в него строки if(Serial.available()){ // Ппроверяем серийный порт на наличие данных delay(100); //загоняем прочитанное в буфер while(Serial.available() && i< 99) { buffer = Serial.read(); } //закрываем массив buffer="\0"; String val = buffer; if (val == "High") { // Если получили значение High Serial.println("Led is On"); // Отправляем в Serial подтверждение получения digitalWrite(led, HIGH); // Включаем светодиод } if (val == "Low") { // Если получили значение Low Serial.println("Led is Off"); // Отправляем в Serial подтверждение получения digitalWrite(led, LOW); // Выключаем светодиод } } }
    Все. Проверяем.

    Проблемы и планы:

    Т.к. я не занимался программирование до этого времени, я не до конца понимаю некоторые вещи в процессе отладки. Буду признателен, если кто-нибудь подскажет как решить проблемы из перечня ниже:

    Самая основная проблема - голосовая фраза не проговаривается целиком. Пропадают последние буквы. Хотя звуковой файл приходит с сервера Google в нормальном виде. Как я понимаю ситуацию: проблема аудио-плеера, но где именно пока не ясно.
    - Уже писал, что у Google Speech API есть ограничение на 50 запросов в сутки, но по факту получается больше. В любом случае этого мало. Планирую прописать локальное распознавание главной команды и только после ее распознавания, остальной текст отправлять на обработку Google"у. Ищу решение.
    - Думаю не помешает отправка команд на Ethernet-шилд Arduino, т.к. некоторые системы могут находиться на приличном расстоянии от главного компьютера и Serial подключение тут уже не подойдет. Займусь этим решение на днях, т.к. нет у меня в наличии роутера для подключения к нему Arduino с Ethernet-шилдом.

    На этом собственно все! Прошу строго не судить за строки кода! Я только начал изучать этот плацдарм и буду крайне признателен, если вы меня ткнете носом в то, как делать не нужно и покажете как нужно. Так же буду рад, если к этому проекту подключатся другие заинтересованные лица - всегда открыт к общению!

  • DIY или Сделай сам
  • Привет, Гиктаймс!

    Как видно из названия речь в этой статье пойдет о распознавании цифр на микроконтроллере. Сразу хочу оговориться, что в данной статье не будет приведен исходный код, рассматриваться технология или алгоритм распознавания, скажу лишь, что используются идеи системного подхода. Некоторые из них изложены в наших статьях ( , и вот ). Это связано с тем, что наш подход тянет на оригинальность, но требует уточнения некоторых вопросов. Кто-то может сказать: «очередная статья про программирование микроконтроллеров». Отнюдь нет, поиск подобных проектов не дал каких-то внятных результатов, за исключением этого видео . Из обсуждений на форумах понятно одно: идея получения подобного устройства (камера + микроконтроллер = результат распознавания на выходе, а не просто снятая картинка) приходила многим, но оставалась без реализации. Да и распознавание, по общему мнению, требует много вычислительных ресурсов и микроконтроллеры для этого не подходят, в частности про Arduino были высказывания, что это вообще невозможно. Если стало интересно прошу под кат.

    Что бы не возникало очевидных вопросов, ответим на них:

    • Нет, это не сервис по распознаванию изображений
    • Нет, это не OpenCV
    • Нет, это не нейронные сети
    • Используется морфологический анализ объектов из которых состоит цифра
    • Да, распознавание производится именно микроконтроллером!

    Идея

    Если кратко, то все началось с того, что было желание попробовать свои силы и проверить свои идеи в распознавании изображений. В процессе обсуждения пришли к выводу, что можем обойтись небольшими вычислительными мощностями для решения данной задачи. По понятным причинам подробности этих обсуждений описывать не будем.

    Установка

    Итак, задача поставлена, нужна реализация. Не отступая от уже устоявшихся
    берем то, что есть под рукой. А было под рукой парочка Arduino Uno, старая оптическая мышь и CD привод. Кстати, на то что бы использовать сенсор оптической мыши в качестве камеры для получения изображения нас натолкнула прочитанная когда то давно, ну и собственно весь остальной около «мышиный» материал. Единственное нам пришлось выпаять сенсор и всю его обвязку для удобства использования, а также приклеить к нему линзу, которую мы бережно «выдрали» из CD привода. Это было нужно для того, что бы увеличить расстояние от объекта съемки до камеры иначе цифры нашего размера не помещались и была видна лишь небольшая часть. Кстати говоря перед линзой из CD привода, мы пробовали прикрепить оптику от веб камеры, но как-то не срослось.

    Ещё


    Затем встал вопрос как эту камеру позиционировать над объектом съемки. Тут нам очень помог старый сломанный микроскоп, который лежал без дела. С уважением сняли с него механизм управления предметным столиком. Этот механизм нам позволил перемещать камеру лишь по двум осям, тут же пришла мысль использовать направляющую лазерной головки от CD привода. Все это закрепили на корпусе от многострадального CD привода. В итоге мы получили классный механизм позиционирования камеры.

    Ещё


    Итого: так называемая камера у нас есть, механизм позиционирования есть, осталось положить бумажечку с циферкой и получить изображение с камеры. Тут то и начались «проблемы». Так как характеристики «мышинного» оптического сенсора весьма скудны для использования его в качестве камеры, стали импровизировать с подсветкой.

    Ещё


    Стало понятно, что просто подсветить не получиться важна интенсивность, направление внешний свет тоже вносит коррективы. Пришлось включать в работу еще одну «ардуинку», что бы управлять интенсивностью подсветки ( естественно можно было и по другому управлять, но в последствии и не только подсветкой, а еще переключением цифр на индикаторе ). В итоге оказалось, что съемка на просвет гораздо лучше. А если например использовать в качестве цели светящийся семи сегментный индикатор то сенсор его видит вообще отлично. Так, что теперь у нас в качестве объектов съемки индикатор и полоса с белыми цифрами залитая черным фоном.

    слева изображение в градациях серого полученное с индикатора (такое изображение мы получаем с сенсора), справа бинаризованное.

    Ещё


    Общий вид установки в сборе


    ранний вариант установки


    Блок распознавания


    Немаловажную роль в нашей установке играет, так называемый блок распознавания (на картинке выше). Как видно, он состоит из Arduino Uno и всем известного wifi передатчика ESP8266 . Поясняю, wifi передатчик нам нужен для того, что бы результат распознавания увидеть на планшете. Приложение на планшете отправляет запрос, «ардуинка», получая запрос, «снимает» изображение с сенсора мыши, затем бинаризует его. После бинаризации происходит распознавание, а после его завершения формируется ответ. В ответе мы посылаем результат распознавания и 41 байт для построения бинаризованного изображения на экране планшета, так сказать, для наглядности.

    Если оглянуться, то на «на ардуинку» возложен неплохой функционал: и работа с камерой, и распознавание, и работа с esp8266. Что не могло не отразится на работе - пришлось бороться с нехваткой памяти. Вот уж не думал, что когда либо придется отвоевывать каждый байт памяти.

    Демонстрация процесса распознавания

    Вместо заключения

    На этом собственно и все. Впереди еще очень много работы. И первая задача: распознавание чисел (строки цифр) снимаемых «человеческой» камерой (а не «мышиным сенсором») и переносом разработанной технологии на ESP8266 и снижением накала борьбы за каждый байт памяти.

    С радостью ответим на вопросы.

    В данном проекте я совместил детектор распознавания лиц (face detection) и следящую (tracking system) систему.

    Вкратце суть проекта: вебкамера, установленная на поворотном механизме подключена к компьютеру под управлением операционной системы Windows и с установленным программным обеспечением OpenCV . Если программа обнаруживает в поле зрения вебкамеры лицо, то вычисляется центр лица. Координаты X и Y передаются в контроллер Arduino, который подключен к компьютеру по USB. В свою очередь, контроллер Arduino по принятым командам управляет двумя сервомоторами: по координате X и по координате Y, т.о. обеспечивается следящая система.

    Библиотеку OpenCV (Open Source Computer Vision Library) можно скачать . Библиотека мультиплатформенная, в настоящее время существует под следующие ОС: Windows, Linux, Android, Mac OS и даже iOS. Библиотека обеспечивает обработку изображений в режиме реального времени. Написана на С/С++.

    Т.о. данный проект представляет собой смесь soft и hard решений. Обработка изображения ведется на компьютере, а управление серво осуществляется при помощи контроллера.

    Итак, что я использовал для проекта:

    Программное обеспечение:

    Железо:

    компьютер с ОС Windows 7 SP1

    Arduino Uno или совместимый + БП

    2 сервопривода

    USB вебкамера

    Итак, поехали.

    Шаг 1. Установка программного обеспечения

    1) Если у вас ОС Windows, то скачайте файл OpenCV-2.3.1-win-superpack.exe (или более позднюю версию) и установите библиотеку.

    2) Скачайте и установите Microsoft Visual C++ 2010 Express. Если у вас 64-битная версия Windows, то также необходимо будет скачать Windows SDK (но для 64 версии могут быть проблемы, я так и не смог заставить работать OpenCV под Windows 7 x64).

    Процесс настройку OpenCV для Visual C++ читайте на официальном сайте.

    Шаг 2. Крепление камеры и сервомоторов

    Я не стал делать конструкцию "долговечной", потому как после достижения конечной цели я все разбираю для следующего проекта.

    Вебкамеру я прикрепил к сервомотору оси Х, а его, в свою очередь закрепил на сервомоторе оси Y. И всю эту конструкцию закрепил в струбцине от "третьих рук".

    Шаг 3. Подключение

    Подключение сервомоторов:

    Желтый вывод от серво оси Х подключается к выводу 9 контроллера Arduino

    Желтый вывод от серво оси Y подключается к выводу 10 контроллера Arduino

    Красный вывод Vcc от серво подключается к выводу 5V

    Черный вывод GND от серво подключается к выводу GND контроллера Arduino

    Подключение вебкамеры:

    Вебкамера подключается к компьютеру по USB интерфейсу. Программа C++ идентифицирует вебкамеру по номеру USB-порта. Возможно, потребуется указать порт в программе.

    Подключение контроллера Arduino UNO:

    Контроллер также подключается к компьютеру через USB-интерфейс. В системе появляется виртуальный COM-порт, который необходимо внести в код программы на C++.

    Скачать файлы проекта

    Оригинал статьи на английском языке (перевод Колтыков А.В. для сайта cxem.net)

    В данном проекте я совместил детектор распознавания лиц (face detection) и следящую (tracking system) систему.

    Вкратце суть проекта: вебкамера, установленная на поворотном механизме подключена к компьютеру под управлением операционной системы Windows и с установленным программным обеспечением OpenCV . Если программа обнаруживает в поле зрения вебкамеры лицо, то вычисляется центр лица. Координаты X и Y передаются в контроллер Arduino, который подключен к компьютеру по USB. В свою очередь, контроллер Arduino по принятым командам управляет двумя сервомоторами: по координате X и по координате Y, т.о. обеспечивается следящая система.

    Библиотеку OpenCV (Open Source Computer Vision Library) можно скачать . Библиотека мультиплатформенная, в настоящее время существует под следующие ОС: Windows, Linux, Android, Mac OS и даже iOS. Библиотека обеспечивает обработку изображений в режиме реального времени. Написана на С/С++.

    Т.о. данный проект представляет собой смесь soft и hard решений. Обработка изображения ведется на компьютере, а управление серво осуществляется при помощи контроллера.

    Итак, что я использовал для проекта:

    Программное обеспечение:
    Arduino IDE 1.0 for Windows

    Microsoft Visual C++ 2010 Express SP1
    Serial C++ Library for Win32 (от Thierry Schneider)

    Железо:
    компьютер с ОС Windows 7 SP1
    Arduino Uno или совместимый + БП
    2 сервопривода
    USB вебкамера

    Итак, поехали.

    Шаг 1. Установка программного обеспечения

    1) Если у вас ОС Windows, то скачайте файл OpenCV-2.3.1-win-superpack.exe (или более позднюю версию) и установите библиотеку.

    2) Скачайте и установите Microsoft Visual C++ 2010 Express. Если у вас 64-битная версия Windows, то также необходимо будет скачать Windows SDK (но для 64 версии могут быть проблемы, я так и не смог заставить работать OpenCV под Windows 7 x64).

    Процесс настройку OpenCV для Visual C++ читайте на официальном сайте.

    Шаг 2. Крепление камеры и сервомоторов

    Я не стал делать конструкцию "долговечной", потому как после достижения конечной цели я все разбираю для следующего проекта.
    Вебкамеру я прикрепил к сервомотору оси Х, а его, в свою очередь закрепил на сервомоторе оси Y. И всю эту конструкцию закрепил в струбцине от "третьих рук".

    Шаг 3. Подключение

    Подключение сервомоторов:
    Желтый вывод от серво оси Х подключается к выводу 9 контроллера Arduino
    Желтый вывод от серво оси Y подключается к выводу 10 контроллера Arduino
    Красный вывод Vcc от серво подключается к выводу 5V
    Черный вывод GND от серво подключается к выводу GND контроллера Arduino

    Подключение вебкамеры:
    Вебкамера подключается к компьютеру по USB интерфейсу. Программа C++ идентифицирует вебкамеру по номеру USB-порта. Возможно, потребуется указать порт в программе.

    Подключение контроллера Arduino UNO:
    Контроллер также подключается к компьютеру через USB-интерфейс. В системе появляется виртуальный COM-порт, который необходимо внести в код программы на C++.

    Пришла как-то идея сделать голосовое управление Arduino, но одного Arduino мало, т.к. для системы умного дома нужно еще и общение с компьютером и его системами.

    Поиск решения:

    BitVoicer
    Натыкался на разного рода статьи с применением BitVoicer в связке с Arduino, но вся проблема в том, что BitVoicer работает только на Windows, а это не позволяет использовать систему на простых устройствах типа Rasberry Pi под управлением Unix.
    Arduino Voice Recognition
    Так же Arduino можно управлять голосом благодаря модулю распознавания голоса , но пока у меня нет срадств на его приобретение и есть ряд неудобств при использовании этого модуля: ограниченное количество команд, нудное обучение, для новых команд требуется перепрошивка модуля, что уже является минусом, если система отлажена и установлена.

    Решение

    Начал искать кросплатформенное решение, которое позволяло бы работать системе на множестве операционных систем. Нашлось такое: Speech to Text Library for Java/Processing . Комплекс реализован на базе языка Processing (Java) и Google Speach API о котом уже ранее писали. Данное решение позволяет отслеживать голос в реальном времени enableAutoRecord() , указывать лимит громкости enableAutoThreshold() , подключать внешние микрофоны getLineIn() , указывать язык распознавания setLanguage(String) . Полный перечень возможностей и специфика есть на сайте разработчика: http://stt.getflourish.com . Для работы нам понадобиться Google Speech API Key. Как его получить описано тут: www.chromium.org/developers/how-tos/api-keys . Единственный негативный момент в том, что Google Speech позволяет обрабатывать лишь 50 запросов в сутки, но на практике проходят больше 500 запросов.

    Для того, чтобы в дальнейшем было проще ориентироваться по тексту, я прикладываю все исходники, в которых уже прописаны голосовые команды, подключение к плате Arduino, скетч для платы Arduino, голосовое подтверждение фраз и все остальное, что сейчас уже есть и работает: исходники . После скачивание папку GoogleTTS помещаем в библиотеки Processing"a. Скетч для Arduino лежит в папке GoogleTTS/ArduinoSerial. Все писалось на Processing 3.0a4, доступный в пре-релизе на официальном сайте .

    Реализация («Слушай мою команду!»):
    С распознаванием определились. Теперь нужно отлавливать нужные нам команды и по ним принимать решения. За это отвечает секция:
    void commands() { if (result.equals("arduino")) { // Ищем соответствие // Выполняющая команда при получении соответсвия } else if (result.equals("сколько время")) { // Выполняющая команда при получении соответсвия } }
    Голосовой ответ
    Теперь нам нужен инструмент, который будет нам отвечать человеческим голосом в случае найденного соответствия. В качестве инструмента реализации был выбран Google Translate, а вернее модуль, который конвертирует текст в голос. Текст оправляется запросом на сервер Google, преобразуется в звуковой файл и отправляется нам обратно в формате mp3. За это отвечает секция:
    void googleTTS(String txt, String language) { // преобразование текста в звук происходит командой googleTTS("текст", "язык") String u = "http://translate.google.com/translate_tts?tl="; u = u + language + "&q=" + txt; u = u.replace(" ", "%20"); try { URL url = new URL(u); try { URLConnection connection = url.openConnection(); connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 1.2.30703)"); connection.connect(); InputStream is = connection.getInputStream(); File f = new File(sketchPath + "/" + txt + ".mp3"); OutputStream out = new FileOutputStream(f); byte buf = new byte; int len; while ((len = is.read(buf)) > 0) { out.write(buf, 0, len); } out.close(); is.close(); println("File created: " + txt + ".mp3"); } catch (IOException e) { e.printStackTrace(); } } catch (MalformedURLException e) { e.printStackTrace(); } }

    За обработку непосредственно текстовых фраз отвечает секция:
    void voicer(String s) { // Выполняется командой voicer("текст") println(s); // применяется для мониторинга текста File f = new File(sketchPath + "/" + s + ".mp3"); // Проверка файла // Если файл уже есть - проигрывть файл if(f.exists()){ println("Файл уже есть! Проигрываю Файл!"); player = minim.loadFile(s + ".mp3"); player.play(); } // Если файла еще нет - создаем его else { println("Файла еще нет! Создаю!"); googleTTS(s, "ru"); player = minim.loadFile(s + ".mp3"); player.play(); } }

    Пример реализации распознавания и голосового подтверждения:
    void commands() { if (result.equals("компьютер")) { // Ищем соответствие voicer("Слушаю"); // Получаем голосовое подтверждение // Выполняющая команда при получении соответсвия } }
    He is alive!

    Processing + Arduino

    Ну вот вроде и заработало, но чего-то не хватает. Теперь «подружим» это все с Arduino.
    Инициализируем serial подключение в Processing для отправки данных на Arduino (для пользователей Mac и Unix):
    String portName = Serial.list(); myPort = new Serial(this, portName, 9600); myPort.bufferUntil("\n");

    Для Windows пользователей:
    String myPort = new Serial(this, "Ваш COM-порт", 9600); myPort.bufferUntil("\n");

    И отправим туда команду при найденном голосовом соответствии:
    void commands() { if (result.equals("включи свет")) { // Если голосовая фраза распозналась как "включи свет", то выполняем запрос myPort.write("High"); // Отправляет команду High в Serial подключение voicer("Включаю свет"); // Голосовое подтверждение о выполнении команды } else if (result.equals("выключи свет")) { myPort.write("Low"); // Отправляет команду Low в Serial подключение voicer("Выключаю свет"); // Подтверждение // Выполняющая команда при получении соответсвия } }

    Теперь займемся платой Arduino. Нам нужно слушать Serial порт и при нахождении команды из списка, выполнять требуемое действие согласно команде. Скетч очень прост:
    int led = 13; // Пин светодиода на плате void setup() { Serial.begin(9600); // Инициализируем серийное подключение pinMode(led, OUTPUT); // Пин светодиода передает данные } void loop() { int i=0; // переменная для загона строки в буффер char buffer; // массив буфера для загона в него строки if(Serial.available()){ // Ппроверяем серийный порт на наличие данных delay(100); //загоняем прочитанное в буфер while(Serial.available() && i< 99) { buffer = Serial.read(); } //закрываем массив buffer="\0"; String val = buffer; if (val == "High") { // Если получили значение High Serial.println("Led is On"); // Отправляем в Serial подтверждение получения digitalWrite(led, HIGH); // Включаем светодиод } if (val == "Low") { // Если получили значение Low Serial.println("Led is Off"); // Отправляем в Serial подтверждение получения digitalWrite(led, LOW); // Выключаем светодиод } } }
    Все. Проверяем.

    Проблемы и планы:

    Т.к. я не занимался программирование до этого времени, я не до конца понимаю некоторые вещи в процессе отладки. Буду признателен, если кто-нибудь подскажет как решить проблемы из перечня ниже:

    Самая основная проблема - голосовая фраза не проговаривается целиком. Пропадают последние буквы. Хотя звуковой файл приходит с сервера Google в нормальном виде. Как я понимаю ситуацию: проблема аудио-плеера, но где именно пока не ясно.
    - Уже писал, что у Google Speech API есть ограничение на 50 запросов в сутки, но по факту получается больше. В любом случае этого мало. Планирую прописать локальное распознавание главной команды и только после ее распознавания, остальной текст отправлять на обработку Google"у. Ищу решение.
    - Думаю не помешает отправка команд на Ethernet-шилд Arduino, т.к. некоторые системы могут находиться на приличном расстоянии от главного компьютера и Serial подключение тут уже не подойдет. Займусь этим решение на днях, т.к. нет у меня в наличии роутера для подключения к нему Arduino с Ethernet-шилдом.

    На этом собственно все! Прошу строго не судить за строки кода! Я только начал изучать этот плацдарм и буду крайне признателен, если вы меня ткнете носом в то, как делать не нужно и покажете как нужно. Так же буду рад, если к этому проекту подключатся другие заинтересованные лица - всегда открыт к общению!



    © 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows