字幕と書き起こしのJSON

開く保存書き起こし音声認識

1つのフォーマットではなく、多くのフォーマットの総称です。音声認識エンジン、動画サイト、字幕サイトは、字幕や書き起こしをJSONで渡します。それぞれ独自の構造を持ちます。Subtitldは、字幕が持つすべての情報を含む独自の形式で保存します。その形式はWhisperが書く形です。また、十数種のツールが書くJSONを開くこともできます。

概要

拡張子.json
メディアタイプapplication/json
仕様JSONそのもの。RFC 8259とECMA-404。構造はツールごとに異なります。
時間の精度Subtitldのもの: 秒単位(ミリ秒まで)。他のもの: ミリ秒、秒、100ナノ秒単位のティック、または "1.400s" のようなテキスト
文字コードUTF-8
装飾Subtitldのもの: テキストが保持するタグ。YouTubeのもの: 太字、斜体、下線、色。その他: なし
配置Subtitldのもの: テキスト内の {\an8}。YouTubeのもの: ウィンドウ。Bilibiliのもの: 位置
話者Subtitldのもの: speaker。音声認識サービスは、それぞれのラベルを付けます
コンテナ内なし

SubtitldのJSONの構成

Subtitldが保存する内容を、1つの字幕について示します。

{
  "language": "en-us",
  "segments": [
    {
      "id": 0,
      "start": 23.0,
      "end": 24.5,
      "text": "You're a jerk, Thom.",
      "speaker": "Celia"
    }
  ],
  "text": "You're a jerk, Thom."
}
項目 内容
"language" プロジェクトの言語。Subtitldでの表記(en-us)
"segments" 字幕。順番どおり
"id" 番号。Whisperと同じく0から
"start"、"end" 秒
"text" テキスト。タグ(<i>、{\an8})と改行(\n)を含みます
"speaker"、"translations" など 字幕が持つその他の情報。話者、言語ごとの翻訳、吹き替え
末尾の "text" すべてのテキストを1行にしたもの。それだけを必要とするツール向けです。読み戻されることはありません

意図的にWhisperの構造にしています。 OpenAIのWhisperが書く形式なので、Whisperのセグメントを読むツールは、Subtitldのファイルも読めます。また、Subtitldは、Whisperのファイルを開けます。ただし、デコードの統計と単語ごとの時刻は除きます。

Subtitldが開くもの

各ツールのJSONは、そのキーによって種類が分かります。Subtitldが開けるのは次のものです。

ツール Subtitldが取り込む内容
Subtitld、OpenAIのWhisper すべての項目(Subtitldのもの)。テキストと言語(Whisperのもの)
whisper.cpp セグメント。2つのチャンネルを区別している場合は話者
WhisperX セグメントと話者
YouTube(.json3、yt-dlpが保存する形式) テキスト、太字、斜体、下線、色、位置
Bilibili(.bcc) テキストと位置
AssemblyAI、Deepgram、AWS Transcribe、Rev.ai、Google Speech-to-Text、Azure Speech、Speechmatics 単語、話者、言語を字幕に変換
Amara テキスト、斜体、太字、下線、上部に表示される字幕

どれでもないJSONファイルは、その旨を表示します。有効なJSONでないファイルは、エラーの行と列を示します。

書き起こしを字幕へ

音声認識サービスは、単語とその時刻、または長い発話のまとまりを渡します。Subtitldは、品質チェックパネルで許可された範囲内で、それらを字幕にします。ここでの範囲は、1行あたりの文字数、行数、秒数です。字幕は次の場所で終わります。

  • 話者が変わったとき、または発話が1秒を超えて途切れたとき。
  • 文末で、次の文を加えると1行を超えてしまうとき。
  • いっぱいになったとき: ほどよく埋まる最後の句読点、なければ2語の間。

単語の時刻がない発話は、同じ方法で分けます。その時刻は、各部分の長さに応じて割り振られます。

