Feat: floatTo16BitPCM 转换
This commit is contained in:
parent
b27241b7bc
commit
ce8514cc39
|
|
@ -4,7 +4,7 @@ import viteLogo from "/vite.svg";
|
|||
import "./App.css";
|
||||
import { client, start } from "./utils/mqtt";
|
||||
import { startAudio, stopAudio, context } from "./utils/microphone";
|
||||
import { arrayBufferToBase64, downSampleAudioFrame, getMergedPCMData } from "./utils/audio";
|
||||
import { arrayBufferToBase64, downSampleAudioFrame, floatTo16BitPCM, getMergedPCMData } from "./utils/audio";
|
||||
|
||||
let mqttData;
|
||||
|
||||
|
|
@ -17,7 +17,7 @@ const getAudio = () => {
|
|||
// 降比特率到 16000
|
||||
const downedFloat32Arr = downSampleAudioFrame(float32Arr, context.sampleRate, 16000);
|
||||
// 转 base64 打包给后端
|
||||
const sendItem = arrayBufferToBase64(downedFloat32Arr.buffer);
|
||||
const sendItem = arrayBufferToBase64(floatTo16BitPCM(downedFloat32Arr));
|
||||
// 存储一遍压缩后的音频
|
||||
buffers.push(downedFloat32Arr);
|
||||
|
||||
|
|
|
|||
|
|
@ -61,3 +61,22 @@ export const arrayBufferToBase64 = (buffer: ArrayBuffer) => {
|
|||
}
|
||||
return window.btoa(binary);
|
||||
}
|
||||
|
||||
// Float32 转 16 Bit PCM
|
||||
export const floatTo16BitPCM = (input: Float32Array) => {
|
||||
const audioLength = input.length * 2;
|
||||
|
||||
// 新开一个对象
|
||||
const buffer = new ArrayBuffer(audioLength);
|
||||
const view = new DataView(buffer);
|
||||
|
||||
// 写入 input 的数据到 buffer 里面(view 理解成只是一个操作手段)
|
||||
let offset = 0;
|
||||
|
||||
for (let i = 0; i < input.length; i++ , offset += 2) {
|
||||
const s = Math.max(-1, Math.min(1, input[i]));
|
||||
view.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue