ONNX Runtime Web (ORT Web) предоставляет возможность запускать модели машинного обучения прямо в браузере с использованием JavaScript, что особенно актуально для задач обработки аудио, таких как классификация звука и распознавание речи. Библиотека поддерживает работу с моделями в формате ONNX, включая модели Wav2Vec и Whisper tiny, которые ориентированы на аудиовходы.
Для использования 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.async/await.Модели Wav2Vec и Whisper tiny требуют аудиосигнал в виде
нормализованного массива с плавающей запятой
(Float32Array), обычно с частотой дискретизации 16 кГц. Для
этого необходимо:
Float32Array.Пример:
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 можно использовать для классификации:
const embeddings = results['output'].data;
Для задачи классификации добавляется слой или логика для распознавания классов (например, с помощью kNN или небольшого классификатора в JavaScript).
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 могут использоваться для:
Использование ONNX Runtime Web позволяет интегрировать сложные аудиомодели в браузерные приложения с минимальной задержкой и без необходимости держать сервер для инференса.