

# YouTubeの字幕をタイミングを維持したままSRTまたはVTTに変換する

YouTubeの字幕をSRTまたはVTTに変換するには、あらかじめ表示時間が設定された字幕キューをUTF-8のテキストファイルとして書き出し、動画プレーヤーで確認します。この方法を使えるのは、時間情報付きの字幕が存在し、手元の動画とオンラインの動画で時間の起点が同じ場合に限られます。コピーした文章だけ、または開始時刻だけでは、正確な終了時刻を復元できません。

字幕キューとは、表示の開始時刻と終了時刻を持つ1つのテキストブロックです。SRT（SubRip Text）では、ミリ秒の前にカンマを使います。VTT（WebVTT）は`WEBVTT`ヘッダーで始まり、ミリ秒の前にピリオドを使います。UTF-8は、特殊文字を損なわずに保存できる標準的な文字コードです。Actorはウェブデータを収集するプログラムで、TaskはActorの入力設定を保存したものです。

字幕の抽出には、[YouTube Transcript Scraper Actor](https://apify.com/chronometrica/youtube-transcript-scraper)を使います。SRT形式とVTT形式に加えて、JSON形式も指定してください。生のJSON出力には、各セグメントのフィールドとして`startSeconds`、`endSeconds`、`durationSeconds`、`text`が含まれます。字幕の生の文字列だけを、UTF-8のテキストファイルとして保存してください。データセット全体をCSVとして書き出したり、`\n`という文字を含むエスケープされたJSON文字列のまま保存したりしないでください。処理に失敗した入力は、データセットの行ではなく、実行結果のOUTPUTに表示されます。1つの字幕トラックを使ったテスト実行では、取得を検証するために61個のキューを保存しました。ただし、ご自身のプレーヤーで再生を確認する必要があります。

時間情報付きの字幕がまったく存在しない場合は、ファイルを検証する前に[YouTube字幕抽出ガイド](https://chronometrica.com/ja/articles/youtube-%E6%96%87%E5%AD%97%E8%B5%B7%E3%81%93%E3%81%97%E3%81%AE%E5%8F%96%E5%BE%97-%E5%AD%97%E5%B9%95%E3%81%AE%E7%A2%BA%E8%AA%8D/)を確認してください。

## 変換と検証の全手順

1. 動画と言語を確認する：動画のURLと選択した言語を確認します。元のJSONキューと取得元のURLを保存してください。
2. 出力形式を指定する：JSON、SRT、VTT形式を指定します。処理が成功した行があり、セグメントが空でないことを確認してください。字幕を取得できない場合は、リンク先の取得ガイドを使ってください。時間情報のないテキストから終了時刻を作り出さないでください。
3. ファイルを保存する：`srt`フィールドの内容全体を`lesson.srt`にコピーするか、`vtt`フィールドの内容全体を`lesson.vtt`にコピーします。文字コードをUTF-8に設定したプレーンテキストエディターを使ってください。JSONの引用符、文字としての`\n`、CSVのセルを残したり、ファイル名の末尾に`.txt`拡張子を付けたりしないでください。
4. 構文を確認する：SRTではキュー番号を付け、ミリ秒の前にカンマを使います。VTTは`WEBVTT`とその後の空行で始まり、ミリ秒の前にピリオドを使います。どちらの形式も、キューの間を空行で区切り、開始時刻と終了時刻の間に`-->`を使います。終了時刻が開始時刻より後になっていることと、キューの開始時刻が前のキューより早くなっていないことを確認してください。時間の重複が正しい場合もあるため、自動で削除せず、再生して確認してください。
5. 動画の再生を確認する：最初、中間、最後のキューを、動画プレーヤー上の映像や音声と照らし合わせます。アクセント記号、改行、長い行を確認してください。書式の確認に合格しても、画面上のタイミングやテキストが誤っている場合があります。
6. 時間のずれを修正する：すべてのキューが同じ一定時間だけ遅れている場合は、手元の動画でイントロが削除されていないか確認します。その特定の動画に対してのみ、開始時刻と終了時刻の両方を、ずれと正確に同じ時間だけ移動してください。時間の経過とともにずれが大きくなる場合、一定時間の移動では修正できません。ずれが次第に大きくなる場合は、未検証のフレームレート変換を適用せず、正しい時間情報を持つ元の字幕に戻ってください。
7. 最終ファイルを保存する：元のキューと、承認された時刻変更の記録を保存してください。

## 架空のサンプルファイル

秒単位の時刻を持つ3個のキューを使った簡単な例を示します。

- キュー1：`0.250`秒から`2.750`秒 — 「設定を開いてください。」
- キュー2：`3.000`秒から`5.500`秒 — 「Françaisを選んでください。」
- キュー3：`6.000`秒から`8.125`秒 — 「変更を保存してください。」

### SRTファイルの全内容

```srt
1
00:00:00,250 --> 00:00:02,750
Open the settings.

2
00:00:03,000 --> 00:00:05,500
Choose Français.

3
00:00:06,000 --> 00:00:08,125
Save the change.
```

架空のサンプルファイル

### VTTファイルの全内容

```vtt
WEBVTT

00:00:00.250 --> 00:00:02.750
Open the settings.

00:00:03.000 --> 00:00:05.500
Choose Français.

00:00:06.000 --> 00:00:08.125
Save the change.
```

架空のサンプルファイル

ミリ秒を区切る記号は、SRTではすべてカンマ（`00:00:00,250`）、VTTではすべてピリオド（`00:00:00.250`）になる点に注意してください。

### 計算の内訳

小数で表した秒をミリ秒に変換するには、1,000を掛けます。たとえば、`0.250`秒は`250`ミリ秒になり、`8.125`秒は`00:00:08.125`になります。

- 各キューの表示時間は、2.500秒、2.500秒、2.125秒です。
- キューが実際に表示される時間の合計は7.125秒です（`2.500 + 2.500 + 2.125`）。
- 字幕全体の開始から終了までの時間は7.875秒です（`8.125 - 0.250`）。これにはキュー間の空白時間も含まれます。

どちらの合計値も、[テキストの正確さ](/ja/articles/youtube%E5%8B%95%E7%94%BB%E3%81%AE%E6%AD%A3%E7%A2%BA%E3%81%AA%E5%BC%95%E7%94%A8%E6%96%B9%E6%B3%95/)や読む速さを測るものではありません。

### 時間のずれを修正する別の例

別の動画コピーで、1.000秒のイントロが削除されている場合を考えます。その動画で元の開始時刻と終了時刻が`10.250–12.750`秒だったキューは、1.000秒を引くと`9.250–11.750`秒になります（`10.250 - 1 = 9.250`、`12.750 - 1 = 11.750`）。

この時刻の移動を、最初の三つのキューを使ったサンプルファイルに適用しないでください。最初のキューの開始時刻（`0.250`）から1.000秒を引くと、無効な負の開始時刻（`-0.750`）になってしまいます。元のファイルは変更せずに保存し、時刻を移動したファイルは使用前に動画プレーヤーで確認してください。

## 次に行うこと

[youtube-transcript-scraper](https://apify.com/chronometrica/youtube-transcript-scraper)を開くか、[YouTube Subtitles in SRT and VTT Task](https://apify.com/chronometrica/youtube-transcript-scraper/examples/youtube-subtitles-srt-vtt)を起動し、JSONと必要な字幕形式を指定して1本の動画でテストしてください。その後、出力された文字列をファイルとして保存し、プレビューで確認してください。

## 出典と参考資料

- [WebVTT：ウェブ動画のテキストトラック形式（W3C勧告候補草案）](https://www.w3.org/TR/webvtt1/)
- [SubRipのファイル構造とミリ秒の構文（米国議会図書館）](https://www.loc.gov/preservation/digital/formats/fdd/fdd000569.shtml)
- [動画の文字起こしと字幕を管理する（YouTubeヘルプ）](https://support.google.com/youtube/answer/15930243?hl=en-CA)