Электрификация

Справочник домашнего мастера

Arduino распознавание речи

Распознавание голоса на Arduino или «Do You Know What I Am Saying?»

25 апреля 2016

Фразы «О’кей, Google» и «Привет, Siri» прочно вошли в обиход у пользователей смартфонов. Голосовое управления это удобно — не надо нажимать кнопки, двигать курсором мыши в нужную область и т.д. Просто произносишь команду и ждешь ее исполнения.

Наверное каждый человек хотел бы иметь у себя дома возможность включать\выключать свет в комнате по команде, чтобы не приходилось вставать и идти к выключателю. Вариантов применения у данной технологии неизмеримое множество.

В данной статье рассмотрим один из самых простых способов научить Arduino понимать голосовые команды — Elechouse Voice Recognition Module. В качестве примера будем управлять светодиодом. Голосовой командой мы сможем его включить, выключить или заставить мигать.

Для работы нам потребуется:

  • Elechouse Voice Recognition Module v3.1: модуль распознавания голоса
  • Плата Arduino. Например, Arduino UNO R3.
  • Любой светодиод и подходящий резистор для него. Я использовал красный 5V светодиод.
  • Arduino IDE с установленной библиотекой VoiceRecognitionV3

Устройство собиралось на макетной плате MB-102 с джамперами.

Подключение

Подключение модуля очень простое. Всего два пина: TX и RX. Их надо подключить к выходам Arduino 2 и 3 соответственно. Запитать модуль следует от 5V.

Обучение командам

Итак, первым делом надо наш модуль обучить командам. Как было сказано выше, всего у нас три команды:

  • Зажгись
  • Выключись
  • Мигай

Откройте проект vr_simple_train, поставляем в комплекте с библиотекой VoiceRecognitionV3.

Файл — Примеры — VoiceReocgnitionV3 — vr_simple_train

Залейте этот скетч в Arduino и откройте Монитор порта (Сервис — Монитор порта или нажмите Ctrl + Shift + M на клавиатуре)

Обязательно надо выставить скорость обмена (baud rate) 115200 и отправку по новой строке.

Перед нами интерфейс управления голосовыми командами. Введите в верхнее поле settings и нажмите кнопку «Послать».

Модуль ответит нам своими текущими настройками. Это значит, что все хорошо и можно приступать непосредственно к обучению команд.

За обучение командам отвечает функция sigtrain.

Введите в поле команду sigtrain 0 On и нажмите на кнопку «Послать». Команда означает, что в ячейку памяти 0 мы хотим записать команду с сигнатурой On. Сигнатура это некий уникальный ярлык, который описывает вашу команду.

Когда в окне появится фраза «Speak now», то следует проговорить в микрофон нашу команду «Зажгись».

После появления фразы «Speak again», проговорите фразу еще раз.

Если оба слова совпали, то модуль выдаст Success: 1, что означает, что мы только успешно записали команду On.

Если же модуль не смог сопоставить две голосовых команды (например, было шумно в помещении или вы произносили просто разные слова), то модуль ответит фразой «Cann’t match» и предложит начать процесс записи команды еще раз до тех пор, пока не будут предоставлены верные данные.

То же самое надо проделать и с другими нашими командами «Выключись» и «Мигай», но использовать надо другие ячейки памяти (1 и 2) и другие сигнатуры (Off и Blink)

sigtrain 1 Off sigtrain 2 Blink

Делай, что я говорю!

Модуль настроен и знает целых три команды. Залейте в Arduino следующий скетч:

