woolball-client
Version:
Client-side library for Woolball enabling secure browser resource sharing for distributed AI task processing
70 lines (69 loc) • 2.63 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.audioCompression = void 0;
let audioEncoder = null;
let audioDecoder = null;
async function audioCompression(data) {
const { input, codec = 'opus', bitrate = 128000, sampleRate = 48000, numberOfChannels = 2, ...options } = data;
try {
if (!('AudioEncoder' in globalThis) || !('AudioDecoder' in globalThis)) {
throw new Error('WebCodecs API não está disponível neste navegador.');
}
const inputData = typeof input === 'string' ? JSON.parse(input) : input;
const encoderConfig = {
codec,
sampleRate: sampleRate || inputData.sampleRate,
numberOfChannels: numberOfChannels || inputData.numberOfChannels,
bitrate
};
const encodedChunks = [];
if (!audioEncoder) {
audioEncoder = new AudioEncoder({
output: (chunk, metadata) => {
encodedChunks.push(chunk);
},
error: (error) => {
throw new Error(`Erro no encoder: ${error.message}`);
}
});
}
audioEncoder.configure(encoderConfig);
if (inputData.frames) {
for (const frame of inputData.frames) {
const audioData = new AudioData({
format: frame.format || 'f32',
sampleRate: frame.sampleRate || sampleRate,
numberOfChannels: frame.numberOfChannels || numberOfChannels,
numberOfFrames: frame.numberOfFrames,
timestamp: frame.timestamp,
data: frame.data
});
audioEncoder.encode(audioData);
audioData.close();
}
}
else if (inputData.encodedChunks) {
}
await audioEncoder.flush();
const chunks = encodedChunks.map(chunk => {
const buffer = new ArrayBuffer(chunk.byteLength);
chunk.copyTo(buffer);
return buffer;
});
const blob = new Blob(chunks, { type: `audio/webm; codecs=${codec}` });
const reader = new FileReader();
const base64Promise = new Promise((resolve, reject) => {
reader.onload = () => resolve(reader.result);
reader.onerror = reject;
});
reader.readAsDataURL(blob);
const base64 = await base64Promise;
return {
audio: base64
};
}
catch (error) {
throw error;
}
}
exports.audioCompression = audioCompression;