タイムタグ規格書(再整理版)

に公開

はじめに

歌唱タイミングをデータとして表現し、音楽関連ソフトウェアなどでの取り扱いを可能にする「タイムタグ」について、2000 年頃に駄歌詞屋本舗様が規格をとりまとめて公開してくださっていました。ありがとうございます。しかし残念ながら、ホスティングサービスの終了と共に消滅してしまいました。

Internet Archive には残っています(以降「原著」と言います)が、検索で発見しづらかったり動作が重かったりして不便なため、ここに改めて整理します。加えて、最新の状況も反映します。

概要

本文書は、タイムタグを規定します。タイムタグは、歌において歌詞が発声されるタイミングをデータとして表現するためのものです。

元々タイムタグには正式な規格が存在しませんでしたが、原著において当時の一般的な内容が整理されました。本文書はそれに最新の状況を反映するとともに、使われなくなった内容を削除し、再整理したものです。

従って本文書は唯一無二のタイムタグ規格仕様書ではありませんが、なるべく多くのソフトウェアが本規格に準拠することによって、ソフトウェア間での矛盾がなくなっていくことを期待します。

タイムタグの定義

タイムタグの原則

  • 曲の演奏開始を基準とした時刻を表現するタグを「タイムタグ」といいます。
  • 1 つのタイムタグは [ ] で囲まれ、間に時刻を表現する数字および : が入ります。
  • タイムタグを構成する文字はすべて半角でなければなりません。
  • タイムタグには「秒単位タイムタグ」と「拡張タイムタグ」の 2 種類があります。

秒単位タイムタグ

フォーマット
[xx:yy]
  • 曲の演奏開始を基準とした時刻を秒単位で表現するタイムタグです。
  • [] の間には、数字 2 文字(上記フォーマットの xx の部分)、:、数字 2 文字(上記フォーマットの yy の部分)が入ります。
    • よって、 [ ] を含めて全部で 7 文字となります。
  • xx には分単位の数字が入ります。1 桁の場合は先頭に 0 を付与し、必ず 2 桁にします。0 分の場合 xx は 00 です。
    • xx の最小値は 00、最大値は 99 です。この範囲外の分を表現することはできません(してはなりません)。
  • yy には秒単位の数字が入ります。1 桁の場合は先頭に 0 を付与し、必ず 2 桁にします。0 秒の場合 yy は 00 です。
    • yy の最小値は 00、最大値は 59 です。この範囲外の秒を表現することはできません(してはなりません)。
  • 秒単位タイムタグの最小値は [00:00]、最大値は [99:59] です。
時刻 ✅ 正しい例 ❌ 誤った例
1 分 5 秒 [01:05] [1:05] [01:5] [1:5](桁不足)
[00:65](秒の最大値オーバー)
[01:05](全角文字が使われている)
実装のヒント
  • 誤った例のようなタイムタグを拡大解釈してエラーとならないようにする実装も技術的には可能ですが、原著では、誤った書き方を許容しないことが正しい規格普及に必要であるとして、タイムタグとして認識しないことが推奨されています。
  • 歴史的経緯により秒単位タイムタグが規格化されているものの、秒単位タイムタグでは歌唱タイミングを正確に表現するのは困難です。規格上、秒単位タイムタグを正しく読み込めることは必要ですが、秒単位タイムタグは互換性確保のために用いることとし、次節の拡張タイムタグを主に用いるほうが良いでしょう。

拡張タイムタグ

フォーマット
[xx:yy:zz]
  • 曲の演奏開始を基準とした時刻を 10 ミリ秒単位で表現するタイムタグです。
  • [] の間には、数字 2 文字(上記フォーマットの xx の部分)、:、数字 2 文字(上記フォーマットの yy の部分)、:、数字 2 文字(上記フォーマットの zz の部分)が入ります。
    • よって、 [ ] を含めて全部で 10 文字となります。
  • xx および yy については秒単位タイムタグと同様です。
  • zz には 10 ミリ秒単位の数字が入ります(言い換えると、秒未満の小数点以下第 2 位までの数字が入ります)。1 桁の場合は先頭に 0 を付与し、必ず 2 桁にします。0 ミリ秒の場合 zz は 00 です。
    • zz の最小値は 00、最大値は 99 です。この範囲外の秒未満を表現することはできません(してはなりません)。
  • 拡張タイムタグの最小値は [00:00:00]、最大値は [99:59:99] です。