#include <SoftwareSerial.h> #include <TimerOne.h> #include «VoiceRecognitionV3.h» VR myVR(2, 3); // 2:RX 3:TX, you can choose your favourite pins. uint8_t records; uint8_t buf; int led = 13; #define onRecord (0) #define offRecord (1) #define blinkRecord (2) /** @brief Print signature, if the character is invisible, print hexible value instead. @param buf —> command length len —> number of parameters */ void printSignature(uint8_t *buf, int len) { int i; for(i = 0; i < len; i++) { if (buf>0x19 && buf<0x7F) { Serial.write(buf); } else { Serial.print(«, HEX); Serial.print(«]»); } } } /** @brief Print signature, if the character is invisible, print hexible value instead. @param buf —> VR module return value when voice is recognized. buf —> Group mode(FF: None Group, 0x8n: User, 0x0n:System buf —> number of record which is recognized. buf —> Recognizer index(position) value of the recognized record. buf —> Signature length buf~buf —> Signature */ void printVR(uint8_t *buf) { Serial.println(«VR Index\tGroup\tRecordNum\tSignature»); Serial.print(buf, DEC); Serial.print(«\t\t»); if (buf == 0xFF) { Serial.print(«NONE»); } else if (buf&0x80) { Serial.print(«UG «); Serial.print(buf&(~0x80), DEC); } else { Serial.print(«SG «); Serial.print(buf, DEC); } Serial.print(«\t»); Serial.print(buf, DEC); Serial.print(«\t\t»); if (buf > 0) { printSignature(buf+4, buf); } else { Serial.print(«NONE»); } Serial.println(«\r\n»); } void setup() { myVR.begin(9600); Serial.begin(115200); Serial.println(«Elechouse Voice Recognition V3 Module\r\nControl LED sample»); pinMode(led, OUTPUT); if (myVR.clear() == 0) { Serial.println(«Recognizer cleared.»); } else { Serial.println(«Not find VoiceRecognitionModule.»); Serial.println(«Please check connection and restart Arduino.»); while(1); } if (myVR.load((uint8_t)onRecord) >= 0) { Serial.println(«onRecord loaded»); } if (myVR.load((uint8_t)offRecord) >= 0) { Serial.println(«offRecord loaded»); } if (myVR.load((uint8_t)blinkRecord) >= 0) { Serial.println(«blinkRecord loaded»); } Timer1.initialize(100000); } void timerIsr() { digitalWrite(13, digitalRead(13) ^ 1); } void loop() { int ret; ret = myVR.recognize(buf, 50); if (ret > 0) { switch(buf){ case onRecord: digitalWrite(led, HIGH); Timer1.detachInterrupt(); break; case offRecord: digitalWrite(led, LOW); Timer1.detachInterrupt(); break; case blinkRecord: Timer1.attachInterrupt(timerIsr); break; default: Timer1.detachInterrupt(); Serial.println(«Record function undefined»); break; } printVR(buf); } }

Скетч ожидает от модуля голосовую команду и исполняет ее.

Видео-демонстрация работы:

Данная статья является собственностью Amperkot.ru. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.

Распознавание голоса (voice recognition module v3.1)

Общие сведения:

Модуль распознавания голоса — Voice Recognition Module V3.1 — это компактный и простой в управлении модуль распознавания речи. На базе данного модуля можно создавать проекты с голосовым управлением.

Для работы модуля его необходимо обучить — записать через микрофон собственные голосовые команды в энергонезависимое хранилище голосовых команд модуля. Вы можете записать до 80 голосовых команд (каждая команда не более 1,5 сек., примерно одно, максимум два слова) и все они будут храниться в модуле, даже после отключения питания. Стоит отметить, что записывать можно не только голос (слова), но и различные звуки.

У модуля есть два вида памяти: память хранилища (где голосовые команды просто хранятся) и память распознавателя (где голосовые команды участвуют в сравнении со звуком поступившем через микрофон).

Перед распознаванием голосовых команд их нужно загрузить из памяти хранилища в память распознавателя. Память распознавателя рассчитана на 7 голосовых команд, значит модуль способен одновременно сравнивать до 7 голосовых команд с поступающим звуковым сигналом.

Термины:

  • Хранилище голосовых команд – энергонезависимая память состоящая из 80 ячеек, в каждую ячейку можно записать одну голосовую команду с текстовым комментарием.
  • Распознаватель голосовых команд – основная часть модуля распознавания речи, блок содержащий ОЗУ из 7 ячеек, в каждую ячейку можно загрузить одну голосовую команду из хранилища голосовых команд модуля. Блок распознавателя сравнивает загруженные в него голосовые команды с поступающим звуковым сигналом.
  • Номер ячейки – совпадает с номером записи. Память хранилища и память распознавателя разбита на ячейки. Одна ячейка может хранить одну запись (голосовую команду). Доступ к записям хранилища и записям распознавателя осуществляется по номерам ячеек.
  • Обучение – процесс записи ваших голосовых команд в хранилище.
  • Загрузка – копирование записанной голосовой команды из хранилища в распознаватель.
  • Подпись – текстовый комментарий (до 10 символов) к голосовой команде записанной в хранилище.
  • Группа – список содержащий 7 номеров ячеек хранилища. Поддерживаются, системные группы и пользовательские группы. Загрузка группы приводит к загрузке в распознаватель тех голосовых команд хранилища, номера которых указаны в группе.
    Более подробно о группах читайте в разделе Группы.

Видео:

Редактируется…

Спецификация:

  • Точность распознавания речи: 99% (при идеальных условиях).
  • Объем хранилища: до 80 голосовых команд длительностью не более 1,5 сек.
  • Одновременное распознавание: до 7 голосовых команд.
  • Напряжение питания: 4,5 … 5,5 В (постоянного тока).
  • Потребляемый ток: до 40 мА.
  • Цифровой Интерфейс: UART и GPIO уровень TTL 5В.
  • Аналоговый интерфейс: разъем микрофона jack 3,5-мм моноканальный.
  • Габариты платы: 31х50 мм.

