Back to all guides

LRC to TTML Conversion Guide

A deep dive on converting plain LRC and enhanced LRC into clean TTML. Covers format differences, metadata, and edge cases.

Converting LRC to TTML is common. This guide covers what the conversion actually does, how plain LRC and enhanced LRC differ in practice, and what happens to metadata along the way.

The shortcut

If you just want the tool, use the LRC to TTML converter. Paste your input, download the TTML. Keep reading if you want to understand what is happening underneath.

Plain LRC to TTML

Plain LRC has one timestamp per line. Each line becomes a single <p> in TTML with a begin attribute equal to the LRC timestamp. The end attribute is the next line's begin time.

[00:12.34]First line
[00:15.67]Second line

<!-- becomes -->

<p begin="00:00:12.340" end="00:00:15.670">First line</p>
<p begin="00:00:15.670" end="...">Second line</p>

The last line's end time does not exist in LRC. CallEditor uses the audio duration if you have loaded audio, or leaves the end undefined.

Enhanced LRC (eLRC) to TTML

eLRC has inline word timestamps in angle brackets. Each inline timestamp becomes a word boundary in TTML:

[00:12.34]<00:12.34>Hello <00:12.80>world<00:13.20>

<!-- becomes -->

<p begin="00:00:12.340" end="00:00:13.200">
  <span begin="00:00:12.340" end="00:00:12.800">Hello</span>
  <span begin="00:00:12.800" end="00:00:13.200">world</span>
</p>

The trailing inline timestamp (the last angle-bracket before the end of the line) serves as the end time of the last word. If there is no trailing timestamp, the last word's end falls through to the next line's begin.

Metadata handling

LRC metadata tags like [ti:Song Title], [ar:Artist], and [al:Album] map to the TTML metadata block. Title goes to <ttm:title>. Artist and album survive the conversion but are not always emitted by every TTML generator, since they are not part of the streaming platform ingestion schema.

What does not convert

LRC has no concept of:

  • Multiple agents or singers (duets)
  • Background vocals
  • Line-level metadata beyond the global tags

If your song needs any of these, the LRC to TTML conversion is a starting point, not the end product. Open the converted file in CallEditor and add agents, background vocals, and any other TTML- only structure.

Time format translation

LRC uses [mm:ss.xx]. TTML uses HH:MM:SS.mmm. The converter normalizes the format: [01:23.45] becomes 00:01:23.450. Both are the same moment in time, just different text representations.

Multi-timestamp LRC lines

Some LRC files use multiple timestamps per line for repeated choruses:

[00:30.00][01:30.00][02:30.00]Chorus line

The converter expands these into three separate <p> elements in TTML, one per timestamp. If the line has inline word timing, the inline times are used for the first occurrence and stripped from the repeats (because the inline times are absolute, not relative, and repeats need different absolute times).

Sanity checking the output

After conversion, open the TTML in CallEditor with the matching audio. Play through and check that the timing feels right. LRC timing is often approximate; TTML is more demanding. You will likely want to tighten a few word boundaries before delivery.

Ready to try it?

Better Lyrics

A browser extension that adds time-synced, animated lyrics to YouTube Music. Free, open source, and the reason CallEditor exists.

Visit better-lyrics.boidu.dev