let outputArray = this.base64ToArrayBuffer(voice);//base64转ArrayBuffer
//AllData.push(outputArray);
let arr16 = new Int16Array(outputArray.buffer);//转换init16Array
let voice_data = this.dealVoice([arr16], 8000, 16000);//升采样率
let Base64_test = this.arrayBufferToBase64(voice_data.data);//
arrayBufferToBase64: function (buffer) {
var binary = "";
var bytes = new Uint8Array(buffer.buffer);
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
}
base64ToArrayBuffer(base64String) {
const padding = "=".repeat((4 - (base64String.length % 4)) % 4);
const base64 = (base64String + padding)
.replace(/\-/g, "+")
.replace(/_/g, "/");
const rawData = window.atob(base64);
const outputArray = new Uint8Array(rawData.length);
for (let i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
},
dealVoice(pcmDatas, pcmSampleRate, newSampleRate) {
var size = 0;
for (var i = 0; i < pcmDatas.length; i++) {
size += pcmDatas[i].length;
}
var step = newSampleRate / pcmSampleRate;
if (step <= 1) {
//新采样不高于pcm采样率不处理
step = 1;
newSampleRate = pcmSampleRate;
} else {
size = Math.floor(size * step);
}
var res = new Int16Array(size);
//处理数据
var posFloat = 0,
prev = 0;
for (var index = 0, nl = pcmDatas.length; index < nl; index++) {
var arr = pcmDatas[index];
for (var i = 0; i < arr.length; i++) {
var cur = arr[i];
var pos = Math.floor(posFloat);
posFloat += step;
var end = Math.floor(posFloat);
//简单的从prev平滑填充到cur,有效减少转换引入的杂音
var n = (cur - prev) / (end - pos);
for (var j = 1; pos < end; pos++, j++) {
//res[pos]=cur;
res[pos] = Math.floor(prev + j * n);
}
prev = cur;
}
}
return {
sampleRate: newSampleRate,
data: res,
};
},
07-02
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交