37 lines
1.1 KiB
TypeScript
37 lines
1.1 KiB
TypeScript
/**
|
|
* Audio utility functions for voice chat.
|
|
* Handles PCM16 decoding and AudioContext initialization.
|
|
*/
|
|
|
|
/**
|
|
* Decode base64 PCM16 audio to Float32Array for Web Audio API
|
|
*/
|
|
export function decodePCM16ToFloat32(base64Audio: string): Float32Array {
|
|
const raw = atob(base64Audio);
|
|
const bytes = new Uint8Array(raw.length);
|
|
for (let i = 0; i < raw.length; i++) {
|
|
bytes[i] = raw.charCodeAt(i);
|
|
}
|
|
const pcm16 = new Int16Array(bytes.buffer);
|
|
const float32 = new Float32Array(pcm16.length);
|
|
for (let i = 0; i < pcm16.length; i++) {
|
|
float32[i] = pcm16[i] / 32768;
|
|
}
|
|
return float32;
|
|
}
|
|
|
|
/**
|
|
* Create and initialize AudioContext with worklet
|
|
*/
|
|
export async function createAudioPlaybackContext(
|
|
workletPath = "/audio-playback-worklet.js",
|
|
sampleRate = 24000
|
|
): Promise<{ ctx: AudioContext; worklet: AudioWorkletNode }> {
|
|
const ctx = new AudioContext({ sampleRate });
|
|
await ctx.audioWorklet.addModule(workletPath);
|
|
const worklet = new AudioWorkletNode(ctx, "audio-playback-processor");
|
|
worklet.connect(ctx.destination);
|
|
return { ctx, worklet };
|
|
}
|
|
|