Обучение пользовательского классификатора звуков

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

Это позволит использовать все возможности библиотеки без установки дополнительных пакетов. Также рекомендуется использовать современный браузер с поддержкой Web Audio API, поскольку классификация звуков напрямую зависит от захвата аудиопотока с микрофона.


Инициализация аудиопотока

Для классификации звуков требуется доступ к микрофону. Используется стандартный API браузера:

let mic;

function setup() {
    mic = new p5.AudioIn();
    mic.start();
}

Объект p5.AudioIn() создаёт поток с микрофона. Метод start() запускает захват аудио. Этот поток впоследствии будет передаваться в классификатор для обучения.


Создание пользовательского классификатора

ml5.js предоставляет функционал soundClassifier для распознавания аудио. Для создания пользовательского классификатора используется transfer learning, позволяющий дообучать предобученные модели на новых звуках. Пример создания классификатора:

let classifier;

async function initClassifier() {
    classifier = await ml5.soundClassifier('https://teachablemachine.withgoogle.com/models/YOUR_MODEL/model.json', {
        probabilityThreshold: 0.7
    });
}

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

  • Параметр probabilityThreshold задаёт минимальный уровень уверенности для распознавания.
  • Можно использовать как предобученные модели, так и модели, созданные через Teachable Machine.

Сбор данных для обучения

Для создания собственного классификатора необходимо собрать аудиоданные для каждого класса. Используется функция addExample:

function recordExample(label) {
    classifier.addExample(mic.getLevel(), label);
}

Особенности:

  • mic.getLevel() возвращает текущий уровень громкости, но для более точного обучения лучше использовать спектрограмму.
  • Каждый класс должен содержать достаточное количество примеров (не менее 30–50 на начальном этапе).

Сбор данных выполняется циклически: пользователь воспроизводит звук, программа фиксирует его и присваивает метку.


Обучение модели

После накопления примеров вызывается метод train:

classifier.train((lossValue) => {
    if (lossValue) {
        console.log('Потеря на текущем шаге:', lossValue);
    } else {
        console.log('Обучение завершено');
    }
});

Особенности:

  • Аргумент функции обратного вызова показывает значение функции потерь (loss) на текущей итерации.
  • Когда lossValue равен null, обучение завершено.

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


Предсказание звуков в реальном времени

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

classifier.classify(mic, (err, results) => {
    if (err) {
        console.error(err);
        return;
    }
    console.log('Распознанный звук:', results[0].label, 'с вероятностью', results[0].confidence);
});

Особенности:

  • results[0] содержит наиболее вероятный класс.
  • confidence отражает уровень уверенности классификатора.
  • Метод classify можно вызывать циклически или в виде события при каждом новом аудиофрейме.

Работа с пользовательскими метками и интерфейс

Для удобства лучше хранить список классов и их меток:

let labels = ['Аплодисменты', 'Свист', 'Постукивание'];

labels.forEach(label => {
    let button = document.createElement('button');
    button.innerText = `Записать ${label}`;
    button.oncl ick = () => recordExample(label);
    document.body.appendChild(button);
});

Это позволяет накапливать примеры для каждого звука и визуализировать процесс сбора данных.


Улучшение точности классификации

  1. Стабильность записи: звуки должны быть записаны при минимальном фоновом шуме.
  2. Разнообразие примеров: каждый класс должен содержать вариации звучания.
  3. Нормализация громкости: разные уровни громкости могут искажать обучение, поэтому полезно нормализовать аудиопоток.
  4. Использование спектрограмм: преобразование аудио в спектрограммы значительно повышает точность.

Интеграция с веб-приложением

После обучения и тестирования классификатор можно интегрировать в интерактивное веб-приложение:

classifier.classify(mic, (err, results) => {
    if (!err) {
        document.getElementById('output').innerText = `${results[0].label} (${(results[0].confidence * 100).toFixed(1)}%)`;
    }
});

Таким образом, можно создать интерфейс, который реагирует на звуки в реальном времени, изменяет элементы страницы, запускает события или управляет мультимедиа.