一個簡單的 LRC 檔案就是純文字,其中每一行歌詞前面都有一個帶方括號的時間戳,例如 [01:23.45]Example line,而 LRC 檔案產生器就是那個能根據一份歌詞列表、一個起始時間戳,以及每行之間固定的間隔,替你產生出該檔案的工具。大多數讀者會來到這裡,是因為他們想要讓同步歌詞在他們的音樂播放器中隨著音訊檔案捲動,而且他們想要一種確定性的方式來建立這個檔案,無需上傳音訊,也不必依賴會「聆聽」他們曲目的服務。一個現代化的瀏覽器型產生器完全在當前的分頁中執行:你在每一列輸入一行歌詞、設定第一個 [mm:ss.xx] 時間戳,以及 0.01–600.00 秒的間隔,還能選擇性地加入標題、演出者和專輯標籤,然後工具就會輸出一個 UTF-8 .lrc 檔案的完整文字內容,供你在本機下載。固定間隔只是被視為一份草稿,而非最終的時間點:人聲幾乎不會以完全等距的間隔開始,所以這個檔案是設計成可以在專用的編輯器中開啟,並根據實際錄音重新微調的。本文將逐步說明產生器在內部做了什麼、時間戳的算術實際上是如何運作的,以及究竟該如何使用它來產出一個能正常運作的同步歌詞檔案。

lrc file generator explained
LRC 檔案產生器解析:數學如何產出 LRC 檔案

LRC 檔案產生器實際上會產出什麼

LRC 檔案產生器的輸出是一個副檔名為 .lrc 的 UTF-8 純文字檔。在檔案內部,每一行有時間標記的歌詞都以 [mm:ss.xx] 開頭,後面緊接著歌詞文字——這是一種嚴格的、實質上的慣用格式,而非正式的標準。QuickLRC 參考資料將此描述為被最廣泛支援的子集,而像 Subforge 這樣的獨立解析器也確認了其算術:分鐘貢獻六萬毫秒、秒貢獻一千毫秒、小數點後兩位數代表百分之一秒。檔案頂端可選的中繼資料欄位——標題 ([ti:…])、演出者 ([ar:…]) 和專輯 ([al:…])——只有在填寫時才會輸出,並以一行空白與有時間標記的歌詞隔開,以提升可讀性。產生器會保持歌詞文字原封不動:它不會改寫一般歌詞行內的拼字、標點、大小寫、語言或版權聲明。它寫入檔案時也不會加上位元組順序記號 (BOM),如此一來,期待純 ASCII 的舊式播放器就不會在讀取第一個字元時出錯。這就是契約:一個以一組經過驗證的小型輸入為基礎所打造的、確定性且範圍嚴格的輸出。超出這個契約之外的行為,屬於播放器的職責——而這正是刻意為之,因為沒有任何兩個音樂播放器會以完全相同的方式解讀 LRC。

時間戳格式與為什麼百分之一秒很重要

在這個子集中,一個有效的時間戳包含兩位或三位數的分鐘、剛好兩位介於 00 到 59 之間的秒、一個小數點,以及剛好兩位的百分之一秒數字。有效的範例包括 00:00.00、09:59.99、10:00.00,以及 123:45.67。產生器支援最高達 999:59.99 的時間戳,但不會輸出小時欄位、以冒號分隔的格數、三位數的毫秒、逐字級別的尖括號時間戳、卡拉 OK 雙人對唱標記,或任何播放器專屬的延伸格式。這種狹隘的範疇正是讓檔案得以跨播放器流通的原因——它從不包含任何解析器無法辨識的內容。

百分之一秒之所以重要,是因為它是這個格式「兩位小數」規則下所能保留的最小單位。對單一一行人聲而言,1/100 秒的解析度已經綽綽有餘,而解析器的算術在每一步都是精確的整數運算:分鐘 × 60000 + 秒 × 1000 + 百分之一秒。相較之下,小數形式的秒數(例如像 2.50 這類數值)在浮點運算中被加總數千次時會喪失精度。產生器透過在產出任何列之前,將間隔一次性地轉換為整數百分之一秒,完全迴避了這個問題。

下表顯示了四個官方時間戳範例及其背後的整數毫秒值。

顯示的時間戳分鐘百分之一秒總毫秒數
00:00.000000
09:59.9995999599,990
10:00.001000600,000
123:45.6712345677,425,670

最右欄的算術遵循公式 分鐘 × 60000 + 秒 × 1000 + 百分之一秒——這與獨立解析器(例如 Subforge 的 LRC 時間實作)所使用的公式相同。

間隔的算術是如何運作的

間隔欄位接受任何介於 0.01 到 600.00 秒之間、且小數位數不超過兩位的小數。在內部,那個小數會在產出任何列之前,先被轉換為整數的百分之一秒數。所以 2.50 秒的間隔會剛好變成 250 個百分之一秒,0.01 秒的間隔會剛好變成 1 個百分之一秒,而 12.34 秒的間隔則會變成 1234 個百分之一秒。從那個時候開始,後續每一行都是將那個百分之一秒的值,加到上一行的百分之一秒總和上來定位——在整個執行過程中,完全不會重複進行任何小數運算。

假設起始時間戳為 00:12.34(也就是 1234 個百分之一秒),間隔為 2.50 秒(250 個百分之一秒)。前三行有時間標記的內容會變成:

第 1 行:1234 + 0 × 250 = 1234 個百分之一秒 → 00:12.34 第 2 行:1234 + 1 × 250 = 1484 個百分之一秒 → 00:14.84 第 3 行:1234 + 2 × 250 = 1734 個百分之一秒 → 00:17.34

