diff --git a/web/app.js b/web/app.js index 6e19df9..4f3d574 100644 --- a/web/app.js +++ b/web/app.js @@ -173,9 +173,12 @@ // ── Audio pipeline ── async function initAudio() { if (state.audioCtx) return; - const audioCtx = new (window.AudioContext || window.webkitAudioContext)({ - sampleRate: TARGET_SAMPLE_RATE, // Request 16kHz directly (Chrome supports) - }); + // Use device native sample rate — we resample to 16kHz in software + const audioCtx = new (window.AudioContext || window.webkitAudioContext)(); + // Chrome requires resume() after user gesture + if (audioCtx.state === "suspended") { + await audioCtx.resume(); + } await audioCtx.audioWorklet.addModule("audio-processor.js"); state.audioCtx = audioCtx; } @@ -183,6 +186,10 @@ if (state.recording) return; try { await initAudio(); + // Ensure AudioContext is running (may suspend between recordings) + if (state.audioCtx.state === "suspended") { + await state.audioCtx.resume(); + } const stream = await navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, channelCount: 1 }, });