Аудиоклассификация и обработка звука: Wav2Vec, Whisper tiny

ONNX Runtime Web (ORT Web) предоставляет возможность запускать модели машинного обучения прямо в браузере с использованием JavaScript, что особенно актуально для задач обработки аудио, таких как классификация звука и распознавание речи. Библиотека поддерживает работу с моделями в формате ONNX, включая модели Wav2Vec и Whisper tiny, которые ориентированы на аудиовходы.

Подключение ONNX Runtime Web

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

npm install onnxruntime-web

Или подключить через CDN:

<script src="https://cdn.jsdelivr.net/npm/onnxruntime-web/dist/ort.min.js"></script>

После подключения доступен объект ort, который предоставляет методы для создания сессий и выполнения инференса.

Создание сессии модели

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

const session = await ort.InferenceSession.create('model.onnx', {
  executionProviders: ['wasm'], // веб-ассинхронное выполнение через WebAssembly
});

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

  • executionProviders можно выбрать между wasm и webgl, что позволяет ускорить выполнение на GPU.
  • Загрузка модели может занимать время, особенно для моделей Whisper tiny, поэтому рекомендуется использовать async/await.

Подготовка аудиоданных

Модели Wav2Vec и Whisper tiny требуют аудиосигнал в виде нормализованного массива с плавающей запятой (Float32Array), обычно с частотой дискретизации 16 кГц. Для этого необходимо:

  1. Считать аудиофайл (например, WAV) в браузере.
  2. Декодировать его в аудиобуфер с помощью Web Audio API.
  3. Преобразовать буфер в Float32Array.
  4. Ресемплировать до 16 кГц, если исходная частота отличается.

Пример:

async function loadAudio(file) {
  const arrayBuffer = await file.arrayBuffer();
  const audioCtx = new (window.AudioContext || window.webkitAudioContext)({ sampleRate: 16000 });
  const audioBuffer = await audioCtx.decodeAudioData(arrayBuffer);
  const channelData = audioBuffer.getChannelData(0); // моно-канал
  return channelData;
}

Создание входного тензора

После получения аудиомассива необходимо создать тензор ort.Tensor:

const inputTensor = new ort.Tensor('float32', audioData, [1, audioData.length]);
  • 'float32' — тип данных, соответствующий формату модели.
  • [1, audioData.length] — размерность [batch_size, sequence_length]. Wav2Vec и Whisper tiny ожидают 2D-тензор.

Выполнение инференса

Инференс выполняется через метод run с объектом, где ключи — имена входных узлов модели:

const feeds = { input_values: inputTensor };
const results = await session.run(feeds);
  • Для Wav2Vec выходной тензор содержит эмбеддинги аудио.
  • Для Whisper tiny — вероятности токенов для декодирования текста.

Декодирование результатов

Wav2Vec

Эмбеддинги Wav2Vec можно использовать для классификации:

const embeddings = results['output'].data;

Для задачи классификации добавляется слой или логика для распознавания классов (например, с помощью kNN или небольшого классификатора в JavaScript).

Whisper tiny

Whisper tiny возвращает вероятности токенов, которые необходимо преобразовать в текст. Применяется жадный декодинг или beam search:

function greedyDecode(logits, vocabulary) {
  let output = '';
  for (let t = 0; t < logits.length; t++) {
    const maxIndex = logits[t].indexOf(Math.max(...logits[t]));
    output += vocabulary[maxIndex];
  }
  return output;
}
  • logits — массив вероятностей по каждому токену.
  • vocabulary — массив символов или токенов модели.

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

  • Использование webgl ускоряет инференс на устройствах с поддержкой GPU.
  • Для длинных аудиофайлов можно разбивать сигнал на сегменты, чтобы снизить нагрузку на память.
  • Важна предварительная нормализация и ресемплирование сигнала для корректной работы моделей.

Практическое применение

Модели Wav2Vec и Whisper tiny могут использоваться для:

  • Классификации аудиособытий (шумы, голоса, музыка).
  • Транскрипции речи в реальном времени.
  • Разработки интерактивных веб-приложений, работающих без серверной инфраструктуры для ML.

Использование ONNX Runtime Web позволяет интегрировать сложные аудиомодели в браузерные приложения с минимальной задержкой и без необходимости держать сервер для инференса.