時刻 ✅ 正しい例 ❌ 誤った例
1 分 5 秒 75
(750 ミリ秒)
[01:05:75] [1:05:75](桁不足)
[00:65:75](秒の最大値オーバー)
[01:05:750](秒未満の最大値オーバー)
[01:05:75](全角文字が使われている)
2 分 3 秒 04
(40 ミリ秒)
[02:03:04] [02:03:4](桁不足)
[02:03:40](400 ミリ秒として扱われる)
実装のヒント

誤った例のようなタイムタグを拡大解釈してエラーとならないようにする実装も技術的には可能ですが、原著では、誤った書き方を許容しないことが正しい規格普及に必要であるとして、タイムタグとして認識しないことが推奨されています。

歌詞ファイルの定義

歌詞ファイルの原則

  • 歌詞ファイルは、一般的なテキスト形式とします。
  • 文字コードは、原則として UTF-8 を用います。
    • 他の文字コードにも対応することに対して制限はありません。
  • 改行文字は、0x0d,0x0a (CRLF) / 0x0d (CR) / 0x0a (LF) のいずれかを用います。
  • 歌詞ファイルの内容には、歌詞を表現する文字列、タイムタグ、@ タグ(後述)が含まれます。
実装のヒント
  • UTF-8 についてですが、本来 UTF-8 は BOM をつける必要はありません。しかし、現実には BOM 付きの UTF-8 も多いため、BOM 付き UTF-8 にも対応するのが良いでしょう。
  • 歴史的経緯により過去のソフトウェアは Shift-JIS を使用しますので、Shift-JIS にも対応することを強く推奨します。
  • 改行文字の読み込み対応については、3 種類すべてに対応することを強く推奨します。

歌詞ファイルの種類

  • 歌詞ファイルには「行頭タイムタグ付き歌詞ファイル」と「カラオケタグ付き歌詞ファイル」の 2 種類があります。
  • タイムタグが記述されたいずれかの行において、「歌詞の一部分よりも後にタイムタグがあり、かつ、その行に複数のタイムタグがある」という条件に合う行が 1 行でもあれば、それは「カラオケタグ付き歌詞ファイル」です。
カラオケタグ付き歌詞ファイルの例
[00:01:25]…[00:02:95]兎[00:04:70]追[00:05:57]ひ[00:05:83]し[00:06:50]彼の[00:07:66]山
[00:10:09]小[00:10:85]鮒[00:11:80]釣[00:12:71]り[00:13:01]し[00:13:63]彼の[00:14:84]川
  • 上記条件を満たさない場合は「行頭タイムタグ付き歌詞ファイル」です。
行頭タイムタグ付き歌詞ファイルの例
[00:01:25]…兎追ひし彼の山
[00:10:09]小鮒釣りし彼の川

行頭タイムタグ付き歌詞ファイル

  • タイムタグがある行は、1 つのタイムタグと 1 行の歌詞を表す文字列からなり、常にタイムタグは行の先頭になくてはなりません。
❌ 誤った例
[00:10:00][01:40:00]あいうえお
あいう[00:10:00]えお
  • 1 つの歌詞ファイル中に、秒単位タイムタグと拡張タイムタグの両方が混在してはなりません。
❌ 誤った例
[00:10]あいうえお
[00:10:50]かきくけこ
  • 歌詞ファイル中で後に続くタイムタグは、常にそれより前のタイムタグより大きい時間を指定しなくてはなりません。
    • 同じ時間を示すタイムタグが続いてはなりません。
    • タイムタグの逆転があってはなりません。
❌ 誤った例
[00:10:00]あいうえお
[00:10:00]かきくけこ
[00:10:00]あいうえお
[00:09:00]かきくけこ

