inference-server
Version:
Libraries and server to build AI applications. Adapters to various native bindings allowing local inference. Integrate it with your application, or use as a microservice.
60 lines • 2.32 kB
JavaScript
import fs from 'node:fs';
import path from 'node:path';
import * as WaveFile from 'wavefile';
import decode from 'audio-decode';
import libSampleRate from '@alexanderolsen/libsamplerate-js';
export async function resampleAudioBuffer(input, opts) {
const nChannels = opts.nChannels ?? 2;
const inputSampleRate = opts.inputSampleRate ?? 44100;
const resampler = await libSampleRate.create(nChannels, inputSampleRate, opts.outputSampleRate, {
// http://www.mega-nerd.com/SRC/api_full.html http://www.mega-nerd.com/SRC/api_simple.html
converterType: libSampleRate.ConverterType.SRC_SINC_BEST_QUALITY, // default SRC_SINC_FASTEST. see API for more
});
const resampledData = resampler.simple(input);
resampler.destroy();
return resampledData;
}
export async function decodeAudio(fileBuffer, sampleRate = 44100) {
const decodedAudio = await decode(fileBuffer);
let audio = decodedAudio.getChannelData(0);
if (decodedAudio.sampleRate !== sampleRate) {
audio = await resampleAudioBuffer(audio, {
inputSampleRate: decodedAudio.sampleRate,
outputSampleRate: sampleRate,
nChannels: 1,
});
}
return audio;
}
export async function loadAudioFromFile(filePath, opts = {}) {
const buffer = fs.readFileSync(filePath);
const sampleRate = opts.sampleRate ?? 16000;
const audio = await decodeAudio(buffer, sampleRate);
return {
sampleRate,
channels: 1,
samples: audio,
};
}
export async function loadAudioFromUrl(url, opts = {}) {
const arrayBuffer = await fetch(url).then((res) => res.arrayBuffer());
const buffer = await Buffer.from(arrayBuffer);
const audio = await decodeAudio(buffer);
return {
sampleRate: opts.sampleRate ?? 16000,
channels: 1,
samples: audio,
};
}
export async function saveAudioToFile(audio, destPath) {
const format = path.extname(destPath).toLowerCase().replace('.', '');
if (format === 'wav') {
const wav = new WaveFile.WaveFile();
wav.fromScratch(audio.channels, audio.sampleRate, '32f', audio.samples);
fs.writeFileSync(destPath, wav.toBuffer());
}
else {
throw new Error(`Unsupported audio format: ${format}`);
}
}
//# sourceMappingURL=loadAudio.js.map