先に上限を設定してください。 字幕は、ファイルを開くときに作られます。書き起こしを開く前に品質チェックの上限を変えると、字幕を長くも短くもできます。

話者と言語

サービスは話者に 0、spk_1、SPEAKER_02、S3 などの番号を付けます。Subtitldは、それらを話し始めた順にA、B、C…と呼び、話者の名前は自分で付けます。ファイルが名前を持つ場合(Rev.aiはそれができます)、その名前を保持します。

プロジェクトの言語は、ファイルから読み取ります。コード(en_us、pt)、または名前(Whisperが指定されたときに保持する English)として書かれています。ない場合は、ファイル名から判断します(video.en.json3)。プロジェクトと同じ言語のファイルは、プロジェクトの国の指定を保持します。たとえば pt-br のプロジェクトでは、pt は pt-br になります。

YouTubeのjson3

YouTubeのプレーヤーが読み、yt-dlpが .json3 として保存する形式です。ミリ秒単位のテキストのイベントからなり、太字、斜体、下線、色のペン、そして表示位置のウィンドウを持ちます。自動キャプションは、行が次々と切り替わり、それぞれ次の行が現れるまで表示されます。Subtitldは、次の行が始まるまで、各行を1つの字幕にします。

BilibiliのBCC

Bilibiliのプレーヤーが読む形式で、Subtitldが保存するもう1つのJSONです。

{
  "font_size": 0.4,
  "font_color": "#FFFFFF",
  "background_alpha": 0.5,
  "background_color": "#9C27B0",
  "Stroke": "none",
  "body": [
    {
      "from": 23.0,
      "to": 24.5,
      "location": 2,
      "content": "You're a jerk, Thom."
    }
  ]
}

時刻は秒です。content はプレーンテキストで、改行は \n で示されます。上部の見た目は、Bilibiliの公式ファイルが持つものと同じです。Subtitle Editも同様に書き出します。

一度に1つの字幕。 同時に表示される字幕は、1つのエントリにまとめられ、テキストは1行ずつになります。そのため、タイムラインに重なりは生じません。location は常に2、つまり下中央です。Bilibiliのプレーヤーが、それ以外の場所に字幕を配置するために使うことは知られていません。

Subtitldでの JSON

Subtitldの JSON に残るもの
  • 各字幕のテキスト、装飾、位置
  • 話者、翻訳、吹き替え
  • 開始と終了(ミリ秒単位)
  • プロジェクトの言語
残らないもの
  • 単語ごとの時刻と、サービスがそれぞれにどれだけ確信を持っていたか
  • Whisperのデコードの統計
  • YouTubeのフォント、サイズ、縁、背景
  • BCCでは、装飾、位置、原文の横に並べた翻訳

Subtitld独自の情報を残すには、.usfx プロジェクトとして保存してください。

書き出し

Subtitldのエクスポートダイアログ。BCCを選択し、原文と話者名がテキストの前に表示されています

エクスポート、字幕の順に選ぶと、次の2つを選べます。

  • JSONSubtitld独自のもの。プロジェクトをそのままの状態で、すべての字幕とすべての項目を保存します。
  • BCCBilibiliのもの。原文、翻訳、または両方(翻訳は下に表示)。話者名は省略するか、テキストの前に書きます。必要に応じて時刻をずらすこともできます。

豆知識

UTF-8

JSONの標準であるRFC 8259(2017年)は、システム間で送るJSONはUTF-8でなければならないと定めています。

10,000,000

Azureの書き起こしで1秒あたりのティック数です。時刻を100ナノ秒単位で数えます。

5

YouTubeのプレーヤーは、表示時間を指定していないjson3のキャプションを5秒間表示します。

関連する形式

.json の修正が必要ですか?

Subtitld で動画と一緒に開き、波形上でタイミングを調整しましょう。

Subtitld をダウンロード