目次

タイムタグ規格とは

 みなさんはカラオケに行ったことがありますよね? カラオケでは、あたりまえですが、曲と同時に歌詞が表示されます。

 「タイムタグ」とは MP3 などの曲を演奏するときに、歌詞を曲と同期して表示させるための時間設定のことです。歌詞にタイムタグをつけておけば、カラオケのように、曲の進行に合わせて、歌詞を表示することができるのです。

 タイムタグの記述方法については、駄歌詞屋本舗さんがとりまとめて仕様書を公開されており、これが事実上の標準となっています。これをタイムタグ規格と呼びます。

ルビ拡張規格の必要性

 再びカラオケを思い浮かべて下さい。表示されている歌詞のうち、難しい漢字や、外国語などにはルビ(読みがな)が振ってありますよね? また、例えば、「時間」を「とき」と読ませるような、特殊な読み方をする場合にもルビは必要です。

 残念ながら、タイムタグ規格には現在のところ、ルビに関する定めがありません。ルビを振ることができないので、多くの場合、「薔薇(ばら)」のように、括弧付きでルビを表記するなどの代替策が取られているようです。

 しかしせっかくなら、ルビはルビとして定め、カラオケのように漢字の上に表示される方が読みやすいでしょう。ルビを指定するためには、タイムタグ規格を少し拡張する必要があります。2008 年時点で私が探した限りでは、ルビに関するタイムタグ規格の拡張規格はこれまでに公開されていないようでした。そこで、ここにルビ拡張規格を定め、公開いたします。

 タイムタグ規格準拠のアプリケーションを開発されており、ルビ表示機能を付けようと考えている開発者の方がいらっしゃいましたら、本拡張規格をご検討いただきますようお願いします。賛同していただけるのであれば、本拡張規格に準拠したルビ機能を開発していただくことにより、拡張規格の乱立による混乱が防げ、利用者の方々にとっても、1 つの歌詞ファイルが様々なアプリケーションで利用できるので便利になると思います。

ルビ拡張規格

◆ ルビの記述方法

 大前提として、ルビ以外の部分についてはタイムタグ規格に準拠します。ルビの部分のみを拡張します。

 ルビは @ タグで指定します。書式は次の通りです。

書式@RubyX=ルビ対象(漢字等),ルビ(読みがな)【省略可】,適用開始時刻【省略可】,適用終了時刻【省略可】
  • X は 1 から始まる連番で、@Ruby1、@Ruby2……のように @Ruby タグを指定することにより、複数のルビを定義することができます。タイムタグ規格において、同じ @ タグを複数指定することはできないので、連番を振ることにより重複を避けています。
  • 連番は途中で飛んではいけません。例えば、@Ruby10 の次が @Ruby12 となっている定義は規格違反です。プレイヤーによっては、@Ruby12 が読み込まれない場合があります。
  • X の上限は無いので、いくつでもルビを定義することができます。
  • ルビ対象(「親文字」と呼称される場合もあります)には、ルビを振りたい漢字や英語などを指定します。
  • ルビには、漢字や英語などの読みがなを指定します。ルビを省略した場合は、ルビ対象に対応するルビを取り消すことになります。ルビを省略し、適用開始時刻や適用終了時刻を付与する場合、区切りのカンマは省略できません。
  • 適用開始時刻はタイムタグで指定し、この時刻以降(この時刻を含む)に登場するルビ対象に対してルビを振るものとします。タイムタグは秒単位タイムタグ、拡張タイムタグのどちらでも構いません。適用開始時刻を省略した場合は、[00:00:00] が指定されたものとします。適用開始時刻を省略し、適用終了時刻を付与する場合、区切りのカンマは省略できません。
  • 適用終了時刻はタイムタグで指定し、この時刻以前(この時刻を含む)に登場するルビ対象に対してルビを振るものとします。タイムタグは秒単位タイムタグ、拡張タイムタグのどちらでも構いません。適用終了時刻を省略した場合は、[99:59:99] が指定されたものとします。
  • 適用開始時刻・適用終了時刻は、歌詞に付与されているタイムタグと同様、@TimeRatio や @Offset の補正を受けるものとします。
  • 区切りのカンマは必ず半角でなくてはなりません。

◆ ルビの記述例

@Ruby1=為替,かわせ,,[01:00:00]
@Ruby2=為替,カワセ,[01:00:00],[02:00:00]
@Ruby3=為替,,[02:00:00]
  • 曲頭から 1 分以前に表示される「為替」に対し、「かわせ」というルビを振ります。
  • 1 分以降 2 分以前に表示される「為替」に対し、「カワセ」というルビを振ります。
  • 2 分以降に表示される「為替」に対しては、ルビは振りません。

