voice
v0.1.1Speak to the console — bundled streaming speech-to-text for live dictation, optional host whisper.cpp for final-pass and file transcription, read-aloud, and remote speech providers, with a mic chip and a voice page.
Install
bash
iii trigger compose::add worker=voice@0.1.1Run in your project with the iii engine running. Exact versions are immutable and digest-pinned.
skill doc
SKILL.md
voice
Local speech-to-text and read-aloud on the iii bus. Nothing leaves the machine by default: a small streaming recognizer produces live text, while bundled Parakeet or a configured host whisper-cli can produce accurate final text. An OpenAI-compatible endpoint or any speech provider registered with llm-router can replace either half through configuration.
When to Use
- A user attached or named a WAV recording and wants its text:
voice::transcribe. - A surface streams microphone audio and wants live text:
voice::dictation::*. - A reply should be spoken:
voice::speak.
Boundaries
- Audio in is 16 kHz mono 16-bit PCM for dictation; WAV files of any rate for
voice::transcribe. No other container is decoded. - The bundled models are English. Portuguese and other languages need
stt.backend: whisper_cppwith a multilingual GGML model, or a remote backend. - For natural local read-aloud, install
piper-tts, enter your language in Voice's Piper language filter, choose a matching voice from the bundled multilingual catalog, explicitly download it, and selecttts.backend: piper.piper-pt-br-faber-mediumremains available for Brazilian Portuguese. Filtering does not download or change the active voice.tts.piper.commandis an executable path, not a shell command. No fallback to robotic eSpeak occurs if Piper is unavailable. tts.piper.devicedefaults toauto(request NVIDIA CUDA, allow ONNX Runtime CPU fallback; retry once on CPU if the GPU-preferred process fails).cpuforces CPU. Auto allocates 30 seconds per attempt; CPU-only gets 60 seconds. GPU requires compatible onnxruntime-gpu/CUDA/cuDNN in Piper's own environment. No drivers are auto-installed; doctor reports policy, not verified GPU usage.- In Console, Read selection speaks only highlighted text in that chat. Voice chat is opt-in per browser/conversation and reads live assistant text in sentence/phrase chunks before the turn ends (including visible progress, never thinking/tool arguments). It deduplicates snapshots and flushes only the unread tail at completion; it does not send messages or keep the microphone open. Stop disables automatic reading.
voice::speakacceptstext_format: markdown(default) to read prose without Markdown markers, hidden link URLs or block code;plainpreserves literal text. Chat selections use plain because they are already rendered. The character cap applies after conversion. No messages are modified and no remote links are fetched.- Every
voice::speakbackend returnsaudio_base64andmimeto the caller.hostgenerates WAV using say/espeak in file-output mode, never server playback. The requesting browser plays/stops its own audio; other clients are unaffected. - Dictation sessions idle past
session_idle_secsare closed by the worker.
Functions
voice::transcribe— a WAV file (path or base64) to text with timestamped segments.voice::dictation::start— open a session; transcript events go tooutput_function_id.voice::dictation::push— feed one base64 PCM chunk (risingseq).voice::dictation::stop— close a session and return its transcript (discardto drop it).voice::dictation::list— open sessions.voice::speak— read text aloud; returns aspeech_id.voice::speech::prepare— stateless Markdown snapshot preparation (text,complete); returns plain text andmax_chunk_chars. Withhold unfinished syntax, then queue plain-textvoice::speakclips in the requesting browser.voice::speak::stop— legacy compatibility, returnsstopped: 0. Stop browser audio locally.voice::models::list— local models, whether each is installed, and each one's license, author and source (Parakeet TDT 0.6B v2 is CC BY 4.0: keep the attribution if you copy its files elsewhere).voice::models::download— install a local model, checksum-verified.voice::models::remove— delete a downloaded model.voice::doctor— backends, model state, open sessions.
Reactive triggers
voice::transcript— partial, final, closed and error events of dictation sessions (filtersession_id).voice::session-started,voice::session-stopped— session lifecycle.voice::model-progress— download progress, one event per megabyte and a finaldone.