@coze/uniapp-api
Version:
Official Coze UniApp SDK for seamless AI integration into your applications | 扣子官方 UniApp SDK,助您轻松集成 AI 能力到应用中
46 lines (45 loc) • 2.07 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Resampler = void 0;
/**
* Simple audio resampler for PCM audio data
* Converts audio from one sample rate to another using linear interpolation
*/
exports.Resampler = {
/**
* Resample PCM audio data from one sample rate to another
* @param {Int16Array} inputBuffer - Input PCM buffer
* @param {number} inputSampleRate - Original sample rate
* @param {number} outputSampleRate - Target sample rate
* @returns {Int16Array} - Resampled PCM buffer
*/
resample(inputBuffer, inputSampleRate, outputSampleRate) {
// If sample rates are the same, return the original buffer
if (inputSampleRate === outputSampleRate) {
return inputBuffer;
}
// Calculate the output buffer size based on the ratio of sample rates
const ratio = outputSampleRate / inputSampleRate;
const outputLength = Math.ceil(inputBuffer.length * ratio);
const outputBuffer = new Int16Array(outputLength);
// Perform linear interpolation for resampling
for (let i = 0; i < outputLength; i++) {
// Calculate the position in the input buffer
const inputPos = i / ratio;
const inputIndex = Math.floor(inputPos);
const fraction = inputPos - inputIndex;
// Handle edge case at the end of the buffer
if (inputIndex >= inputBuffer.length - 1) {
outputBuffer[i] = inputBuffer[inputBuffer.length - 1];
continue;
}
// Linear interpolation between two adjacent samples
const sample1 = inputBuffer[inputIndex];
const sample2 = inputBuffer[inputIndex + 1];
// Calculate interpolated value and ensure it's within Int16 range
const interpolatedValue = sample1 + fraction * (sample2 - sample1);
outputBuffer[i] = Math.max(Math.min(Math.round(interpolatedValue), 32767), -32768);
}
return outputBuffer;
},
};