Wassim Soltani
Lyrica

I give it a song and its lyrics. It pulls out the voice, times every word with machine learning, and hands me the result to check by ear.

A private appSince Oct 4, 2026

Why I built it

Over five years without a video
201620182020202220242026
About 2016A first channel with 2 videos. I lost access to it.
Feb 2018First video on my current channel: a couple of months between classes.
Sep 2020 – Feb 20214 more videos. Some reached 12k, 15k and 24k views.
2021 – 2026Over five years without a video.
Oct 4, 2026The first Lyrica prototype. I can post again.
I don't like those lazy videos that just print an entire section on screen.

I've made lyric videos for fun for about ten years. I like the ones where you can tell care went into them, so I synced every line, and often every word, by hand and by ear. With my attention to detail, a good video took me well over a month.

People liked them, but the timing was so tedious that I stopped in 2021, even though I loved making them. Lyrica does that hardest part now, so I can post again and spend my time on the creative side.

From a song to timed words

All of this runs on my own GPU. A 3:17 song takes about 53 seconds on an RTX 3060 Ti.

each line’s start timegoes to word timing
The original file is never touched.Lyrica decodes a copy to analyse and keeps the upload exactly as it was, at its full bit depth and sample rate, for the finished video.
My text is the source of truth.Section tags become the song's sections and are never timed as words. (x2) at the end of a line means it's sung twice, and a line in parentheses is a backing vocal that still gets timed.
Listen to the voice alone.Every later step works on the isolated vocal, so drums and guitars can't drag a word off its spot. The vocal is saved under the audio's fingerprint, so analysing a song again skips this step.
Borrow the timing, never the words.Lyrica looks the song up on LRCLIB and matches my lines to its synced lines with Needleman–Wunsch, the same kind of alignment used on DNA, so missing or extra lines don't throw it off. Only the start times are kept, as soft hints for the word timing.
Ask where, not what.Lyrica never asks a model what was sung: screams and stretched vowels make that hopeless. It already has the words, so a multilingual wav2vec2 model scores every letter at every moment, and one Viterbi pass over the whole song finds the best path through all of them. In one pass, lines can't steal syllables from each other, and no word can land where the vocal is silent.
Words end when the singer stops.This kind of model places letters on short spikes, so raw word ends come too early. Each word is stretched while the voice stays loud, and long holds are marked as held notes. Singing that no word covers is tested against the lines around it, to catch a line sung twice but written once.
Sections come from my tags.Each tagged section gets its real start and end from the timed words, and the audio only fills the gaps, like an intro or an instrumental. Tempo, beats, and the low, mid and high end are measured 50 times a second.
I still sign off on every word.Each word comes with a confidence score: how strongly the model preferred that letter over every other at that moment. Under 0.3, the word is underlined in the editor. I listen, fix what's off and tick it off, and I can always go back to what the agent produced.

Where it runs

The app lives on Cloudflare. The heavy lifting happens on my own PC.

AnywhereCloudflareAt home
MeThe only user. No accounts, sign-up or roles.
Cloudflare AccessSign-in required for every page and API call.
WorkerAPI and web app. Uploads go to R2 in 32 MB parts, with no storage keys.
D1Songs, lyrics and status. 30 days of point-in-time restore.
Job hubDurable Object: the job queue and the agent's WebSocket. Dropped jobs are requeued.
R2Audio and analyses. A daily job deletes orphaned files.
Lyrica AgentOutbound connection only, authenticated with a token. No open ports.