AI pronunciation coaching with phoneme-level analysis, articulatory feedback, and personalized practice.
LiltLab is an AI-powered pronunciation training platform for English learners, accent coaches, actors, remote professionals, public speakers, and creators who want more than generic right-or-wrong speech feedback. Users can paste or type text, record themselves reading it aloud, and receive detailed analysis at the word, phoneme, and prosody level, along with AI-generated coaching and optional reference audio.
The project solves a common gap in language and speech tools: most products can tell you whether something sounds wrong, but not what sound broke down, how severe the mismatch was, or what to practice next. LiltLab combines phoneme recognition, articulatory-distance scoring, visual feedback, and coaching workflows to make speech practice measurable and actionable.
- Features
- Tech Stack
- Architecture Overview
- Installation
- Usage
- Configuration
- Screenshots / Demo
- API / CLI Reference
- Tests
- Roadmap
- Contributing
- License
- Contact / Support
- Real-time pronunciation analysis for custom text passages and word practice.
- Phoneme-level alignment with articulatory-distance scoring and top-k predictions.
- Per-word scoring, difficult-word tracking, and saved practice history.
- Prosody visualization for pitch, stress, pauses, and speech rate.
- AI coaching powered by Gemini for next-step feedback and practice guidance.
- Reference audio generation and side-by-side comparison using ElevenLabs.
- Multiple persistence modes with local storage, Supabase, or Neo4j.
- Local development mode that works without production auth and database services.
- Repo-specific Tessl skills for developer context and repeatable workflows.
- Frontend: Next.js 16, React 19, TypeScript, Tailwind CSS 4.
- Backend: Next.js App Router API routes and a FastAPI analysis service.
- Speech and ML: wav2vec2 phoneme recognition, articulatory-distance scoring, local deterministic analysis fallback.
- Data and Auth: Supabase, Neo4j, Clerk.
- AI and Media: Gemini via Vercel AI SDK, ElevenLabs text-to-speech.
- Developer Tooling: Node test runner, ESLint, Python
unittest, Tessl.
flowchart LR
User[User] --> Client[Next.js Web App]
Client --> WebAPI[Next.js API Routes]
WebAPI --> AnalysisAPI[FastAPI Analysis Service]
AnalysisAPI --> SpeechModel[Phoneme Recognition + Articulatory Scoring]
WebAPI --> DB[(Supabase or Neo4j)]
WebAPI --> Auth[Clerk]
WebAPI --> TTS[ElevenLabs]
WebAPI --> Coach[Gemini]
The user interacts with a Next.js web application that handles recording, playback, and analysis views. The web layer calls a FastAPI-based analysis service for phoneme and prosody feedback, stores practice data in Supabase or Neo4j, and integrates with Clerk, ElevenLabs, and Gemini for authentication, reference audio, and coaching.
- Node.js 18 or later
- npm 9 or later
- Python 3.11 or later
- A Supabase project if you want relational persistence
- A Neo4j instance if you want graph persistence
- A Clerk application for production auth
- ElevenLabs and Google AI API keys for reference audio and coaching
- A Modal account if you want to deploy the full production analysis backend
git clone https://github.com/MasteraSnackin/LiltLab.git
cd LiltLabpython3 -m venv .venv
source .venv/bin/activate
pip install fastapi uvicorn modalcd web
npm install
cp .env.example .env.local
cd ..Set DATA_BACKEND in web/.env.local to one of the following:
localfor no external databasesupabasefor relational persistenceneo4jfor graph persistence
cd web
npm run neo4j:apply-schema
npm run neo4j:smoke
cd ..source .venv/bin/activate
modal setup
modal deploy api/app.py- Update
web/.env.localfor local development:
DATA_BACKEND=local
LOCAL_DEV_MODE=true
LOCAL_DEV_USER_ID=local-dev-user
MODAL_API_URL=http://127.0.0.1:8000
LILTLAB_API_KEY=local-dev-key- Start the local FastAPI analysis service:
source .venv/bin/activate
python3 -m uvicorn api.local_dev_server:app --host 127.0.0.1 --port 8000- Start the web app:
cd web
npm run dev- Open
http://localhost:3000, paste a passage, record audio, and review the generated analysis.
DATA_BACKEND=neo4j
LOCAL_DEV_MODE=false
NEO4J_URI=neo4j+s://<your-instance>
NEO4J_USERNAME=<your-username>
NEO4J_PASSWORD=<your-password>
NEO4J_DATABASE=neo4jcd web
npm run neo4j:apply-schema
npm run neo4j:smoke
npm run devUse the local backend directly to verify the analysis service:
curl -X POST http://127.0.0.1:8000/api/analyze \
-H "X-API-Key: local-dev-key" \
-F "audio=@sample.webm" \
-F "target=The weather is beautiful today."The main configuration file is web/.env.local. Start from web/.env.example and fill in the values that match your environment.
| Variable | Required | Description |
|---|---|---|
DATA_BACKEND |
Yes | Selects local, supabase, or neo4j. |
LOCAL_DEV_MODE |
Recommended for local setup | Enables local auth and storage fallbacks. |
LOCAL_DEV_USER_ID |
Local only | Fake user identifier used in local mode. |
MODAL_API_URL |
Yes | URL of the pronunciation analysis backend. |
LILTLAB_API_KEY |
Yes | Shared API key between the web app and analysis backend. |
NEXT_PUBLIC_SUPABASE_URL |
Supabase mode | Supabase project URL. |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Supabase mode | Supabase public client key. |
SUPABASE_SERVICE_ROLE_KEY |
Supabase mode | Server-side Supabase key used by API routes. |
NEO4J_URI |
Neo4j mode | Neo4j connection string. |
NEO4J_USERNAME |
Neo4j mode | Neo4j username. |
NEO4J_PASSWORD |
Neo4j mode | Neo4j password. |
NEO4J_DATABASE |
Neo4j mode | Neo4j database name, usually neo4j. |
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY |
Production auth | Clerk client key. |
CLERK_SECRET_KEY |
Production auth | Clerk server key. |
GOOGLE_GENERATIVE_AI_API_KEY |
Coaching | Gemini API key. |
ELEVENLABS_API_KEY |
Reference audio | ElevenLabs API key. |
ELEVENLABS_VOICE_ID |
Optional | Default reference voice. |
- Live demo:
<ADD LIVE DEMO URL HERE> - Product walkthrough video:
<ADD DEMO VIDEO URL HERE>
LiltLab does not expose a standalone CLI today, but it does include web and backend HTTP endpoints that power the application.
| Method | Endpoint | Purpose |
|---|---|---|
POST |
/api/analyze |
Uploads audio, runs pronunciation analysis, stores results, and returns user and reference analysis. |
POST |
/api/coach |
Generates coaching guidance for a practice result. |
GET |
/api/history |
Returns saved practice sessions for the active user. |
GET |
/api/passages/:id |
Returns a stored passage and related take data. |
GET |
/api/voices |
Returns supported voice options for reference audio generation. |
The local FastAPI service mirrors the production analysis surface and is useful for fast development without external infrastructure.
curl -X POST http://127.0.0.1:8000/api/analyze \
-H "X-API-Key: local-dev-key" \
-F "audio=@sample.webm" \
-F "target=Practice makes progress."LiltLab uses the Node test runner for frontend and server-side TypeScript tests, plus Python unittest for the local analysis backend.
cd web
npm test
npm run lint
npm run buildpython3 -m unittest tests/test_local_dev_server.py- Add production-ready deployment guides for Modal, Vercel, Supabase, and Neo4j.
- Expand adaptive coaching and personalized review loops for repeated mistakes.
- Introduce richer reference libraries for speeches, scripts, and accent targets.
- Improve observability, CI automation, and release workflows.
- Add more shareable progress views and learner analytics.
Contributions are welcome. If you want to improve LiltLab:
- Fork the repository.
- Create a feature branch from
main. - Make your changes with tests where appropriate.
- Run the local test and lint commands before opening a pull request.
- Open an issue or pull request at
https://github.com/MasteraSnackin/LiltLab.
Please use issues for bug reports, feature requests, and implementation discussions before large changes.
This project is licensed under the CC BY-SA 4.0 License. See LICENSE for details.
- Maintainer:
MasteraSnackin - GitHub:
https://github.com/MasteraSnackin - Repository:
https://github.com/MasteraSnackin/LiltLab - Issues:
https://github.com/MasteraSnackin/LiltLab/issues - Email:
<ADD MAINTAINER EMAIL HERE> - Website:
<ADD PROJECT WEBSITE HERE>