カラオケタグ付き歌詞ファイル

  • すべてのタイムタグは拡張タイムタグでなくてはなりません。
    • 秒単位タイムタグでカラオケのような表現をするのは、たいていの場合困難です。
  • 同一行中に、タイムタグは、歌詞を挟みながらいくつあっても構いません。
  • 歌詞を挟まずに 2 つのタイムタグを記述しても構いません。
  • 歌詞を挟まずに 3 つ以上タイムタグがある場合、最初と最後のタイムタグだけが有効です。
[00:10:00]あいうえお[00:20:00][00:25:00][00:30:00]かきくけこ[00:40:00]
は、
[00:10:00]あいうえお[00:20:00][00:30:00]かきくけこ[00:40:00]
と同じです。
  • 必ずしも行の先頭や行の最後にタイムタグが無くても構いません。
✅ 許容される例
あいうえお[00:10:00]かきくけこ[00:20:00]
[00:10:00]あいうえお[00:20:00]かきくけこ
実装のヒント

行の先頭や行の最後にタイムタグが無い場合、前の行や次の行の改行が無いものと考えることで、タイムタグを補完できます。
ただし、規格上は補完方法を規定していないため、ソフトウェアによって解釈違いが発生しうることに注意が必要です。
特に、ファイルの先頭やファイルの末尾のタイムタグが無い場合の補完方法はソフトウェアによって異なるでしょう。

  • 同じ時間を示すタイムタグがあっても構いません。
✅ 許容される例
[00:10:00]あいうえお[00:10:00]
  • タイムタグの逆転は原則としてあってはなりません。
❌ 原則から外れる例
[00:10:00]あいうえお[00:09:00]かきくけこ
実装のヒント

デュエットで上のパートと下のパートを同時に歌う場合、

[00:10:00]上のパート[00:20:00]
[00:10:00]下のパート[00:20:00]

のようにやむを得ずタイムタグが逆転する場合があります。
例外となりますので、ソフトウェアによっては必ずしも意図が反映されないおそれがあることに注意が必要です。
可能であれば、歌詞ファイルを分割するなど、タイムタグの逆転が発生しないようにすることが望ましいでしょう。

ファイル名など

ファイル名

  • 歌詞ファイルと曲ファイルを暗黙的に対応させたい場合、歌詞ファイルのファイル名は、拡張子を除く部分を曲ファイルと同じにする必要があります。
曲ファイル 歌詞ファイル
ABC.mp3
ABC.mp4
ABC.lrc
ABC.kra
ABC.txt
  • ソフトウェアで明示的に歌詞ファイルと曲ファイルを対応させる場合は、この限りではありません。

拡張子

  • 歌詞ファイルとして認められる拡張子は、lrc / kra / txt です。
  • ただし、kra はカラオケタグ付き歌詞ファイルのみ認められます。
実装のヒント

3 種類の拡張子のファイルが同時に存在していた場合、読み込みの優先順位は kra > lrc > txt にすると良いでしょう。

  • kra はカラオケタグ付き歌詞ファイルです。
  • lrc はカラオケタグ付き歌詞ファイルの場合も行頭タイムタグ付き歌詞ファイルの場合もあります。
  • txt は歌詞ファイルではないただのテキストファイルである可能性もあります。

フォルダー

  • 歌詞ファイルと曲ファイルを暗黙的に対応させたい場合、歌詞ファイルは曲ファイルと同じフォルダーになくてはなりません。
  • ソフトウェアで明示的に歌詞ファイルと曲ファイルを対応させる場合は、この限りではありません。
実装のヒント

ソフトウェアで歌詞ファイルと曲ファイルを対応させる手法としては、例えば歌詞ファイル用フォルダーを指定するなどが考えられます。
この場合、曲ファイルと同じフォルダーと、指定フォルダーの両方に歌詞ファイルが存在していた場合に、どちらを優先するか等の検討が必要です。
また、歌詞ファイルと曲ファイルを 1 対 1 で指定する手法も考えられます。

