Розпізнавання голосу Ардуїно. Голосове управління Arduino засобами Processing та Google Speech API

А пам'ятаєте, як кілька років тому (а можливо і зараз) була популярна ідея управління світлом у кімнаті за допомогою бавовни в долоні? А, адже, це дуже зручно, лежиш у ліжку, ліньки встати і бавовною в долоні вимикається світло або заходимо додому, темно, намацати вимикач довго, а тут з самого порога бавовна чи дві і світло вже горить. Мені здається, що ця концепція є актуальною досі, але до неї можна застосувати вже більше високі технологіїв порівнянні з тими, що були 5 років, 10 років тому. Тепер за порівняно невелику суму можна купити кілька деталей та запрограмувати конструкцію на подібні функції, Про що піде мова нижче.

Сьогодні розглянемо модуль, призначений для розпізнавання голосових команд (у тому числі просто голоси в рамках записаної голосової команди) – Voice recognition module V3.1 (V3)або часто зустрічається кодування назва FZ0475.

У комплект поставки входить сам модуль ( друкована платадуже хорошої якості), мікрофон на гнучкій ніжці з роз'ємом 3,5 мм jack та кутові PLS контакти з кроком 2,56 мм для плати модуля (їх можна не використовувати, якщо підключатися до контактів модуля іншим способом).

На сьогоднішній день існує декілька видів модулів з аналогічним функціоналом різних виробниківта розробників або виконань. Цей модуль розпізнавання голосу, на мій погляд, має певний баланс між вартістю, функціоналом, зручністю. Більш потужним і значно дорожчим буде модуль EasyVR. Дешевшими та незручними будуть модулі на базі LD3320 (незручні як мінімум тому, що нормальне описи на них знайти не просто, а в іншому це вже суб'єктивно).

Характеристики модуля Voice recognition module V3.1 (V3):

  • Напруга живлення – 5 вольт
  • Споживаний струм – до 40 мА
  • Інтерфейси – UART, GPIO
  • Точність розпізнавання - 99% (в ідеальних умовах)
  • Дальність дії – залежить від мікрофона, для штатного мікрофона з комплекту дальність становить 0,5 – 1 метр максимальної відстані при досить гучному голосі, якщо ж голос тихий, то доведеться підносити мікрофон ближче до рота.

Модуль є невеликою акуратною платою, на якій розташовані головний мікроконтролер (чорна пляма), роз'єм jack 3,5 мм для підключення мікрофона, мікросхема flash пам'яті, контакти GPIO, UART і живлення, пара світлодіодів та інший необхідний обвіс, необхідний роботи схеми – резистори, конденсатори, кварц. Компактний розмірплати дозволить без особливих труднощів вбудовувати модуль в власні розробки. Для збільшення дальності роботи голосових команд, можливо, необхідно використовувати мікрофон з підсилювачем. При досягненні прийнятної дальності модуль придатний для використання в системах розумного будинку. Без доробок щодо поліпшення дальності роботи модуль можна використовувати в настільних системахуправління, а також у системах охорони (контролю та обмеження доступу). З штатним мікрофоном через невелику дальність найнадійніше використовувати модуль розпізнавання голосу як гарнітуру та бездротовим способомпередавати команди контролеру, який чимось керує, використовуючи акумулятор і бездротові модулі (наприклад, HC-05 або HC-12 або будь-які інші). Модуль здатний працювати без зовнішнього мікроконтролера, тому що виробником закладено функціональну самостійність, необхідно лише одноразово записати голосові командиі встановити налаштування для самостійної роботиза допомогою зовнішнього пристрою(ПК чи МК).

Отже, щоб розпочати роботу з модулем розпізнавання голосу, нам необхідно підключити його або до комп'ютера (потрібний USB-UART перехідник), або до мікроконтролера (необхідно розробляти програмний коддля керування модулем).

Принципової різниці в керуванні та налаштуванні модуля між підключенням до комп'ютера або мікроконтролера немає, тому для наочності скористаємося ПК для налаштування. В інструкції описуються команди для модуля у шістнадцятковій формі, тому для зручності знадобиться і термінал, що передає байти у шістнадцятковій формі, наприклад, AccessPort (можна завантажити наприкінці статті). Крім того, виробник наголошує на користувачів платформи Arduino і надає бібліотеку для використання цього модуля та інструкцію з використання цієї бібліотеки. Однак багатьом з нас набагато цікавіше працювати з самим модулем безпосередньо, ніж через обгортку Arduino.

Перед початком роботи розберемося із платою. З торців плати праворуч гніздо для підключення мікрофона, з іншого чотири контакти UART інтерфейсу. Знизу розташовано вісім контактів, що використовуються для виведення сигналів, що викликаються розпізнаванням голосових команд. Зверху чотири контакти, налаштовані як вхід сигналу, використовуються для перемикання між групами (по сім голосових команд у кожній) команд, якщо така функція використовується. Інші шість контактів зверху, ймовірно, використовуються для підключення до пам'яті модуля.

Для функціонування та конфігурації модуля використовується система команд. Загальний виглядкадру виглядає так:

Перші чотири команди 00, 01, 02, 03 використовуються для перевірки стану модуля та його налаштувань. Наступні шість команд 10, 11, 12, 13, 14, 15 використовуються для зміни налаштувань модуля, серед яких керування портами виведення та налаштування автостарту (auto load). Далі три команди 20, 21, 22 використовуються для запису голосових команд. Наступні три команди 30,31,32 використовуються для керування розпізнаванням голосових команд. Команди 0A, 0D, FF використовуються лише при поверненні даних самим модулем. Команд насправді небагато і все це не так страшно, як на перший погляд здається в документації на модуль. Розглянемо команди, необхідних роботи з модулем розпізнавання голосу. Не всі з існуючих команднесуть практичний характер.

Примітно те, що модуль може працювати без зовнішнього мікроконтролера, що управляє, а також самостійно управляти чимось своїми портами виведення. Для цього необхідно налаштувати їх (команди 12, 13, 14).

Команда 12 - Налаштувати порти виводу. Ця команда налаштовує режим роботи портів виведення модуля розпізнавання голосу.

Формат: | AA | 03 | 12 | MODE | 0A |

Де MODE може приймати чотири значення: 0 – імпульсний режим (при спрацьовуванні голосової команди відповідний команді висновок змінить свій стан на час, що встановлюється командою 13); інвертується), 2 - режим включення (при спрацьовуванні голосової команди висновок перейде в стан логічної одиниці і більше не перейде в стан логічного нуля, скидання здійснюється командою 14), 3 - режим вимкнення (аналогічно режиму включення тільки, навпаки, при спрацьовуванні голосової команди висновок перетворюється на стан логічного нуля).

