Feat: floatTo16BitPCM 转换
This commit is contained in:
parent
b27241b7bc
commit
ce8514cc39
|
|
@ -4,7 +4,7 @@ import viteLogo from "/vite.svg";
|
||||||
import "./App.css";
|
import "./App.css";
|
||||||
import { client, start } from "./utils/mqtt";
|
import { client, start } from "./utils/mqtt";
|
||||||
import { startAudio, stopAudio, context } from "./utils/microphone";
|
import { startAudio, stopAudio, context } from "./utils/microphone";
|
||||||
import { arrayBufferToBase64, downSampleAudioFrame, getMergedPCMData } from "./utils/audio";
|
import { arrayBufferToBase64, downSampleAudioFrame, floatTo16BitPCM, getMergedPCMData } from "./utils/audio";
|
||||||
|
|
||||||
let mqttData;
|
let mqttData;
|
||||||
|
|
||||||
|
|
@ -17,7 +17,7 @@ const getAudio = () => {
|
||||||
// 降比特率到 16000
|
// 降比特率到 16000
|
||||||
const downedFloat32Arr = downSampleAudioFrame(float32Arr, context.sampleRate, 16000);
|
const downedFloat32Arr = downSampleAudioFrame(float32Arr, context.sampleRate, 16000);
|
||||||
// 转 base64 打包给后端
|
// 转 base64 打包给后端
|
||||||
const sendItem = arrayBufferToBase64(downedFloat32Arr.buffer);
|
const sendItem = arrayBufferToBase64(floatTo16BitPCM(downedFloat32Arr));
|
||||||
// 存储一遍压缩后的音频
|
// 存储一遍压缩后的音频
|
||||||
buffers.push(downedFloat32Arr);
|
buffers.push(downedFloat32Arr);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -61,3 +61,22 @@ export const arrayBufferToBase64 = (buffer: ArrayBuffer) => {
|
||||||
}
|
}
|
||||||
return window.btoa(binary);
|
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