Голосовое управление Arduino средствами Processing и Google Speech API
Поиск решения:
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, доступный в пре-релизе на официальном сайте.
Реализация («Слушай мою команду!»):
С распознаванием определились. Теперь нужно отлавливать нужные нам команды и по ним принимать решения. За это отвечает секция:
Голосовой ответ
Теперь нам нужен инструмент, который будет нам отвечать человеческим голосом в случае найденного соответствия. В качестве инструмента реализации был выбран Google Translate, а вернее модуль, который конвертирует текст в голос. Текст оправляется запросом на сервер Google, преобразуется в звуковой файл и отправляется нам обратно в формате mp3. За это отвечает секция:
За обработку непосредственно текстовых фраз отвечает секция:
Пример реализации распознавания и голосового подтверждения:
Processing + Arduino
Ну вот вроде и заработало, но чего-то не хватает. Теперь «подружим» это все с Arduino.
Инициализируем serial подключение в Processing для отправки данных на Arduino (для пользователей Mac и Unix):
Для Windows пользователей:
И отправим туда команду при найденном голосовом соответствии:
Теперь займемся платой Arduino. Нам нужно слушать Serial порт и при нахождении команды из списка, выполнять требуемое действие согласно команде. Скетч очень прост:
Проблемы и планы:
Т.к. я не занимался программирование до этого времени, я не до конца понимаю некоторые вещи в процессе отладки. Буду признателен, если кто-нибудь подскажет как решить проблемы из перечня ниже:
— Самая основная проблема — голосовая фраза не проговаривается целиком. Пропадают последние буквы. Хотя звуковой файл приходит с сервера Google в нормальном виде. Как я понимаю ситуацию: проблема аудио-плеера, но где именно пока не ясно.
— Уже писал, что у Google Speech API есть ограничение на 50 запросов в сутки, но по факту получается больше. В любом случае этого мало. Планирую прописать локальное распознавание главной команды и только после ее распознавания, остальной текст отправлять на обработку Google’у. Ищу решение.
— Думаю не помешает отправка команд на Ethernet-шилд Arduino, т.к. некоторые системы могут находиться на приличном расстоянии от главного компьютера и Serial подключение тут уже не подойдет. Займусь этим решение на днях, т.к. нет у меня в наличии роутера для подключения к нему Arduino с Ethernet-шилдом.
TMRpcm: Arduino библиотека для воспроизведения PCM/WAV аудиофайлов напрямую с SD карты
Содержание
О библиотеке
TMRpcm – Arduino библиотека для асинхронного воспроизведения PCM/WAV файлов напрямую с SD карты.
Использует стандартную библиотеку SD Arduino, SD карту и выходное устройство (громкоговоритель, наушники, усилитель и т.д.).
- все платы на базе ATmega328: Arduino Uno, Nano, Duemilanove и т.д.;
- платы Mega: 1280, 2560 и т.д..
Особенности
- Воспроизведение PCM/WAV напрямую с SD карты.
- Основные форматы: WAV файлы, 8-бит, частота дискретизации 8–32 кГц, моно.
- Асинхронное воспроизведение: позволяет работать коду в основном цикле программы во время воспроизведения звука.
- Работа на одном таймере: TIMER1 (Uno, Mega) или TIMER3, 4 или 5 (Mega).
- Двухтактный выход или подключение двух динамиков.
- Двойное увеличение частоты дискретизации.
- Поддерживаемые устройства: Arduino Uno, Nano, Mega и т.д.
Подготовка аудиофайлов
Файлы конвертируются легко и просто:
- с помощью iTunes:
- кликнуть Edit > Preferences > Import Settings;
- изменить значение в выпадающем списке на WAV Encoder и Setting : Custom > 16.000kHz to 32kHz, 8-bit, Mono;
- правый клик на любом файле в in iTunes и выбрать » Create WAV Version «;
- с помощью Audacity:
- Tracks > Stereo Track to Mono;
- Project Rate (HZ) > установить 32000, 22050, 16000 или 11025;
- File > Export > Save as type: Other uncompressed files > Options. ;
- выбрать WAV, Unsigned 8 bit PCM.
Затем с помощью компьютера скопируйте файл на SD карту.
Известные ограничения
Данная библиотека сильно нагружает процессор, и выполнение кода во время воспроизведения будет медленнее, чем обычно. Нагрузка от обработки аудиофайлов может быть уменьшена за счет использования аудио более низкого качества, кодированного с меньшей частотой дискретизации (с минимальным значением 8 кГц).
Возможно влияние на другие библиотеки, которые используют прерывания. Функции isPlaying() , disable() или noInterrupts() могут использоваться для предотвращения параллельного выполнения кода.
Управление громкостью допускает хороший диапазон регулировки громкости, но при большой громкости возможно появление искажений.
Загрузка
Также проект можно найти на GitHub: ссылка.
Функции
Пример использования
Это простая схема для проигрывания wav файлов с помощью Arduino Nano v.3.0, она содержит 4 кнопки, при нажатии каждой из которых воспроизводится заданный wav файл, загруженный на SD карту.
Комплектующие
- Arduino Nano v3.0 (я использовал китайскую версию под названием Funduino Nano);
- модуль SD карты;
- SD карта;
- макетная плата;
- четыре кнопки;
- четыре резистора 22 кОм;
- один резистор 4,7 кОм;
- NPN транзистор BC546B;
- динамик;
- перемычки.
Подготовка SD карты
- Отформатируйте SD карту (убедитесь, что настройки форматирования совпадают с приведенными на скриншоте выше).
- Конвертируйте ваши аудиофайлы в .WAV файлы (я использовал программу Wav Sample rate converter) со следующими параметрами:
- частота дискретизации: 16000 Гц;
- количество каналов: моно;
- количество бит на отсчет: 8.
- Wav файлы для примера приведены ниже.
Схема
Перед написанием кода вам необходимо скачать (ссылка выше в разделе «Загрузка») и установить библиотеку TMRpcm.
Поиск неисправностей
Если у вас не получилось заставить эту схему работать, то ниже приведены два тестовых скетча для поиска неисправностей. Код был протестирован на Arduino Nano, Uno и Mega.
Подключать кнопки нет необходимости, файлы будут воспроизводится автоматически.
Нет необходимости подключать транзистор, подключите небольшой динамик или наушники напрямую к выводу 9 платы Arduino Nano или к выводу 11 платы Arduino Mega.
Скачанные по ссылке выше аудиофайлы скопируйте в корневой каталог SD карты.
Arduinio Nano
Arduino Nano | SD карта |
---|---|
12 | MISO |
11 | MOSI |
13 | SCK |
4 | CS |
9 | динамик |
GND | GND |
5V | VCC |
Arduino Mega
Arduino Mega | SD карта |
---|---|
50 | MISO |
51 | MOSI |
52 | SCK |
53 | CS |
11 | динамик |
GND | GND |
5V | VCC |
Если тестовый код работает, то добавьте строку #include в программу с кнопками.
Если звука всё равно нет, то добавьте задержку между командами воспроизведения delay(1000); .
Дополнительные возможности
Данная библиотека предназначалась для простого и удобного пользователю использования в качестве проигрывателя wav аудиофайлов, использующего стандартные библиотеки Arduino и воспроизводящего файлы в простейшем wav формате. Многие дополнительные функции были добавлены по запросам пользователей и включены в pcmConfig.h , чтобы сохранить изначальную простоту.
Большинство дополнительных функций требуют больше памяти RAM, больше программной памяти и, в некоторых случаях, большей вычислительной мощности для воспроизведения. Некоторые из них до сих пор еще отлажены не полностью. Помните об этом при включении данных функций.
Смотрите pcmConfig.h для настройки следующих параметров:
Пользовательские определения
В pcmConfig.h настраиваются следующие параметры:
Параметр | Описание |
---|---|
#define buffSize 128 | Управляет размером двух буферов (или четырех в режиме MULTI). |
#define DISABLE_SPEAKER2 | Выключает вывод по умолчанию второго динамика для совместимости с другими библиотеками (вывод 10 на Uno). |
#define ENABLE_MULTI | Включает режим воспроизведения нескольких треков (по умолчанию на одном таймере). |
#define STEREO_OR_16BIT | Включает воспроизведение стерео или 16-битных файлов. |
#define MODE2 | Включает режим двойного таймера для воспроизведения нескольких треков. Не доступен с TIMER2. |
#define SDFAT | Библиотека SdFat использует меньше памяти программ и RAM. Смотрите пример SDFAT в составе данной библиотеки. |
#define HANDLE_TAGS | Пропускает теги WAV файлов, которые содержат метаданные. |
#define USE_TIMER2 | Использует 8-разрядный TIMER2, вместо 16-разрядных таймеров. |
#define rampMega | Принудительный ручной выбор включения/выключения метода линейного изменения ШИМ. |
#define ENABLE_RF | Включает стриминг аудио через радиоканал (NRF24L01+). |
Второй громкоговоритель / двухтактный режим
Данная библиотека по умолчанию выводит данные на два вывода таймер, хотя по умолчанию полностью включен только один.
Для включения дополнительный вывод должен быть настроен на выход, например:
- Arduino Uno (один выход): audio.speakerPin = 9;
- Arduino Uno (двухтактный выход): audio.speakerPin = 9; pinMode(10,OUTPUT);
Чтобы полностью выключить второй выход, раскомментируйте в pcmConfig.h строку #define DISABLE_SPEAKER2 .
Режим Multi
Режим Multi включает одновременное воспроизведение двух треков.
Функции множественного режима немного отличаются от функций стандартного режима:
- по умолчанию: использует тот же таймер и выводы, что и в обычном режиме с двухтактным выходом;
- MODE2: использует два 16-разрядных таймера и до 4-х выводов.
- рекомендуемая частота дискретизации 16–20 кГц;
- размер буфера может быть увеличен для улучшения производительности;
- звуки, воспроизводимые одновременно, должны иметь одинаковые частоты дискретизации;
- для включения режима multi раскомментируйте определение в pcmConfig.h;
- переменная audio.speakerPin2 должна быть установлена в 4-выводном режиме для выбора дополнительного таймера / вывода, которые будут использоваться.
Стандартный режим (2 вывода, один трек) | 1 или 2 динамика |
Стандартный режим стерео (2 вывода, один трек) | 2 динамика, не двухтактные (нагрузка между выводом и корпусом) |
Стандартный режим стерео MODE2 (4 вывода, один трек) | 4 динамика ИЛИ двухтактные выходы (нагрузка между двумя выводами) на 2 динамика |
Режим Multi (2 вывода, два трека) | 1 или 2 динамика |
Режим Multi стерео (4 вывода, два трека) | 2 или 4 динамика, не двухтактные |
Режим Multi MODE2 (4 вывода, два трека) | 2 динамика на двухтактных выходах или 4 динамика на не двухтактных выходах |
Примечание: все 4-выводные режимы требуют платы с двумя и более 16-разрядными таймерами.
Воспроизведение стерео и 16-битного аудио
Эти режимы требуют дополнительных ресурсов и вычислительной мощности, так как с SD карты должны считываться удвоенные данные. Треки моно могут воспроизводиться в режиме стерео, но не наоборот.
В стандартном режиме:
#define STEREO_OR_16BIT В этом режиме стерео и 16-битные файлы обрабатываются одинаково, причем первый байт считывает на один выход, а второй байт – на другой. Это дает в результате стерео выход на двух динамиках, подключенных между выводом (выводами) динамика и корпусом, или один 16-разрядный выход, использующий резисторную матрицу. #define MODE2 В стандартном режиме MODE2 позволяет выводить стерео или 16-разрядный звук, используя два дополнительных вывода таймера. Таймер и выводы указываются переменой speakerPin2 . Двухтактные выводы таймера должны быть настроены на выход вручную.
#define STEREO_OR_16BIT Включение этой опции вместе с режимом MULTI позволит воспроизводить два стерео или 16-разрядных трека на отдельных выводах таймера. Это обеспечивает выход для четырех громкоговорителей, подключенных между выводом (выводами) и корпусом, или один 16-разрядный выход для каждого трека. #define MODE2 Включение этой опции с режимом MULTI и STEREO_OR_16BIT ни на что не влияет.
Использование SDFAT
Библиотека SDFAT может использоваться для уменьшения использования оперативной памяти и памяти программ и для повышения производительности. Файлы должны быть включены в скетч. Смотрите пример в архиве с библиотекой.
Метаданные (теги ID3v2.3 и LIST)
Функции были добавлены для чтения данных о песне, артисте и альбоме из тегов ID3v2.3 и LIST в WAV файлах.
Примечание: добавление, модифицирование и редактирование метаданных поддерживает программа Audacity.
listInfo Прочитать теги LIST в символьный буфер, возвращает длину тега. id3Info Прочитать теги ID3 в символьный буфер, возвращает длину тега. getInfo Ищет оба тега и считывает в символьный буфер, возвращает длину тега. Первым ищется ID3.
Теги для запросов:
- 0 = название песни;
- 1 = имя артиста;
- 2 = название альбома.
- Найти только информацию LIST и напечать название песни через последовательный порт.
- Найти информацию ID3v2.3 и LIST и напечатать информацию о песне, артисте и альбоме через последовательный порт.
Использование TIMER2
Часто данная библиотека используется с платами Uno, Nano и т.д. только с одним 16-разрядным таймером. Когда TIMER1 необходим для других целей, для воспроизведения аудио может быть использован TIMER2.
Выводы динамика – на Uno, Nano и т.д. только вывод 3.
Для включения использования 8-разрядного TIMER2 раскомментируйте строку #define USE_TIMER2 в секции пользовательских определений.
- этот вариант, как правило, является не самым лучшим решением;
- скорость воспроизведения будет слегка отличаться от использования 16-разрядных таймеров;
- воспроизведение на TIMER2 поддерживает нестандартные частоты дискретизации: 31,4 кГц, 23,5 кГц и 15,7 кГц;
- увеличение частоты дискретизации включено по умолчанию и в этом режиме не может быть изменено;
- рекомендуются частоты дискретизации 24–32 кГц при размере буфера 128.
ШИМ и опция rampMega
В попытках уменьшить шумы треска, создаваемые ШИМ, было опеределено четыре основных источника проблемы:
- включение ШИМ/таймеров на Arduino;
- выключение ШИМ/таймеров на Arduino;
- разница в значениях между треками;
- парсинг незвуковых данных.
- 1 и 2. При тестировании на платах Arduino Duemianove и Mega я обнаружил необходимость в разных методах линейного изменения при включении и выключении. Надеюсь, это решит проблему на большинстве других плат.
- 3. Код линейного изменения между треками не меняется. При воспроизведении треков с разными частотами дискретизации используйте функцию disable() для выключения таймеров между изменениями. Смотрите также #4.
- 4. Опция HANDLE_TAGS включена в pcmConfig.h , чтобы обеспечить правильное воспроизведение wav-файлов с включенными метаданными (ID3 или LIST).
Простое цифровое создание WAV файлов
Данные функции будут генерировать стандартные WAV файлы. Исходные данные с аналоговых входов или других датчиков могут быть записаны в файл для генерации цифрового звука, который может быть воспроизведен на любом устройстве, поддерживающем WAV файлы, или легко конвертирован в другие форматы.
Примечание: в дальнейшем будут добавлены и другие форматы wav.
Синтаксис:
Использование:
Смотрите пример, включенный в библиотеку. Создайте файл шаблона, затем запишите в него данные, начиная с 44 байта. Используйте команду finalizeWavTemplate , чтобы добавить данные о размере файла перед воспроизведением.
Примечания: Если указанный файл существует, он будет перезаписан при создании, но обновлен только при завершении. Эти функции при использовании функций записи вызываются автоматически.
Запись звука
Запись звука находится всё еще в тестировании и может работать не так, как ожидается.
Функции:
startRecording Начать запись с указанного аналогового вывода. stopRecording Остановить запись и финализировать wav файл.
Проходной режим – во время записи выдает звук на динамик.
Режимы: 0 – нормальный/нет; 1 – динамик включен; 2 – записи нет, вывод только на динамик.
Синтаксис:
Использование:
- раскомментируйте #define buffSize 128 и #define ENABLE_RECORDING в pcmConfig.h ;
- начните запись
- остановите запись
Примечания:
- для записи рекомендуется библиотека SdFat;
- рекомендуются SD карты минимум класса 4;
- возможно, понадобится увеличение buffSize .
На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.
В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.
Если не ошибаюсь на макете-схема стягивающие резисторы на кнопках по 220 Ом, но не как не 22 кОм, и если это 220 Ом тогда мало — будет «дребезг» при нажатии (1-2 кОм предостаточно). Хотя может их раскраска похожа и я ошибаюсь. Да ошибся, ведь у вас кнопки работают при значении LOW.