Подключение:

  • Колодка из 4 выводов (GND, VCC, RXD, TXD) используется для подключения модуля к аппаратной или программной шине UART Arduino.

В примерах библиотеки «VoiceRecognitionV3» используется программная шина UART, где вывод модуля RXD подключается к выводу 3 Arduino UNO, а вывод модуля TXD подключается к выводу 2 Arduino UNO (выводы можно переназначить в скетче). Вместо Arduino UNO можно использовать Piranha Uno.

  • Колодка из 4 выводов (IN0, IN1, IN2, GND) может быть использована для загрузки требуемых групп голосовых команд из хранилища в распознаватель голосовых команд.
IN-2 IN-1 IN-0 № загружаемой группы в распознаватель голосовых команд:
0 0 0 Загрузить системную или пользовательскую группу номер 00.
0 0 1 Загрузить системную или пользовательскую группу номер 01.
0 1 0 Загрузить системную или пользовательскую группу номер 02.
0 1 1 Загрузить системную или пользовательскую группу номер 03.
1 0 0 Загрузить системную или пользовательскую группу номер 04.
1 0 1 Загрузить системную или пользовательскую группу номер 05.
1 1 0 Загрузить системную или пользовательскую группу номер 06.
1 1 1 Загрузить системную или пользовательскую группу номер 07.

Более подробно о группах читайте в разделе Группы.
Все выводы IN-0…IN-2 внутрисхемно подтянуты до уровня Vcc.
По умолчанию, загрузка групп при помощи выводов IN-0…IN-2 отключена.

  • Колодка из 8 выводов (OUT0-OUT6, GND) может быть использована для управления маломощными устройствами напрямую или мощными устройствами через реле, или силовые ключи.
    Выходы OUT модуля, так же как и ячейки распознавателя, пронумерованы от 0 до 6. Опознание модулем голосовой команды приводит к соответствующей реакции выхода OUT модуля, номер которого совпадает с номером ячейки распознавателя содержащей опознанную голосовую команду.
Выводы: Назначение:
OUT-0 Вывод реагирует на опознание голосовой команды в 0 ячейке распознавателя.
OUT-1 Вывод реагирует на опознание голосовой команды в 1 ячейке распознавателя.
OUT-2 Вывод реагирует на опознание голосовой команды в 2 ячейке распознавателя.
OUT-3 Вывод реагирует на опознание голосовой команды в 3 ячейке распознавателя.
OUT-4 Вывод реагирует на опознание голосовой команды в 4 ячейке распознавателя.
OUT-5 Вывод реагирует на опознание голосовой команды в 5 ячейке распознавателя.
OUT-6 Вывод реагирует на опознание голосовой команды в 6 ячейке распознавателя.

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

Питание:

Входное напряжение питания 5В постоянного тока, подаётся на выводы Vcc и GND модуля.

Подробнее о модуле:

У модуля распознавания голоса — Voice Recognition Module V3.1 есть два вида памяти: память хранилища (где голосовые команды просто хранятся, даже после отключения питания) и память распознавателя (где голосовые команды участвуют в сравнении со звуком поступившем через микрофон).

Оба типа памяти состоят из ячеек, в одну ячейку записывается одна голосовая команда. Память хранилища голосовых команд состоит из 80 ячеек пронумерованных от 0 до 79, а память распознавателя голосовых команд состоит из 7 ячеек пронумерованных от 0 до 6. Значит модуль способен хранить до 80 голосовых команд, а одновременно сравнивать до 7 голосовых команд с поступающим звуковым сигналом.

Для работы модуля его необходимо обучить — записать столько голосовых команд в энергонезависимое хранилище, сколько требуется для Вашего проекта. В распознаватель, голосовые команды не записываются, а загружаются из памяти хранилища. Модуль позволяет указать номера ячеек хранилища, голосовые команды которых будут автоматически загружаться в распознаватель при подаче питания модуля.

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

Пример:

  • Предположим, мы желаем создать голосовое управление светом в коридоре, комнате и на кухне, а так же управление жалюзи в комнате и на кухне.
  • Записываем в ячейки хранилища следующие голосовые команды: «свет», «жалюзи», «в коридоре», «в комнате» и «на кухне».
  • Голосовые команды «свет» и «жалюзи» загружаем из хранилища в распознаватель изначально.
  • При распознавании голосовой команды «свет», загружаем в распознаватель голосовые команды «в коридоре», «в комнате» и «на кухне».
  • При распознавании голосовой команды «жалюзи», загружаем голосовые команды «в комнате» и «на кухне» (не загружая «в коридоре», если конечно у Вас там нет жалюзей).
  • Таким образом Вы можете произнести «свет, в коридоре», «свет, в комнате», «свет, на кухне», «жалюзи, в комнате», «жалюзи, на кухне», а модуль сначала распознает первое слово («свет» или «жалюзи»), а потом оставшуюся часть Вашей длинной голосовой команды.
  • Осталось добавить в программу условие, что через определённое Вами время, после опознания команды «свет» или «жалюзи», они опять должны быть загружены в распознаватель. Так модуль перейдёт в состояние готовности принять следующую длинную голосовую команду, вне зависимости от того была ли корректно распознана предыдущая, или нет.

