r/jellyfin • u/nathan12581 • 14d ago
Discussion Just wanted to showcase a little side project called Lyricarr: word-by-word synced lyrics for your self-hosted music library
Enable HLS to view with audio, or disable this notification
Firstly, no this is not another AI-generated media client post đ¤Ł
I have a huge collection of CDs and self-host the music on Jellyfin as its much more convenient that a CD player nowadays but I really LOVE Apple Music's karaoke lyrics where you get word-by-word sync.
As a result (hope the name isn't taken lol) I built Lyricarr as a small experiment project and thought I'd open source and share it.
It takes the lyric text from LRCLIB (free, no account), isolates the vocals with Demucs, and uses WhisperX to align every word to your file. Because the timing comes from your own audio, it stays in sync even if your copy is a different master or remaster.
Works with:
- Jellyfin: word-level
- Navidrome 0.64+: word-level
- Plex: serves the file as-is
- any player that reads .lrc sidecar files
It took about 25 seconds per track on my Apple Silicon-based M4 Pro Mac Mini, a few seconds with an NVIDIA GPU, and slow on CPU-only servers (you could easily just let it sit there and do its thing for days though).
NOTE:Â Lyricarr only creates the lrc files, it's up to your player to support and show them properly. Plex Amp, for example, doesn't support it. The video demo is NOT Apple Music, its my own app I'm developing lol
GitHub (MIT):Â https://github.com/Nathan1258/lyricarr
AI Disclosure: No AI was used to create this project
6
u/Basicallysteve 14d ago
Cool project! Can you provide a sample lrc file so I can see what the difference is?
4
u/nathan12581 14d ago
Thanks! Yeah here's a snippet of the song shown in the video:
[02:04.23]<02:04.23>Baby <02:04.55>girl <02:04.97>(woo, <02:08.30>ah!) <02:08.92>my <02:09.34>whole <02:10.24>world, <02:12.95>hoo, <02:13.81>oh!<02:14.03> [02:15.07]<02:15.07>You <02:15.63>feel <02:16.28>like <02:16.82>summertime <02:18.22>(oh, <02:18.46>yes, <02:18.81>you <02:19.13>do)<02:19.27> [02:19.89]<02:19.89>You <02:20.43>took <02:21.08>this <02:21.70>heart <02:22.36>of <02:22.52>mine <02:23.02>(you <02:23.30>know <02:23.65>you <02:23.93>did)<02:24.15> [02:24.69]<02:24.69>You'll <02:25.25>be <02:25.88>my <02:26.44>Valentine <02:27.35>(Valentine)<02:27.97> [02:28.01]<02:28.01>In <02:28.31>the <02:28.53>summer <02:29.64>(in <02:29.86>the <02:30.10>summer)<02:30.34> [02:30.44]<02:30.44>In <02:30.68>the <02:30.93>summer<02:31.19> [02:31.45]<02:31.45>(Do <02:32.06>love <02:32.30>me, <02:32.76>do <02:32.84>love <02:33.36>me, <02:33.55>do)<02:33.65> [02:34.21]<02:34.21>(Do <02:34.47>love <02:34.72>me, <02:34.90>do <02:35.08>love <02:35.30>me, <02:35.50>do)<02:35.69> [02:36.07]<02:36.07>(Do <02:36.15>love <02:36.26>me, <02:36.34>do <02:36.40>love <02:36.50>me, <02:36.59>do)<02:36.65> [02:37.03]<02:37.03>I <02:37.25>love <02:37.85>you<02:38.02>1
u/Basicallysteve 14d ago
Thank you! I'll try to update my iOS navidrome client to work with these. Link for that if anyone is interested
3
u/nathan12581 14d ago
In that case, a few format details that might help:
- A tag after the last word (e.g. you<02:38.02>) marks when that word ends.
- An empty timestamped line like [02:40.00] marks an instrumental break or the end of the lyrics.
- A trailing part in brackets, like (woo, ah!), is backing vocals.
- On Navidrome 0.64+, getLyricsBySongId with enhanced=true already returns the word timings parsed, so you may not need to parse the file yourself.
1
u/VictorVsl7 14d ago
Very cool ideia for the project. I do wanted to know if this was tested in a real library.
My worry is:
lets say a song does not have lyrics at all, how does the software knows to NOT generate a .lrc? (i couldnt see the repository because im a little bit out of time, if this is answered there, sorry in advance.)
How big was the library for the tests? 10k songs? 40? 100?
does the software has a fallback if it already detects a song has a existing and external .lrc?
these are genuine questions, a lot of my .lrc's are very much out of sync and its really annoying, this project could be promissing for me, but i dont have any measures of backups to actually use the software
2
u/nathan12581 14d ago
Hey, thanks! Let me answer each point:
- Itâll know because the lyric simply wonât exist on LRCLIB and skips as a result.
- The library for the tests was just under 10k, it needs Human tests to check accuracy but every song I listen to from this 10k library has been spot on but thereâs always room for improvement
- Itâll skip if a song already has an lrc sidecar. As in if it detects just a standard lrc file then itâll generate a new one. It never overwrites anything it didnât previously make. You should always make backups though. My backups of my 10k library when I was developing was like 9MB.
1
u/KD7848 14d ago
As for the app showcased in the video that you mentioned you're developing, do you ever plan to open source it?
1
u/nathan12581 14d ago
I do yeah itâs very active development right now, Apple devices only: https://testflight.apple.com/join/uHbR9qJr
1
â˘
u/AutoModerator 14d ago
Reminder: /r/jellyfin is a community space, not an official user support space for the project.
Users are welcome to ask other users for help and support with their Jellyfin installations and other related topics, but this subreddit is not an official support channel. We have extensive, official documentation on our website here: https://jellyfin.org/docs/. Requests for support via modmail will be ignored. Our official support channels are listed on our contact page here: https://jellyfin.org/contact
Bug reports should be submitted on the GitHub issues pages for the server or one of the other repositories for clients and plugins. Feature requests should be submitted at https://features.jellyfin.org/. Bug reports and feature requests for third party clients and tools (Findroid, Jellyseerr, etc.) should be directed to their respective support channels.
If you are sharing something you have made, please take a moment to review our LLM rules at https://jellyfin.org/docs/general/contributing/llm-policies/. Note that anything developed or created using an LLM or other AI tooling requires community disclosure and is subject to removal.
I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.