🎶

Intonavio

A singing practice app that turns any YouTube song into a pitch trainer. It separates the vocals from the music, plots the singer's pitch on a graph, and shows your voice on top of it while you sing. I built it because practicing at home without a teacher telling you "higher, lower" is mostly guesswork.

Any YouTube song Real-time pitch tracking AI stem separation
📱 iOS 🖥️ macOS
Intonavio Song Library
Song Library
Intonavio Practice View
Practice Mode
Intonavio Scores
Phrase Scores

How it works

Paste a link, wait about a minute, start singing.

🔗

Paste URL

Drop any YouTube lyrics video link

🎛️

Split stems

AI separates vocals from the instrumental track

📈

Analyze pitch

Extract the reference pitch from the vocal track

🎤

Sing along

Your voice plots on top of the reference, scored in real time

Two versions, same app

I built Intonavio twice. The first version was a full client-server system, ready to ship as a paid product. But the app market is brutal, and the amount of polish needed to actually sell it was way more than what I had. So I stripped out the backend and made a local-only version that anyone can build and run for free.

🏗️

Intonavio

Client-server

NestJS API with PostgreSQL and Redis

BullMQ job queue for stem splitting

Python worker with pYIN for pitch analysis

Cloudflare R2 for stems and pitch data

Apple Sign In, Google OAuth, JWT auth

Docker Compose on a VPS

The version I built to sell. Never shipped it.

Recommended
📱

IntonavioLocal

100% on-device

SwiftUI + SwiftData, no backend

Calls StemSplit API directly from the app

On-device YIN pitch analysis (Accelerate/vDSP)

Stems and data stored locally on your phone

No account, no sign in, no subscription

You bring your own StemSplit API key

Same app, no server. Just clone and build.

What changed between versions

Component Intonavio IntonavioLocal
Data PostgreSQL SwiftData
Files Cloudflare R2 Documents directory
Pitch analysis Python pYIN worker On-device YIN (Accelerate)
Stem splitting API via NestJS proxy Direct from app
Job queue Redis + BullMQ Swift async Task
Auth Apple/Google/JWT None needed
Infra Docker on VPS Just Xcode

Both versions feel the same when you're singing. The piano roll, scoring, and stem player are identical code. Only the plumbing behind it changed.

The practice screen

Lyrics at the top, piano roll pitch graph in the middle, controls at the bottom. Your voice is the green line. The reference is underneath.

Intonavio practice mode with real-time pitch overlay
📜

Synced lyrics

The lyrics video plays at the top, scrolling in time with the music so you always know what to sing next.

📊

Live pitch comparison

The piano roll shows the original singer's pitch. Your voice draws on top of it, green when you're close, red when you're off.

🔁

Loop anything

Set A-B markers on any phrase. Slow it down, repeat it, get it right before moving on.

🎧

Audio modes

Original track, instrumental only (instant karaoke), or isolated vocals to study the singer's phrasing.

Phrase-by-phrase scoring

Every phrase gets scored individually so you know exactly which parts of a song need more work.

Difficulty levels

Beginner

Wide pitch tolerance. Just get in the neighborhood.

⭐⭐

Intermediate

Tighter window. You need to be close.

⭐⭐⭐

Advanced

Almost spot on or it counts against you.

🎧

Best with headphones

Without headphones, the mic picks up the song from the speakers and has to filter it out. Headphones keep your voice clean and the pitch detection more accurate.

Intonavio phrase scores breakdown

Features

🎵

Any YouTube song

Paste a YouTube lyrics video URL. The app pulls the audio and prepares it for practice.

🎛️

AI stem separation

Vocals and instrumental split automatically. Karaoke any song, or isolate the singer to study their technique.

🎤

Real-time pitch detection

Sing into the mic and see your pitch plotted against the reference vocalist, live on a piano roll.

📜

Synced lyrics

Lyrics scroll in sync with the pitch graph so you always know where you are in the song.

🔁

A-B loop

Set markers on any section and repeat it until it clicks. Slow the tempo if you need to.

📊

Phrase-by-phrase scoring

See how you did on every phrase. Green when you're close, yellow when you're drifting, red when you're lost.

Three difficulty levels

Beginner gives you room to breathe. Advanced expects you to be almost spot on. Pick what matches your level.

🎹

Vocal exercises

Scales, arpeggios, intervals, vibrato. Same pitch detection and scoring as song practice.

Under the hood

I wrote all the docs before any code. Every screen, every data model, every API contract got designed on paper first. Then I built it in phases, mostly pair-programming with Claude.

iOS app

  • SwiftUI
  • AVAudioEngine for mic input and playback
  • Real-time pitch detection on-device

Backend (server version)

  • NestJS + PostgreSQL
  • Redis + BullMQ for job queues
  • Python worker (librosa + pYIN) for pitch analysis
  • Cloudflare R2 for stems and pitch data
  • Docker Compose

Built for singing practice

I started taking singing lessons and realized that practicing at home without feedback is just guessing. So I built this. If you want to see how close you actually are to the notes, grab the .ipa or clone the repo.