![見出し画像](https://assets.st-note.com/production/uploads/images/147073534/rectangle_large_type_2_b44ad108a17e848fdf24e39b8b55fb02.jpeg?width=1200)
大谷ホームラン実況BOTを作りました!
多くの日本の中年男性がかかる病「大谷ホームラン病」。
ドジャース大谷翔平選手の活躍に一喜一憂。ホームランでも打てば我が子のことのように喜び、打たないと気分は落ち込む。あのビートたけしさんもかかったという病です(→ソース)。
大谷ホームランの動画を何度もYouTubeやらXで見ているのですが、私は大谷のホームランの映像よりも興奮している実況を聞くのが好きです。
このとにかく大興奮している感じが好きなのですが、英語が理解できないので何を言っているかはわからない。わからなくて興奮は伝わるのですが、どんなことを言っているか知しりたくYouTubeの翻訳機能を使うのですがうまくいかない。
それなら自力で作るしかない。
という謎の使命感から、この大谷ホームラン実況BOTをXで作成しました。
「1-0、彼はスイングし、1打を打ち込む、堂々たるドライブ、どこまで行くか?ドジャースが先制!レジー・ウィルソンウィル・スミスの1ストライク。大谷翔平の今季27本目のホームラン、ここ14試合で10本目。そしてこの一発は、この試合をひっくり返#大谷ホームランhttps://t.co/y0BnoTLDdt
— 大谷ホームラン実況bot (@ohtani_home_run) July 3, 2024
大谷ホームラン実況BOTの概要
大谷ホームラン実況BOTは「大谷のホームラン動画の実況を翻訳する」だけですが、大まかに3つの工程が必要になります。
大谷のホームラン打ったらできるだけ早く検知
該当のホームラン動画を探し実況の音声だけを切り抜く
その実況を文字に起こし翻訳してポスト
思ってた以上に大変でした。
肝心なのは①の"できるだけ早く"というところで、インプレッションを上げるためにとにかく早いポストが望まれます。
細かい工程は後ほど述べるとしまして、今回利用しました技術的なものを先に列挙しておきます。(作成はPythonで行いました)
BeautifulSoup4(ホームラン検知の際のスクレイピングに利用)
YouTube Data API(ホームラン動画の検索)
yt-dlp(YouTube動画のMP3化)
OpenAI API(Whisperによる音声文字起こし・実況切り抜き)
DeepL API(英語の翻訳)
X API(APIによるポスト)
ではざっとですが、内容を紹介します。
1.大谷のホームラン検知
まず最初の難題で
どうやって大谷のホームラン検知するか?
にぶち当たるのですが、ネットで色々探していたところ「大谷ホームランBOT」を既に作られている方がいました。
LINEBOTであることと実況を文字に起こすという点で違いますが、ホームラン検知までは目的は変わりません。こちらの方はヤフーニュースからスクレイピングで大谷のホームランを検知しています。
私も色々考えPythonでMLBのデータが取得できるPybaseballを利用できないかなど考えてみたのですが、リアルタイムでデータの更新が行われるわけではないので断念。やはりニュースサイトのスクレイピングでホームランを検知することにしました。(他人のXのポストから検索するという手もありますが、XのAPIは高いので諦めました)
私は日刊スポーツの大谷選手のページから見出しに"本塁打", "ホームラン", "号", "弾"のいずれかが含まれ、かつ"全ホームラン", "なるか"のいずれもない場合にホームラン検知とすることにしました。
"全ホームラン", "なるか"を除いたのはダイジェスト記事と「大谷30号なるか」みたいな釣り記事の誤検知を防いでいます。
またもしここで間違って検知した場合も、次のYouTube動画検索で引っ掛からないので、多少ゆるくても問題なさそうです。
2.ホームラン動画の検索
ホームランを検知した後、YouTubeからホームラン動画を探します。
毎回違うチャンネルから探すのは難しいので、大谷のホームランの後すぐに更新してそうなチャンネルを決めておきます。
「大谷 ホームラン」で検索すると最初に出てくるのはSPOTVNOWというチャンネルです。SPOTVはスポーツ専門のVODサービスなので、大谷がホームランを打った後はかなり早く動画がアップされるようなのですが、実況が日本人です。本来は日本人の実況・解説でありがたいはずなのですが、今回は現地実況がほしいので使えません。
色々探したのですが、更新が早く実況が現地のものなのはMLBの公式チャンネルしかありませんでした。(別に公式でいいのですが、ホームランのシーン以外も長いので音声の切り抜きが必要になります)
そして動画を見つけるにはYouTube Data APIを使います。YouTube Data APIは動画が検索などができるYouTube公式のAPIです。無料で使えるのですが、レート制限が結構厳しく、1日に多くの検索はできないようになっています。
今回の目的となるSearchの仕様はこちらのドキュメントに記載されています。(右側のExplorerで試すこともできます)
やたらパラメータが多いですが、今回は”channelId”にMLB公式のチャンネルID、検索ワードとなる”q”に"大谷 翔平"、いつ以降に公開されたかの”publishedAfter”に指定時間をセットして実行するだけです。(MLBは日本人向けにタイトルに日本語で「大谷翔平」と入れています)
これで実行するとホームラン以外の動画も出てくるのではないか?
と思われるかもしれないですが、”publishedAfter”に指定する時間を現在の時間から2時間前など短い時間にするので、その範囲でホームラン以外の動画がひっかかることはないと想定しています。
3.MP3化→文字起こし→切り抜き
ホームランの動画が見つかったら、MP3に落として文字に起こします。MP3にするのはyt-dlpを利用します。
yt-dlpはオープンソースのYouTube動画を音声にするソフトで、Windowsからでも利用できますし、Pythonからも実行できます。
文字に起こすのはOpenAIのWhisperです。
https://platform.openai.com/docs/guides/speech-to-text
Whisperは無料で利用できるダウンロード版もありますが、環境にGPUが必要なのでAPIを利用します。(APIでも1時間の音声で約60円なので大した費用になりません)
その後に切り抜きをします。MLB公式の動画はホームランの打席を全て流しているため、ホームランを打つ前の投球の実況が不要なので切り抜きをします。切り抜きは次のプロンプトでGPT-4oにしてもらいます。(やっぱりOpenAIのAPIです)
次はMLBの試合でのアナウンサーの実況を文字に起こしています。大谷翔平がホームランを打っているシーンだけ実況を切り取ってください。
4.翻訳・ポスト
切り抜いた後は翻訳してポストするだけです。翻訳はDeepLを利用します。
OpenAIのGPTでも訳してもらえますが、DeepLの方が確実ですし"無料"なのでこちらを使ってしまいました。※一定文字数まで無料です
ポストはX APIを使います。X APIは投稿だけなら1日50件まで無料です。(無料プランはほぼ投稿のみで、自分も含めポストの取得はできません)
これでポストして完了です。(リプライに英語の原文をポストしています)
そして再度となりますが、出来たのがこちらとなります。
「右中間にスマッシュがある。忘れてください。驚異の一発。大谷翔平がまたやってくれた。彼はまたやってくれた。毎晩毎晩、顎を落とすような畏敬の念を抱かせる。大谷翔平は25回目の頭を振っている。またか、と首を前後に振っているところだ。宣伝通りもあ#大谷ホームランhttps://t.co/opk1o0qsap
— 大谷ホームラン実況bot (@ohtani_home_run) June 27, 2024
運用面と欠点
このBOTは毎日MLBの主な試合時間である5時~14時(日本時間)の間、10分に一回Pythonファイルを実行するようにしています。残念ながら1日に2本以上ホームランを打ってしまうと判定が不能(1本目か2本目かの判別ができない)となってしまうため、1日1ポスト以上しないようにしています。
ここら辺もGPTで判別出来たら…とも思うのですが、なかなか複雑そうなのでいつかもの凄く暇になった時対応したいと思います。
おわりに
なんとも微妙な長さの説明ですがこれで終わりです。
ソースはここに置いておきますので興味ある方は見て下さい。
https://github.com/nekoniii3/ohtani_hr_bot
ポストを見てもらえばわかるように、"「"など余計な文字が入っていたり、いまいちうまく切り抜けていなかったり、まだまだ修正の余地がありそうです。
こちらのbotの作り方が、何かの参考になればと思います。
大谷BOTフォローしてくだされば幸いです!
※勝手に音声を使っているので著作権的にあれかと思いますが、ご容赦ください