Clean successor to V3 (forge: lilith/atlilith). Seeded from local Mac working tree at ~/Code/@projects/@cocottetech/. node_modules and build artifacts excluded via .gitignore. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.6 KiB
4.6 KiB
voice-input-settings.screen
S2 settings category — voice + input config. Implements per brief S §S2. Reached from settings-root.screen.md "Voice & input" card. Voice: working.
Layout (full-screen sheet)
┌─────────────────────────────────────────────────┐
│ ◄ Settings Done │ 56pt
├─────────────────────────────────────────────────┤
│ │
│ ─── Speech-to-text ─── │
│ Recognizer: ● iOS native ○ Cloud (cocotte.io) │
│ Auto-punctuate: ☑ │
│ Auto-stop on silence: [ 2s ▼ ] │
│ │
│ ─── Text-to-speech (Cocotte's voice) ─── │
│ TTS engine: [ system-default ▼ ] │ speech-synthesis MCP picks
│ Voice character: [ warm-alto ▼ ] │ per available voices
│ Speak action receipts: ○ Always ● High-stakes ○ Off│
│ Speed: ━━●━━ 1.0× │
│ │
│ ─── Mic / push-to-talk ─── │
│ Tap behavior: ● Push-to-talk ○ Tap-and-release │
│ Long-press behavior: [ Cook-mode ▼ ] │
│ Voice trigger word ("hey cocotte"): ☐ enabled │ opt-in
│ ⓘ Background mic listening uses more battery. │
│ │
│ ─── Composer input ─── │
│ Default keyboard: [ system ▼ ] │
│ Auto-correct: ☑ Predictive text: ☑ │
│ Markdown shortcuts (`**`, `_`, `>`): ☑ │
│ │
│ ─── Voice register override ─── │
│ ○ Auto (let Cocotte pick) ● Hearth ○ Working ○ Plain│
│ ⓘ Forces all Cocotte copy to one register. │
│ │
└─────────────────────────────────────────────────┘
Components
| Component | Notes |
|---|---|
| STT | Recognizer choice (iOS-native = on-device; cloud = cocotte.io cloud transcription for hands-busy fidelity). |
| TTS | Engine + character + when-to-speak + speed. Hands off to speech-synthesis MCP. |
| Mic / PTT | Push-to-talk vs tap-and-release default; long-press routes to cook-mode or alternate. Voice-trigger opt-in (battery impact disclosed). |
| Composer input | Keyboard, autocorrect, predictive, markdown shortcuts. |
| Voice register override | Auto / hearth / working / plain. Auto = brief T register-by-surface; override = global. |
States
- Default (iOS-native STT, system TTS) — privacy-leaning defaults.
- Cloud STT selected — banner: "Audio is sent to cocotte.io for transcription, retained 30s. Override at any time."
- Voice trigger on — banner: "Background mic on. Battery impact: ~5% / day. Disable if unsure."
- Voice register forced — chip on settings-root.screen.md: "Voice override active."
- VoiceOver — same content read; mic settings have additional VoiceOver hints.
Interactions
- Tap recognizer radio → confirm sheet on cloud-STT switch (privacy disclosure).
- Tap TTS voice picker → speech-synthesis MCP voice list.
- Tap "Speak action receipts" → updates listen-rule for chat-home receipts.
- Tap voice register override → commits; chat-home banner reflects.
Edge cases
- No microphone permission — banner: "Cocotte doesn't have mic access. Grant in iOS Settings to enable voice."
- TTS voice unavailable (offline) — fallback to system default with chip "voice unavailable, using system."
- Reduced-haptics + mic active — single-haptic on mic-start; no haptic on each word recognized.
Related
- Brief S §S2 — parent.
voice.md— voice register source.- Brief J — speech-synthesis MCP.
- Brief X — accessibility override layer.
- chat-home.screen.md — composer mic affordance source.
Out of scope
- Per-language STT (English-only at P0).
- Custom TTS voice training (defer).