這就是產生器將會為前三列產出的精確輸出。由於累計的總和是整數運算,即使經過數百行,反覆的加總也不會累積二進位浮點數的誤差。如果最終計算出來的時間戳超過 999:59.99,產生作業就會失敗,而且檔案不會被默默地截斷——這是一個強制的保證,而非一個輕微的警告。這件事很重要,因為一個讀到錯誤最終時間戳的播放器,可能會把檔案剩下的部分都視為不同步。

如果你想要在不必重做數學的情況下獲得不同的實際節奏,最實際的做法就是稍微調低或調高間隔、重新產生,然後把這個新檔案當作你的下一份草稿。

如何逐步使用 LRC 檔案產生器

LRC 檔案產生器完全在當前的瀏覽器分頁中執行,所以歌詞文字永遠不會離開你的裝置。整個工作流程很短而且是線性的。

  1. 開啟產生器,並把最多 500 行非空白的歌詞貼到歌詞欄位中,每一列放一行顯示的歌詞(總輸入字元最多 50,000 個,單一行的字元最多 500 個)。Windows、舊版 Mac 和 Unix 的行尾格式都接受;它們會在產生之前先被標準化,而且空白的列會被移除。
  2. 以 MM:SS.xx 的形式設定第一個時間戳(例如 00:12.34)。該欄位要求兩位或三位數的分鐘、兩位介於 00 到 59 之間的秒、一個小數點,以及剛好兩位的百分之一秒。
  3. 輸入連續行之間以秒為單位的間隔,介於 0.01 到 600.00 之間,最多兩位小數。這個值會在產出任何列之前,先被轉換為整數的百分之一秒。
  4. 選擇性地填寫標題、演出者和專輯欄位。它們會分別變成 [ti:…]、[ar:…] 或 [al:…] 標籤;每一個都會被修剪、限制在 120 個字元以內,並且會拒絕方括號或控制字元,如此一來單一欄位就無法注入額外的 LRC 標籤。空白的欄位會從檔案中省略。
  5. 閱讀預覽,它會顯示即將被儲存的完整文字。檢查第一個和最後一個時間戳,以確認整個執行結果落在 999:59.99 範圍內,而且與歌曲長度相符。
  6. 點擊下載來儲存檔案。下載的內容是一個副檔名為 .lrc 的 UTF-8 純文字檔,當有設定標題時,檔名會以標題命名(不安全的檔名標點會變成連字號),如果沒有設定標題,則命名為 synced-lyrics.lrc。編輯任何輸入都會清除先前的預覽,因此下載的檔案永遠會與你剛剛認可的預覽完全一致。

關於步驟 3 中所使用的底層「間隔與起始時間」算術,請參考 如何透過起始時間和間隔製作 LRC 檔案。下載之後,請把檔案連同實際錄音一起開啟,並在專用的 LRC 編輯器中微調個別的時間戳——產生器是草稿引擎,不是完工工具。

產生器刻意不做的事

這種狹隘的契約是刻意的,有好幾項功能是在範疇之外的。這個工具不會聆聽音訊、偵測語音、轉錄歌詞、對齊音素、辨識節拍,或估計演出時間。它也不會提供受版權保護的歌詞、搜尋目錄、辨識歌曲、確認所有權,或授予同步授權。歌詞文字仍然是使用者的責任——無論是複製它的權限,還是其中的拼字。

也有一些格式上的選擇是產生器會拒絕的。它不會輸出小時欄位、三位數的毫秒、enhanced-LRC 的尖括號逐字時間標記、卡拉 OK 雙人對唱標記,或任何播放器專屬的延伸格式。它不會默默地截斷超過 999:59.99 的最終時間戳。它不會插入控制字元或零散的方括號對,以免被解析器重新解讀為額外的 LRC 標籤。而且它不會把你的歌詞上傳到伺服器、儲存到帳號中,或傳送給 AI 服務——每一個輸入和每一項計算都會留在當前的分頁中。這個可靠的契約刻意維持得很小:驗證實質上的百分之一秒時間戳子集、將一個有範圍限制的小數間隔轉換為精確的百分之一秒、保留有範圍限制的歌詞文字、只輸出選擇性的 ti/ar/al 標籤、顯示完整且未經截斷的檔案,並下載與預覽完全相同的內容。

播放器相容性與為什麼你應該永遠進行測試

不同的音樂播放器支援不同的中繼資料標籤、時間戳精度、編碼、長分鐘數值,以及 enhanced-LRC 的延伸格式。一個能在某個播放器中完美捲動的檔案,到了另一個播放器可能會被完全忽略,或是中繼資料標籤在解析時被剝離。產生器無法保證跨播放器能有完全相同的解讀,因為那樣的保證不存在於任何單一地方——播放器會自行選擇要實作什麼,而 LRC 並沒有正式的標準機構來強制執行一個公分母。

實際的習慣很簡單:把你下載的檔案載入你實際使用的播放器、逐段檢查歌曲,並確認中繼資料標籤出現在預期的位置,且時間戳落在播放器支援的範圍內。如果有播放器拒絕 99:59.99 以上的長分鐘數值,就把受影響的那些行重新調整時間以符合範圍。如果播放器把 [ti:…] 當作字面上的歌詞,就移除標題標籤。產生器的工作止於產出一個可攜、保守的子集——超出那個子集以外的事,就是播放器的決定了。

這也是為什麼這個檔案最適合被視為一份草稿。實際的人聲鮮少以完全等距的間隔開始;一個固定間隔提供了一個可行的起點,但很少能與實際演出匹配。一旦預覽的文字被儲存,請在專用編輯器中將它開啟,並逐個微調個別的時間戳,直到它們落在正確的音節旁邊為止。