В данный пример можно добавить немного интерактивности включив в проект MP3-плеер и записав в него несколько сообщений. Вы говорите «свет», MP3-плеер воспроизводит сообщение «где?», Вы говорите «на кухне», MP3-плеер воспроизводит сообщение «свет на кухне включён!», или «свет на кухне выключен», в зависимости от текущего состояния реле управления светом. Стоит учитывать, что модуль распознавания речи и MP3-плеер должны находиться на разных шинах UART.

Еще одним плюсом наличия двух типов памяти модуля (хранилища и распознавателя), является возможность создания голосового управления несколькими людьми (до 7 человек) на одном модуле. Каждый человек записывает одинаковые слова голосовых команд в разные ячейки хранилища модуля, а так же записывает одно стартовое слово, например, «Окей дом». В таком случае в распознаватель изначально загружаем все голосовые команды «Окей дом» записанные разными людьми. Если кто то скажет «Окей дом, свет, в коридоре», то по номеру ячейки опознанной модулем голосовой команды «Окей дом», Вы сможете определить кем она была сказана и подгрузить в распознаватель следующие команды «свет» и «жалюзи» записанные именно этим человеком.

Управление модулем может осуществляться 2 способами:

  • Через последовательный порт UART (полный функционал).
    Управление осуществляется командами протокола VR3, или методами библиотеки VoiceRecognitionV3 (некоторые примеры описаны в настоящей статье).
  • Через выводы модуля IN и OUT (частичный функционал).
    Входы IN позволяют загрузить требуемые группы голосовых команд из хранилища в распознаватель, а выходы OUT позволяют определить номер распознанной голосовой команды и управлять устройствами.

Примеры:

В данном разделе содержатся примеры с использованием библиотеки VoiceRecognitionV3.

Пример обучения модуля:

Скетч примера поставляется вместе с библиотекой «VoiceRecognitionV3» и предназначен для записи голосовых команд в хранилище, загрузки голосовых команд из хранилища в распознаватель, удаления записанных голосовых команд, проверки состояния хранилища и распознавателя, получения комментариев к записям и проверки состояния модуля.

  1. Откройте скетч из примеров: Файл -> Примеры -> VoiceRecognitionV3 -> vr_sample_train.
  2. Выберите Вашу плату Arduino (Инструменты -> Плата), выберите порт (Инструменты -> Порт).
  3. Нажмите кнопку «Загрузить», дождитесь загрузки скетча в Arduino.
  4. Откройте «Монитор последовательного порта». Установите скорость передачи 115200 бод, установите отправку с добавлением символа новой строки (NL — NewLine), или с добавлением символов возврата каретки и новой строки (NL & CR).

В мониторе последовательного порта появится таблица со списком команд, которые Вы можете вводить:

5. Отправьте команду «settings» (настройки) чтобы проверить настройки модуля.
Для отправки команды введите «settings» и нажмите кнопку «Отправить», как на картинке ниже:

В ответ на команду «settings» (настройки) в мониторе последовательного порта появятся текущие настройки модуля:

Эти настройки означают следующее:

Baud rate (скорость передачи данных по шине UART) 9600 бит/сек.
Output IO Mode (режим работы выходов OUT) Импульсный.
Pulse Width (ширина импульса) 10 миллисекунд.
Auto Load (автозагрузка записей в распознаватель) Отключена.
Group control by external IO (управление группами при помощи входов IN 0-2) Отключено.

6. Обучение модуля распознавания голоса. Введите строку «sigtrain 0 On».

Команда «sigtrain» указывает библиотеке что мы хотим записать голосовую команду, далее следует номер записи (ячейки) — «0» и завершает строку текстовое описание голосовой команды — «On». Вместо подписи «On» Вы можете ввести любое слово до 10 байт, например, «Вкл».

В ответ на команду «sigtrain 0 On» (sigtrain номер подпись) в мониторе последовательного порта появится надпись «Speak now» (говорите сейчас). Вам нужно произнести свою голосовую команду (это может быть любое слово, например «Включить»). Через пару секунд в мониторе последовательного порта появятся надпись «Speak again» (говорите снова) . Вам нужно повторно произнести свою голосовую команду.

Это означает что Ваша голосовая команда записана в хранилище голосовых команд.

Но если, по «мнению» модуля, голосовые команды не совпадают, то в мониторе последовательного порта появится надпись «Record: 0 — Cann’t matched» (Запись: 0 — не соответствует):

