開発者向けドキュメント

歌詞ファイル形式 — ALRC / LRC

同期歌詞(音楽に合わせて流れる歌詞)のファイル形式についての解説です。Think Songs が定めた .alrc(ALRC 1.0)を中心に、従来から広く使われている .lrc の文法も、凡例つきの実例で示します。自作のプレイヤーやタイミング作成ツールを書く方、手で歌詞ファイルを書きたい方に向けた内容です。

仕様の正本は機械可読な JSON で公開しています。パーサを書くときはこちらを参照してください。

GET /api/spec

1. 2 つの形式

Think Songs は 2 つの形式を扱います。拡張子ではなく中身で判別するため、.txt で保存されていても正しく読み込めます。

.alrc

標準

ALRC 1.0(Advanced Lyrics File Format)。Think Songs が定めた刷新形式で、こちらが標準です。旧 LRC とは非互換なので拡張子を分けています(.lrc を名乗らない=既存プレイヤーが誤読しない)。

.lrc

従来・互換用

従来の LRC / Enhanced-LRC。1990 年代から音楽プレイヤーで使われてきた事実上の標準で、1 行ごと(拡張すると 1 文字ごと)にタイムタグを置くだけの素朴な形式です。読み込み・書き出しに対応していますが、新しく作るなら .alrc をおすすめします。

