Google Cloud Tech Acceleration Program(Google TAP)に参加しました

# はじめに
私たちバンダイナムコ研究所が所属するバンダイナムコグループ内では、企業間を超えてチームを組み業務の効率化や最適化などを行う事があります。
チーム間のコラボレーションや作業の標準化など、様々なツールを駆使しています…が、それでも解決できていない課題がいくつか存在しているのも確かです。

その辺りをGoogleのエンジニアと議論しながら進められる点に魅力を感じて参加しました。
平たく言うと「Google TAPに参加したよ！」の記事です。

## Google TAPってなぁに？
「Google Cloud Tech Acceleration Program (Google TAP)」はGoogleが提供するGoogle Cloudのエンジニアによる内製化支援で、数日にわけて行われるアジャイル型ワークショップです。
今回は「ゲーム動画の場面検索」についてDay1～Day4の4日間のワークショップを実施して頂きました。

https://cloud.google.com/solutions/in-house-development-support

4日間のスケジュールはおおまかに
- Day1: まず「何を作るのか」の話し合い
- Day2: どうやって(どんな技術を使って)作っていくのかの相談
- Day3: 実装
- Day4: 成果物の確認と今後の展開についての話し合い

となっていました。
とはいえ現実としては「何を作るのか」の部分で決めきれなかった内容がDay2に持ち越されたり…なんていうこともあったので、その辺りは臨機応変に対応しました。(現実の開発でもよくありますよね)

