Subtitldプロジェクト
Subtitld独自のファイルです。字幕、翻訳、話者、吹き替えを記したUSFドキュメントを先頭に置き、その他すべての中身を示すマニフェスト、作業を中断した場所の画像、そして希望すれば動画とその音声までを収めたZIPパッケージです。移動もバックアップも受け渡しも1ファイルで済み、どの部分も標準的なツールで読めます。
概要
| 拡張子 | .usfx |
|---|---|
| メディアタイプ | application/x-usfx(application/zip の一種)。Appleのシステムでは org.subtitld.usfx。 |
| 仕様 | このページ。パッケージはPKWAREのZIP(APPNOTE.TXT)、ドキュメントはSubtitldの要素を加えたUSF 1.0です。 |
| パッケージ | ZIP。メンバーはDeflate(RFC 1951)で圧縮され、CRC-32で検査されます。2 GiBを超えるファイルにはZip64 |
| 最初のメンバー | subtitles.usf。Subtitldが保存するすべてのプロジェクトで、その名前はバイト30にあります |
| 時間の精度 | 字幕はミリ秒。吹き替えは必要なだけの小数桁を持つ正確な秒数。 |
| 文字コード | XML内でもメンバー名でもUTF-8 |
| 装飾 | USFのもの。斜体、太字、下線、取り消し線、色、そして9つの位置 |
| 話者 | それぞれに名前、色、画像、音声 |
| 言語 | 原語と各翻訳を1ブロックずつ。ISO 639-2コードと名前で区別 |
| 内包するメディア | 吹き替えと話者の画像。希望すれば動画、その音声、分離したボーカルと背景、タイムラインの波形 |
ファイルの構成
.usfx はZIPです。どのアーカイブツールでも開けます。ツールがこだわるなら .zip に名前を変えてください。
Tears of Steel.usfx subtitles.usf manifest.xml thumbnail.png assets/speakers/Celia.png assets/dubs/77a03e27.wav assets/video/Tears_of_Steel.mkv assets/waveform.npy assets/audio/vocals.flac
- 1 · ドキュメント
USFで書かれたプロジェクトそのもの。すべての字幕、翻訳、話者、吹き替え。常に存在し、常に先頭にあります。
- 2 · マニフェスト
ファイルを作ったもの、動画の場所、音声のミックス、そして他の各メンバーのメディアタイプ。
- 3 · 画像
ファイルマネージャーに表示されるプロジェクトの姿。中断したフレーム、その字幕、その位置のタイムライン。
- 4 · アセット
各吹き替えの音声と話者の顔。動画、その音声、波形は希望した場合のみ。
ドキュメントは何が起きるかを記し、アセットはそこで再生されるものです。subtitles.usf 内の吹き替えは、パッケージ内のパス assets/dubs/77a03e27.wav でクリップを指すので、パッケージを別のフォルダー、ディスク、コンピューターに移しても欠けることはありません。
メンバー
| パス | 内容 | 圧縮 | 書き込まれる条件 |
|---|---|---|---|
subtitles.usf |
ドキュメント。字幕、翻訳、話者、音声、吹き替え | Deflate | 常に、最初に |
manifest.xml |
マニフェスト | Deflate | 常に、2番目に |
thumbnail.png |
プロジェクトの512 × 384のPNGカード | 無圧縮 | 作れる画像があるとき |
assets/speakers/<speaker>.png |
話者の画像。一辺最大256ピクセル | Deflate | オフにしない限り |
assets/dubs/<uid>.<ext> |
吹き替えテイクの音声。テイクのIDで命名 | Deflate | 常に、音声のあるすべてのテイクについて |
assets/dubs/<uid>__<n>__<file> |
分割または伸縮されたテイクの断片と、伸縮元の手を加えていないソース | Deflate | テイクが分割または伸縮されたとき |
assets/video/<file> |
動画 | Deflate | 希望したとき |
assets/waveform.npy |
タイムラインの波形のピーク(NumPy配列) | Deflate | 希望したとき |
assets/audio/original.flac |
動画の音声 | Deflate | 希望したとき |
assets/audio/vocals.flac、background.flac |
ボーカルとそれ以外に分離した音声 | Deflate | 希望したとき |
assets/ 内の名前は英字、数字、-、_、. で構成され、それ以外は _ になります。そのため Tears of Steel.mkv は Tears_of_Steel.mkv として格納されます。ASCII以外の文字はそのまま残り、名前はUTF-8で書かれ、APPNOTEの求めるとおりその旨のフラグ(ZIPヘッダーのビット11)が立てられます。
画像を圧縮せずに格納する理由。 PNGはすでに圧縮されているので、Deflateは時間がかかるだけです。無圧縮なら、そのバイト列はファイル内にPNGそのままの形で存在し、サムネイル生成ツールは何も展開せずに読み出せます。
最初のバイト
どのプロジェクトも同じ形で始まります。ZIPのローカルファイルヘッダー、続いて最初のメンバーの名前です。
50 4B 03 04 14 00 00 00 08 00 4E 70 51 5D 64 CE 1E 0B 6F 3B 00 00 7F E2 00 00 0D 00 00 00 73 75 62 74 69 74 6C 65 73 2E 75 73 66
- 1 · シグネチャ
PK\3\4、バイト0〜3。ここからZIPのメンバーが始まります。 - 2 · ヘッダー
展開に必要なバージョン2.0、フラグなし、方式8(Deflate)、MS-DOS形式の時刻と日付(この例では2026年10月17日 14:02:28)、CRC-32、圧縮後と圧縮前のサイズ(15,215バイトと57,983バイト)。
- 3 · 名前の長さ
13。拡張フィールドなし。
- 4 · 名前
バイト30からの
subtitles.usf。
メンバーが圧縮されていても、名前は決して圧縮されません。そのため名前がシグネチャになります。バイト30の名前が subtitles.usf であるZIPは、Subtitldのプロジェクトです。HaikuのTrackerはまさにこの規則 0.60 ("PK\003\004") [30] ("subtitles.usf" | "manifest.xml") でプロジェクトを他のアーカイブと区別し、通常のZIPの規則より優先させます。ODFとEPUBも、mimetype という名前の最初のメンバーで同じことをしています。
動画はZIP本来の上限である4 GiBを超えることがあります。2 GiB以上では、SubtitldはZip64の拡張フィールドと終端レコード(APPNOTE 4.5節)を書き込みます。メンバーが65,535個を超える場合も同様です。Subtitld、そのWindows用サムネイルハンドラー、そして現行のunzipはどれもこれを読めます。
マニフェスト
<?xml version="1.0" encoding="UTF-8"?>
<manifest version="1.0">
<format>USFX</format>
<generator>Subtitld</generator>
<source path="/home/ana/Videos/Tears of Steel.mkv"
basename="Tears of Steel.mkv"/>
<voicemix volume="0.5000"/>
<entry path="subtitles.usf" type="application/x-usf+xml"/>
<entry path="thumbnail.png" type="image/png"/>
<entry path="assets/speakers/Celia.png" type="image/png"/>
<entry path="assets/dubs/77a03e27.wav" type="audio/wav"/>
</manifest>
| 要素 | 内容 |
|---|---|
<manifest version> |
マニフェストのバージョン、1.0 |
<format>、<generator> |
USFX と、ファイルを書いたもの、Subtitld |
<source path basename> |
プロジェクト保存時の動画のフルパスと、ファイル名のみ |
<voicemix volume> |
音楽/ボイススライダーの位置。0 は背景のみ、0.5 は元の音声のまま、1 はボーカルのみで、吹き替えは背景とともにフェードアウトします |
<entry path type> |
マニフェスト自身を除く各メンバーに1つ。それぞれにメディアタイプ |
タイプは application/x-usf+xml、image/png、audio/wav、audio/flac、audio/mpeg、video/mp4、video/x-matroska、video/quicktime、video/webm、video/ogg、そして波形やその他のものには application/octet-stream です。
動画のパスはファイルと一緒に運ばれます。 <source path> は、プロジェクトを保存したコンピューター上の動画の場所で、フォルダー名やユーザー名も含みます。プロジェクトを共有する前に、このことを念頭に置いてください。パスの先に何もない場合、Subtitldはプロジェクトのフォルダーで動画を名前で探します。
ドキュメント
subtitles.usf は Universal Subtitle Format ファイル(UTF-8)で、Subtitldが単体で書くものと同じ内容に、プロジェクトに必要なものをUSF流に加えたものです。USFにない部分には要素と属性を足しています。知らないものを読み飛ばすUSFリーダーなら、その字幕を読めます。
<USFSubtitles version="1.0"
xmlns:subtitldcc="https://subtitld.cc/ns/usf/1">
<metadata>
<title>Tears of Steel</title>
<author><name>Subtitld</name></author>
<language code="eng">English</language>
<subtitldcc:origin share-id="Xk3pQ9aZ2bT" version="3"/>
</metadata>
<styles>
<style name="Celia">
<fontstyle color="#e5484d"/>
<dubbing engine="edge-tts" voice="en-GB-SoniaNeural"
rate="0" pitch="0" fit_to_subtitle="true"/>
</style>
</styles>
<subtitles>
<language code="eng">English</language>
<subtitle start="00:00:23.000" stop="00:00:24.500">
<text speaker="Celia" style="Celia">You're a jerk, Thom.</text>
<dubbing uid="77a03e27" engine="edge-tts"
voice="en-GB-SoniaNeural" rate="0" pitch="0"
path="assets/dubs/77a03e27.wav"
start="23.0" end="24.5"/>
</subtitle>
</subtitles>
<subtitles>
<language code="por">Portuguese (Brazil)</language>
<subtitle start="00:00:23.000" stop="00:00:24.500">
<text speaker="Celia" style="Celia">Você é um idiota, Thom.</text>
</subtitle>
</subtitles>
</USFSubtitles>
SubtitldがUSFに加えるもの
| 場所 | 要素または属性 | 内容 |
|---|---|---|
<metadata> |
<subtitldcc:origin share-id version> |
プロジェクトの元になった subtitld.cc の字幕。変更をその次のバージョンとして公開できるようにします。独自の名前空間 https://subtitld.cc/ns/usf/1 にあり、元がある場合にのみ書かれます。 |
<styles> |
<style name> |
話者ごとに1つ、話者の名前で。Default スタイルはありません。あるとプレーヤーですべての字幕のスタイルが変わってしまうためです。 |
<style> |
<fontstyle color> |
話者の色、#RRGGBB |
<style> |
<dubbing engine voice rate pitch fit_to_subtitle> |
話者の音声。エンジン、音声、−100〜100の速度とピッチ、そして吹き替えを字幕の長さに合わせるかどうか |
<text> |
speaker、style |
誰が話すかと、そのスタイル |
<text> |
alignment |
USFの9つの位置のいずれか、TopLeft から BottomRight まで。下中央なら指定なし |
<subtitle> |
<dubbing> |
字幕の吹き替えのテイク。1テイクにつき1要素 |
<dubbing> |
uid engine voice rate pitch |
テイクのIDと、作成に使った音声 |
<dubbing> |
path、raw_path |
パッケージ内の音声と、伸縮したテイクの元になったソース |
<dubbing> |
start、end |
タイムライン上で再生される位置(秒) |
<dubbing> |
<subclip type path raw_path start end offset rate> |
分割または伸縮されたテイクの断片 |
通常の .usf では、話者の画像や吹き替えの音声を <avatar> と <data> にbase64でXML内に持たせられます。.usfx ではそうしません。それらは独立したメンバーになり、base64より4分の1小さく、XMLを解析せずに読めます。
時刻
字幕の start と stop はUSFの時刻で、最も近いミリ秒に丸められます。吹き替えの時刻は省略せずに書いた素の秒数 18.01579117916244 です。同じ64ビットの数値として読み戻せる最短の10進数なので、ドラッグで置いたクリップは元の位置に正確に戻ります。
古いバージョンのSubtitldは時刻を1ミリ秒早く書き、ゼロの開始を 23:59:59.999 と書いていました。Subtitldはその値をゼロとして読み、ミリ秒はそのままにします。
テイクとサブクリップ
1つの字幕は複数のテイクを持てます。最初の <dubbing> が再生されるもので、他は代替案です。選ぶまでは鳴らず、選んだものが先頭に移ります。
分割または伸縮されたテイクは、オーディオエディターのクリップのように配置された <subclip> のリストを持ちます。
| 属性 | 意味 |
|---|---|
start、end |
再生されるソースファイルの範囲。ファイル先頭からの秒数 |
offset |
その範囲が始まる位置。テイクの start からの秒数 |
rate |
伸縮後の速度。20 は120 % |
path、raw_path |
再生される音声と、伸縮元の手を加えていない音声 |
サブクリップは、テイクの start に offset を足した位置から、end から start を引いた秒数だけ再生されます。隙間は無音、重なりはミックスされます。ソースは決して変更されないので、分割も伸縮もすべて元に戻せます。また伸縮は常に raw_path から作り直され、伸縮したものをさらに伸縮することはありません。
翻訳
各言語は独自の <subtitles> ブロックを持ち、ISO 639-2コードと、要素内の言語名で区別されます。言語名によって、ブラジルのポルトガル語とポルトガルのポルトガル語を区別できます。どのブロックもすべての字幕を同じ時刻で持ち、吹き替えを持つのは最初のブロックだけです。Subtitldは翻訳を開始時刻で、または最も重なる字幕で対応付けるので、他のツールが書いたブロックは揃っていなくてもかまいません。
プロジェクトを開く
大きなプロジェクトもすぐに開きます。Subtitldはエディターに必要なものを先に読み、残りは作業中に読み込みます。
subtitles.usf:字幕、話者、音声を読むmanifest.xml:動画とミックスのためassets/speakers/:顔。メインスレッドの外でデコード- 同梱の動画:一度だけ展開
- 吹き替え:再生できるよう最初に
- 波形:次に
- 分離した音声:最後に
タイムライン上の各吹き替えは、音声が届くまでハッチング表示され、届くと再生されます。
メンバーはプロジェクトの隣ではなく、Subtitld専用のフォルダーに展開されます。ドキュメント、顔、吹き替えは、プロジェクトのパスのMD5を名前にしたキャッシュフォルダーに入ります。作業中に届くものは1 MiBずつ一時ファイルに流し込まれ、完了してから所定の名前に変更されるので、途中でクラッシュしても書きかけのものは残りません。次に同じプロジェクトを開いたとき、すでにあるファイルはメンバーとサイズが完全に一致する場合にだけ再利用され、そうでなければ展開し直されます。
動画は次の順で探されます。
- パッケージ内の動画、
assets/video/。 <source path>のパス(まだ存在する場合)。- プロジェクトのフォルダーにある、
<source basename>と同じ名前のファイル。 - それでもなければ、Subtitldが場所を尋ねます。
ZIPでないファイル、途中で切れたファイル、CRC検査に失敗したファイルは何も開きません。Subtitldはその旨を伝え、最近使ったファイルの一覧から外します。以前のプロジェクトも開けます。マニフェストのないものや、USFがZIPのルートに別の名前で置かれたものです。
プロジェクトの保存
保存は、手元のプロジェクトを決して危険にさらしません。
- スナップショット。 保存した時点のプロジェクトがコピーされるので、書き込み中も編集を続けられます。保存、自動保存、バックアップは順番に行われ、同時に書き込むのは1つだけです。
- 新しいファイル。 パッケージはプロジェクトの隣の
<project>.usfx.tmpに書き込まれます。 - 欠けなし。 音声がまだキャッシュにない吹き替え(読み込み中、または消去済み)は、置き換えられる予定のファイルからコピーされます。動画なしで保存したプロジェクトは、元の画像を保ちます。
- 検査。 新しいファイルを開き直し、すべてのメンバーのCRC-32を検証します。
- 入れ替え。 そのうえで初めて、1回のリネーム(
os.replace)でプロジェクトを置き換えます。プロジェクトの名前が書きかけのプロジェクトを指すことはありません。
どこかの段階で失敗すると、一時ファイルは削除され、ディスク上のプロジェクトは元のままで、編集内容はSubtitldで開いたままです。プロジェクトの吹き替えがまだ読み込み中のときは、保存はそれを待ちます。
中に入れるもの
全体設定のUSFXで、保存するすべてのプロジェクトに何を追加で含めるかを選びます。
- 話者のポートレート画像話者の顔。オン。
- タイムラインの波形キャッシュ波形。別のコンピューターで開いても再計算せずに済みます。オフ。
- 元の音声トラック動画の音声をFLACで。オフ。
- 処理済み音声(ボーカル + 背景)ボーカルとそれ以外に分離した音声をFLACで。分離をもう一度実行せずに済みます。オフ。
- 元の動画ファイル動画そのもの。すべてを1ファイルにまとめ、動画以上の大きさになります。オフ。
それぞれ、Subtitldが入れるものを持っているときに入ります。たとえば分離した音声は、分離を実行した後だけです。字幕、翻訳、話者、音声、そしてすべての吹き替えは常に含まれます。Deflateは吹き替えのWAVを約6分の1小さくしますが、動画やFLACはほとんど縮みません。
自動保存とバックアップ
- プロジェクトファイルを自動保存する保存と同じ安全な方法で、
.usfxそのものに書き込みます。USFXとして保存したプロジェクトが対象です。 - 自動バックアップ変更があるとき、自分のファイルとは別に、Subtitldのバックアップフォルダーに完全な
.usfxを<project>_<YYYYMMDDHHMMSS>.usfxという名前で作ります。最大保持数(指定しなければ20)を超えると、古いものから削除されます。
ファイルマネージャーでの表示
サムネイルはSubtitldの見た目のカードです。プロジェクトを中断した動画のフレームとその字幕、その下に再生ヘッド前後12秒のタイムライン、波形、話者の色の字幕が並びます。4:3の512 × 384なので、横長のフレームよりもファイルマネージャーの正方形のセルをうまく埋めます。動画がない場合は、フレームの代わりにSubtitldのマークが入ります。
| システム | タイプ | 得られるもの |
|---|---|---|
| Linux | shared-mime-infoの application/x-usfx(application/zip の一種)、*.usfx で判別 |
専用のアイコン。AURパッケージでは、freedesktop.orgのサムネイル生成ツール subtitld-thumbnailer によるサムネイル |
| Windows | インストーラーとMSIXパッケージで登録するファイルタイプ | アイコン。ZIPのセントラルディレクトリをZip64も含めて自力で読み、エクスプローラーが求めるサイズでWICによりPNGをデコードするシェルのサムネイルプロバイダー(UsfxThumbnail.dll、IThumbnailProvider) |
| macOS | public.zip-archive に準拠するタイプ org.subtitld.usfx |
専用のアイコン |
| Haiku | 上記の判別規則を持つ application/x-usfx |
アイコン。TrackerがプロジェクトとZIPを区別します |
4つのどのシステムでも、ダブルクリックするとプロジェクトがSubtitldで開きます。どちらのサムネイル生成ツールも thumbnail.png だけを読み、8 MiBを超えるものは拒否し、PNGのシグネチャ 89 50 4E 47 0D 0A 1A 0A で始まらないものは受け付けません。Windows用は、Subtitldが書くとおり無圧縮のものだけを受け付けます。Linux用はPythonの標準ライブラリだけを使います。ファイルマネージャーはサムネイル生成ツールをサンドボックス内で、しかも多数同時に動かすからです。
.usfxを自分で読む
プロジェクトの中にSubtitldだけのものはありません。中を見るには次のようにします。
unzip -l "Tears of Steel.usfx"
unzip -p "Tears of Steel.usfx" manifest.xml
すべての言語の字幕を、Pythonの標準ライブラリで読むには次のようにします。
import zipfile
import xml.etree.ElementTree as ET
def text_of(element):
"""A <text>'s words, <br/> as a line break."""
parts = [element.text or '']
for child in element:
parts.append('\n' if child.tag == 'br' else text_of(child))
parts.append(child.tail or '')
return ''.join(parts)
with zipfile.ZipFile('Tears of Steel.usfx') as usfx:
usf = ET.fromstring(usfx.read('subtitles.usf'))
for block in usf.iter('subtitles'):
language = block.find('language')
if language is not None:
print('#', language.get('code'), language.text)
for subtitle in block.iter('subtitle'):
text = subtitle.find('text')
print(subtitle.get('start'), subtitle.get('stop'),
text.get('speaker'), text_of(text))
他人から受け取ったプロジェクトは、自分が書いたものでないXMLと同じく、xml.etree の代わりに defusedxml で解析してください。
自分で作る
Subtitldが開ける最小のプロジェクトは、subtitles.usf を1つ含むZIPです。マニフェストがなければ、Subtitldは動画の場所を尋ねます。ファイルマネージャーにも認識されるものを作るには、Subtitldが書く形に従ってください。
- 最初に
subtitles.usf、次にmanifest.xml。 - すべてのメンバーをDeflateで圧縮。ただし
thumbnail.pngは無圧縮。 - 吹き替えは
assets/dubs/の下に置き、ドキュメントではパッケージ内のパスで指す。 - すべてUTF-8。
Subtitldは知っているものだけを残します。 保存では、このページにあるメンバーと、Subtitldが古いドキュメントから理解した内容で作ったドキュメントを書き込みます。他のツールがパッケージに加えたファイルや、USF内の独自の要素は、Subtitldがプロジェクトを保存した時点で失われます。自分のデータは別に置いてください。
他の形式との比較
USFXは、オフィススイートや電子書籍の文書パッケージと同じ作りです。ZIP、XMLのメインドキュメント、目録、そしてその隣のメディア。
ODF(.odt) |
EPUB | Office Open XML(.docx) |
USFX | |
|---|---|---|---|---|
| 規格 | OASIS ODF 1.3 Part 2 | W3C EPUB 3.3のOCF | ECMA-376 Part 2、OPC | このページ |
| ツールが判別する方法 | 無圧縮の最初のメンバー mimetype |
無圧縮の最初のメンバー mimetype:application/epub+zip |
[Content_Types].xml |
バイト30にある最初のメンバーの名前 subtitles.usf |
| 目録 | META-INF/manifest.xml。各ファイルにタイプ |
META-INF/container.xml、次にパッケージ文書 |
[Content_Types].xml と _rels/ |
manifest.xml。各メンバーにタイプ |
| メインドキュメント | content.xml |
パッケージ文書とそのスパイン | word/document.xml |
subtitles.usf |
| メディア | Pictures/ |
パッケージ内のどこでも | word/media/ |
assets/ |
| プレビュー | Thumbnails/thumbnail.png |
表紙画像 | 任意のサムネイルパート | 無圧縮の thumbnail.png |
メインドキュメントはそれ自体がオープンなフォーマットです。.usfx から subtitles.usf を取り出せば、それは2002年から仕様が公開されているUSFファイルです。
豆知識
すべてのプロジェクトで最初のメンバーの名前が始まるバイト位置です。HaikuはこれでSubtitldのプロジェクトを他のZIPと区別します。
プロジェクトの画像のサイズです。ファイルマネージャーはファイルを正方形で表示するので、4:3にしています。
.usfx にLinux、Windows、macOS、Haikuで専用のアイコンを与え、WindowsのエクスプローラーとLinuxのファイルマネージャーでその画像を表示できるようにしたリリースです。
関連する形式
Subtitldで動画を開き、字幕を作って保存すれば、それが .usfx です。