Word-level time-aligned lyric support (Enhanced LRC file)

Feature description:

Lyric files in an enhanced format with word timing tags, such as this example (from wikipedia):

[mm:ss.xx] <mm:ss.xx> line 1 word 1 <mm:ss.xx> line 1 word 2 <mm:ss.xx> ... line 1 last word <mm:ss.xx>
[mm:ss.xx] <mm:ss.xx> line 2 word 1 <mm:ss.xx> line 2 word 2 <mm:ss.xx> ... line 2 last word <mm:ss.xx>
...
[mm:ss.xx] <mm:ss.xx> last line word 1 <mm:ss.xx> last line word 2 <mm:ss.xx> ...  last line last word <mm:ss.xx>

It should be a kind of extension format for LRC. I hope Symfornium can support this feature.

Problem solved:

I hope the symfonium can make use of word time tag or just hide the tags.

Brought benefits:

This can result in a better lyrics display effect, at the very least, it won’t require manually removing these tags

Other application solutions:

Apple music

1 Like

No short term plans to support this as relatively complex, but I can filter them.

Can you send me a couple of files with those to check if there’s any different variations in the formats?

1 Like

Where do you even source elrc files?
I already have a hard time finding lyrics that are properly synced line by line, let alone word by word.
Or do you sync them yourself? And if so, with which program?

1 Like

Am I supposed to send these files to you via email or upload them here? I’ve examined these LRC files I have, and they are all in the same format. In fact, they were all downloaded from the same website. I’m sorry for not being able to provide more variations.

There’s a foobar2000 plugin called ESLyric (github.com) that can grab lyrics from some music websites.
There are also some methods to generate word time tags using AI, but I have never tried them.

2 Likes

Just upload here, if they are all in the same mm:ss.xx then it will be handled in next release. If there’s variation I’ve covered some but well we’ll see :slight_smile:

lrcs.zip (14.8 KB)

Thanks so yes they will be properly removed in next release.

Not sure I’ll add actual support for that anytime soon.

1 Like

Thank you very much for your work.

Thanks, I’ll check it out. Currently I use Lyrics Reloaded for MusicBee but the results for synced lyrics are lackluster at best.

Hi. Not sure if I should be sending this here or not but it seems that the extraction/removal of elrc didn’t work correctly for me.

I’m not able to send the music file now (it’s embedded lyrics) but I should be able to later.

What provider ? And yes I need the file to reproduce.

Same here.

Provider: Jellyfin and local (tried with both)
I noticed that the format is slightly different as there are three digits for milliseconds.

And the file: https://file.io/bZWFuwd6W0Uc

Yes this is a different one due to the 3 digits, will support those too.

Do you happen to know if there is something like an ISO or another kind of specification that states how synced lyrics should be formatted?
MusicBee for example saves them as:

[0:17.576]She'll be gone soon
[0:19.127]You can have me for yourself

while lrcget saves them this way:

[00:34.89] Using the Guardian as a shield
[00:37.33] To cover my thighs against the rain

Both are used in the wild and probably valid.

But I think Jellyfin does not support yet the 3 digits so it’s that’s your target use for now you should keep to 2.

1 Like

Good to know, thanks for the info.
I’m currently writing a python script to easily import/export all synced and unsynced lyrics from tags to .txt and .lrc files and back (import via mp3tag, export via ffprobe).
Maybe I’ll add a flag to “standardize” the lyrics to the 2 digit version during export where I have them as json.
Mixed formatting bothers me and ±5ms lost by rounding should not matter for lyrics.
I just wish there were a standard. German problem I guess. Anyways, thanks for clarifying. :smiley:

Unrelated but since you like Python :stuck_out_tongue:

I know a few users that could use a script that take the input from the json export of Symfonium user data and write back the ratings as tag in the files.

So if one day you need a script idea you can post it in The Tips and Tricks part.

Your lyrics scripts probably belongs there too for increased visibility.

I’ll think about it. The lyrics script is pretty much done and merrily imports from .txt to the UNSYNCEDLYRICS tag and from .lrc to the LYRICS tag and the other way around.
Both LYRICS and UNSYNCEDLYRICS can be changed in the script config to use different tags instead.

Rounding timestamps is such a headache that I decided to let jellyfin sort their detection out instead of truncating and losing precision.

During export, my script can optionally transform:
[0:00.000]LYRICS
and
[00:00.00] LYRICS
into
[00:00.000]LYRICS

And gives a hint for users that want the current version of jellyfin to detect the lyrics to change a [:-3] to [:-4] to truncate the ms to .00 instead.
I don’t like losing precision (even if it’s just 10ms) so the default is instead more padding for the .00 variety.
I’ll probably also add some performance optimisations so the script doesn’t run each line of each lyric through a regex on every run and instead skips when the first line is already in the target formatting or something like that.

Now I’ll just have to write documentation for all that, which will be another headache.

Once the script is on github and tested well enough to be trusted I’ll add it to the Tips and Tricks section here as well. :wink: