📱 Live on the App Store → https://apps.apple.com/tw/app/mirror-ai-speech-coach/id6764643543?l=en-GB
Mirror is a voice-first coaching system that turns a user's raw speech into a monetizable data asset. A new user speaks freely through a short guided conversation; the system refines that raw voice into three durable artifacts — a voice signature (pace, energy, and stylistic tags), a personal memory (structured profile and recurring themes), and a voice clone — and then sells coaching back to the user in their own refined voice. The data pipeline is the product: each spoken session deepens the signature and memory, which in turn makes the paid coaching more personal and harder to replace. This repository is a redacted public extract that demonstrates the client integration layer and the data architecture; the production backend, prompts, and secrets are intentionally absent.
Live app: https://apps.apple.com/tw/app/mirror-ai-speech-coach/id6764643543?l=en-GB
The app is live on the App Store with real, working features: guided voice calibration, voice-signature extraction, voice cloning, memory capture, and in-app coaching sessions.
Mirror follows a thin-client / managed-backend split. This extract contains the
client integration layer (Expo / React Native) and the data-model definitions;
the orchestration backend lives in a separate, private repository. A fuller
walkthrough is in docs/ARCHITECTURE.md.
The core loop is the calibration pipeline, which converts raw voice into refined, monetizable signal:
Raw voice (spoken replies)
│ 5-round guided conversation (LLM-generated questions, guide voice TTS)
▼
Captions ──► transcription + stylistic tagging ──► voice_captions
│
├──► aggregation ──► voice_signature (pace / energy / canonical tags)
├──► trait scoring ──► personality profile (best-effort)
├──► voice cloning ──► voice_id (clone trained from the longest sample)
└──► persona prompt ──► creator_persona (signature + memories + profile)
│
▼
Paid coaching: the user hears refined speech spoken back in their own
cloned voice; every new session feeds back into signature + memory.
Layered view:
Key client modules (illustrative):
- Calibration state machine — drives the round loop
(
pick-topic → asking → speaking → awaiting-user → processing → finalizing → done); only confirmed, non-empty replies advance a round. - API client — attaches the auth token, targets the configured backend,
and surfaces credit-exhaustion (
402) as a typed error. - Voice plumbing — uploads spoken replies for captioning, holds the
shared
VoiceSignature/ caption types, and refreshes the signature. - Streaming TTS — speaks with a fixed guide voice during calibration
(user has no clone yet), then switches to the user's cloned voice once a
voice_idexists.
The finalization step degrades gracefully: trait scoring, voice cloning, and persona generation are each best-effort, so a partial failure still lands the signature and the user can retry cloning later.
mirror-bda/
├── src/ Client integration layer (Expo / React Native)
│ ├── voice/ Calibration state machine, captioning, TTS, signature types
│ ├── memory/ Memory capture + structured profile data model
│ └── lib/ Authed API client, env wiring, shared helpers
├── docs/ Architecture and data-model documentation
│ └── ARCHITECTURE.md Calibration pipeline + layered system overview
├── data/ Redacted, anonymized data extracts (schema + demand evidence)
├── scripts/ Reproduction scripts for the demand evidence
├── .env.example Template for wiring your own backend / services
└── LICENSE MIT
This repository is a redacted extract, not a runnable clone of the production app. Its purpose is to demonstrate the client integration layer and the data architecture behind Mirror. The full application is live on the App Store (link above) with all features working.
To explore the client layer against your own backend:
- Install dependencies (Expo / React Native toolchain; Node 18+).
- Copy the environment template and point it at your own services:
Then fill in your own backend URL and your own database/auth project credentials. The repository ships no real project URLs, keys, or voice IDs — every value in
cp .env.example .env.local
.env.exampleis a placeholder. - Read
docs/ARCHITECTURE.mdalongsidesrc/to follow how a spoken reply travels from microphone to signature, memory, clone, and persona.
Because the backend orchestration is intentionally absent, the calibration and coaching endpoints will not respond unless you supply your own implementation behind the configured API URL.
The project's demand evidence is drawn from product, usage, and research signals — not marketing-channel numbers. The relevant inputs are:
- Usage signals — signups, calibration completions, coaching sessions, and captured memory entries, exported as anonymized, aggregated extracts.
- Research signals — a willingness-to-pay survey and qualitative responses from prospective users.
To regenerate the figures and tables from the anonymized extracts in data/:
# from the repository root
python scripts/<analysis_script>.py # see scripts/ for the exact entry pointsscripts/ contains the analysis entry points; data/ contains the
anonymized, aggregated inputs they consume. No raw user audio, transcripts, or
personally identifying information is included — only de-identified aggregates
sufficient to reproduce the reported product/usage/research metrics.
To keep this extract publishable while protecting users and proprietary work, the following are deliberately excluded:
- Backend implementation — the LLM orchestration, question-generation logic, trait-scoring code, persona-prompt generation, voice-clone training calls, and credit/billing accounting. Only the client-side contracts they satisfy are shown.
- Prompts — all system prompts and prompt-engineering details.
- Secrets and identifiers — real backend/database project URLs and
references, API keys (anon or service), voice-clone model IDs, and any
service credentials.
.env.examplecarries placeholders only. - User data / PII — raw audio, raw transcripts, email addresses, and any
individual-level records.
data/holds only de-identified aggregates. - Marketing data — acquisition-channel performance and growth-channel metrics are out of scope for this extract.
Mirror is built on the following open-source and third-party technologies:
- Expo / React Native — cross-platform mobile client framework.
- Supabase — authentication, Postgres, and object storage.
- Fish Audio — voice cloning and text-to-speech.
- Google Gemini — large-language-model generation used by the backend.
All trademarks belong to their respective owners. This repository integrates with these services but does not redistribute them.
Released under the MIT License — see LICENSE.
Author: Ray Tsai (R14922A21)