@ タグの定義

@ タグの原則

  • 歌詞ファイルに様々な情報を付加するためのタグを「@ タグ」といいます。
  • 1 つの @ タグは、行頭文字を @ とする 1 行の文字列で表されます。
    • @ の前に何らかの文字がある行は @ タグではありません。
  • @ タグは歌詞ファイル中のどこにあってもかまわず、その順序も問いません。

@ タグのフォーマット

フォーマット
@タグ名=内容
  • タグ名は、タグの名前を示す文字列です。
  • 内容は、タグ名の内容を示す値や文字列です。
  • タグ名と内容の間には、必ず 1 つだけ = が必要で、また、いくつかの半角スペースが入っても構いません。
  • @、タグ名、= はすべて半角でなければなりません。
  • タグ名は大文字小文字の区別はしません。
  • 内容が値である場合、
    • すべて半角数字でなければなりません。
    • 単位を記述してはなりません。
    • 空欄は認められません。
  • 内容が文字列である場合、
    • 行全体が 1024 文字以内でなければなりません。
    • 空欄でも構いません。
  • 以上の規則に当てはまらない場合、その @ タグは無効です。
  • 同一歌詞ファイル中に、同じ @ タグが複数存在してはなりません。

@ タグの透明性

  • 行頭文字が @ である行はすべて @ タグとして扱う必要があります。
    • @ タグを歌詞として表示してはなりません。
  • タグ名が未知あるいは未対応だった場合、
    • その @ タグを無視しなければなりません。
    • 保存時は元の内容のまま保存しなければなりません。
実装のヒント

歌詞として @ が存在している場合、@ タグとして扱われないようにするための手法として

  • @ を行頭以外に配置する
  • 数値文字参照 @ を使用する
  • 全角@を使用する
    などが考えられます。

個別の @ タグ

曲情報の @ タグ

曲情報をユーザーに伝えるための @ タグです。

@ タグ名 内容 内容の型
@Artist アーティスト名。 文字列 @Artist=山田太郎
@Title 曲名。 文字列 @Title=故郷
@Album アルバム名。 文字列 @Album=日本の童謡 88 選
@TaggingBy タイムタグ付けした人の名前。 文字列 @TaggingBy=タグ付け太郎
@EditedBy タイムタグを修正した人の名前。 文字列 @EditedBy=タグ直し二郎

タイムタグを補正する @ タグ

@ タグ名 内容 内容の型
@Offset すべてのタイムタグに適用する時間のズレ幅。整数。
単位はミリ秒(10 ミリ秒ではないことに注意)。
負値ならばタイムタグを早める方向にずらす。
適用後の時刻がタイムタグの最小値より小さくなった場合は最小値、最大値より大きくなった場合は最大値として扱うこと。
適用した結果でタイムタグを置換する場合、@Offset=0 とする(@Offset を削除してはいけない)。
@Offset=1000
[00:05:00][00:06:00] として扱う

@Offset=-500
[00:05:00][00:04:50] として扱う

背景の @ タグ

歌詞表示の際に背景を表示するための @ タグです。

@ タグ名 内容 内容の型
@Bgfile 背景ファイル名。 文字列 @Bgfile=MyBackground.png
@Bgfolder 背景フォルダー名。 文字列 @Bgfolder=C:\Backgrounds

ルビの @ タグ

歌詞のルビ(読みがな)を指定するための @ タグです。

ルビタグの概要

@ タグ名 内容 内容の型
@RubyX ルビ等を示す文字列。 文字列 @Ruby1=為替,かわせ
  • フォーマットは以下の通りです。
