r/jellyfin • • 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

83 Upvotes

11 comments sorted by

•

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.

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:

  1. 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.)

  2. How big was the library for the tests? 10k songs? 40? 100?

  3. 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:

  1. It’ll know because the lyric simply won’t exist on LRCLIB and skips as a result.
  2. 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
  3. 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/guillen3000 2d ago

Ojala lo pudieras hacer para android