После чего опять появится надпись «Speak now» (говорите сейчас), а затем «Speak again» (говорите снова).

Вам нужно повторить голосовые команды пока запись не будет сохранена в хранилище.

Что такое подпись? Подпись — это текстовое описание голосовой команды. В нашем случае мы записали команду 0 с подписью «On». После завершения обучения модуль может отображать подпись произнесённой (распознанной) голосовой команды.

Во время обучения можно смотреть не в монитор последовательного порта, а на два светодиода расположенные рядом с разъёмом микрофона: SYS_LED (желтый) и STATUS_LED (красный).

  • Желтый светодиод быстро мигает – приготовьтесь произнести голосовую команду.
  • Красный светодиод горит – произнесите голосовую команду.
  • Желтый светодиод мигает – приготовьтесь повторно произнести голосовую команду.
  • Красный светодиод горит – произнесите голосовую команду.
  • Оба светодиода мигают одновременно – голосовые команды совпали и записаны.
  • Желтый светодиод медленно мигает – сравнение звукового сигнала с записями распознавателя.

7. Попробуйте обучить модуль следующей голосовой команде.

Ведите строку «sigtrain 1 Off». Эта строка указывает модулю что Вы собираетесь записать голосовую команду в 1 ячейку хранилища с подписью «Off». После появления надписей «Speak now» (говорите сейчас) и «Speak again» (говорите снова), произнесите слово «Отключить».

Таким образом Вы можете записать в хранилище до 80 голосовых команд (с номерами от 0 до 79). При записи голосовых команд не обязательно соблюдать очерёдность следования номеров ячеек памяти хранилища. Можно записать голосовую команду, сначала в 3 ячейку, потом в 0, а потом, например, в 27. Главное помнить, в какой ячейке какая команда, чтоб их случайно не затереть, вот для этого то мы и указываем подпись при записи голосовых команд. Но, если Вы уверены, что подпись Вам не нужна, то вводите строку «sigtrain номер» без подписи.

Для того что бы модуль, после обучения (записи голосовых команд), мог опознать голосовую команду, её нужно загрузить из хранилища в распознаватель. В распознаватель модуля можно загрузить до 7 из 80 записанных команд.

8. Загрузка голосовых команд из хранилища в распознаватель модуля. Введите строку «load 0 1» для загрузки записей из 0 и 1 ячеек хранилища в память распознавателя.

Процесс загрузки не удаляет записи из памяти хранилища, а копирует записи из указанных ячеек хранилища голосовых команд в память распознавателя по порядку.

В ответ на команду «load 0 1» (загрузить записи 0 и 1) в мониторе последовательного порта появятся надписи «Record 0 Loaded» (запись 0 загружена) и «Record 1 Loaded» (запись 1 загружена).

В память распознавателя можно загружать записи из любых ячеек хранилища голосовых команд, например, строка «load 3 21 17» приведёт к загрузке записей из ячеек 3, 21 и 17 хранилища голосовых команд, в память распознавателя, по порядку указания ячеек. То есть запись 3 хранилища скопируется в ячейку 0 распознавателя, запись 21 хранилища скопируется в ячейку 1 распознавателя, а запись 17 хранилища скопируется в ячейку 2 распознавателя. Но пока делать этого не стоит, ведь мы записали только 2 голосовые команды в память хранилища (ячейки 0 и 1) и загрузили их в в память распознавателя (так же ячейки 0 и 1).

Теперь если Вы произнесёте слова «Включить» и «Отключить», то увидите сообщения

  • Распознана голосовая команда загруженная в ячейку распознавателя 0, запись загружена не группой, запись загружена из ячейки хранилища 0, голосовая команда имеет подпись «On».
  • Распознана голосовая команда загруженная в ячейку распознавателя 1, запись загружена не группой, запись загружена из ячейки хранилища 1, голосовая команда имеет подпись «Off».

Пример управления светодиодом на плате Arduino:

Скетч примера поставляется вместе с библиотекой «VoiceRecognitionV3».

  1. Откройте скетч из примеров: Файл -> Примеры -> VoiceRecognitionV3 -> vr_sample_control_led.
  2. Выберите Вашу плату Arduino (Инструменты -> Плата), выберите порт (Инструменты -> Порт).
  3. Нажмите кнопку «Загрузить», дождитесь загрузки скетча в Arduino.
  4. Откройте «Монитор последовательного порта». Установите скорость передачи 115200 бод, установите отправку с добавлением символа новой строки (NL — NewLine), или с добавлением символов возврата каретки и новой строки (NL & CR).

В мониторе последовательного порта появится следующий текст:

