AI-powered English pronunciation coaching: phoneme- and pitch-level speech analysis with interactive visual feedback. Vue 3 frontend, serverless AWS backend, and Wav2Vec2/SPICE ML model serving (PyTorch/TensorFlow, SageMaker/TorchServe).
0
stars
2
commits
Jupyter Notebook
primary language
Jun 24, 2026
updated
AI-powered English pronunciation coaching — analyze speech at the phoneme and pitch level, then visualize it against a native-speaker reference.
VoiceMatch is a full-stack, cloud-native application that helps learners improve their English pronunciation through fine-grained speech analysis and interactive visual feedback. Users record themselves (or pull a reference clip from YouTube), and the system breaks the audio down into words, phonemes, and a pitch/intonation contour, then renders the result on an interactive chart so they can compare their pronunciation against a native speaker and practice deliberately.
This is a monorepo containing the web frontend, a serverless backend, and a self-contained ML model-serving
toolkit (voicematch-models).
Pronunciation feedback tools usually stop at "right / wrong." VoiceMatch goes deeper: it aligns recognized words and phonemes to their timestamps, estimates the speaker's pitch contour, and overlays everything so a learner can see exactly which sounds and which intonation patterns drift from a native reference.
The platform is split into three cooperating components:

Phoneme-level breakdown and pitch contour for a spoken English phrase.
A recording (or a YouTube reference clip) is uploaded to S3, trimmed and transcoded server-side, then fanned out in parallel to three ML inference services. The backend fuses word/phoneme timing with an interpolated pitch contour and returns it to the frontend for visualization. The model services run either on AWS SageMaker (cloud) or locally as Docker containers (the same images, swapped by endpoint).
flowchart TD
user([User / Browser + Mic])
web["VoiceMatch Web<br/>(Vue 3 SPA)"]
yt[(YouTube reference clip)]
s3[(AWS S3<br/>recordings & downloads)]
backend["VoiceMatch Backend<br/>(AWS Lambda / Serverless)"]
subgraph models["VoiceMatch Models (SageMaker / Docker)"]
word["Word recognition<br/>Wav2Vec2 · PyTorch"]
phon["Phoneme recognition<br/>Wav2Vec2 · PyTorch"]
pitch["Pitch evaluation<br/>SPICE · TensorFlow"]
end
user -->|record / import| web
web -->|upload audio| s3
yt -->|/youtube/download| backend
web -->|/audio/process| backend
backend <-->|fetch / trim| s3
backend -->|audio stream| word
backend -->|audio stream| phon
backend -->|audio stream| pitch
word --> backend
phon --> backend
pitch --> backend
backend -->|words + phonemes + pitch contour| web
web -->|interactive chart| user
Request flow

| Layer | Technologies |
|---|---|
| Frontend | Vue 3, Vuetify, Pinia, TypeScript, Vite, Plotly.js, Tone.js, Web Audio API / AudioWorklets |
| Backend | Node.js, TypeScript, Serverless Framework, AWS Lambda, API Gateway, FFmpeg (fluent-ffmpeg), youtube-dl-exec |
| ML / Inference | PyTorch + Hugging Face Transformers (Wav2Vec2), TensorFlow + TensorFlow Hub (SPICE), pydub, datasets |
| Model serving | Docker, TorchServe, AWS SageMaker, DJL |
| Cloud / Infra | AWS S3, AWS Lambda, AWS SageMaker, ECR |
extendable-media-recorder + AudioWorklets, with client-side WAV/Opus encoding.voicematch-labs/
├── voicematch-web/ # Vue 3 SPA — recording, import, and visualization (primary frontend)
├── voicematch-backend/ # Serverless (AWS Lambda) API: audio ingest, trimming, model orchestration
│ └── src/
│ ├── handler/ # Lambda handlers: youtubeInfo, youtubeDownload, audioProcess
│ ├── services/ # predictions.ts — calls to the three ML inference services
│ └── utils/ # s3, ffmpeg, youtube-dl helpers
├── voicematch-models/ # Model-serving toolkit (Docker / TorchServe / SageMaker)
│ └── models/
│ ├── wordrecog/ # Wav2Vec2 word recognition
│ ├── phonerecog/ # Wav2Vec2 phoneme recognition
│ └── pitcheval/ # SPICE pitch evaluation
├── notebooks/ # Research notebooks (HF transformers, Wav2Vec2, pitch estimation)
├── voicematch-research/ # Exploratory model/training scripts
├── langchain-research/ # Unrelated LangChain experiments
└── web/ # Frontend scaffolds and Web Audio / worklet experiments
Note:
voicematch-modelsis documented separately and linked from the portfolio. See its README for model details and serving instructions.
Each component is self-contained. See the per-component READMEs for full instructions:
voicematch-web, voicematch-backend,
voicematch-models.
PATH# Build an inference image (example: word recognition)
cd voicematch-models/models/wordrecog
docker build -t voicematch-wordrecog:latest .
# Serve it (repeat for phonerecog and pitcheval on their own ports)
docker run --rm -d --name voicematch-wordrecog -p 7081:8080 voicematch-wordrecog:latest serve
The backend expects the three services on localhost:7081 (words), localhost:7082 (phonemes),
and localhost:7083 (pitch). See voicematch-backend/src/services/predictions.ts.
cd voicematch-backend
npm install
cp .env.example .env # fill in AWS region / bucket values
npm run debug # serverless offline on http://localhost:3000
Endpoints: GET /youtube/info, GET /youtube/download, GET /audio/process.
cd voicematch-web
npm install
npm run dev # Vite dev server
Released under the MIT License.
2 commits
Jupyter Notebook
97.7%
Vue
1.2%
AI-powered English pronunciation coaching: phoneme- and pitch-level speech analysis with interactive visual feedback. Vue 3 frontend, serverless AWS backend, and Wav2Vec2/SPICE ML model serving (PyTorch/TensorFlow, SageMaker/TorchServe).
0
stars
2
commits
Jupyter Notebook
primary language
Jun 24, 2026
updated
AI-powered English pronunciation coaching — analyze speech at the phoneme and pitch level, then visualize it against a native-speaker reference.
VoiceMatch is a full-stack, cloud-native application that helps learners improve their English pronunciation through fine-grained speech analysis and interactive visual feedback. Users record themselves (or pull a reference clip from YouTube), and the system breaks the audio down into words, phonemes, and a pitch/intonation contour, then renders the result on an interactive chart so they can compare their pronunciation against a native speaker and practice deliberately.
This is a monorepo containing the web frontend, a serverless backend, and a self-contained ML model-serving
toolkit (voicematch-models).
Pronunciation feedback tools usually stop at "right / wrong." VoiceMatch goes deeper: it aligns recognized words and phonemes to their timestamps, estimates the speaker's pitch contour, and overlays everything so a learner can see exactly which sounds and which intonation patterns drift from a native reference.
The platform is split into three cooperating components:

