Почему PitchDetection лучше работает со свистом?
Я играю с примером программы UtterAsterisk, которая поставляется с TarsosDSP. Цель этой программы - показать горизонтальные полосы, которые указывают на примечание, которое должен сделать пользователь. Вертикальная черта перемещается слева направо, чтобы указать пользователю правильное время, когда выполнять какие ноты. Пользователь получает очки в зависимости от того, сделал ли пользователь правильную заметку за правильную продолжительность времени.
Ссылка на скриншот приложения: https://0110.be/files/photos/392/UtterAsterisk.png
В этой программе 3 раздела:
- выберите аудио вход
- выберите алгоритм обнаружения
- Визуальное представление ожидаемых заметок против фактических произведенных заметок: каждые X миллисекунд создается маленький черный квадрат, представляющий заметку, сделанную пользователем. В заголовке этого раздела (в последней версии программы) написано "свист работает лучше всего".
Мне интересно, почему этот код лучше всего работает со свистом?
В качестве справочной информации я пытаюсь сделать быстрый прототип для аналогичной программы, но там, где пользователь будет издавать не свистящие, не вокальные (без речи) звуки (например, звуки животных), и для правильности их необходимо будет подобрать.
Я попытался свистеть заметки, указанные в программе, и она работает довольно хорошо (за исключением того факта, что я ужасно свист!).
Я попытался выбрать разные алгоритмы обнаружения, но примечание, которое делает звук, не всегда регистрируется в 3-м разделе, когда я делаю не свистящие звуки.
У меня такое ощущение, что свист создает единую ноту, тогда как крякающий звук (как утка) на самом деле является гармоникой (надеюсь, я понял это правильно: несколько нот смешаны для создания звука).
Строка 151, 152: https://github.com/JorenSix/TarsosDSP/blob/master/src/examples/be/tarsos/dsp/example/UtterAsterisk.java
// add a processor, handle percussion event.
dispatcher.addAudioProcessor(new PitchProcessor(algo, sampleRate, bufferSize, this));
Я полагаю, что PitchProcessor будет обрабатывать только один пик, поскольку он возвращает pitchDetectionResult, который содержит только одну частоту (строка 59): https://github.com/JorenSix/TarsosDSP/blob/master/src/core/be/tarsos/dsp/pitch/PitchDetectionResult.java
К сожалению, я в основном начинаю в области цифровой обработки сигналов и мог бы использовать некоторую помощь, чтобы понять, как свист лучше в этом конкретном приложении. Если моя интуиция указывает на свою правоту (свист = отдельная нота), как можно сделать то же самое, что и эта программа (сравнить звуки, издаваемые пользователем, с записью матча)?
Спасибо за ваш вклад!
1 ответ
Кажется вероятным, что ответ прямо здесь.
где пользователь будет издавать не свистящие, не вокальные (без речи) звуки (например, звуки животных) и должен быть согласован для правильности.
Кажется вероятным, что эти "звуки" являются результатом нескольких тонов, в которых свист (свист человека), вероятно, произведет один тон.
Для сравнения проверьте разницу между звучанием одной ноты (или клавиши), сыгранной на фортепиано, и аккордом (несколькими нотами), сыгранным на фортепиано.
Другой вариант - использовать телефон для получения звука набора (например, нажмите 7) или свист. Телефон воспроизводит звуки DTMF (Dual Tone Blah Blah).