🙅‍♂️

YouTubeの字幕を取得するWebアプリを作ろうとして断念した話

に公開

はじめに

LLM時代においてテキストデータの価値はますます高まっています。
私はよくYouTubeを観るのですが、動画データはLLMには扱いづらいと感じており、常々テキストデータに変換できればと思っていました。YouTubeでは字幕が自動生成されているため、それを取得できればLLMに食わせて面白いことができそうだ、と考えて、学習も兼ねてアプリを作ろうと思ったのが今回の動機となります。

が、結論から言うと断念しました。
この記事では他の方が同じ轍を踏まないように、私の取り組みを共有しようと思います。

やりたかったこと

以下のようなWebアプリを作ろうとしました。

アプリ名)YouTube字幕エクスポーター

  • ログイン不要・誰でも使えるWebアプリ
  • YouTubeのURLを入力 → 字幕を抽出 → テキストで表示 → ダウンロード

実際に作っていたPoCはこちらです。


技術調査

このアプリの肝はYoutubeの字幕を取得するロジックのため、まずはどうすれば実現できるか簡単に技術調査を行いました。

YouTube Data API

まず思いついたのがYoutubeの公式APIです。
https://developers.google.com/youtube/v3?hl=ja

しかし、このAPIは自分がアップロードした動画以外の字幕を取得することができません。
そのためこちらは断念しました。

youtube-transcript-api

次に代替案として、こちらの非公式のAPIを見つけました。
https://github.com/jdepoix/youtube-transcript-api

こちらであれば任意の動画に対して字幕を取得できることがわかったため、こちらを使ってアプリの実装を行いました。

実装方針1:youtube-transcript-apiをサーバで動かす

ということで、youtube-transcript-apiによって字幕を取得する方針で設計と実装を行いました。アーキテクチャは以下のようにしています。

見つかった課題(その1)

上記のyoutube-transcript-apiを用いて滞りなくPoCを開発し、ローカルで正常に字幕を取得できることを確認しました。これであとはAzureなどに上げて公開するだけ、そう思っていたのですが、ここで問題が見つかりました。

youtube-transcript-apiREADMEで気になる記載を見つけました。

残念ながら、YouTubeは現在、AWS、Google Cloud Platform、Azureなどのクラウドプロバイダに属するIPアドレスのほとんどをブロックするようになっています。そのため、こうしたクラウド環境にコードをデプロイすると、RequestBlocked や IpBlocked といった例外が発生する可能性が非常に高いです。また、自前でホスティングしている場合でも、リクエストが多すぎるとIPがブロックされることがあります。

どうやらクラウドにアプリをデプロイした場合、クラウドからのYouTubeへのアクセスはYouTube側でブロックされるとのことです。

実際にそういった投稿も見つかります。
TranscriptsDisabled But it's not disabled (works locally, fails on Cloud machine) #303

ローカルでは問題なく動いても、クラウドにデプロイすると使えなくなるのでは本末転倒です。
ということで、この方針は断念しました。

実装方針2:youtube-transcript(JavaScript)をクライアントで動かす

次に考えたのが、ユーザーのブラウザで処理させる方法です。
サーバーサイドからのアクセスがYouTubeでブロックされてしまうのなら、ユーザーのブラウザ上で字幕を取得してしまおうという考えです。

処理は以下のようになります。

JavaScript製ライブラリyoutube-transcriptを見つけたのでこちらで実装してみました。
https://github.com/Kakulukian/youtube-transcript

見つかった課題(その2)

ただし、再び課題が見つかりました。

どうやらYouTube側が対象リソースに対してCORS(クロスオリジンリソース共有)を許可していないため、ブラウザから直接YouTubeのリソースにアクセスしようとすると、CORSポリシーによりリクエストがブロックされてしまいます。

CORSポリシーについては他にわかりやすく説明している記事があるため割愛しますが、YouTube側がCORSを許可していないため私にはどうしようもなく、こちらの方法も断念しました。

まとめ

以上が私の取り組みになります。
まとめるとこうなります。

手法 結果 理由
YouTube Data API 自分の動画にしかアクセスできない
youtube-transcript-apiをサーバで動かす YouTubeがクラウドIPをブロック
youtube-transcript(JavaScript)をクライアントで動かす CORS制限でブロック

ちなみに、これらはWebアプリとして提供しようとした場合の事象のため、ブラウザの拡張機能やデスクトップアプリとして提供すれば回避できそうです。ただ私がやりたかったこととはズレるため、今回は断念としました。

以上、この記事が皆さんの助けになれば幸いです。ここまでお読みいただきありがとうございました。

Discussion