Найбільш практичним є режим перемикача, що не потребує зайвих команд. Імпульсний режимбув би хороший, але логіка цього режиму така, що при спрацьовуванні голосової команди він одноразово видає логічну одиницю, на якийсь час від 10 мс до 1 с. Це мало. Хоча, дивлячись якісь вимоги до цього режиму, може бути корисно. Режими включення та вимкнення реалізовані незручно, тому що вимагають виконання додаткових команд.

Команда 13 - Завдання тривалості імпульсу відповідного режиму.

Формат: | AA | 03 | 13 | LEVEL | 0A |

Де LEVEL набуває значення від 00 до 0F (відповідає тривалості від 10 мс до 1 с).

LEVEL тривалість
0x00 10 мс
0x01 15 мс
0x02 20 мс
0x03 25 мс
0x04 30 мс
0x05 35 мс
0x06 40 мс
0x07 45 мс
0x08 50 мс
0x09 75 мс
0x0A 100 мс
0x0B 200 мс
0x0C 300 мс
0x0D 400 мс
0x0E 500 мс
0x0F 1 с

Команда 14 – скидання портів виведення до стану заданого режимами увімкнення або вимкнення.

Формат: | AA | 03 | 14 | FF | 0A | - скидання всіх портів виведення

| AA | 03+n | 14 | IO0 | ... | IOn | 0A | - скидання вибраних портів виведення

Де n – кількість висновків, які скидаються вибірково, IO0…IOn – перерахування цих висновків у кадрі надсилання даних.