Phoneme-level breakdown and pitch contour for a spoken English phrase.
A recording (or a YouTube reference clip) is uploaded to S3, trimmed and transcoded server-side, then fanned out in parallel to three ML inference services. The backend fuses word/phoneme timing with an interpolated pitch contour and returns it to the frontend for visualization. The model services run either on AWS SageMaker (cloud) or locally as Docker containers (the same images, swapped by endpoint).
flowchart TD
user([User / Browser + Mic])
web["VoiceMatch Web<br/>(Vue 3 SPA)"]
yt[(YouTube reference clip)]
s3[(AWS S3<br/>recordings & downloads)]
backend["VoiceMatch Backend<br/>(AWS Lambda / Serverless)"]
subgraph models["VoiceMatch Models (SageMaker / Docker)"]
word["Word recognition<br/>Wav2Vec2 · PyTorch"]
phon["Phoneme recognition<br/>Wav2Vec2 · PyTorch"]
pitch["Pitch evaluation<br/>SPICE · TensorFlow"]
end
user -->|record / import| web
web -->|upload audio| s3
yt -->|/youtube/download| backend
web -->|/audio/process| backend
backend <-->|fetch / trim| s3
backend -->|audio stream| word
backend -->|audio stream| phon
backend -->|audio stream| pitch
word --> backend
phon --> backend
pitch --> backend
backend -->|words + phonemes + pitch contour| web
web -->|interactive chart| user
Request flow

| Layer | Technologies |
|---|---|
| Frontend | Vue 3, Vuetify, Pinia, TypeScript, Vite, Plotly.js, Tone.js, Web Audio API / AudioWorklets |
| Backend | Node.js, TypeScript, Serverless Framework, AWS Lambda, API Gateway, FFmpeg (fluent-ffmpeg), youtube-dl-exec |
| ML / Inference | PyTorch + Hugging Face Transformers (Wav2Vec2), TensorFlow + TensorFlow Hub (SPICE), pydub, datasets |
| Model serving | Docker, TorchServe, AWS SageMaker, DJL |
| Cloud / Infra | AWS S3, AWS Lambda, AWS SageMaker, ECR |
extendable-media-recorder + AudioWorklets, with client-side WAV/Opus encoding.voicematch-labs/
├── voicematch-web/ # Vue 3 SPA — recording, import, and visualization (primary frontend)
├── voicematch-backend/ # Serverless (AWS Lambda) API: audio ingest, trimming, model orchestration
│ └── src/
│ ├── handler/ # Lambda handlers: youtubeInfo, youtubeDownload, audioProcess
│ ├── services/ # predictions.ts — calls to the three ML inference services
│ └── utils/ # s3, ffmpeg, youtube-dl helpers
├── voicematch-models/ # Model-serving toolkit (Docker / TorchServe / SageMaker)
│ └── models/
│ ├── wordrecog/ # Wav2Vec2 word recognition
│ ├── phonerecog/ # Wav2Vec2 phoneme recognition
│ └── pitcheval/ # SPICE pitch evaluation
├── notebooks/ # Research notebooks (HF transformers, Wav2Vec2, pitch estimation)
├── voicematch-research/ # Exploratory model/training scripts
├── langchain-research/ # Unrelated LangChain experiments
└── web/ # Frontend scaffolds and Web Audio / worklet experiments
Note:
voicematch-modelsis documented separately and linked from the portfolio. See its README for model details and serving instructions.
Each component is self-contained. See the per-component READMEs for full instructions:
voicematch-web, voicematch-backend,
voicematch-models.
PATH# Build an inference image (example: word recognition)
cd voicematch-models/models/wordrecog
docker build -t voicematch-wordrecog:latest .
# Serve it (repeat for phonerecog and pitcheval on their own ports)
docker run --rm -d --name voicematch-wordrecog -p 7081:8080 voicematch-wordrecog:latest serve
The backend expects the three services on localhost:7081 (words), localhost:7082 (phonemes),
and localhost:7083 (pitch). See voicematch-backend/src/services/predictions.ts.
cd voicematch-backend
npm install
cp .env.example .env # fill in AWS region / bucket values
npm run debug # serverless offline on http://localhost:3000
Endpoints: GET /youtube/info, GET /youtube/download, GET /audio/process.
cd voicematch-web
npm install
npm run dev # Vite dev server
Released under the MIT License.
2 commits
Jupyter Notebook
97.7%
Vue
1.2%