in lex-web-ui/src/lib/lex/wav-worker.js [185:232]
function downsampleTrimBuffer(buffer, rate) {
if (rate === options.sampleRate) {
return buffer;
}
const length = buffer.length;
const sampleRateRatio = options.sampleRate / rate;
const newLength = Math.round(length / sampleRateRatio);
const result = new Float32Array(newLength);
let offsetResult = 0;
let offsetBuffer = 0;
let firstNonQuiet = 0;
let lastNonQuiet = length;
while (offsetResult < result.length) {
const nextOffsetBuffer = Math.round((offsetResult + 1) * sampleRateRatio);
let accum = 0;
let count = 0;
for (let i = offsetBuffer; (i < nextOffsetBuffer) && (i < length); i++) {
accum += buffer[i];
count++;
}
// mark first and last sample over the quiet threshold
if (accum > options.quietTrimThreshold) {
if (firstNonQuiet === 0) {
firstNonQuiet = offsetResult;
}
lastNonQuiet = offsetResult;
}
result[offsetResult] = accum / count;
offsetResult++;
offsetBuffer = nextOffsetBuffer;
}
/*
console.info('encoder trim size reduction',
(Math.min(newLength, lastNonQuiet + options.quietTrimSlackBack) -
Math.max(0, firstNonQuiet - options.quietTrimSlackBack)) / result.length
);
*/
return (options.useTrim) ?
// slice based on quiet threshold and put slack back into the buffer
result.slice(
Math.max(0, firstNonQuiet - options.quietTrimSlackBack),
Math.min(newLength, lastNonQuiet + options.quietTrimSlackBack)
) :
result;
}