フォーマット
@RubyX=親文字(漢字等),ルビ(読みがな)【省略可】,適用開始時刻【省略可】,適用終了時刻【省略可】
  • X は 1 から始まる連番で、@Ruby1、@Ruby2……のように @Ruby タグを指定することにより、複数のルビを定義することができます。
    • 同一歌詞ファイル内で同じ @ タグが複数存在してはならないので、連番を振ることにより重複を避けています。
  • 連番は途中で飛んではいけません。
    • 例えば、@Ruby10 の次が @Ruby12 となることは認められません。ソフトウェアによっては、@Ruby12 が読み込まれない場合があります。
  • X の上限は無く、いくつでもルビを定義することができます。
  • 親文字(ルビが振られる対象)には、ルビを振りたい漢字や英語などを指定します。
  • ルビには、漢字や英語などの読みがなを指定します。
    • ルビを省略した場合は、親文字に対応するルビを取り消すことになります。
    • ルビを省略し、かつ、適用開始時刻や適用終了時刻を付与する場合、区切りのカンマは省略できません。
  • 適用開始時刻はタイムタグで指定し、この時刻以降(この時刻を含む)に登場する親文字に対してルビを振るものとします。
    • タイムタグは秒単位タイムタグ、拡張タイムタグのどちらでも構いません。
    • 適用開始時刻を省略した場合は、[00:00:00] が指定されたものとします。
    • 適用開始時刻を省略し、かつ、適用終了時刻を付与する場合、区切りのカンマは省略できません。
  • 適用終了時刻はタイムタグで指定し、この時刻以前(この時刻を含む)に登場する親文字に対してルビを振るものとします。
    • タイムタグは秒単位タイムタグ、拡張タイムタグのどちらでも構いません。
    • 適用終了時刻を省略した場合は、[99:59:99] が指定されたものとします。
  • 適用開始時刻・適用終了時刻は、歌詞に付与されているタイムタグと同様、@Offset の補正を受けるものとします。
  • 区切りのカンマは必ず半角でなくてはなりません。

ルビタグの記述例

意味
@Ruby1=為替,かわせ,,[01:00:00] 曲頭から 1 分以前に表示される「為替」に対し、「かわせ」というルビを振ります。
@Ruby2=為替,カワセ,[01:00:00],[02:00:00] 1 分以降 2 分以前に表示される「為替」に対し、「カワセ」というルビを振ります。
@Ruby3=為替,,[02:00:00] 2 分以降に表示される「為替」に対しては、ルビは振りません。
  • 適用開始時刻、適用終了時刻により、1 番では「運命」を「うんめい」と読み、2 番では「運命」を「さだめ」と読むような歌詞にも対応可能です。
実装のヒント

デュエットなどで、同じタイミングで同じ漢字に別々のルビを振りたい場合は、歌詞ファイルを分割すると良いでしょう。

ルビタグへのタイムタグの埋め込み

  • ルビにタイムタグを埋め込むことにより、ルビの発声タイミングを指定できます。
  • ルビに埋め込まれたタイムタグは、親文字の発声開始時刻からの相対時刻とします。
  • ルビに埋め込まれたタイムタグは、親文字の発声終了時刻との逆転を発生させないように指定するものとします。
@Ruby1=為替,か[00:00:50][00:01:00]
[00:01:00]本日の[00:10:00]為替[00:12:00]レート[00:20:00]

「為替」のルビ「かわせ」の「わ」の発声開始は [00:00:50] で示されていますが、これは曲頭から 0 秒 50 という意味ではありません。

親文字である「為替」の発声開始が [00:10:00] で示されているため、ここから [00:00:50] 秒後ということで、

  • [00:10:00] + [00:00:50] = [00:10:50](10 秒 50)

に「わ」が発声開始となります。

また、親文字である「為替」の発声開始が [00:10:00]、発声終了が [00:12:00] のため、ルビに埋め込むタイムタグは最大 [00:02:00] までしか認められません。

廃止された @ タグ

過去に使用されていましたが、時代と共に役目を終えた @ タグです。新たに付加してはなりません。

@ タグ名 内容
@TimeRatio 過去の特定のソフトウェアの不具合に対応するためのタグ。
@TimeType 過去の特定のソフトウェアの不具合に対応するためのタグ。
@SilencemSec @Offset で包含可能なタグ。
@Silence タイムタグ作成時に再生されたサウンドデータの曲前部の無音部のフレーム数。
@Flames タイムタグ作成時に再生されたサウンドデータの総フレーム数(正しくは Frames)。
@TotalSec タイムタグ作成時に再生されたサウンドデータの総演奏時間。単位は秒。