◆ プレーヤーでの表示方法

 指定されたルビを実際にどのように表示するかは、本拡張規格では定義せずに、個々のプレーヤーに任せるものとします。

 とはいえ、一般的には、通常のカラオケと同じように表示するのが自然でしょう。すなわち、漢字(などのルビ対象)の真上に、漢字よりも小さい文字でルビを振ります。ルビのワイプは、漢字と同じタイミングで行います。例として、以下の歌詞ファイルでのルビ表示を考えてみます。

サンプル@Ruby1=為替,かわせ
[00:01:00]本日の[00:10:00]為替[00:12:00]レート[00:20:00]
 ルビを均等割り付けすることにすると、「本日の為替レート」という歌詞のうち、「為替」の真上にルビである「かわせ」を均等に配置します。「か」を「為」の上あたり、「わ」を「為」と「替」の間、「せ」を「替」の上あたりに配置します。

 ワイプは、10 秒の時点から「為」のワイプが始まり、同時にルビの「か」のワイプも始まります。11 秒の時点では、「為」のワイプがちょうど終わったところで、ルビの方は、「か」のワイプが終わり、「わ」のワイプが半分終わったところになります。12 秒の時点で、「替」のワイプが終わり、ルビの方は「わ」の残り半分と「せ」のワイプが終わります。

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

 本規格では、ルビにタイムタグを埋め込むことも可能とします。これにより、より細かなワイプの制御が可能です。

 ルビに埋め込まれたタイムタグは、歌詞中で指定されている時刻からの相対時刻とし、歌詞中で指定されている時刻との逆転現象を発生させないように指定するものとします。時刻の逆転現象が発生した場合のプレーヤーの動作は不定です。

 例として、以下の歌詞ファイルでのルビ表示を考えてみます。先ほどの例とほとんど同じですが、ルビにタイムタグが埋め込まれています。

サンプル@Ruby1=為替,か[00:00:50]わ[00:01:00]せ
[00:01:00]本日の[00:10:00]為替[00:12:00]レート[00:20:00]
 ワイプは、10 秒の時点から「為」のワイプが始まり、同時にルビの「か」のワイプも始まります。今回はルビにタイムタグが埋め込まれているので、「か」のワイプが始まってから [00:00:50] 秒後、すなわち、10.50 秒の時点で「か」のワイプが終わります。一般的なプレーヤーでは、ルビと漢字のワイプ位置は揃えられていますから、10.50 秒の時点では、漢字の方は「為」の途中までワイプが終わっていることでしょう。同様にして、11 秒の時点で「わ」のワイプが終わり、12 秒の時点で「せ」のワイプが終わります。「かわ」が早くワイプされ、「せ」が遅くワイプされる感じですね。

 ここで例えば、ルビ中のタイムタグを「か[00:00:50]わ[00:03:00]せ」のように指定してしまうと、ルビのワイプとしては 13 秒の時点でようやく「せ」のワイプが始まるのに対し、歌詞は次の「レート」のワイプが 12 秒の時点で始まり、逆転現象が発生します。逆転現象が発生するようなタイムタグの埋め込みは行わないで下さい。

◆ 必須部分とオプション部分

 以上がルビ拡張規格の内容ですが、ルビ拡張規格を「必須部分」と「オプション部分」に区別することとします。

 「必須部分」は、ルビ拡張規格に対応するプレーヤーを開発する際に、必ずサポートしなければならない部分です。「必須部分」は次の部分です。

  • 「ルビ対象(漢字等)」の指定。
  • 「ルビ(読みがな)」の指定。ルビ中のタイムタグ埋め込みは必須としないが、埋め込まれているタイムタグを正しく無視できるようにすること。
 「オプション部分」は、ルビ拡張規格に対応するプレーヤーを開発する際に、必ずしもサポートしなくても良い部分です。もちろん、サポートが可能であれば、積極的にサポートして下さい。「オプション部分」は次の部分です。
  • 「適用開始時刻」「適用終了時刻」の指定。
  • ルビへのタイムタグの埋め込み。

