Timed Lyrics Editor
Lyrics
Blank lines are dropped. A line that already starts with [mm:ss.xx] keeps that time.
Drop an audio file, paste the lyrics, then press play and tap the stamp key as each line starts. Nothing leaves this tab.
Shift every timed line
Exported .lrc
A line appears here once it has a time.
Lines with no time are left out of both exports: a line needs a stamp before it has a place on the timeline.
Keyboard
- K or Space — play / pause
- Left / Right arrow — 5 seconds back / forward
- R — stamp this line and move to the next
- T — insert a line after this one
- Delete — clear this line's time
- Up / Down arrow — move to the previous / next line
This page turns a song and a list of lines into a timed .lrc file. Load an audio file, paste the lyrics — plain text, one line per line, or an existing .lrc whose timestamps you want to adjust — press play, and tap a key at the moment each line starts. The stamp is taken from the audio element's current time, so it follows the file you are listening to rather than a clock in the page. When the last line is stamped, export the result as .lrc, or as .srt if the subtitle editor you are feeding needs one.
The lyric list is the whole model. A line has text and an optional start time; a line with no start time is one you have not reached yet. Unstamped lines stay in the editor so you can come back to them, but they do not appear in the export: a line without a start time has no position on the timeline, and inventing one would put a line on screen at a moment nobody chose. That is why a file exported halfway through a song is shorter than the list in front of you, not wrong.
Four operations cover what actually goes wrong while timing lyrics. Stamping sets a line to the current playback time, and the editor advances to the next line so a run of lines takes one keypress each. Clearing removes a stamp you landed a beat early. Inserting adds a line you forgot to paste. Shifting moves every stamped line by the same number of milliseconds, which is what you need after noticing that the whole file sits a second behind the vocal — the relative spacing stays intact, and a negative shift stops at zero rather than writing a timecode that players cannot read.
The timing model is the one LRC itself has. A line lasts until the next line begins; the final line has no next line, so it is given two seconds, the same width this site uses whenever a format has no end time of its own. When you export .srt, that is where the end times come from — the same derivation a conversion from an .lrc file makes on the converter pages, so the two routes produce the same timeline. Centiseconds are the precision .lrc can record; a stamp at 12.346 seconds is written as 12.34, which is why an exported file read back can differ from the editor by a few milliseconds.
The audio file is opened by the browser's own audio element and never read, parsed or uploaded by this page. There is no request carrying it anywhere; the only network traffic is the page itself. A draft of the line list is kept in this browser's local storage so an accidental reload does not cost you a session of work, and clearing site data removes it. Nothing about the song or the lyrics exists on a server after you close the tab.
Examples
Plain lyrics, stamped in one pass
Lyrics
First line of the song
Second line of the song
Third line of the songExported .lrc
[00:12.00]First line of the song
[00:15.30]Second line of the song
[00:18.75]Third line of the songEach stamped line is one cue. The .lrc export writes centiseconds, so 18.75 seconds is exactly what the keypress recorded; a stamp at 18.754 would be written as 18.75.
Re-timing an existing .lrc
Lyrics
[00:12.00]First line of the song
[00:14.00]Second line of the song
Third line of the songExported .lrc
[00:12.00]First line of the song
[00:14.00]Second line of the song
[00:17.75]Third line of the songPasting a .lrc keeps the timestamps it already has. The third line arrived with no timestamp, stayed unstamped until it was played, and was stamped at 17.75 seconds.
Frequently asked questions
Do the lines I have not stamped yet end up in the .lrc file?
No. An unstamped line has no start time, and .lrc positions a line by its timestamp only, so there is nothing to write for it. The line stays in the editor list with no time next to it, and the moment you play past it and press the stamp key it joins the export. This is deliberate rather than a limitation: the alternative is giving the line a made-up time, which puts it on screen at a moment you never chose — exactly the kind of silent invention this site avoids elsewhere.
How long does the last lyric line stay on screen in the .srt export?
Two seconds past its start time. .lrc has no end times at all — a line lasts until the next one starts — so the final line has nothing to inherit an end from. Two seconds is the same width this site uses for any format without end times, which means the .srt export of this editor and the .lrc-to-srt conversion page give the same timeline for the same stamps. If the song really holds that last line for eight seconds, shifting or editing the duration afterwards is honest about it; a guess hidden inside the exporter is not.
What happens if I shift the timeline back past the first line?
Those lines stop at zero and the editor says how many were clamped. A negative timecode does not exist in .lrc or .srt — a player given one either rejects the file or treats the line as starting at the very beginning. Shifting is meant to repair an offset such as noticing the whole file is a second late; when the requested shift would push the first line before the start of the track, the physically meaningful result is zero, and the rest of the lines keep their spacing relative to each other unless they were clamped too.
Can I paste an existing .lrc and fix only the lines that are wrong?
Yes — that is why the editor reads LRC timestamps on paste. Lines that already carry a [mm:ss.xx] tag keep their time; the text after the tag is what you edit; a line without a tag starts unstamped. Metadata lines such as [ti:], [ar:] and [offset:] are ignored on import rather than treated as lyrics, because they are not lines anyone sings. A line with several tags takes the first one, since the editor's model is one start time per line.
Does my audio file get uploaded so the page can read its duration or waveform?
No — and there is no waveform either. The audio is played by the browser's built-in audio element from a local file handle; this page never reads its bytes, never decodes it and never sends a request containing it. Timestamps come from the audio element's current playback position when you press the key, which is the same number a waveform would give you. Decoding a full album track for a waveform would cost memory and time without improving the stamp.
Why does the exported .lrc differ from the editor by a few milliseconds?
Because .lrc records centiseconds and the editor keeps integer milliseconds. A stamp at 12.346 seconds is written as [00:12.34] — rounding to the nearest hundredth, not truncating. Reading the file back gives 12.340 seconds, so the difference is at most five milliseconds per line, well below what a player can display. If you need the exact stamp, export .srt instead: it carries milliseconds, and the same cue model is what produces both files.