ソフトウェア独自の @ タグ

ソフトウェアで独自に使用している @ タグについては、本文書では触れません。当該ソフトウェアのヘルプ等をご覧ください。

例)

  • @Emoji
  • @HeadOffset

なお、「@ タグの透明性」により、独自 @ タグが歌詞ファイル中に存在していても悪影響は発生しません。

対応必須項目

  • 本文書に準拠したソフトウェアを開発する際、記載のすべての項目に対応するのが理想です。
  • ただし、開発に優先順位を付ける必要がある場合、以下に示す必須項目のみ対応することも可能とします。
項目 対応の必要性
秒単位タイムタグ ✅ 必須
拡張タイムタグ ✅ 必須
行頭タイムタグ付き歌詞ファイル ✅ 必須
カラオケタグ付き歌詞ファイル 任意
@ タグの定義
(@ タグの原則~@ タグの透明性)
✅ 必須
個別の @ タグ 任意

原著との主な相違点

歌詞ファイルの文字コード

原著では、歌詞ファイルの文字コードは原則として Shift-JIS を用いていました。

時代が進み Shift-JIS では表現できない文字が増えたこと、現在も開発が続いているソフトウェアの多くは UTF-8 に対応していること、原著でも他の文字コードに制限は無かったことを鑑みて、本文書では原則を UTF-8 としています。

@ タグの文字数

@ タグの内容が文字列である場合、行全体が 1024 文字以内でなければなりませんが、原著では半角 1024 文字以内でした。

UTF-8 では 1 文字が 3 バイト以上となることもあり、半角換算すると制限が厳しくなってしまうため、本文書では文字種にかかわらず 1024 文字としています。

@ タグの透明性

原著では @ タグを歌詞として表示してはならない旨のみが明文化されていました。

ソフトウェア間での矛盾をより少なくするため、本文書では記述を増やしました。

ルビタグ

ルビ拡張規格を本文書に統合しました。

廃止された @ タグ

原著で既に廃止されていた @ タグに加えて、時代と共に役目を終えたいくつかの @ タグを追加で廃止しました。

備忘録

行頭タイムタグ付き歌詞ファイルにおけるリピート拡張

行頭タイムタグ付き歌詞ファイルにおいて、行頭に複数のタイムタグをつけてサビなどの繰り返しを表現するという、

[00:15:00][00:45:00]あいうえお

のような手法について、原著では、「カラオケタグ付き歌詞ファイルとの混同を招くデメリットが大きい」として認められていませんでした。

本文書も同様にこれを認めないものとします。

ルビタグ

ルビを表現する手法としては、例えば「為替(かわせ)」のように括弧でくくるなど様々な手法が考えられました。

その中で、

  • 親文字とルビの対応範囲を明確化できる
  • 非対応のソフトウェアに副作用を発生させない(@ タグの透明性)
  • タイムタグ規格の他の部分に準拠している

などの理由により、現在の形に落ち着きました。

ルビタグの経緯についてはこちらの資料をご覧ください。

ソフトウェアの例

原著や本文書に準拠したソフトウェアのうち、2015 年以降に更新のあるものとしては、例えば以下があります(敬称略)。

ソフトウェア 開発者 対応 OS
KbMedia Player Kobarin Windows
RhythmicaLyrics MIZUSHIKI Windows
ニコカラメーカー(初代) SHINTA Windows
ニコカラメーカー 2 SHINTA Windows
ニコカラメーカー 3 SHINTA Windows

歌詞ファイルの例

  • ニコカラメーカー 3 のサンプルフォルダー内にカラオケタグ付き歌詞ファイル(故郷.lrc)があります。

参考リンク

主な改訂履歴

  • 2025/09/01 初版。
  • 2025/09/03 「ソフトウェア独自の @ タグ」を新規作成。

Discussion