本拡張規格の特徴

 ルビ拡張規格の策定に当たり、いくつかの方式を検討しましたが、最終的に上記の仕様といたしました。ここでは、備忘録の意味も込め、本拡張規格の策定経緯や、本拡張規格の利点などを記します。

 まず、ルビを @ タグで指定するようにしたのは、ルビの指定による副作用を排除するためです。

 一般的にルビを表記する方法として用いられている、括弧でルビを指定するという仕様も検討しました。「本日の為替(かわせ)レート」というように、歌詞に直接ルビを書き込む表記です。この方法は一般的なので、歌詞ファイルの流用がしやすい(修正しなくてもルビ表示ができる)という利点があります。しかし例えば、コーラスを括弧でくくる場合もあるなど、括弧はよく使われる文字なので、ルビ以外の文字もルビとして扱われてしまうという副作用があり、悪影響もまた大きくなります。それと、ルビ対象の文字がどこなのかが特定しづらいという問題もあります。このため、採用を見送りました。

 それでは括弧よりも使用頻度の少ない文字で、ルビ対象もきちんと表記すればどうかということで、「本日の{為替|かわせ}レート」のような仕様も検討しました。しかしこの方法ですと、ルビ非対応のプレーヤーで表示した場合に、{} などがそのまま表示されてしまい、使用頻度が少ないだけに違和感のある表示となってしまいます。

 @ タグで指定することにすれば、ルビ非対応プレーヤーにおいては、@ タグが無視されるだけで、悪影響はありません。また、ルビ対応プレーヤーにおいても、ルビとルビ以外を混同する恐れがありません。ルビ対応プレーヤー開発時の手間という観点から見ても、歌詞解析ルーチンについては既存のものをそのまま使用できるという利点があります。

 @Ruby タグで適用開始時刻・適用終了時刻を指定できるようにしたのは、同じ漢字に複数のルビを振れるようにするためです。例えば、歌詞の 1 番では「時間」を「じかん」と読ませ、歌詞の 2 番では「時間」を「とき」と読ませるような歌詞に対応します。

 適用開始時刻・適用終了時刻なんていう遠回しな指定方法ではなく、単純に、ルビが出てくる回数だけルビを指定すればよい、という考え方もあります。しかし例えば、歌詞の 1 番に「時間」が 10 回出てくる場合、@Ruby1~@Ruby10 まで 10 回も書くのは面倒ですし、@Ruby10 から 2 番なのか @Ruby11 から 2 番なのか、そのうち数え間違えたりします。その点、適用開始時刻・適用終了時刻をタイムタグで指定する方式であれば、漢字の近くにタイムタグがあるわけですから、間違えずに済みます。

 本拡張規格は、シンプルであることも利点の 1 つです。歌詞部分は通常通りで、簡単な @ タグのみでルビを指定できます。適用開始時刻などはオプションなので、基本的には漢字とルビを指定するだけです。ルビの表示方法を各プレーヤーに任せることで、細かなオプションが不要となり、同時に、各プレーヤーにむやみな制約を課すことを防いでいます。

仕様書

 上記の内容のうち、仕様に関する部分のみを、仕様書としてまとめて配布します。

ルビ拡張規格に対応したソフトウェア

 ここでは、本拡張規格に対応したソフトウェアを紹介します。また、本拡張規格に対応したソフトウェアを開発された方は、ご連絡を頂ければ、ここに掲載させて頂きます。(順不同・敬称略)

名称作者対応 OS概要
waku-WAK KARAOKE PlayerSHINTAHaikuカラオケ歌詞作成・表示機能付きのメディアプレーヤー。音楽だけではなく、動画(ムービー)に歌詞を合わせることも可能。カラオケタグエディタは歌詞のワイプ(色替え)をマウスで指定でき、タイミングを取りやすい。
ニコカラメーカーSHINTAWindowsニコカラ(カラオケ字幕付きの楽曲動画)を手軽に作ることができるツール。プレビューでビジュアルに出来映えを確認しながら、ニコカラを作成できる。
ニコカラメーカー 2
SHINTAWindowsニコカラメーカーの後継ツール。ニコカラメーカー同様、簡単にニコカラを作成でき、かつ、機能が豊富になっている。
RhythmicaLyrics MIZUSHIKIWindowsリズムゲーム感覚でリズミカルにタイムタグ付き歌詞が作成できるタイムタグエディタ。

サンプルデータ

  • ニコカラメーカー 2 に、タイムタグ規格ルビ拡張規格に準拠した「故郷」の歌詞ファイルが同梱されているのでご参照ください。

終わりに

 最後までお読みいただきありがとうございました。ご不明な点などございましたら、お気軽にご連絡ください。

 また、よりよい規格のご提案や、実装時のテクニックなどございましたら、こちらもお寄せいただければと思います。

更新履歴

2009/03/14 初版。
2011/03/19 サンプルデータを記載。
2016/02/13 適用終了時刻を記載。
2016/03/21 仕様書部分を独立して公開。
2017/01/09 アドレス(URL)変更:内容は変更無し。
2020/06/28 ソフトウェアにニコカラメーカー 2 追記。サンプルデータを更新。
2020/11/22 適用終了時刻の定義を「未満」から「以前」に変更。経緯はこちら