Arduino распознавание речи. Распознавание цифр на микроконтроллере

В данном проекте я совместил детектор распознавания лиц (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 мы покажем, как использовать мобильное приложение для Android и модуль Bluetooth HC-05 для голосового управления светодиодом.

Для этого урока нам понадобится минимум комплектующих. После того как вы сделаете урок - вы сможете усложнить схему и дополнить её устройствами по своему вкусу.

  • Arduino UNO
  • HC-05 Bluetooth Модуль
  • Макетная плата
  • Провода
  • 330 Ом резистор
  • Светодиоды (LED)

Шаг 2: Подключение модуля Bluetooth HC-05

Стандартный модуль Bluetooth HC-05 имеет шесть контактов. Однако в этом проекте мы будем использовать только 4.

Мы будем использовать вывод VCC, вывод GND, вывод TXD и вывод RXD. Вывод VCC модуля bluetooth подключается к + 3,3 В от Arduino. Вывод GND модуля подключается к GND Arduino (земля). Штырь TX модуля bluetooth соединяется с цифровым выводом 0 (RXD), а контакт RXD подключается к цифровому выходу 1 (TXD).

Шаг 3: Подключение светодиодов

Следующим шагом в создании светодиодов, управляемых голосом, является подключение светодиодов к Arduino через макет.

Сначала подключите короткий конец светодиода к земле. Затем подключите длинный конец каждого из светодиодов к резистору 330 Ом. Наконец, подключите сопротивление тока от светодиодов к цифровым контактам на Arduino.

В этом проекте мы будем подключать один светодиод к цифровому выводу 2, другой - к цифровому выходу 3, а последний светодиод - к цифровому выходу 4.

Шаг 4: Питание

Для этого проекта мы можем подавать питание на Arduino через любой источник питания + 5 В. Вы можете использовать USB-порт со своего компьютера для питания Arduino, но в этом проекте мы будем использовать портативную батарею 5В. Прежде чем подключать источник питания к вашему Arduino, убедитесь, что GND Arduino подключен к земле макетной платы.

Шаг 5: Код

Код для нашего проекта ниже.

Шаг 6: Использование мобильного приложения

Вы можете начать тестировать свой проект, загрузив приложение для Android - BT Voice Control для Arduino (BT Voice Control for Arduino), созданное SimpleLabsIN.

После того как вы скачали и установили приложение на свой телефон на базе Android нажмите на строку меню в правом верхнем углу и выберите «Подключить робота». В появившемся новом окне выберите модуль Bluetooth HC-05 и подключите его.

Теперь, когда вы говорите с помощью определенных команд из кода на свое устройство через приложение, определенные светодиоды должны включаться и выключаться. Посмотрите внимательнее на код, где указаны команды и поставьте свои. Например, вместо "*switch on red" можно просто указать "red". Так команды будут быстрее, короче и понятнее.

Шаг 7: Итоговый результат

Итоговый результат можно посмотреть на видео ниже.

Желаем вам успешных проектов! Не забывайте оставлять комментарии на проект в нашей

Пришла как-то идея сделать голосовое управление 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-шилдом.

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

  • 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-шилдом.

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

    Понравилась статья? Поделиться с друзьями: