folx-tv/client/replit_integrations/audio/audio-utils.ts
sebastjanartic 308e602c73 Fix hero card aspect ratio and add horoscope generation functionality
Introduce horoscope generation via OpenAI API, including new API endpoints and database schema. Adjust card components in `home.tsx` to use `aspect-[16/9]` for consistent image sizing, resolving previous height stretching issues. Update dependencies in `package.json`.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 413891e8-d784-4bea-b9f5-91a5a68316b4
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: ca1aa952-242c-43c1-9e28-47aed39cee1b
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/f209e72a-0939-48fa-84fc-57854de71967/413891e8-d784-4bea-b9f5-91a5a68316b4/nTLKCC5
Replit-Helium-Checkpoint-Created: true
2026-02-28 20:25:58 +00:00

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