開発者向けドキュメント
歌詞ファイル形式 — ALRC / LRC
同期歌詞(音楽に合わせて流れる歌詞)のファイル形式についての解説です。Think Songs が定めた .alrc(ALRC 1.0)を中心に、従来から広く使われている .lrc の文法も、凡例つきの実例で示します。自作のプレイヤーやタイミング作成ツールを書く方、手で歌詞ファイルを書きたい方に向けた内容です。
仕様の正本は機械可読な JSON で公開しています。パーサを書くときはこちらを参照してください。
GET /api/spec1. 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 のどちらでも構いません。