Далі щоб голосові команди виконувались, їх необхідно записати в модуль (навчити модуль). Тут є обмеження. Одночасно розпізнаватись можуть лише сім команд, хоча записати їх можна значно більше. Для того, щоб розширити діапазон голосових команд, які будуть розпізнаватись, використовується система угруповання (команда 32), яка керується портами введення модуля. Встановлюючи конфігурацію сигналів цих контактах, здійснюється вибір групи команд, яка розпізнаватиметься. Це обумовлено обмеженістю продуктивності голосового контролера модуля, що використовується.

Команда 20 - запис однієї чи кількох голосових команд.

Формат: | AA | 03+n | 20 | R0 | ... | Rn | 0A |

Де n - це кількість голосових команд, що записуються (якщо записується одна команда n=0, дві команди n=1 і так далі відповідно до загального формату передачі команд Lenght - довжина), R0...Rn номера голосових команд (AA 03 20 03 0A – команда для запису третьої голосової команди).

Команда 21 - запис однієї голосової команди та встановлення для неї підпису.

Формат: | AA | 03+SIGLEN | 21 | RECORD | SIG | 0A |

Де RECORD – номер голосової команди, SIG – підпис (може складатися з декількох байт, таким чином, що кожен байт може відповідати кодуванню символу алфавіту за потреби), SIGLEN – кількість байт, з яких складається підпис.

Команда 22 - Додавання або видалення підпису для обраної голосової команди.

Формат: | AA | 03+SIGLEN | 22 | RECORD | SIG | 0A | - додавання підпису

| AA | 03 | 22 | RECORD | 0A | - видалення підпису

Під час запису голосових команд необхідно керуватися сигналами світлодіодів. Після введення команди, що запускає процес запису, починає швидко моргати жовтий (помаранчевий) світлодіод. Як тільки спалахне червоний світлодіод необхідно вимовити голосову команду в мікрофон. При успішності займеться жовтий (помаранчевий) світлодіод і далі знову червоний - необхідно підтвердити голосову команду, вимовити її ще раз. У разі успіху загоряться обидва світлодіоди – голосова команда збережена.

Після того, як у модулі записані голосові команди нічого відбуватися не буде доти, доки ці команди не помістити в "розпізнавач" (Recognizer) модуля. Для цього необхідно скористатися командою 30. Після виконання цієї команди модуль почне очікувати на збіг голосової команди зі збереженими зразками. Одночасно розпізнавати можна лише сім команд. При цьому повільно моргатиме жовтий (помаранчевий) світлодіод на платі модуля.

Команда 30 - Завантажити записи в "розпізнавач" (Recognizer) модуля.

Формат: | AA | 2+n | 30 | R0 | ... | Rn | 0A |

Формат відповіді наступний: | AA | 07 | 0D | 00 | GRPM | R | RI | SIGLEN | SIG | 0A |

Де GRPM - інформація про групу, до якої належить команда (якщо використовується), R - розпізнана голосова команда (за цими даними можна розрізняти команда між собою якщо не використовуються підписи), RI - індекс команди в розпізнавачі, SIGLEN - довжина підпису в байтах, SIG – підпис (якщо використовується).

Ну і нарешті, якщо модуль повинен працювати самостійно, необхідно скористатися командою 15 для автоматичного запускуза налаштуваннями розпізнавача. У цьому випадку модуль розпізнавання голосу працюватиме самостійно без ініціалізації після включення.

Команда 15 - Встановлення автозапуску розпізнавача при включенні.

Формат: | AA | 03 | 15 | 00 | 0A | - відключення функції автозапуску

| AA | 03+n | 15 | BITMAP | R0 | ... | Rn | 0A | - встановлення функції автозапуску

Для контролю вірності виконання команд кожної їх відповідає свою відповідь. У разі такої потреби всі дані можна знайти в документації на модуль розпізнавання голосу, що додається в кінці статті. Не варто забувати, що все числові значенняпредставлені в шістнадцятковійформі.

