Proposed native-first implementation plan for fast, accessible typed or prepared speech on iOS and Android.
When speech is time-sensitive, the user should not have to navigate the full TTS studio, choose technical generation settings, wait without feedback, or lose the ability to communicate when the network fails. Quick Speak should optimize the path from intent to audible speech while preserving an obvious route to the full studio.
A user can open Quick Speak, type or select a pinned phrase, and activate one large Speak control. SpeakTrue uses the selected cloud voice when available and a clearly labeled platform voice fallback when cloud generation is unavailable or the user chooses offline mode.
AVSpeechSynthesizer and Android TextToSpeech fallback;Speak button becomes Stop during playback.Ready: local UI is immediately usable.Generating: cancellable cloud request with concise progress.Speaking with SpeakTrue voice: cloud artifact playing.Speaking with device voice: platform fallback is active and visibly distinct.Offline: cloud unavailable; device voice remains offered.Needs sign-in: cloud voice unavailable; device voice remains offered.Error: stable message with Retry and Use Device Voice.tts-generate path.Do not upload or save locally synthesized audio to Soundboard automatically. Save generated audio remains a cloud-artifact action with the existing canonical artifact contract.
Clear recent phrases.Add quick_speak_phrases only after the local interaction is validated:
| Field | Type | Notes |
|---|---|---|
id |
uuid | Stable shortcut/sync identity |
user_id |
uuid | Owner |
text |
text | Bounded; never emitted to telemetry |
locale_code |
text nullable | Device/cloud voice hint |
sort_order |
integer | User ordering |
is_pinned |
boolean | Synced pin state |
preferred_voice_id |
text nullable | Cloud voice preference, not a provider key |
linked_clip_id |
uuid nullable | Optional saved cloud artifact |
| timestamps | timestamptz | UTC |
Use RLS for owner CRUD, a maximum phrase count, idempotent upsert, and conflict rules based on updated_at plus a client mutation ID. Local-only users never need this table.
Platform references:
backend/supabase/functions/tts-generate/ and canonical artifact fields.quick_speak_phrases only in the sync slice.quick-speak-phrases-* handler/index/tests or a single resource handler with method dispatch.ios/SpeakTrue/ following current flat feature organization.ios/SpeakTrue/AIProxyService.swift and existing audio player behavior.AVSpeechSynthesizer adapter with injectable protocol for tests.ios/SpeakTrue/MainTabView.swift without hiding existing studio access.features/quickspeak/{data,presentation,ui} under android/app/src/main/java/com/speaktrue/.features/tts/data contracts where practical without coupling Quick Speak UI to TTS studio state.android.speech.tts.TextToSpeech behind an injectable lifecycle-aware service.Q01: Ship local iOS Quick Speak with cloud TTS — Risk: medium; Depends: interaction copy approval; Mode: HITL.
Add destination, composer, Speak/Stop, local recents, existing cloud generation/playback, error states, and focused view-model/UI accessibility tests. No backend or sync changes.
After this: an iOS user can type and speak a phrase through the familiar SpeakTrue voice path with fewer steps than the full studio.
Q02: Ship local Android Quick Speak with cloud TTS — Risk: medium; Depends: Q01 interaction review; Mode: AFK.
Add the parallel feature module, navigation, composer, Speak/Stop, local recents, cloud playback, tests, and the mandatory Android gate.
After this: the same focused cloud Quick Speak flow works on Android.
Q03: Add explicit device-voice fallback on iOS — Risk: high; Depends: Q01; Mode: HITL.
Add the synthesizer adapter, locale/voice selection, audio-session/interrupt handling, visible fallback labeling, offline/auth failure routes, and device tests.
After this: an iOS user can communicate with a device voice when cloud speech is unavailable.
Q04: Add explicit device-voice fallback on Android — Risk: high; Depends: Q02; Mode: HITL.
Add lifecycle-safe TextToSpeech initialization, language availability checks, audio focus, visible labeling, fallback preference, tests, and the Android gate.
After this: an Android user can communicate with a device voice when cloud speech is unavailable.
Q05: Add synced pinned phrases — Risk: high; Depends: Q01-Q04 and sync-default decision; Mode: HITL.
Add schema/RLS/API, migration rollback, local-first synchronization, conflict handling, pin ordering, clear/delete behavior, and cross-platform sync tests.
After this: a signed-in user’s pinned phrases follow them between iOS and Android while local-only use still works.
Q06: Connect favorites and saved audio — Risk: medium; Depends: Library L02 and Q05; Mode: AFK.
Allow a pinned phrase to link to an owned Soundboard clip, prefer valid cached audio, surface favorite library items as optional Quick Speak sources, and refresh expired URLs safely.
After this: frequently reused speech can play quickly from existing saved audio while remaining editable as text.
Q07: Add opaque-ID app shortcuts — Risk: high; Depends: Q05; Mode: HITL.
Add iOS App Shortcuts and Android shortcuts that resolve a phrase ID, open Quick Speak, require explicit Speak, handle sign-out/deletion, and prove that phrase text is absent from URLs/logs.
After this: a user can reach a pinned phrase from the operating system without navigating the app or leaking its text.
Q08: Accessibility and staged-release hardening — Risk: high; Depends: Q03-Q07; Mode: HITL.
Complete VoiceOver/TalkBack, Dynamic Type/font scale, switch/keyboard, reduced motion, audio-route, interruption, offline, lock-state, and rollback tests; release through independent flags.
After this: Quick Speak has accessibility and reliability evidence suitable for an allowlisted then broad release.
bash scripts/verify_android_ci_local.sh before commit/push.Disable Quick Speak UI, fallback, and shortcuts through separate flags. Leave local phrase data intact for re-enable. Keep synced phrase schema additive and readable; do not delete user phrases during feature rollback. Existing TTS generation and Soundboard contracts remain the fallback product path.