高度な表示のできるYouTube字幕ファイル（YTTファイル）をダウンロードする方法

YouTubeには、多様な装飾やアニメーション効果が付けられた高度な字幕（拡張字幕）が存在します。通常のSRT字幕とは違い、カラーやフォントサイズ、文字の縁取りなど、視覚的にリッチな演出が可能です。こうした装飾が施されている字幕ファイルは主に「YTT」形式で配布・管理されています。

本記事では、YouTube上で公開されているYTT字幕ファイルをダウンロード・利用する方法を紹介します。

## こんな字幕を見たことはありませんか？

以下の動画などで、色や装飾がついた高度な字幕を見かけたことがあるかもしれません。

![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100169/9a03f7d3-9cc7-0af2-1162-376c9b6d5f50.gif)

https://youtu.be/KfZR9jVP6tw

https://youtu.be/zPMWAj54Seg

https://youtu.be/9fkXHT8eC60

もし「こんな派手な字幕を自分でも作れたら面白そう」と思ったら、まずは既存のYTT字幕を取得して中身を見てみるのがおすすめです。

## YTTファイルとは？

YouTube独自の拡張字幕ファイル形式で、見た目の情報（テキストカラー、位置指定、サイズなど）が含まれているのがSRTとの大きな違いです。下記の記事も参考になります。

https://qiita.com/1204yudai/items/898c368af8832443a874

ただし、上記記事にはYTTファイルの**ダウンロード方法**が記載されていません。そこで、本記事ではPythonライブラリ「yt-dlp」を活用してYTTファイルを取得する手順を説明します。

## 準備環境

- **OS**: Windows 11 Pro (22H2)
- **Python**: 3.9.16
- **yt-dlp**: 2023.7.6  
- **VSCode**: 1.81.1

本記事ではWindows 11を前提としていますが、macOSやLinuxでも同様の手順が可能です。

## Python環境の構築

Pythonがまだインストールされていない場合は、公式サイトからダウンロードするか、Windows用のMicrosoft Storeからインストールします。  

