Загрузка модели SoundClassifier

Для работы с ml5.js необходимо подключить библиотеку к проекту. Обычно это делается через CDN:

<script src="https://cdn.jsdelivr.net/npm/ml5@latest/dist/ml5.min.js"></script>

После подключения библиотеки создаётся объект ml5, предоставляющий доступ к различным функциям машинного обучения, включая классификацию звука. Важно убедиться, что подключение происходит до любых скриптов, которые используют ml5, иначе возникнет ошибка ml5 is not defined.


Создание объекта SoundClassifier

Для распознавания звуков используется класс ml5.soundClassifier. Он позволяет загружать предобученные модели, предоставленные ml5.js, либо модели, экспортированные из Teachable Machine. Создание классификатора выглядит следующим образом:

let classifier;

ml5.soundClassifier('https://teachablemachine.withgoogle.com/models/model.json')
  .then(clf => {
    classifier = clf;
    console.log("Модель загружена");
  })
  .catch(err => console.error("Ошибка загрузки модели:", err));

Ключевые моменты:

  • URL модели указывает на JSON-файл модели. В случае Teachable Machine это ссылка на экспортированную модель.
  • Метод ml5.soundClassifier возвращает Promise, поэтому для корректной работы необходимо использовать .then() или async/await.
  • Ошибки загрузки обрабатываются через .catch().

Использование callback-функции при загрузке

Кроме Promise, ml5.js поддерживает традиционное использование callback:

ml5.soundClassifier('model.json', function(error, clf) {
  if (error) {
    console.error(error);
    return;
  }
  classifier = clf;
  console.log("Классификатор готов к использованию");
});

Особенности подхода через callback:

  • Код выполнения после загрузки модели помещается внутрь функции callback.
  • Ошибки сразу обрабатываются локально, что упрощает отладку в небольших проектах.

Настройка параметров классификатора

При загрузке модели можно передать объект с опциями:

let options = {
  probabilityThreshold: 0.7,
  overlapFactor: 0.5
};

ml5.soundClassifier('model.json', options)
  .then(clf => {
    classifier = clf;
  });

Описание параметров:

  • probabilityThreshold — минимальная вероятность, при которой класс считается распознанным.
  • overlapFactor — степень перекрытия фрагментов аудиосигнала для анализа. Более высокий коэффициент повышает точность, но снижает производительность.

Инициализация микрофона

Классификатор требует доступ к микрофону для захвата звука в реальном времени. Для этого используется встроенный объект браузера navigator.mediaDevices.getUserMedia:

navigator.mediaDevices.getUserMedia({ audio: true })
  .then(stream => {
    console.log("Микрофон подключен");
  })
  .catch(err => console.error("Ошибка доступа к микрофону:", err));

ml5.js автоматически обрабатывает поток аудио при вызове classifier.classify(). Если микрофон не предоставлен, классификация работать не будет.


Запуск классификации звука

После загрузки модели и инициализации микрофона можно запускать процесс распознавания:

classifier.classify(gotResult);

function gotResult(error, results) {
  if (error) {
    console.error(error);
    return;
  }
  console.log(results);
}

Особенности работы метода classify:

  • Вызывает callback gotResult каждый раз, когда модель получает новый фрагмент аудио.

  • Параметр results — массив объектов, где каждый объект содержит:

    • label — название распознанного класса.
    • confidence — вероятность распознавания в диапазоне от 0 до 1.

Оптимизация производительности

При работе с длинными аудиопотоками важно учитывать нагрузку на процессор и задержки:

  • Ограничение частоты обновления: можно обрабатывать результаты не при каждом кадре, а через интервалы времени.
  • Порог вероятности: не обрабатывать результаты с низкой уверенностью (probabilityThreshold).
  • Отключение микрофона: когда классификация не нужна, останавливать аудиопоток через stream.getTracks().forEach(track => track.stop()).

Советы по организации кода

  • Разделять инициализацию модели, захват аудио и обработку результатов на отдельные функции.
  • Использовать Promise или async/await для последовательной загрузки модели и подключения микрофона.
  • Хранить ссылки на объект классификатора и аудиопоток глобально, чтобы иметь возможность управлять ими при необходимости.

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