Таким чином, за допомогою системи команд можна досить гнучко налаштовувати модуль розпізнавання голосу для використання з різною метою. Якщо ж простого управлінняпорти виведення модуля недостатньо, то модуль розпізнавання голосу можна підключати до інших пристроїв за допомогою UART або GPIO. Для бездротового підключенняможна використовувати раніше розглянуті модулі.

За допомогою бездротових модулів можна підключати модуль розпізнавання голосу до будь-яких пристроїв, де це необхідно. Наприклад, підключимо його до мікроконтролера, який щодо одержуваних даних про розпізнавання голосових команд керуватиме світлодіодами. Бездротові модулідозволяють передавати дані у двох напрямках, тому за потреби для мікроконтролера можна написати код ініціалізації голосового модуля та запису голосових команд. У нашому випадку під керуванням ПК у модулі вже записано кілька голосових команд і налаштовано автозапуск розпізнавання при включенні живлення, тому для мікроконтролера пропишемо лише прийом даних та керування світлодіодами щодо цих даних. Мікроконтролер STM32F103C8T6 використовує USART1 для прийому даних та контакти PB10...PB15, налаштовані на вихід, якими керує світлодіодами. Вихідний код розташований у додатку наприкінці статті.

Трохи про результати

Розпізнавання голосу не зовсім точне. Це залежить від вибраних команд та голосу користувача. При тестуванні мною було виявлено декілька негативних моментів. Під час навчання командам модуля було обрано голосові команди «раз» і «два». Команда «два» проходила завжди чітко, а ось команда «раз» досить часто визначалася як «два» і відповідно виконувався код другої команди. Далі при спробі віддавати голосові команди англійською (а вони не записувалися в голосовий модуль) практично завжди команда one визначалася як два. Можливо, вся справа у вимові, інтонації та інших аспектах людського голосу, закладених в алгоритм кодування голосового модуля команд, що вимовляються. Однак ці секрети виробники в відкритому доступіне дають. Крім цього, на якість розпізнавання впливають зовнішні шумові умови – гул з вулиці, шум вентилятора, випадкові звуки та інше. Виробник звертає увагу на те, що високий рівеньточність розпізнавання має місце в ідеальних умовах. Ідея використання мікрофона з підсилювачем, звичайно, збільшить дальність роботи пристрою, але так само збільшить ймовірність та помилки, оскільки посилення голосу відбуватиметься і з посиленням шумів.

В підсумкуЯкщо у вас невисокі вимоги до розпізнавання голосу та виконання голосових команд, то цей модуль чесно відпрацює, витрачені на нього гроші.

Список радіоелементів

Позначення Тип Номінал Кількість ПриміткаМагазинМій блокнот
IC1 МК STM32

STM32F103C8

1 До блокноту
VR1 Лінійний регулятор

AMS1117-3.3

1 До блокноту
MOD1, MOD3 Модуль бездротового зв'язкуHC-122 До блокноту
MOD2 Модуль розпізнавання голосуVR3.11 До блокноту
Z1 Кварц8 МГц1