## 具体的に何をTAPのテーマにしたのか
今回は「映像検索システムのPoC」をテーマにしました。(この後のDay1の章の中に経緯が書いてあります。
映像の中でもゲーム制作で扱う映像データの検索を目標と定め、「テイルズ オブ アライズ」の映像を検証用データとして利用して進めます。


## 参加メンバー
今回のTAPには
- バンダイナムコエンターテインメント(立案) : 5名
- バンダイナムコ研究所(AI) : 4名
- 株式会社iret(UI) : 2名
- 株式会社HEROZ(アドバイザリー) : 1名
で参加しました。

# Day1
まずは「今抱えている・解決したい課題って何なの？」について、参加者全員でディスカッションをしました。

Google TAP実施に先立って事前に社内ヒアリングをしたところ
「動画探しにすごく時間がかかる」
という話が方々から出たので、それをベースにディスカッションをしていきます。
「”ラスボスとの戦闘シーンが欲しい”って日本語で入力したら候補がズラッと出てきて欲しい」
「特定のシーンを探すのに動画ファイルを片っ端から漁らないといけない。キーワードだけでも入力したら関係ありそうなファイルを教えてくれないかな」
「主人公の必殺技が決まるシーンってどこだっけ…確かこの動画ファイルのどっかにあった気がするんだけど…みたいなので探した結果無かったりする」
「”なんかいい感じのシーン探して”とかいうオーダーが来るよね」

ここでGoogle蓮池さんからの重要な質問が
「一口に『動画を探す』と言っても、以下をはっきりさせた方が良いと思いますよ」
- 誰が探しますか？
- どんな場面で使いますか？
- 欲しい情報(検索結果に必要な情報)は何ですか？
- etc...

…確かに動画を探すと言っても「プロモーション用に映える動画を探す」とか「デバッグ時に特定の場面を探す」とか色々あって、用途によって欲しい情報ってかなり違いますね。

ディスカッションの結果、大まかに
- ゲームのプロデューサー・ディレクターが使うのがメイン
- 「このシーンがあるファイルどれだっけ？」の質問に対して的確にファイルを提示して欲しい
- 具体的に何分何秒の所が該当シーンなのかはある程度候補が絞り込めるようにしたい
という方向性になりました。

あとはDay2に向けて各々宿題事項の確認などをして終了です。

Day1終了時のホワイトボードはこんな感じ。みんなで意見を出し合いました。
![IMG_0345_small.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35751/f80e728e-52f9-5bb3-7452-1ce3bc8234f1.jpeg)


# Day2
「…というわけで、一旦こんな感じでプロトタイプを作ってみました」
Day2開始からGoogle中井さんが「検索部分はこれで良いのでは…？」というクオリティの物を見せて下さいました。これで良いのでは…？

仕組みの概要としては
- Google CloudのGemini APIに予め動画のサマリー(文章)と重要なシーンの説明を作成させる
- 生成した文章をVertex AI Searchで検索する
- 動画の内容をGemini APIで検索する
というものです。これで良いのでは…？

ここで蓮池さん
「最終的なUIをイメージしながら、この仕組みで情報が足りるのかを考えると良いですね。漏れは無いですか？」

あー、確かに。ということで、全員でもう一度ディスカッションです。
「動画の要約は要る？どこに出す？」
「セリフの文字起こしどうする？」
「動画にタグ付けされてた方が探しやすいかな」
…ここで再度要件の整理です。

- 「動画ファイルの検索」ではなくて「動画ファイル内の"シーン"を検索」する必要がありそう。
    - 用途を考えると「主人公が必殺技を決めるシーンが欲しい」みたいなニーズがありそう。
    - だったら"特定のシーン"がファイルの何分何秒から始まるかを検索する必要があるよね。
- "シーンを検索"のために技術的にどんなことが必要になるか
    - キャラクターの情報（身体的特徴とか名前とか各キャラクターの画像とか）をGeminiに教える必要がある。
    - 他にもゲーム固有の情報(街の名前とか)は与える必要がある。


要件をもとに、検証では動画ファイルをシーン毎に要約させることで検索しやすいテキスト情報としてアウトプットすることを目指しました。

Gemini APIではテキストプロンプトだけでなく、動画ファイルや画像ファイルを一緒に入力することができます。
そこでテイルズ オブ アライズの動画ファイルを適切に理解させるために、主要キャラクターであるアルフェンやシオンの画像をGemini APIへの入力に利用することで、以下のような動画のシーン毎の要約を実施します。

|キャラクター画像|画像|
|---|---|
|アルフェン|![data_character_master_アルフェン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35751/cc79a0b1-4f8c-3b58-1f62-d381196d045f.png)|
|シオン|![data_character_master_シオン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35751/d1d361d7-ec01-aae5-e076-a63442ce007a.png)|

```
Timestamp, Description
00:07-00:14, アルフェン一行は、ミハグサールの主府ニズを目指して旅をしていた。シオンはアルフェンに休憩を促す。, アルフェン一行の旅の目的と、シオンの性格がわかる重要なシーン。
00:21-00:24, アルフェンは、鎧が重いので少し休みたいと言う。, アルフェンの弱気な一面が垣間見えるシーン。
00:34-00:41, シオンは、こんなところで休んでいる暇はないと言い、ミハグサールの主府ニズまで休まず進むべきだとアルフェンを叱咤する。, シオンの強い意志と責任感がわかる重要なシーン。
00:41-00:52, シオンは、アルフェンが倒れたらアルフェンを運べるのは自分だけだと言い、休む時に休むようにと諭す。, シオンのアルフェンに対する優しさがわかるシーン。
01:19-01:29, 謎の黒騎士が現れ、アルフェンに襲いかかる。, 物語が大きく動き出す重要なシーン。
01:30-02:29, アルフェンは黒騎士に応戦するが、黒騎士に圧倒される。, 黒騎士の強さがわかるシーン。
...
```

少し間違っている箇所はありますが、動画ファイル内の出来事をうまく要約できています。
ここで要約した内容と検索クエリをプロンプトとして入力することで、動画内の近いシーンを検索することができます。


- 検索クエリ: 謎の黒騎士が初めて登場するシーン
- 検索結果: このシーンでは、謎の黒騎士が初めて登場し、アルフェンに襲いかかります。黒騎士は黒いフードを被り、顔は隠されていますが、アルフェンに襲いかかる様子から、敵であることがわかります。

![result1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35751/ed3b9be0-44b0-acbf-95fd-79f3905982d8.png)

- 検索クエリ: アルフェンとシオンの関係性が垣間見えるシーン
- 検索結果: アルフェンはシオンが倒れたら運べるのは自分だけだと話し、休む時に休むようにと諭しています。シオンを気遣うアルフェンの優しさが伝わってくるシーンです。

![result2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35751/8d4f55dd-02fc-7fba-b872-c706fbd283b9.png)


この日は、動画内のシーン毎の要約以外にもGemini APIで様々な情報を抽出して、検索精度や網羅性の向上に活用できないかを検証しました。


※ランチも食べたよ！
![IMG_4059_small.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35751/bb8ba952-1bda-49c1-1f91-c919ae852144.jpeg)
なんかモリモリに盛るのもカッコ悪い気がしたので控えめにしましたが、今思えば盛りまくるべきだった。

# Day3
Day2の検討内容を蓮池さん・中井さんと振り返りながら更に仕様を詰めていきます。

Google内のカフェに行ったりしながら(もちろんランチも食べました)
![IMG_4060_small.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35751/84cca876-5122-436b-69b2-b6643c45dd71.jpeg)

「各動画にタグが付いていた方が便利ですね」
という結論に至ったので、タグ付きの検索の仕組みへ変更することに。
「では我々エンジニア陣が実装いたしましょう」
我々バンダイナムコグループが誇るエンジニアの腕の見せ所です。

中井さんに作ってもらったものをベースに~~少しいじくる~~大胆かつ飛躍的な修正を加えていきます。

そう、私はタダ飯を食いに来ているわけではないのです。

# Day4
仮のUIと仮の検索システムを接続してのお披露目会です。

最終的にこんな構成になりました。
![GCP構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35751/149010fa-64f7-f78c-3fc0-1b5cf9ef488e.png)

大まかには以下の仕組みとなっています。
1. 映像からメタデータを生成する
    - 映像ファイルをGemini APIに入力
    - Gemini APIがメタデータ(動画ファイルの要約と重要なシーンの説明)を生成
    - Cloud Storageに格納
1. 動画検索
    - "ファイル"検索:Cloud Storage上の"動画ファイルの要約"をVertex AI Searchで文章検索
    - "シーン"検索:Cloud Storage上の"シーン説明"をGemini APIで検索

ここまでくれば
「ここを直そう」
「ここはもっとこうしよう」
「この後誰に試してもらおうか」
などの具体的な話が進みます。

一通りの確認事項と、今後の展開を決めた所でGoogle TAP全日程が終了となりました。

# 感想
とても良い4日間になったと思っています。

社内で打ち合わせをしていると、どうしても「目の前の議論」に意識が囚われて
「で、結局何が作りたいんだっけ？」
というのがうやむやになりがちですが、そこをGoogleエンジニアの方々にサポートしていただいて、第三者の視点から軌道修正できたのは非常に良かったなぁと。

それにプロトタイプを作って頂けたおかげで、目指すゴールがよりはっきりしたのも大きかったなと。ここについてもやはり
「で、結局何が作りたいんだっけ？」
を防いで
「今ある物はこうなっているけど、こうした方が課題にフィットするんじゃないだろうか」
という話に自然と流れていくのでとても有難かったなと思っています。

あとは4日間である程度動く物を作ってしまうのがハッカソンみたいでちょっと楽しかったですね。

Tales of Arise™& ©Bandai Namco Entertainment Inc.