Feat: floatTo16BitPCM 转换

This commit is contained in:
Paul 2024-06-04 11:25:14 +08:00
parent b27241b7bc
commit ce8514cc39
2 changed files with 21 additions and 2 deletions

View File

@ -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);

View File

@ -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;
}