Skip to content

feat(swift-ios): on-device voice dictation with learned vocabulary - #3

Open
saphid wants to merge 13 commits into
feat/issue110-reasoning-selectorfrom
t3code/voice-swift-ios
Open

saphid wants to merge 13 commits into
feat/issue110-reasoning-selectorfrom
t3code/voice-swift-ios

Conversation

@saphid

@saphid saphid commented Aug 23, 2026

Copy link
Copy Markdown
Owner

Mic button in the composer drives Apple DictationTranscriber (iOS 26, mic permission only, fully on-device) with contextual vocabulary rebuilt each recording from the draft, recent thread messages, and titles. Live hypothesis types directly into the draft and refines in place; a halo glow behind the composer pulses with the live mic level; send works mid-dictation; Settings gains a Voice Dictation section (button toggle, keyboard-while-dictating toggle, Apple Dictation vs General speech model picker). Includes fixes from a cross-vendor review (cancellation races, teardown, backgrounding, correction-algorithm ranking).

Verified: full test suite green on simulator including 14 vocabulary tests; ran on an iPhone 16 Pro.

Built by Claude Fable 5 on Claude Code.

🤖 Generated with Claude Code

saphid and others added 13 commits August 21, 2026 11:38
The composer's reasoning level was read-only, so changing it meant opening
the model picker and reconfiguring the model. Make it an inline selector
instead.

The levels are read from the selected model's own option descriptor, so the
client never assumes which levels a provider exposes, and choosing one writes
the same selection shape the model picker's configuration screen writes
through the composer's existing selection binding. Descriptors that are not a
choice list, and values the model does not offer, keep the previous read-only
and hidden behavior.
On-device review of the selector asked for two changes. The two prompt-tier
"ultra" levels are not wanted in the composer, so the control excludes exactly
the `ultracode` and `ultrathink` choice ids and documents that as the single
product rule in an otherwise descriptor-driven control. A level excluded here
is still displayed while it is the effective one, so the composer keeps telling
the truth about a setting made elsewhere, but it is never offered or checked.

The composer sits at the bottom of the screen, where an adaptive menu flips
its contents and puts the highest level nearest the finger. Pin the menu to
the descriptor's declared order so the lowest level reads first.
…ulary

Mic button in the composer drives Apple's DictationTranscriber
(iOS 26, mic-permission only) with contextual strings extracted from
the draft, recent thread messages, and titles, plus a conservative
post-recognition corrector for near-miss jargon. Volatile partials
preview under the editor; finalized segments append to the draft.
DictationTranscriber over SpeechTranscriber because it is the only
module honoring contextual vocabulary.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sequential locale resolution (async calls cannot sit in nil-coalescing),
cancellable startup task with checkCancellation after every suspension,
full teardown on every engine failure path with weak engine captures to
break the results-task cycle, scenePhase and audio-interruption handling,
send disabled while dictation is active, exact-first correction ranking
with a plain-word fuzzy gate, UUID-fragment filtering, bounded
per-message extraction, and a static recording indicator.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ronment model

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ttings

The hypothesis now types directly into the draft and refines in place
(user edits mid-recording rebase the committed text instead of being
overwritten). Recording state is a red mic with a ring that breathes
with the live microphone level instead of a stop square. New device-
local Voice Dictation settings: hide the button, and choose between
Apple's Dictation model (contextual vocabulary) and General speech
model (better prose, corrections only).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…, caret follows dictation

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ation

The whole input surface (editor, mic, send) gets a soft accent glow that
pulses with the live microphone level; the equalizer bars are gone. Send
now works mid-dictation: the live hypothesis is already in the draft, so
sending cancels recognition and submits what is visible.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions github-actions Bot added size:XXL vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Aug 23, 2026
@github-actions

Copy link
Copy Markdown

Thread transfer impact

⚠️ The latest CI run did not produce a thread transfer result for 9bff637.

This comment will update automatically after the next completed run.

@t3dotgg
t3dotgg force-pushed the feat/issue110-reasoning-selector branch from 2524de5 to 4e361bf Compare September 6, 2026 22:17

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant