Я играю с примером программы 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
К сожалению, я в основном начинаю в области цифровой обработки сигналов и мог бы использовать некоторую помощь, чтобы понять, как свист лучше в этом конкретном приложении. Если моя интуиция указывает на свою правоту (свист = отдельная нота), как можно сделать то же самое, что и эта программа (сравнить звуки, издаваемые пользователем, с записью матча)?
Спасибо за ваш вклад!