/** * Convert Float32 PCM samples to 16-bit signed integer PCM. * Required for ElevenLabs realtime STT (pcm_16000 format). */ export function floatTo16BitPCM(float32Array: Float32Array): ArrayBuffer { const buffer = new ArrayBuffer(float32Array.length * 2) const view = new DataView(buffer) for (let i = 0; i < float32Array.length; i++) { const s = Math.max(-1, Math.min(1, float32Array[i])) view.setInt16(i * 2, s < 0 ? s * 0x8000 : s * 0x7fff, true) } return buffer } /** * Encode an ArrayBuffer as a base64 string for WebSocket transport. */ export function arrayBufferToBase64(buffer: ArrayBuffer): string { const bytes = new Uint8Array(buffer) let binary = '' for (let i = 0; i < bytes.length; i++) { binary += String.fromCharCode(bytes[i]) } return btoa(binary) }