0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

YouTube字幕を取得し、LLM(Gemini-1.5-flash)で要約するアプリ作成の試行のつづき

Last updated at Posted at 2024-10-22

ReactとNext.jsでフロント、Pythonでバックエンドを開発し、Vercelへデプロイした話。ついでにSquidとngrokでプロキシサーバも作った!の続編です。

困ったこと(大きく2点)

(1)フロントとバックの通信問題

  • フロントエンドとバックエンドを別々のアプリケーションにする必要がありました。そこで、フロントエンドとバックエンドを通信させようとしたところ、CORSエラーが発生。CORSの制御は私には難しく感じました。
    AIに相談した結果、Vercelに2つのアプリをデプロイし、1つのドメインとして扱う方法が可能とのことで、以下のようなJSON設定を作成しました。(フロントはデプロイした時に生成されるURLを使い、バックは、以下のようにフロントのサブURLに見える。)

これにより、バックエンド側では以下のエンドポイントが呼び出されます:

@app.route('/api/download/<video_id>', methods=['GET'])
def download(video_id):

フロントエンドに配置(バックエンドをデプロイしてURLが決まってからフロントエンドをデプロイ)
Vercel.json

{
  "rewrites": [
    {
      "source": "/app2/(.*)",
      "destination": "https://backend-teal-five-69.vercel.app/$1"
    }
  ]
}

フロントエンドからバックエンドにアクセスするロジック:

<a
  href={`/app2/api/download/${result.videoId}`}
  target="_blank"
  rel="noopener noreferrer"
  className="bg-blue-500 text-white p-2 rounded hover:bg-blue-600"
>
  字幕要約
</a>

バックエンドの確認用URL:

@app.route("/")
def hello_world():
    return "<p>path : /  hello world</p>"

(2)YouTube字幕取得APIの拒否問題

  • YouTubeから字幕を取得しようとした際、YouTube APIが拒否されました。この問題はこちらのissuesでも言及されていますが、プロキシサーバを経由することで解決する必要があるとのこと
    https://github.com/jdepoix/youtube-transcript-api/issues/303
    そこで、自宅のWindows環境にプロキシサーバを構築し、外部アクセスを可能にしました。Wi-Fiが無くiPhoneのテザリングのみで接続していますが、問題なく実現できました。

  • 使用したツール:
    Ngrok: 自宅サーバを公開するためのツール
    Squid: プロキシサーバとして機能

  • Ngrokの使い方
    (localhostのWebアプリを公開)
    参考URL: https://www.mgo-tec.com/blog-entry-ngrok-install.html
    まず、localhost上でWebサービスを立ち上げる必要があります。私はReactアプリをlocalhost:3000で起動し、それをNgrokで外部に公開しました。
    NgrokのサイトでサインアップしてAuthtokenを取得
    Ngrokのダウンロードとインストール(ファイルを解凍するだけ。)解答したexeファイルをダブルクリックすると、コマンドプロンプトが開きます。
ngrok authtoken <Authtoken>
ngrok http 3000

これで外部からアクセス可能なURLが生成されます。一旦停止します。

  • Squidの使い方
    参考URL: https://e-kamo.net/install-squid4-on-win10
    Windows版Squidを使ってプロキシサーバを立ち上げました。以下が設定の要点です:

  • Squidをインストール
    設定ファイル(squid.conf)にキャッシュやDNSサーバの設定を追加

# キャッシュディレクトリの設定
cache_dir ufs C:/Squid/var/cache 3000 16 256
# DNSサーバの指定(google)
dns_nameservers 8.8.8.8 8.8.4.4
# error_directoryの指定
error_directory C:/Squid/usr/share/squid/errors/ja-jp
# access.logフォーマットをYYYY/MM/DD HH:MM:SS から始まるように
logformat readable_time %{%Y/%m/%d %H:%M:%S}tl %>a %Ss/%03>Hs %<st %rm %ru %un %Sh/%<A %mt
access_log C:/Squid/var/log/squid/access.log readable_time

追記したら、メモ帳を保存して終了。

Squidに認識させるため、Powershellの管理者権限で停止・起動

net stop "Squid for Windows"
.\squid.exe -z
net start "Squid for Windows"
.\squid.exe -k reconfigure

これでプロキシサーバがポート3128で稼働します。
プロキシサーバを起動したので、パソコンのプロキシを127.0.0.1:3128で設定します。

  • Ngrokの使い方2(Squidのプロキシサーバを公開)
    Squidの設定ファイル(squid.conf)は、http_port 3128となっているので、ポート3128を使います。
    Windows Firewall ディフェンダーとセキュリティソフトでポート3128を開きます。
    SquidプロキシはTCPベースのプロトコルで動作するため、TCPトンネルを作成する必要があります。
    grok tcpコマンドで、TCPトラフィックをトンネルします。
    Ngrokを使ってTCPトンネルを作成し、プロキシサーバを公開します。
ngrok tcp 3128

表示されたURL("tcp://0.tcp.jp.ngrok.io:????")が外部から見た私のプロキシサーバのアドレスになります。

YouTube字幕取得APIの実装
プロキシサーバを介してYouTubeTranscriptApiを利用するためのコードは以下です:

transcript = YouTubeTranscriptApi.get_transcript(
    video_id, 
    languages=['en'], 
    proxies={"https": "tcp://0.tcp.jp.ngrok.io:????"}
)

この方法により、自宅のプロキシサーバを通じてYouTubeの字幕を取得することが可能になりました。

GitHubでソースコードを公開していますので、興味がある方はぜひご覧ください
https://github.com/sinzy0925/vercel-youtube-search

インスタグラムに、毎日やったことを投稿してます。
こちらの件に関する内容は、以下です。(笑笑)
https://www.instagram.com/p/DBOftGBzYUw/
https://www.instagram.com/p/DBRFtYjTmUN/
https://www.instagram.com/p/DBTd4gUzBeu/
https://www.instagram.com/p/DBWLrMAThjm/
https://www.instagram.com/p/DBYyqsYSjwe/

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?