この記事は「Wake Up, Girls! Advent Calendar 2019」18 日目の記事です
この記事では推しの声優の情報を自動的に収集する仕組みである @yoppinews bot の開発や運用についてご紹介します。
声優のファン活動のなかで、どのような作品やイベントに出演するのかといった情報をおさえておくのは重要でありながら意外にも時間やコストを要します。
チケットの争奪戦が予想される場合、オタクはひっそりと情報を仕入れそっと eplus で抽選に申し込みます。 気づけば行きたかったイベントの抽選は終わっているなんてことが初期にはよくありました(遠い目)。
だいたい同じ演者を追っている人間を twitter でフォローしておくと関連する情報が入ってきてベンリですが、声優オタク人生は山あり谷あり他界あり で、「お前が一番!」とか言ってたオタクは大体わりと早期に他界 します(当社調べ)。
私が現在活動を追っている 青山吉能 さんは 2019 年 3 月に解散した Wake Up, Girls! という声優ユニットに所属していました。
ユニットの解散から四半世紀が経った今、一つのものを追いかけていたタイムラインのオタクはゆるやかに散り散りになりつつあります。
このようなことは予見できたため、自分自身が怠惰にオタク活動を継続するために、自前で青山吉能さんのみの情報が得られる独立した情報収集の仕組みとして Twitter Bot: @yoppinews を作ることにしました。
モノとしてはあくまで自分のために作っており、第三者に情報を拡散するようなことを目的とはしていませんでしたが、成果物に対する反応は改善を行うモチベーションにもなるため公開しています。
この記事では、声優の情報を収集する仕組みの要件、実際のシステムの構成、および成果物の利用方法について解説を垂れ流しますが、かなり愚直な実装で大したものではありませんので、興味のある方は覗いてみてください。
@yoppinews を作成するにあたり、どんな情報をどのように配信したいのかを考えました。以下それぞれの内容について見ていきます。
昨今の声優業界では、twitter、ブログ、Web サイト、プレスリリース、ニュースサイトのいずれかの形で最新情報が告知されることがほとんどであるため、以下のような監視を行えば 8 割以上の情報をキャッチできそうです。
なお、残念ながら インスタグラムはスクレイピングなどによる自動化が規約上難しい ため、ネイティブアプリの通知機能などを利用して人力で情報を拾う必要があります(なんか良い手を知ってる方いたら教えて欲しい)。
不正な方法を用いて、アカウントの作成、情報へのアクセス、または情報の取得を試みることは禁止されています。 これには、弊社から明示的な許可を得ることなく、自動化された手段を用いてアカウントを作成したり、情報を取得したりする行為が含まれます。
また放送・配信・イベント・キャラクターの誕生日などの日程を忘れがちなため、リマインダーとなるようなツイートを行う機能があると便利そうです。
どのような運用にて前述のような情報が得られることが理想か現実と折り合いをつけながら検討した結果が以下のようなものになります。
それぞれのシステムでどんな技術やコンポーネントを使い、どのように構成しているかをざっくりご説明しますが、やってる内容はかなり地味です。
前述のような要件や運用想定のもと、関連ツイート検知の仕組みとして yoppinews-bot を運用しています。このシステムの概要は以下のようなものです
システムの全体像は概ね下図のとおりです。太線が主なデータの流れ。点線が関連する API コールやシステム間連携となります。
毎分実行されるジョブのデータフローはおおよそ以下のようなものとなります。
実装コードは GitHub リポジトリ: yoppinews/yoppinews-bot にて MIT ライセンスで公開していますが、2019 年 3 月までほぼ Python でアプリケーションを書いたことがない人間が学習目的で Python を書いたため、標準的でなかったり、わかりにくいコードがあるかもしれません。ボコスカにする Pull Request をお待ちしております。
前述のとおり yoppinews-bot は本質的には Twitter リストに追加したアカウントを対象に関連キーワード/画像/URL 検出を行うという単純な仕組み の bot です。
しかしながら、例えば オタクのツイートをリツイートする何らかのコンテンツの公式アカウント が存在する場合、必要性の薄い情報がノイズとして発生 します(たとえばコンテンツに対するオタクの感想をひたすらリツイートし続ける公式アカウントなど)。
あるいは、演者本人や演者がメインキャストを務める作品のツイート はプライオリティの高い情報で 常にリツイートしたい などといった要求が生じます。
そこで yoppinews-bot には クロール対象の Twitter リストを複数設定できるようにし、かつ各 Twitter リスト単位でどのようなレベルの検知を行うか といったことを細かく設定できるようになっています。
実際に現在本番環境で運用しているリスト は以下のようなものです。検知オプションのバリエーションとして 6 種類の Twitter リストを運用 しています。
このような設定は YAML 形式のアプリケーションの設定ファイル: config.yaml にて設定が可能性で、一例として always_retweet リストの設定は以下のようなに記述されています。
twitter_config: target_lists: # 常にリツイートするアカウント用 Twitter リスト # 演者本人や演者の冠番組のアカウントをリストインする - owner_screen_name: yoppinews always_retweet: true # この値が true だと常にリツイートされる include_retweet: true # この値が true だと RT も評価される include_reply: true # この値が true だとリプライも評価される include_quoted_text: true # この値が true だと引用 RT のテキストも評価される evaluate_image: NONE # 関連画像検知を有効にするか evaluate_url: NONE # 関連 URL 検知を有効にするか count: 10
基本的に日々の運用作業は、Twitter リストの更新作業となります。例えば、作品への出演が決まったら適切なリストに該当作品の公式アカウントを追加するという形になります。Twitter リストは出先からでも手軽に更新できるため便利です。
監視対象アカウントのツイートに対して、最も有力かつ単純な検知の仕組みがキーワード検知 になります。例えば演者本人の名前が含まれるツイートは、ほぼ間違いなく関連する情報であるため検知したいはずです。
また、一般に担当する キャラクターの名前を含むツイートも関連する情報である可能性が非常に高い と考えられますが、キャラクター名によっては誤検知が大量に発生する 可能性があります。たとえば、青山吉能さんが演じる「恋愛暴君」のグリは、カタカナ 2 文字で非常に誤検知が発生しやすいキーワードになっています。もし「恋愛暴君」公式アカウントや原作者が「グリ」を含むツイートを行った場合、ほぼ関連する情報であると考えられるため、yoppinews-bot では 特定のアカウントに対してのみ検知を行うキーワードの設定ができる ようになっています。
そのほか、監視対象アカウントが乗っ取りなどの被害を受け、スパムツイートを行うような場合の誤検知を防ぐため、禁止キーワードの設定も行える ようになっています。
前述のような検知キーワード、アカウント特有の検知キーワード、禁止キーワードは、アプリケーションの設定ファイル上で以下のように記述できます。
keyword_config: # 無視するキーワード設定 ignored_keywords: - レイバン - Rayban # 検知対象のキーワード設定 keywords: - 青山吉能 - '青山 吉能' - 七瀬佳乃 - 青山つばさ # アカウント特有のキーワード設定 user_related_keywords: boukun_PR: - 恋愛暴君 - グリ megane2702: - 恋愛暴君 - グリ renaiboukun: - 恋愛暴君 - グリ
関連画像検知に関しては、顔比較が簡単に行える Rekognition API を利用しています。
これは非常に手軽なもので、比較元と比較先の画像を指定すると、同一人物である可能性が高い顔が存在するかどうか、類似度はどの程度かを JSON 形式でレスポンスしてくれるサービスとなっています。
本来はイベント終了後や収録などの際に演者の関係者が撮影した写真を自動で検知するために作成した機能ですが、イベントや放送への出演決定の際のビジュアルに宣材写真が含まれることが多く、意外にもそういう性質の画像を検知するのに役に立った実例があります。これは当初の想定をうわまって便利だと感じました。
ツイート内に含まれる URL は関連する情報が記載されている可能性が高いのですが、当然のことながらツイートの検索だけでは関連する情報かどうかの判断が難しいものとなります。
例えば、ファミ通やアニメイトの記事の告知ツイートには演者の名前が入っていなくても、記事本文には記載があるというケースは多々あります。
こういったケースのためにツイートに記載された URL の内容を確認し、関連するツイートであるか判断するという機能を作成しています。
仕組みとしては単純で対象の URL をヘッドレスブラウザにて読み込み、関連キーワードが含まれるかどうかを判断するというものとなります。
単純にページ全体のキーワードを検知対象とすると関連記事などのタイトルも拾ってしまうため、正規表現にマッチする URL だった場合に特定の CSS セレクタでキャプチャできる要素内のテキストのみを検知対象とする工夫をいれています。この点については設定ファイル config.yaml
をみると理解しやすいかと思います。
detect_related_url: selectors: 'https://prtimes.jp': '.content .rbody' 'http(s)?://www.nicovideo.jp/watch/': '.VideoDescription-html' 'http(s)?://ch.nicovideo.jp/\w+/blomaga/': '.main_blog_txt' 'http(s)?://cho-animedia.jp': '.contents' 'http(s)?://www.animatetimes.com/news/details.php': '.news-content' 'http(s)?://www.animatetimes.com/tag/details.php': '.tag-content' 'http(s)?://www.youtube.com/watch': '#description' 'http(s)?://seigura.com/news/': '.entry-content' 'http(s)?://note.mu/': 'p-article__content' ignored_urls: - 'http(s)?://www.animatetimes.com/comment/details.php' - 'http(s)?://example.com'
関連 URL 検知の仕組みとほぼ同じような形でヘッドレスブラウザを用いて、サイトの更新を監視するモジュール: yoppinews-web-monitor があります。仕組みとしては非常に単純で面白くないので、詳細については割愛します
Google カレンダーに登録したスケジュールをツイートする yoppinews-calendar-bot があります。機能としては、その日のイベントや放送・配信情報をツイートする サマリー機能 を持つ Lambda 関数と、イベントや放送・配信開始時刻直前にツイートする スケジュール予告機能 を持つ Lambda 関数の 2 つがあります。
なお @yoppinews で利用している Google カレンダーは https://yoppinews.github.io にて公開しています。
なお、スケジュール予告機能についてはツイートされる文面にこだわりがなければ IFTTT を使って実現することも可能です。@yoppinews では初期のころに IFTTT を利用していましたが自前での実装に差し替えました。
前述のようなシステムにいったいどれだけの費用がかかっていて、どれだけの有効な情報を収集することができるようになったのかというデータも公開します。声優オタクも KPI を重視する時代(KPI って言いたかっただけ)。
本格的に運用に乗り始めた 2019 年 4 月以降の運用費用はおおむね以下のような推移となっています
twitter から API を通して取得した監視対象のツイート件数の推移は以下のようなものとなります
処理したツイートのなかから実際にプログラムが関連ツイートであると判定し、ツイートやリツイートにより情報の配信を行った件数の推移は以下のようなものとなります
まだまだ自動化したい内容がたくさんあります。一例として以下のようなものを作りたいのですが、イベントやコンテンツに時間を使っており、手がつけられてません。
2020 年 1 月クールアニメ「なつなぐ!」「群れなせ!シートン学園」に出演するのでみてください