David
Blumenau
Menu
Feature atlas
ConnectionsA voice conversation with visible state

Make a spoken conversation visible.

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

A recorded request.
A spoken reply.

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

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.

02 / Saved reply

Moonlight Bellflower.

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.

Watch the recorded component flow
Continuous 20.88-second recording of the isolated component wrapper, including the real waits. The original browser output was muted. Its player’s completion events establish playback progression, not that a person heard speakers. The lower edge of the final reply is clipped in the capture; the exact saved text is readable above.
Source, method and limits

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.

Inspect the selected proof receipt

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

Sound when
you choose it.

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

Three pieces. One queue.

The last piece can arrive first. Playback waits for the earlier pieces and keeps their order.

  1. 1Low
  2. 2Middle
  3. 3High

Three short synthetic notes.

Audio off

Preparing audio controls. JavaScript is needed for this example.

Playback order: 1 → 2 → 3.

Stop clears playback. Once enabled, this page stays enabled.

About the sample and what was checked

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

Evidence, implementation & history Implementation inspected

What I checked

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.

Implementation decisions

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.

A path through the feature

  1. The consequence

    Make the active voice phase visible and keep audio/TTS settings close to the session controls.

Source areas

  • resources/js/composables/voice/useVoiceSession.ts
  • resources/js/composables/voice/claudeEngineVoiceAdapter.ts
  • resources/js/components/chat/ChatInputVoiceMode.vue
  • resources/js/lib/audioRuntime.ts
  • resources/js/composables/useWebAudioPlayer.ts
  • app/Http/Controllers/Api/TranscribeController.php
  • app/Services/GroqTranscriptionService.php
  • app/Services/EngineVoiceStream.php
  • express-ai-service/src/audio/AudioManager.ts
  • claude-engine: claude_engine/routes/stream.py

The 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.

Recorded history

Dates describe the researched record, rather than today’s deployment.

  1. web-v6.20.0

  2. web-v10.20.5 — audio waits for an explicit gesture