Skip to content

Voice input: project-aware vocabulary hints for speech-to-text #27752

Closed

Description

@jorgeluiso

Summary

Voice input is my primary way of communicating with T3 Code, but speech-to-text (STT) consistently mangles project-specific proper nouns. I propose that T3 Code maintain a list of vocabulary terms and pass them as recognition hints to each client's speech engine wherever the platform supports hinting.

Note on terminology: this concerns STT/dictation (speech → text), not TTS.

Real-world failures (my actual dictation)

Intended Engines produce What it is
Bun (the JavaScript runtime) Bone, barn, Bond, born A runtime I talk about constantly ("rebuild with Bun")
Repull Ripple, repool A vacation-rental API — never the Ripple cryptocurrency
El Hatillo Elatillo, "el Atillo", "A T O" A municipality near Caracas, Venezuela — a very local place name

General vocabulary survives fine. It is precisely the project and local vocabulary — the words I say most — that gets destroyed.

Why this belongs in T3 Code, not the STT engine

  1. T3 Code knows the input source. It knows a composer draft came from dictation versus typing. Hints should apply only to transcription sessions — never to typed input, autocomplete, or the agent model.
  2. T3 Code knows the project. Speech is highly context-bound. A generic engine has world knowledge; only T3 Code knows that in this repo "Bun" is a runtime. The same user in an anatomy project means bone, literally — hinting "Bun" there would be wrong. Per-project scoping prevents that cross-contamination.
  3. The vocabulary is shareable. A committed terms file means every contributor's dictation gets the project's terms right from day one.

Platform opportunities

  • iOS 26: the current implementation uses SpeechTranscriber, which does not accept vocabulary hints. DictationTranscriber does, via AnalysisContext.contextualStrings (and custom language models); the legacy SFSpeechRecognizer path offers SFSpeechRecognitionRequest.contextualStrings. This may require evaluating a module change for short-form composer dictation.
  • macOS desktop: system dictation offers no app-supplied hints — should degrade gracefully as a no-op.
  • Other clients/engines: each client maps the term list to its best native mechanism (e.g. Whisper-style prompt/keyterm biasing if a cloud or local engine is ever added), or no-ops where unsupported.

Hints are a bias, not a guarantee — capped (~100 phrases on Apple), and not a deterministic replacement. That is fine; even partial improvement removes most of the correction overhead.

Proposed design

The emphasis should be project-local and repo-committable, with an optional user-global list as a secondary source.

  • Committed project terms: T3 Code already discovers .t3code/vcs.json from a project (walking up from nested workspaces). A sibling file such as .t3code/speech.json — or a plain one-term-per-line text file — would fit that existing pattern and let a repo share its dictation vocabulary with every contributor.
  • Auto-generated candidates: an "Improve dictation terms" action could propose terms from the project name, dependency/package names, and the main tech stack. The user reviews and edits the list before it is saved/committed. Candidates must respect the platform hint cap (~100 on Apple), prioritizing explicitly added terms over generated ones.
  • Optional global terms: a user-level list in Settings for terms that follow the person across projects (e.g. local place names). Merged with project terms, deduplicated, with project terms taking priority when the cap forces a choice.
  • Scope: terms apply only to the active project's dictation sessions.
  • Privacy: hints stay on-device and go only to the local transcription engine.

Alternatives considered

  • External dictation apps with a custom dictionary: works, but the app-switching friction is why I use T3 Code's built-in mic.
  • Post-hoc correction by the agent (glossary in agent memory): helps after the fact, per-agent, and the mangled text still lands in the composer.
  • OS-level dictionaries: no project scope and no effect on T3 Code's transcription path.

Acceptance criteria

  • A project can commit a terms file (e.g. under .t3code/) that T3 Code picks up automatically for that project's dictation.
  • T3 Code can generate candidate terms from the project (name, dependencies, stack) for the user to review, capped to the platform hint limit.
  • A user can optionally define global dictation terms in Settings.
  • Dictation in a project is measurably biased toward its terms on at least one supporting client (iOS).
  • Typed input, other projects, and unsupported platforms are completely unaffected.

Activity

  1. jorgeluiso commented on Oct 30, 2026

    @jorgeluiso
    Author

    Additional data point on the "external dictation apps" alternative, from testing:

    I have a Superwhisper subscription, and to be fair, it does support a custom vocabulary — with its dictionary loaded, transcription of my problem terms mostly works. So the hinting approach itself is validated; this is not a request for an unproven technique.

    Two limitations keep it from solving the problem:

    1. App-switching friction. Leaving T3 Code to dictate in another app and come back breaks the flow, which is why I keep returning to T3 Code's built-in mic despite its weaker results on proper nouns.
    2. No project context. Superwhisper holds one global vocabulary. I work across several projects, and their vocabularies are different — terms that are essential in one project are noise (or actively wrong, per the Bun/bone example in the issue) in another. A single global list is not terrible, but it is a missed opportunity: dictation terms are inherently project-specific.

    That is exactly the gap only T3 Code can fill. It is the layer that knows which project is active, can load that project's committed terms, and can leave every other project's dictation untouched. An external dictation app, however good its engine, structurally cannot do that.

  2. locked and limited conversation to collaborators on Oct 30, 2026
  3. converted this issue into a discussion #27755 on Oct 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions