Распознавание звука

Я хочу распознать определенный звук с помощью Arduino Uno.

Мне нужно распознать последовательность хлопков, чтобы запустить реле.

Подумав, мне нужно, чтобы это был режим непрерывного прослушивания без каких-либо триггеров, таких как нажатие кнопки. Фон будет тихим.

Достаточно ли arduino uno мощен для этого и как я могу получить информацию об этом? Любая помощь приветствуется.

Обратите внимание, что мне нужно сделать это полностью на самом Uno, а не на ПК, например Как мне прослушать звук, который соответствует предварительно записанному звуку?

Я думаю, что предварительно запишу звук и сравню с живым семплом, возможно ли это?

, 👍3


3 ответа


2

Если это просто звук хлопка, а фон тихий, то на самом деле все, что вам нужно, это почувствовать, насколько громкий звук. Это можно сделать с помощью прерывания аналогового компаратора (он присутствует в самом чипе, но не в библиотеке Arduino). Если все, что делает uno, — это измеряет звук и, возможно, устанавливает выходной контакт, когда он громкий, то просто опрашивайте аналоги, подключенные к вашему микрофону, и запускайте условие, когда выходной сигнал достаточно громкий. Вам, вероятно, потребуется усилить микрофон, если вы еще этого не сделали, но да, uno справится с этим.

Редактировать: если это последовательность аплодисментов, она все еще может это делать. Опять же, просто измерьте время между громким и тихим, не беспокойтесь о том, какой звук (то есть вам не нужно беспокоиться о точной записи и анализе звука, вам просто нужно знать, когда он громкий, а когда тихо)

,

Как бы это работало, если бы работало, если бы был хлопок и еще один громкий звук, похожий на хлопок (но не хлопок)?, @Dat Han Bag

К сожалению, не будет. Мой ответ выше действительно касается случая, когда единственное, что происходит, - это хлопок. В противном случае да, вам придется правильно идентифицировать звук, что более сложно., @Michael Stachowsky

Если вы сделаете фрагмент кода, который обнаруживает короткий, большой объем. Это будет работать лучше, чем просто высокая громкость. Вы также можете сделать два хлопка (всплески высокой громкости) с ожидаемым временем между ними. Это отфильтрует случайные звуки высокой громкости., @Paul


2

Добавление к ответу Майкла выше, который работает только в некоторых случаях (и он не будет работать идеально даже с последовательностью хлопков). Чтобы заставить его работать в большем количестве случаев, вам нужно будет хранить больше информации о шуме хлопка, как указывает Майкл в своем комментарии выше, «правильно идентифицировать» хлопок, чтобы сделать идентификацию более точной. Есть разные способы сделать это - вы можете сравнить это с живой записью, как вы написали в своем вопросе. Я предлагаю вам попробовать нейронные сети, чтобы сделать такое сравнение I. Я бы сказал, что вам понадобится двухслойная нейронная сеть, скажем, с образцом разных хлопков для ее обучения (вероятно, быстрее обучить ее не с Arduino). Вот библиотека нейросетей для ардуино

http://robotics.hobbizine.com/arduinoann.html

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

Встроенный АЦП Arduino, вероятно, можно использовать для записи, и он достаточно хорош для чего-то вроде хлопка в вашем случае, хотя его нельзя использовать для высококачественной записи звука.

,

0

Я не проверял это, но есть пример для библиотеки ArduinoSound, которая особенно распознает хлопки.

https://github.com/arduino-libraries/ArduinoSound/tree/master/examples /Клэпдетектор

/*
В этом примере считываются аудиоданные с микрофона Invensense ICS43432 I2S.
коммутационной панели и использует вход для обнаружения хлопков. Светодиод
переключается при обнаружении аплодисментов.

Схема:
* Плата Arduino/Genuino Zero, MKRZero или MKR1000
* ICS43432:
* Заземление подключено Заземление
* 3,3 В подключено 3,3 В (ноль) или VCC (MKR1000, MKRZero)
* WS подключен к контакту 0 (ноль) или контакту 3 (MKR1000, MKRZero)
* CLK подключен к контакту 1 (ноль) или контакту 2 (MKR1000, MKRZero)
* SD подключен к контакту 9 (ноль) или контакту A6 (MKR1000, MKRZero)

создано 18 ноября 2016 г.
Сандип Мистри
*/

#include <ArduinoSound.h>

// вывод светодиода для использования в качестве вывода
const int ledPin = LED_BUILTIN;

// порог амплитуды для обнаружения хлопка
const int amplitudeDeltaThreshold = 100000000;

// создаем анализатор амплитуд для использования с входом I2S
AmplitudeAnalyzer amplitudeAnalyzer;

// переменная для отслеживания последней амплитуды
int lastAmplitude = 0;

void setup() {
  // устанавливаем серийный номер
  Serial.begin(9600);

  // настроить вывод светодиода как выход
  pinMode(ledPin, OUTPUT);

  // настройка аудиовхода I2S на 44,1 кГц с 32 битами на выборку
  if (!AudioInI2S.begin(44100, 32)) {
    Serial.println("Failed to initialize I2S input!");
    while (1); // ничего не делать
  }

  // настраиваем вход I2S как вход для амплитудного анализатора
  if (!amplitudeAnalyzer.input(AudioInI2S)) {
    Serial.println("Failed to set amplitude analyzer input!");
    while (1); // ничего не делать
  }
}

void loop() {
  // проверяем, доступен ли новый анализ
  if (amplitudeAnalyzer.available()) {
    // прочитать новую амплитуду
    int amplitude = amplitudeAnalyzer.read();

    // находим разницу между новой амплитудой и последней
    int delta = amplitude - lastAmplitude;

    // проверяем, не превышает ли разница пороговое значение
    if (delta > amplitudeDeltaThreshold) {
      // обнаружен хлопок
      Serial.println("clap detected");

      // переключить светодиод
      digitalWrite(ledPin, !digitalRead(ledPin));

      // немного задержимся, чтобы устранить дребезг
      delay(100);
    }

    // обновить последнюю амплитуду новой амплитудой
    lastAmplitude = amplitude;
  }
}
,

Вопрос помечен как «arduino-uno», это плата, которую ArduinoSound не поддерживает., @Edgar Bonet