Так как в предыдущем примере Вы уже записали 2 команды в распознаватель, то произнесите их. Произнесение первой команды приведёт к включению светодиода на плате Arduino, а произнесение второй к выключению. При этом в мониторе последовательного порта будут отображаться те же сведения, что и при опознании голосовых команд в предыдущем примере:

  • Распознана голосовая команда загруженная в ячейку распознавателя 0, запись загружена не группой, запись загружена из ячейки хранилища 0, голосовая команда имеет подпись «On».
  • Распознана голосовая команда загруженная в ячейку распознавателя 1, запись загружена не группой, запись загружена из ячейки хранилища 1, голосовая команда имеет подпись «Off».

Остальные примеры включённые в библиотеку «VoiceRecognitionV3»:

Файл -> Примеры -> VoiceRecognitionV3 -> vr_sample_multi_cmd: раскрывает принцип работы с группами голосовых команд. Голосовая команда записанная в 0 ячейку хранилища (RECORD 0) используется для переключения между двумя группами голосовых команд. Первая группа содержит номера ячеек хранилища RECORD 0,1,2,3,4,5,6, а вторая группа содержит номера ячеек хранилища RECORD 0,7,8,9,10,11,12. Перед запуском данного примера необходимо обучить модуль (записать) голосовые команды от 0 до 12.

Файл -> Примеры -> VoiceRecognitionV3 -> vr_sample_check_baud_rate: позволяет узнать установленную скорость передачи данных по шине UART. Может пригодиться если Вы забыли пользовательские настройки.

Файл -> Примеры -> VoiceRecognitionV3 -> vr_sample_bridge: позволяет отправлять команды протокола VR3 без кода заголовка, длины кадра и кода конца кадра. Например, для отправки команды «Check Recognizer», вместо байтов «AA 02 01 0A», нужно ввести только 01. Протокол VR3 описан в разделе Wiki — Протокол VR3 для модуля распознавания голоса.

Группы:

Группы используются для удобства загрузки нескольких голосовых команд из хранилища в распознаватель. Каждая группа может включать до 7 номеров ячеек хранилища голосовых команд. Загрузка группы приводит к загрузке в распознаватель всех ячеек хранилища, номера которых указаны в группе. Группы можно загружать командами UART или при помощи входов модуля IN 0-2.

Существует два вида групп: системные группы и пользовательские группы.

Системные группы имеют жесткую структуру и включают в себя 7 номеров ячеек хранилища голосовых команд:

Пользовательские группы Вы можете создавать по своему усмотрению (Вы сами решаете какие ячейки хранилища голосовых команд будут входить в группу). Допускается создание до 8 пользовательских групп с номерами от 00 до 07. Каждая пользовательская группа может содержать до 7 голосовых команд хранилища.

Управлять группами можно, как с использованием методов библиотеки VoiceRecognitionV3, так и при помощи команды протокола VR3.

Ссылки:

  • Модуль распознавания голоса — Voice Recognition Module V3.1.
  • Библиотека VoiceRecognitionV3.
  • Wiki — Установка библиотек в Arduino IDE.
  • Wiki — Протокол VR3 для модуля распознавания голоса.

Управление голосовыми командами.

