01 / Recorded request
An imaginary moon garden
Stock machine voice, captured by the browser’s recorder. Fictional request.
Recognized speech
For an imaginary moon garden, name one blue flower. Answer in one short sentence.
The problem
Hands-free conversation needs a clear path through listening, transcription, response and spoken playback, rather than a hidden recording control.
One recorded voice turn
Actual PanelForge voice components and server pipeline in an isolated wrapper. Stock file-backed input, real provider responses, and a muted recording.
These are saved clips. Playing them opens no microphone and sends no speech.
01 / Recorded request
Stock machine voice, captured by the browser’s recorder. Fictional request.
Recognized speech
For an imaginary moon garden, name one blue flower. Answer in one short sentence.
02 / Saved reply
OpenAI generated speech · tts-1 · Alloy voice.
What was saved
One recognized request, one saved answer, and one returned audio chunk played to completion by the canonical queue.
Groq transcribed the recording; Haiku answered through Claude Engine; OpenAI synthesized the reply.
The input began as fictional eSpeak stock speech supplied to Chromium’s file-backed device. The browser recorded a new WebM/Opus file and uploaded it to the actual transcription route. The listening clip above is decoded and resampled from that upload to mono 24 kHz PCM WAV, with no cuts, speed change or volume normalization. Its converted bytes differ from the uploaded recording. The reply WAV preserves the exact generated and persisted bytes.
The observed model was claude-haiku-5-5 through Claude Engine and Claude CLI 2.1.292. The turn used Groq Whisper transcription and OpenAI tts-1 with Alloy speech. Exactly one PTT submission led to one observed Groq response, one SDK model turn and one observed OpenAI speech response. Model turns are not an inferred count of Anthropic HTTP requests or billed calls.
The private runtime used an empty SDK toolset, an explicit deny-all tool hook, one SDK turn, a $0.50 model budget, a configured 160-token output cap and an independent 240-second stop. The custom wrapper, isolated user/session/database/storage and intercepted queued jobs, broadcasts, notifications and mail are test substitutions. The normal voice policy stayed in place. No production writes or production application runtime use occurred.
The actual queue received and completed one final chunk, index zero. The separate three-note example below tests local multi-item ordering. Neither this file-backed recording nor the saved audio establishes a physical microphone, human audibility, digital output capture, device routing or Safari/iOS behavior.
Source snapshots: PanelForge 93881d2 / web-v10.20.97 and Claude Engine bf89abc / v6.17.0. Two fictional messages and zero tool calls were persisted; the isolated runtime was cleaned after the run.
A separate local ordering example. The three synthetic notes below exercise multi-item ordering. The recorded voice turn above returned one actual speech chunk.
A small working example
An incoming reply should not be what turns audio on. Try a sample reply, then choose Listen to enable this page.
Synthetic tones · actual PanelForge playback code
The last piece can arrive first. Playback waits for the earlier pieces and keeps their order.
Three short synthetic notes.
Sample reply: “Three short pieces, kept in order.” Its audio events arrived while sound was off.
Playback order: 1 → 2 → 3.
Stop clears playback. Once enabled, this page stays enabled.
The three notes are 330, 440 and 550 Hz, each 0.36 seconds long with a peak amplitude of 3.5% of full scale.
The page uses unmodified retained audio code from PanelForge, with authored WAV tones in place of speech. Incoming sample events are dropped until Listen enables audio. No microphone or speech service is connected.
Private desktop Chromium tests captured digital output and verified intent, ordering and Stop. They do not establish physical audibility, Safari or iPad behavior, or how another app’s music behaves.
The wider source proof passed 33 of 34 checks: a separate PCM restart race failed. A private correction passed 45 of 45 expanded checks. This example uses the unmodified source and exposes only the ordered file queue; the PCM correction is unreleased.
What this makes possible
The web voice mode provides a voice-to-voice loop for Claude Engine; PanelForge routes transcript and audio state through a session adapter.
Source information sheet
One fictional file-backed turn ran through actual PanelForge voice components and isolated server routes, Groq transcription, Claude Engine and OpenAI speech. The browser output was muted; one chunk completed and two messages persisted. The separate local three-note queue tests multi-item ordering. Neither is a physical microphone or device-routing claim.
Release anchor: web-v10.20.97.
Research cut: 15 October 2026. Source areas below are from panel-forge and claude-engine. Private conversation references are retained in the research ledger and are not published here.
The web voice mode provides a voice-to-voice loop for Claude Engine; PanelForge routes transcript and audio state through a session adapter.
The active phase remains visible, with audio settings close to the controls. A later correction makes audio activation an explicit choice, keeping incoming chunks quiet until the page has been enabled for sound.
Make the active voice phase visible and keep audio/TTS settings close to the session controls.
resources/js/composables/voice/useVoiceSession.tsresources/js/composables/voice/claudeEngineVoiceAdapter.tsresources/js/components/chat/ChatInputVoiceMode.vueresources/js/lib/audioRuntime.tsresources/js/composables/useWebAudioPlayer.tsapp/Http/Controllers/Api/TranscribeController.phpapp/Services/GroqTranscriptionService.phpapp/Services/EngineVoiceStream.phpexpress-ai-service/src/audio/AudioManager.tsclaude-engine: claude_engine/routes/stream.pyThe recorded turn uses actual voice components and real provider responses in an isolated wrapper, with fictional stock file-backed input and process-muted output. Its separate three-note example tests local multi-item ordering.
Dates describe the researched record, rather than today’s deployment.
web-v6.20.0
web-v10.20.5 — audio waits for an explicit gesture