GitHub - rick-ray-wldd/mirror-bda: Mirror — AI Speech Coach: a system that monetizes data (NTU BDA final project, redacted public extract) · GitHub
Skip to content

rick-ray-wldd/mirror-bda

Folders and files

Repository files navigation

Mirror — AI Speech Coach (BDA Final Project, redacted public extract)

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.


Architecture summary

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:

Layer Responsibility In this extract
Client (Expo / React Native) Calibration state machine, recording, TTS playback, authed API client, UI wiring Yes — see src/
Data model Captions, signatures, personas, memories, user records Yes — schema/types in src/ and data/
Backend (private) LLM question generation, trait scoring, persona-prompt generation, voice-clone training, credit accounting No — intentionally omitted
External services Speech-to-text, voice cloning/TTS, LLM, auth/DB/storage Referenced only; no keys or IDs

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_id exists.

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.


Repository layout

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

How to run / explore

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:

  1. Install dependencies (Expo / React Native toolchain; Node 18+).
  2. Copy the environment template and point it at your own services:
    cp .env.example .env.local
    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 .env.example is a placeholder.
  3. Read docs/ARCHITECTURE.md alongside src/ 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.


Reproducing the demand evidence

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 points

scripts/ 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.


What is intentionally omitted

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.example carries 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.

Open-source attribution

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.


License

Released under the MIT License — see LICENSE.

Author: Ray Tsai (R14922A21)

About

Mirror — AI Speech Coach: a system that monetizes data (NTU BDA final project, redacted public extract)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

Contributors