Иногда бывает, нужно сделать срочный звонок или, к примеру, узнать погоду, но Вы находитесь за рулём или бежите, а может ваши руки заняты чем-то, что Вы делаете в таком случае? Конечно же проще всего сказать “Привет Siri” или “О`кей Google”! А теперь представьте, как было бы удобно с такой же лёгкостью включать свет голосом или изменять температуру кондиционера одной лишь голосовой командой. Сегодня расскажу вам как реализовать такую систему.

Для работы нам потребуется:

Elechouse Voice Recognition Module v3.1: модуль распознавания голоса

Плата Arduino. Например, Arduino UNO R3.

Любой светодиод и подходящий резистор для него. Я использовал красный 5V светодиод.

Arduino IDE с установленной библиотекой VoiceRecognitionV3

Подключение очень простое и показано на картинке. Как записать команды, Вы сможете найти в соответствующем документе (чуть ниже оставил ссылку) Ссылка на скетч также выложена ниже.

Удачи и творческих успехов! Вариантов с использованием представленной технологии масса и светодиод может быть заменён любым другим устройством.

Необходимая информация и скетчи:

( здесь сам скетч )

О том, как работать с платой, подключать светодиод и использовать датчики температуры в своих схемах, показывал на своем канале:

Голосовое управление Arduino средствами Processing и Google Speech API

Идея:

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

Синтезатор речи для вашего Arduino


Автор Instructables под ником Utsource рассказывает, как пользоваться библиотекой Talkie, позволяющей синтезировать речь при помощи Arduino. Это не тот синтезатор речи, которым вы, возможно, пользуетесь на своём смартфоне, планшете или ПК, и который может озвучить любой текст. Набор слов здесь фиксированный, но их больше тысячи (это в сумме, предусмотрены несколько подключаемых словарей). Данная библиотека реализует программно алгоритм синтеза, реализованный в своё время аппаратно в чипах фирмы TI.
Библиотека Talkie лежит , также её можно скачать через менеджер библиотек, введя её название в строку поиска. Мастер показывает это на скриншоте:

Для работы библиотеки не требуется расширение ОЗУ, ПЗУ, добавление каких-либо аппаратных синтезаторов. Синтез речи полностью программный, звуковой сигнал выводится при помощи ШИМ на выход 3. Туда можно просто подключить динамическую головку через резистор, а можно воспользоваться дополнительным усилителем. Во втором случае желателен ФНЧ между Arduino и усилителем, но мастер обходится без него. При мощном усилителе ФНЧ становится обязательным. Усилитель может быть выполнен на любой элементной базе, мастер выбирает микросхему LM386. Схему включения он берёт стандартную, понятно, что показанные на ней микрофон и нагрузочный резистор для него не понадобятся — источником сигнала будет Arduino.


Эту схему он моделирует в программе Fritzing:

И собирает на макетной плате типа breadboard:

Чтобы проверить библиотеку в действии, мастер открывает в Arduino IDE редактор скетчей:

И набирает такой код:
#include «Talkie.h» //Talkie.h is used to initialize this library and set the Digital pin 3 of Arduino as output pin #include «Vocab_US_Large.h» //Vocab_US_Large.h is used to use the alerts #include «Vocab_Special.h» //Vocab_Special.h is used to use the pause Talkie voice; //define an object ‘value’ to use the commands void setup() { } void loop() { voice.say(spPAUSE2); voice.say(sp2_DANGER); voice.say(sp2_DANGER); voice.say(sp3_STORM); voice.say(sp3_IN); voice.say(sp3_THE); voice.say(sp3_NORTH); /*The first command voice.say(spPAUSE2) is to take a short pause while repeating the alert message. And the next commands are just simple words that imply: DANGER DANGER STORM IN THE NORTH.*/ }
Программа подключает ранее установленную библиотеку Talkie и два словаря, один из которых нужен для получения паузы между словами. Никаких знаков препинания этот синтезатор речи не понимает, как и сокращений вроде ЗПТ и ТЧК. При запуске программы он произнесёт монотонно фразу «опасность опасность буря с северной стороны».
Библиотека подойдёт ардуинщикам, не желающим приобретать довольно дорогие дисплеи. Заняв динамической головкой, без усилителя или с таковым, всего одну «ногу», можно реализовать вывод в виде речи довольно длинных фраз, а если занять ещё несколько «ног» кнопками — то и меню, в т.ч. многоуровневые. Доставка новых самоделок на почту

Получайте на почту подборку новых самоделок. Никакого спама, только полезные идеи!

*Заполняя форму вы соглашаетесь на обработку персональных данных

Voice Recognition Module :http://ali.pub/2k0ky2

Наверное каждый человек хотел бы иметь у себя дома возможность включать\выключать свет в комнате по голосовой команде , чтобы не приходилось вставать и идти к выключателю. Ну или управлять любым другим устройством голосом.

В данной статье мы разберем один способ как управлять голосом устройствами. Для этого нам понадобится модуль распознавания речи Voice recognition module V3.1 .

Данный модуль можно приобрести по ссылке в начале статьи. В комплект поставки входит сам модуль , микрофон на гибкой ножке с разъемом 3,5 мм jack плюс PLS контакты с шагом 2,56 мм для платы модуля.

Данный модуль может работать как в паре с микроконтроллером, так и автономно от него.

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

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

На данный модуль есть datasheet в котором подробно описано, как управлять и работать с данным модулем. Ссылка на даташит: https://yadi.sk/i/nbj8jyfz3WxQyy

В данном даташите описано несколько способов программирования данного модуля. В данной статье мы рассмотрим только один, способ программирования с помощью arduino.

Для начала нам нужно подключить модуль к arduino по такой схеме:

Данное подключение используется потому, что мы будем использовать serialsoftware.

После того как мы все правильно подключили, необходимо скачать библиотеку по ссылке: https://github.com/elechouse/VoiceRecognitionV3/archive/master.zip

После того как мы скачаем библиотеку и установим ее, нам понадобится пример vr_sample_train который можно найти перейдя в (файл -> Примеры -> VoiceRecognitionV3 -> vr_sample_train)

Выбрав данный пример, загрузим его в ардуино. После загрузки откроем монитор порта:

  1. В открывшемся мониторе порта, нужно выбрать обязательно. скорость порта 115200, и меню NL ( новая строка) Newline или NL & CR.
  2. После появившейся таблицы в мониторе порта нужно вписать команду “settings» для того чтоб определить, отвечает ли модуль на команды и все ли подключено правильно.
  3. Далее нужно будет ввести команду “sigtrain 0 On» где команда «sigtrain» отвечает за запись команды, «0» это идентификатор команды, «On» это описание нашей команды оно может быть произвольной. После ввода данной команды в мониторе порта появится команда”Speak now”, которая сигнализирует нам о том, что началась запись команды, и нужно проговорить в микрофон нужную команду которую мы хотим использовать. Затем появится команда “Speak again”,которая просит нас повторить команду еще раз. Если команды правильные и совпадают, то высветится команда”Success”, и “record 0” . Но если команда не верная или же присутствовали посторонние шумы, то высветится команда “Cann’t matched” что символизирует о том что команда не записалась и просит проговорить еще раз ее.
  4. Если хотим записать еще одну команду, например первая была “On” на включение, а следующую хотим записать на выключение, то следует нам вписать следующую команду “sigtrain 1 Off ”
  5. После записи команд, нам нужно их записать в память контроллера, чтоб он мог данные команды использовать. За это отвечает команда “load”. Нам нужно записать в модуль две команды с идентификаторами “0” и “1” тогда следует ввести команду “load 0 1″
    После записи можно будет проговорить наши команды и если команды распознаются то в мониторе порта будут появляться вот такие строки
    Теперь позле записи команд давайте попробуем по управлять голосом светодиодами. Для этого откроем пример vr_sample_control_led(Файл -> Примеры -> VoiceRecognitionV3 -> vr_sample_control_led) и загрузим его в ардуино.

И подключив светодиод к 13 пину, мы можем увидеть как по записанным нашим командам светодиод включается и выключается.

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

Скетч:

#include <SoftwareSerial.h> #include «VoiceRecognitionV3.h» /** Connection Arduino VoiceRecognitionModule 2 ——-&gt; TX 3 ——-&gt; RX */ VR myVR(2,3); // 2:RX 3:TX, you can choose your favourite pins. uint8_t records; // save record uint8_t buf; int led = 13; int led1 = 12; #define onRecord (0) #define offRecord (1) #define onRecord1 (2) #define offRecord1 (3) /** @brief Print signature, if the character is invisible, print hexible value instead. @param buf —&gt; command length len —&gt; number of parameters */ void printSignature(uint8_t *buf, int len) { int i; for(i=0; i&lt;len; i++){ if(buf&gt;0x19 &amp;&amp; buf&lt;0x7F){ Serial.write(buf); } else{ Serial.print(«, HEX); Serial.print(«]»); } } } /** @brief Print signature, if the character is invisible, print hexible value instead. @param buf —&gt; VR module return value when voice is recognized. buf —&gt; Group mode(FF: None Group, 0x8n: User, 0x0n:System buf —&gt; number of record which is recognized. buf —&gt; Recognizer index(position) value of the recognized record. buf —&gt; Signature length buf~buf —&gt; Signature */ void printVR(uint8_t *buf) { Serial.println(«VR Index\tGroup\tRecordNum\tSignature»); Serial.print(buf, DEC); Serial.print(«\t\t»); if(buf == 0xFF){ Serial.print(«NONE»); } else if(buf&amp;0x80){ Serial.print(«UG «); Serial.print(buf&amp;(~0x80), DEC); } else{ Serial.print(«SG «); Serial.print(buf, DEC); } Serial.print(«\t»); Serial.print(buf, DEC); Serial.print(«\t\t»); if(buf&gt;0){ printSignature(buf+4, buf); } else{ Serial.print(«NONE»); } Serial.println(«\r\n»); } void setup() { /** initialize */ myVR.begin(9600); Serial.begin(115200); Serial.println(«Elechouse Voice Recognition V3 Module\r\nControl LED sample»); pinMode(led, OUTPUT); pinMode(led1, OUTPUT); if(myVR.clear() == 0){ Serial.println(«Recognizer cleared.»); }else{ Serial.println(«Not find VoiceRecognitionModule.»); Serial.println(«Please check connection and restart Arduino.»); while(1); } if(myVR.load((uint8_t)onRecord) &gt;= 0){ Serial.println(«onRecord loaded»); } if(myVR.load((uint8_t)offRecord) &gt;= 0){ Serial.println(«offRecord loaded»); } if(myVR.load((uint8_t)onRecord1) &gt;= 0){ Serial.println(«onRecord1 loaded»); } if(myVR.load((uint8_t)offRecord1) &gt;= 0){ Serial.println(«offRecord1 loaded»); } } void loop() { int ret; ret = myVR.recognize(buf, 50); if(ret&gt;0){ switch(buf){ case onRecord: /** turn on LED */ digitalWrite(led, HIGH); break; case offRecord: /** turn off LED*/ digitalWrite(led, LOW); break; case onRecord1: /** turn on LED */ digitalWrite(led1, HIGH); break; case offRecord1: /** turn off LED*/ digitalWrite(led1, LOW); break; default: Serial.println(«Record function undefined»); break; } /** voice recognized */ printVR(buf); } }

admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Наверх