判別は 1 行目で行います。1 行目が ALRC の識別行(# Advanced Lyrics File Format …)なら ALRC、それ以外は LRC として扱います。

2. ALRC 1.0 形式(本サービスの標準)

Think Songs が標準として使う形式です。ファイルは「識別行 → ヘッダ(key: value)→ 本文」の3 段構成で、本文は行頭の絶対時刻と、文字の左に置く相対秒でできています。従来の LRC で書けなかったことを書けるようにしたもので、その中身は 4 章で比べます。

# Advanced Lyrics File Format (version: 1.0)

title: 星の雫
artist: サンプル
lyricist: 作詞者名
rights: free  // jasrac / nextone / self / free
style.background-color: #0b1020

[00:04.000]<♥>{星|<0.30><0.55>}<0.85><1.20>ひかり<1.90><2.60><3.10>
  • # / //コメント。# は行頭にあるときだけ行コメント(色 #0b1020 と衝突しません)、// は行のどこでも以降がコメントです。1 行目の識別行は削除できません。
  • key: valueヘッダ。本文の最初の [ より前にすべて置きます。title / artist が必須で、album・lyricist・composer・arranger・taggedby・rights・jasrac・nextone を任意で書けます。
  • style.*作者の推奨スタイル。プロパティ名は CSS3 に準拠します(background-color / background-image / font-family / text-align / color など)。視聴者側の表示設定があればそちらが優先され、これはフォールバックになります。
  • [mm:ss.xxx]行の絶対開始時刻。長尺向けに [hh:mm:ss.xxx] も書けます(コロンの数で解釈)。本文の行はこれで始まります。
  • <♥>パート(声)タグ。行頭に置けばその行ぜんたい、行の途中に置けばそこから先に効きます。1 つのタグに記号を重ねると【ユニゾン】(同じ旋律を複数パートで)で、色を混ぜて 1 色にします:<♥♦>。タグを続けて 2 つ以上書くと【ハモリ】(別旋律を同時に)で、左から順に上・下(3 つなら上・中・下)に文字が塗り分けられます:<♥><♦>。両者は組み合わせられます:<♥♦><★> なら上の帯が ♥♦ のユニゾン、下の帯が ★ です。記号は ♥ ♠ ♣ ♦ ★ ● が組み込みですが、これは上限ではなく、作者が決めた記号も使えます。
  • <秒>相対タグ。行頭の時刻からの相対秒で、すぐ右の文字が歌い始める時刻を表します。終わりは次のタグ。行の最後の文字には終わりを示す末尾タグを置きます。
  • {基底|よみ}ふりがな。よみの中にも相対タグを置けるので、モーラ単位でタイミングを付けられます。表示は基底文字の上によみが乗り、スイープは基底のブロック単位で進みます。
  • タグ 2 連続「切る」。タグが 2 つ続いて間に文字が無いとき、前側は直前の文字の終わりになります。上の例では「ひかり」が 1.90 秒で切れ、次の「よ」は 2.60 秒から始まります。

3. LRC 形式(従来・互換のため対応)

行の先頭に [分:秒.小数秒] を書くだけの形式です。仕様書を発行する団体は存在せず、各社の実装が事実上の仕様になっています。日本語の一次情報としては、ソニーがウォークマン向けに「同期テキスト」として書式を公開しています。

[ti:星の雫]
[ar:サンプル]

[00:04.00]星の雫
[00:08.50]夜をわたる風
  • [ti:…]メタタグ。曲名 ti / アーティスト ar / アルバム al / 作詞 au / 制作者 by / 全体補正 offset など。
  • [mm:ss.xx]その行を表示し始める時刻。行の先頭に置きます。

📖 一次情報:ソニー ウォークマンの「同期テキスト」

ソニーのサポートページに、LRC ファイルの作りかたと書式が説明されています。

同ページによると、書式と制約は次のとおりです。

  • 時間情報は「分:秒:1/100秒」。秒と 1/100 秒の区切りは「:」でも「.」でもよい。
  • 1/100 秒は省略できる。
  • ファイル名は音声ファイルと同じ名前にして拡張子 .lrc を付ける。
  • 文字コードは UTF-8。ファイルサイズの上限は 512 KB。

※ 歌詞配信サービス「歌詞ピタ」は 2018 年 7 月末で終了しており、現在は自分で LRC を用意する形になっています。

文字単位のタイミング(カラオケ表示)

行の途中にも同じ書式のタグを置くと、1 文字ずつ色が変わるカラオケ表示になります。Think Songs はこの書き方に加えて、ふりがな {漢字|かんじ} とパート指定 [♥] にも対応しています(いずれも LRC の標準ではなく独自拡張です)。

[00:04.00][00:04.30][00:04.60][00:05.20]

末尾の、文字を伴わないタグは「最後の文字の終わり」を表します。これがないと最後の 1 文字だけ終わりの時刻が分からず、塗り終わりを推測するしかありません。

⚠️ LRC で困ること

  • 文字ごとにフルの絶対時刻を書くので長い。行を 0.5 秒ずらしたいだけでも、その行のタグを全部書き直すことになります。
  • 「ここで声が止まる」を表せません。ある文字は次の文字が始まるまで塗られ続けるので、歌っていない無音区間をスイープが進んでしまいます。
  • メタ情報がタグの寄せ集めで、作曲者・編曲者・権利関係などを書く場所が決まっていません。
  • 見た目(色・背景・書体)を作者が指定できません。ALRC ならパートごとの文字色まで指定できます。
  • コメントが書けず、制作メモを残せません。

4. ALRC で何ができるようになったか

見た目の派手さではなく、「LRC では書けなかったこと」が書けるようになった点が本質です。

① 相対タグ — 行をずらすのが 1 か所で済む

文字のタイミングを行頭からの相対秒で持つので、行全体を 0.5 秒後ろにずらしたいとき、書き換えるのは行頭の [mm:ss] だけです。絶対時刻を全文字に書く LRC では、その行のタグをすべて計算し直す必要がありました。タグ自体も短くなり、本文が目で追えます。

② 「切る」 — 声が止まる場所を書ける

LRC では、ある文字は次の文字が始まるまで塗られ続けます。歌が途切れる箇所ではスイープだけが無音の上を進み続け、見ていて音とズレます。ALRC はタグを 2 つ続けて置くことで「ここで終わり」を明示できます。この記法を知らない実装は 2 つ目のタグで上書きするだけなので、従来どおりに描画されます(=後方互換)。

③ ふりがな・パートが仕様の一部

ルビとパート(デュエット/ユニゾン)は独自拡張ではなく仕様に含まれます。ルビはモーラ単位でタイミングを持てるので、漢字 1 文字を読みの長さに合わせて塗ることができます。

④ 権利情報と見た目を 1 ファイルに持てる

作詞・作曲・編曲・権利区分・作品コードを決まったキーで書けるので、アップロード時にそのまま取り込めます。style.* で作者の推奨する配色・背景・書体も持ち運べます。

項目.alrc.lrc
行タイミング
文字タイミング○(行頭からの相対秒で短い)○(毎回フルの絶対時刻)
声が止まる場所○ タグ 2 連続で「切る」
ふりがな○ 仕様・モーラ単位のタイミング可△ 独自拡張
パート/ユニゾン/ハモリ○ 仕様(記号は自由)△ 独自拡張
メタ情報key: value(作詞・作曲・編曲・権利・作品コード…)[ti:] など数個のタグ
見た目の指定○ style.*(CSS3 準拠)
コメント○ # 行頭 / // 行内
長尺(1 時間超)○ [hh:mm:ss.xxx]△ 実装依存
改ざん検知・コピー防止○ protectedtag(Ed25519・端末バインド)
再生位置の補正○ offset:(利用者の申告平均をサーバーが注入)△ [offset:] 全体のみ

5. パーサを書くときの注意

互換性のために決めてあることです。

  • 未知の style.* は無視する。 前方互換のための決まりです。将来プロパティが増えても古い実装が壊れません。
  • タグ 2 連続を知らなくてよい。 実装しない場合は 2 つ目のタグで開始時刻を上書きするだけにしてください。従来と同じ描画になります。
  • ヘッダは本文より前。 最初の [mm:ss] 行が現れた時点でヘッダ領域は終わりです。それ以降の key: value は歌詞本文として扱います。
  • 形式は中身で判別する。 拡張子ではなく 1 行目の識別行で ALRC かどうかを決めます。
  • 配信時にサーバーが足すヘッダがある。 songid / userid / protectedtag / offset は配信のたびにサーバーが注入します。作者は書きません。再アップロードする前に取り除いてください。

文字コードは UTF-8 を推奨(Shift-JIS も読み込めます)。改行は LF / CRLF のどちらでも構いません。