У цьому проекті я поєднав детектор розпізнавання осіб (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 для 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++.

  • 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"); 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.432) NET CLR 1.2.30703)"); connection.connect(); InputStream is = connection.getInputStream(); File f = new f); byte buf = new byte; int len; while ((len = is.read(buf)) > 0) ( out.write(buf, 0, len); ) ); println("File created: " + txt + ".mp3"); ) .

    За обробку безпосередньо текстових фраз відповідає секція:
    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 = новий 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; () && 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-шилдом.

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

    Як видно з назви, мова в цій статті піде про розпізнавання цифр на мікроконтролері. Відразу хочу обмовитися, що в цій статті не буде наведено вихідний код, розглядатися технологія або алгоритм розпізнавання, скажу лише, що використовуються ідеї системного підходу. Деякі їх викладені у наших статтях ( , і ось ). Це з тим, що наш підхід тягне на оригінальність, але потребує уточнення деяких питань.Хтось може сказати: "чергова стаття про програмування мікроконтролерів". Ні, пошук подібних проектів не дав якихось виразних результатів, за винятком цього відео. З обговорень на форумах зрозуміло одне: ідея отримання подібного пристрою(Камера + мікроконтролер = результат розпізнавання на виході, а не просто знята картинка) приходила багатьом, але залишалася без реалізації. Та й розпізнавання, за спільну думку, вимагає багато обчислювальних ресурсів і мікроконтролери для цього не підходять, зокрема про Arduino були висловлювання, що це взагалі неможливо. Якщо стало цікаво, прошу під кат.

    Що б не виникало очевидних питань, відповімо на них:

    • Ні, це не сервіс розпізнавання зображень
    • Ні, це не OpenCV
    • Ні, це не нейронні мережі
    • Так, розпізнавання здійснюється саме мікроконтролером!

    Ідея

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

    Встановлення

    Отже, завдання поставлене, потрібна реалізація. Не відступаючи від усталених принципів
    беремо те, що є під рукою. А було під рукою парочка Arduino Uno, стара оптична миша та CD привід. До речі, на те, щоб використовувати сенсор оптичної мишіяк камера для отримання зображення нас наштовхнула прочитана колись давно, та й власне решта навколо «мишачий» матеріал. Єдине нам довелося випаяти сенсор і всю його обв'язку для зручності використання, а також приклеїти до нього лінзу, яку ми дбайливо видерли з CD приводу. Це було потрібно для того, щоб збільшити відстань від об'єкта зйомки до камери інакше цифри нашого розміру не поміщалися і було видно лише невелика частина. До речі, перед лінзою з CD приводу, ми намагалися прикріпити оптику від веб камери, але якось не зрослося.


    Ще



    Потім постало питання як цю камеру позиціонувати над об'єктом зйомки. Тут нам допоміг старий зламаний мікроскоп, який лежав без діла. З повагою зняли механізм управління предметним столиком. Цей механізм нам дозволив переміщати камеру лише по двох осях, тут же прийшла думка використовувати спрямовуючу лазерну головку від CD приводу. Все це закріпили на корпусі від багатостраждального приводу CD. Через війну ми отримали класний механізм позиціонування камери.


    Ще




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


    Ще




    Стало зрозуміло, що просто підсвітити не вийде важлива інтенсивність, напрям зовнішнє світло теж вносить корективи. Довелося включати в роботу ще одну «ардуїнку», щоб управляти інтенсивністю підсвічування ( Звичайно можна було і інакше управляти, але згодом і не тільки підсвічуванням, а також перемиканням цифр на індикаторі). У результаті виявилося, що зйомка на просвіт набагато краща. А якщо наприклад використовувати в якості мети семи сегментний індикатор, що світиться, то сенсор його бачить взагалі відмінно. Так, що тепер у нас як об'єкти зйомки індикатор і смуга з білими цифрами залита чорним тлом.


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


    Ще



    Загальний вид установки у зборі



    ранній варіант встановлення





    Блок розпізнавання


    Важливу роль нашій установці грає, так званий блок розпізнавання (на малюнку вище). Як видно, він складається з Arduino Uno та всім відомого wifi передавача ESP8266. Пояснюю, wifi передавач нам потрібний для того, щоб результат розпізнавання побачити на планшеті. Програма на планшеті надсилає запит, «ардуїнка», отримуючи запит, «знімає» зображення із сенсора миші, потім бінаризує його. Після бінаризації відбувається розпізнавання, а після його завершення формується відповідь. У відповіді ми надсилаємо результат розпізнавання та 41 байт для побудови бінаризованого зображення на екрані планшета, так би мовити, для наочності.

    Якщо озирнутися, то на "на ардуїнку" покладено непоганий функціонал: і робота з камерою, і розпізнавання, і робота з esp8266. Що не могло не вплинути на роботу - довелося боротися з нестачею пам'яті. Ось уже не думав, що колись доведеться відвойовувати кожен байт пам'яті.

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

    Замість ув'язнення

    На цьому, власне, і все. Попереду дуже багато роботи. І перше завдання: розпізнавання чисел (рядки цифр), що знімаються «людською» камерою (а не «мишачим сенсором») і перенесенням розробленої технології на ESP8266 і зниженням напруження боротьби за кожен байт пам'яті.

    З радістю відповімо на запитання.