- [Python公式サイト](https://www.python.org/downloads/)

VSCodeを使って仮想環境を構築する方法については、例えば下記の記事などが参考になります。

- [Pythonの仮想環境をVSCodeで構築する手順](https://www.useful-python.com/env-python-vscode-windows/)

## yt-dlpのインストール

[yt-dlp](https://github.com/yt-dlp/yt-dlp) は、YouTube動画や字幕のダウンロードを可能にするツールです。  
以下のコマンドを実行して、Python経由でインストールしてください。

```bash
pip install yt-dlp
```

インストールが完了すると、コマンドライン上で `yt-dlp --version` と入力することで、バージョン確認ができます。

## ダウンロードスクリプトを書く

ここでは例として、以下のPythonコードを使ってYTT字幕ファイルをダウンロードします。ファイル名を `youtube_subtitle.py` とし、任意のフォルダに保存してください。

```python
from yt_dlp import YoutubeDL
import requests

# ここにダウンロードしたいYouTube動画のURL（または動画ID）を入力
id = 'https://www.youtube.com/watch?v=vSHpZeCu8eg'  # 例: 'vSHpZeCu8eg' のみでも可

# 必要に応じて変更
language = 'ja'        # 取得したい字幕の言語コード
subtitle_track_num = 3 # マルチトラックの字幕がある場合に選択

# YoutubeDLのオプション
ydl_opts = {
    'writesubtitles': True,     # 字幕情報の取得を有効化
    'allsubtitles': True,       # すべての字幕情報を取得
    'subtitleslangs': [language],
}

with YoutubeDL(ydl_opts) as ydl:
    info_dict = ydl.extract_info(id, download=False)

# 日本語字幕が存在するかをチェック
if 'subtitles' in info_dict and language in info_dict['subtitles']:
    subtitles_info = info_dict['subtitles'][language]

    # 指定した字幕トラックが存在するかをチェック
    if len(subtitles_info) > subtitle_track_num:
        subtitle_track = subtitles_info[subtitle_track_num]

        # 字幕データを取得
        subtitle_content = requests.get(subtitle_track['url']).text

        # 動画タイトルの取得（ファイル名用に無害化）
        title = ''.join(char for char in info_dict["title"] if char.isalnum())

        # 拡張子を指定（YTTファイルであることを想定）
        ext = 'ytt'

        # ファイルに保存
        filename = f'{id}_{title}_{language}.{ext}'
        with open(filename, 'w', encoding='utf-8') as subtitle_file:
            subtitle_file.write(subtitle_content)

        print('\033[32m' + 'success : 日本語の字幕をダウンロードして保存しました。' + '\033[0m')
        print(f'ファイル名: {filename}')
    else:
        print('\033[31m' + 'failure : 指定の字幕トラックが見つかりませんでした。' + '\033[0m')
else:
    print('\033[31m' + 'failure : この動画には日本語の字幕が利用できません。' + '\033[0m')
```

### コードのポイント

1. **`YoutubeDL`のオプション設定**  
   - `writesubtitles`: True にすると、字幕情報の取得が有効になります。  
   - `allsubtitles`: True にすると、動画にあるすべての字幕情報を引き出してきます。  
   - `subtitleslangs`: 取得したい言語を指定。

2. **字幕トラックの指定**  
   - `subtitle_track_num` は、複数の字幕トラックが含まれる場合に、どれを使うかを指定しています。日本語字幕でも機械翻訳や自動生成など複数存在する場合があるためです。

3. **ファイル名の生成**  
   - Windowsで扱いやすいように、動画のタイトルから特殊文字を削除しています。  
   - 拡張子は仮に「ytt」としています。保存後の編集や確認にご利用ください。

4. **HTTPリクエストで字幕を取得**  
   - `requests` モジュールを使い、`subtitle_track['url']` にアクセスして実際の字幕ファイルの内容を取得しています。

## スクリプトの実行

スクリプトを保存したディレクトリで以下のコマンドを実行します。

```bash
python youtube_subtitle.py
```

エラーなどが出なければ、指定した動画のYTT形式の字幕ファイルがローカルに保存されます。

## ダウンロードしたYTT字幕を確認する

生成された `.ytt` ファイルをテキストエディタで開くと、独自のタグやメタデータが含まれているのが確認できるはずです。  
たとえば、元の位置情報や色の指定などが反映される場合があります。ただし、YouTube自身のプレイヤー以外でこれらの情報を完全再現するのは難しい場合があります。

また、動画編集ソフトやウェブプレイヤーなどで「.ytt」に部分的に対応しているものもありますが、あまり一般的ではないので、「.ytt」をさらに独自に変換するツールが必要になることもあります。

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100169/b6e760e3-5639-4058-110a-0cfd93ed6e6c.gif)

## 注意点・補足

1. **YouTubeの仕様変更**  
   - YouTubeは頻繁に内部APIや仕様を変更します。そのため、`yt-dlp` が最新でも動かなくなるケースがあります。もしダウンロードが急に失敗するようになったら、`pip install --upgrade yt-dlp` などでアップデートを試してください。対応が追いつくまで待つ必要がある場合もあります。

2. **著作権について**  
   - ダウンロードしたコンテンツは、あくまで個人利用の範囲でお楽しみください。動画や字幕の著作権はコンテンツ提供者にあります。配布や二次利用の際は、著作権者の許可が必要となる場合があります。

3. **字幕の体裁のズレ**  
   - ダウンロードしたYTTファイルを別の場所で再生すると、字幕位置やスタイルが崩れる場合があります。これはYouTube側の独自スタイルを完全に再現できないためです。編集や再利用をする際は、ある程度レイアウトの調整が必要です。

## まとめ

- YouTubeでは、装飾が反映された「YTT形式」の字幕が使われるケースがあります。  
- `yt-dlp` を利用すれば、YTTファイルも含めた各種字幕データを簡単にダウンロード可能です。  
- 「YT-DLP → メタ情報取得 → 字幕データのURL → 実際に字幕ファイルを取得」の流れが基本です。  

YouTubeの字幕を取得して学習・研究したい方や、自分で独自にカスタマイズしたい方の参考になれば幸いです。高度な装飾字幕の仕組みや形式を知っておくと、自分の動画制作にも応用できるかもしれません。

これを機に、ぜひYTT字幕ファイルを活用してみてください。楽しみながら字幕や動画編集の幅を広げていきましょう！