.ytt フォーマット:実務リファレンス
YouTube のタイムドテキスト形式のリファレンスです。スタイル付き字幕の中身である XML で、.ytt として保存され、YouTube 内部では format 3、つまり SRV3 と呼ばれます。以下にまとめたのは、このフォーマットが実際に受け付けるものです。もっともらしく見えて黙って捨てられる値も含めて扱います。
ファイルの形
<timedtext format="3">
<head>
<pen id="1" b="1" fc="#FEFEFE" fo="254" et="4" ec="#000000"/>
<wp id="0" ap="7" ah="50" av="90"/>
<ws id="0" ju="2"/>
</head>
<body>
<p t="1000" d="1600" wp="0" ws="0" p="1">Today we fix that.</p>
</body>
</timedtext>
head では使い回すスタイルを宣言します。テキスト用の pen、字幕ウィンドウの位置を決める wp、その中でテキストをどう揃えるかの ws です。body は字幕行の並びで、各行は使うスタイルを id で指します。
<pen> — テキストのスタイル
| 属性 | 値 | 意味 |
|---|---|---|
fs | 0–7 | フォント。0 は既定のサンセリフ体、1 は Courier New、2 は Times New Roman、3 は Lucida Console、5 は Comic Sans MS、6 は Monotype Corsiva、7 は Carrois Gothic SC。4 は未定義です。 |
sz | integer | サイズ。100 が YouTube の既定値で、目盛りは線形ではありません(下記参照)。 |
b, i, u | "1" | 太字、斜体、下線。true のときだけ書き出されます。 |
fc | #RRGGBB | 文字色。純白の #FFFFFF は #FEFEFE と書かれるのが一般的です。 |
fo | 0–254 | 文字の不透明度。255 は取り除かれるので、完全な不透明は 254 です。 |
bc, bo | #RRGGBB, 0–254 | 背景ボックスの色とその不透明度。bo="0" でボックスが消えます。 |
et | 1–4 | エッジ。1 はハードな影、2 はベベル、3 はグロー、4 はやわらかな影です。縁取り専用のタイプはなく、濃い色のグローがその代わりになります。 |
ec | #RRGGBB | エッジの色。既定は #222222 で、不透明度は文字に合わせられます。 |
of | 0–2 | オフセット。0 は下付き、1 は通常、2 は上付きです。 |
rb | 0–5 | ルビ(ふりがな)。0 はなし、1 はベース、2 は括弧、4 は前に置くテキスト、5 は後ろに置くテキストです。 |
サイズの計算式
sz の値は、思っているサイズそのものではありません。実際の倍率の 4 倍の速さで動きます。
sz = (1 + (scale − 1) × 4) × 100
scale = 1 + (sz / 100 − 1) / 4
つまり sz="100" が 100%、sz="200" が 125%、sz="50" がおよそ 87% です。YouTube の既定の字幕サイズはフレーム高さの約 4.6〜4.8% で、sz="100" はこの大きさで描画されます。
<wp> — ウィンドウの位置
| 属性 | 値 | 意味 |
|---|---|---|
ap | 0–8 | アンカーポイント。0 は左上、1 は上中央、2 は右上、3 は左中央、4 は中央、5 は右中央、6 は左下、7 は下中央、8 は右下です。 |
ah | 0–100 | 水平位置。 |
av | 0–100 | 垂直位置。 |
位置はフレームのそのままの割合ではありません。YouTube はこれをセーフエリアに割り当てます。
screen% = value × 0.96 + 2
av="0" は上から 2%、av="100" は 98% の位置に来ます。逆方向に変換するときは value = (screen% − 2) / 0.96 を使います。
<ws> — ウィンドウのスタイル
| 属性 | 値 | 意味 |
|---|---|---|
ju | 0–2 | 行揃え。0 は左、1 は右、2 は中央です。 |
pd | 0–3 | 表示方向。0 は横書きの左から右です。 |
sd | 0–1 | スクロール方向。縦書きテキスト用です。 |
<p> と <s> — 行とセグメント
| 属性 | 値 | 意味 |
|---|---|---|
p.t | ≥ 1 ms | 開始時刻。0 から始まる行を無視する Android プレーヤーがあります。 |
p.d | > 0 ms | 表示時間。 |
p.wp, p.ws | id | 使用するウィンドウの位置とウィンドウのスタイル。 |
p.p | id | 行全体に使うペン。 |
s.p | id | 行の中のひとつのセグメントに使うペン。 |
s.t | ≥ 0 ms | 行を基準としたセグメントの開始。一語ずつのタイミングはこれで実現します。 |
半日を溶かすクセ
- ペンひとつにエッジはひとつだけ。同じテキストに縁取りと影を付けるなら、2 つのペンで同じ行を 2 回書き、上下に重ねます。
- 太い縁取りはコピーの重ね技。グローのエッジを付けた同じ行を何度か繰り返します。下に重ねるコピーのフォントを大きくしてはいけません。レイヤーが横にずれていきます。
- 不透明度 255 は消えます。254 を使ってください。
- ゼロ幅の詰め物。スタイルの違うセグメントが混ざる行には、前後にゼロ幅スペースが必要です。ないと、一部のモバイルプレーヤーはスタイルを行そのもののペンに潰してしまいます。
- アニメーションはありません。ズームもロールアップも、数十ミリ秒おきに並べた字幕エントリーの連なりです。
- 視聴者の設定が優先されます。プレーヤーで字幕の見た目を変えた人には、こちらのペンではなく自分の設定が見えます。
この情報の出どころ
このフォーマットは YouTube から公に文書化されていません。基準となる挙動は、オープンソースのコンバーター YTSubConverter — そのソースが事実上の仕様書です — から来ていて、YouTube からダウンロードした実際の字幕トラックと、プレーヤーが実際に描画する内容で確かめられています。Rainbow Captions も同じフォーマットを書き出します。上の表を見ながら手でトラックを組んでもいいですし、レイヤーの重ね方、保険の文字、一語ずつのタイミングをアプリに任せることもできます。
Rainbow Captions がペン、重ねた縁取り、保険の文字、一語ごとのタイミングを、170言語すべてで引き受けます。ダウンロード無料、最初の10言語も無料です。
Mac 版をダウンロード