Slide 1

Slide 1 text

AIによる自然言語処理・音声解析を用いた ゲーム内会話パートの感情分析への取り組み 株式会社Cygames 開発運営支援 ゲームエンジニア / 立福 寛 エンジニアリング

Slide 2

Slide 2 text

2/61 はじめに

Slide 3

Slide 3 text

3/61 今回の講演について ◼ AIを活用してキャラクターの表情を自動で求めるツールの紹介 ◆ゲーム内会話パートの感情分析の事例紹介 ◼ AIを用いた感情分析を行う手法に関するノウハウ ◼ 自然言語処理・音声解析の2パターン ◆この講演で得られること

Slide 4

Slide 4 text

4/61 立福 寛 開発運営支援 ゲームエンジニア 複数のゲーム会社でコンテンツパイプラインの構築、モバイルゲームの開発・運営などを担当。 2018年10月に株式会社Cygamesへ入社。2019年後半からAIの社内導入に取り組んでいる。 過去のCEDECの講演 CEDEC2021「ゲーム制作効率化のためのAIによる画像認識・自然言語処理への取り組み」 CEDEC2022「AIによる自然言語処理を活用したゲームシナリオの誤字検出への取り組み」 自己紹介

Slide 5

Slide 5 text

5/61 スクリプトチームからツール作成の相談 ◼ ゲームのストーリーパートのスクリプト作成が大変 ◼ シナリオと音声からキャラクターの表情を設定したい ◼ ツールの実行も簡単にしたい スクリプト作成を効率化したい

Slide 6

Slide 6 text

6/61 ストーリーパートの作り方 シナリオ執筆 音声収録 スクリプト作成 ・表情設定 ・エフェクト追加 シナリオを スクリプトへ変換 AIを使って効率化したい!

Slide 7

Slide 7 text

7/61 ストーリーパートのスクリプトとは? ◼ 登場するキャラクター、セリフ、表情などを指定 ◼ 背景・音声も指定 ◼ テキスト形式、制御用のコマンドが含まれる ◼ 今回は表情部分をAIで求めたい ゲーム中のストーリーパートの制御を行うもの 背景:公園 <表情1>こんにちは<表情2>また会ったね! <表情1>やあ!<表情3>今日はどうする? BGM:曲A キャラクターA キャラクターB

Slide 8

Slide 8 text

8/61 解決したい問題

Slide 9

Slide 9 text

9/61 AIで解決したいこと 感情分析の問題として扱うので以降では「感情」と表現 シナリオ・音声から表情を求めたい シナリオの テキスト 収録した 音声 キャラクターの表情 自然言語処理 音声解析 AIによる判定 出 力 入 力

Slide 10

Slide 10 text

10/61 感情を設定するシナリオについて ◼ 1行=スマートフォンゲームのストーリーパートの1単位 ◼ 対象は会話文のみ(地の文は対象外) ◼ 感情は「句読点・記号区切り」で設定される(最低限の長さは考慮) ◼ 文章のすべての部分に感情が割り振られる ◆仕様 標 準 喜 び こんにちは。 今日も元気です! 1行

Slide 11

Slide 11 text

11/61 キャラクターの感情 ◆基本感情は5種類 ◼ 実際にはキャラクターごとにバリエーションがある(8〜16種類) ◼ 5種類以外は「標準」として扱っておく ◆3種類に分類するケースも調べる 標 準 喜 び 悲しみ 怒 り 照 れ 標 準 ポジティブ ネガティブ 喜び・照れ 悲しみ・怒り

Slide 12

Slide 12 text

12/61 シナリオと音声について ◆1シナリオには1人以上のキャラクターが登場 ◆音声はある場合とない場合がある ◆文章の長さ ◆音声の長さ 1行 句読点区切り 平均 7.9秒 3.6秒 最小 0.2秒 0.2秒 最長 50.6秒 41.1秒 1行 句読点区切り 平均 38文字 17文字

Slide 13

Slide 13 text

13/61 AIを活用した感情分析 ◆自然言語処理による感情分析 ◆音声解析による感情分析 ◼ CNNを使った分類タスク ◼ Wav2Vec2を使った感情分析 ◼ 固有表現抽出タスク ◼ 文章分類タスク ◼ 質問応答タスク

Slide 14

Slide 14 text

14/61 自然言語処理による感情分析

Slide 15

Slide 15 text

15/61 固有表現抽出タスクによる感情分析

Slide 16

Slide 16 text

16/61 固有表現抽出タスクによる感情分析(導入) ◼ 今回はすべてのテキストに5種類の感情(属性)を割り当てる ◼ 属性といえば固有表現抽出タスク! ◆感情分析=テキストの部分ごとに属性を付ける ◆学習データを作成 株式会社Cygamesの所在地は東京です 会社名 はい。よろしくお願いします! 標 準 喜 び 地 名

Slide 17

Slide 17 text

17/61 固有表現抽出タスクによる感情分析(結果) ◼ 9:1で分割して学習データ、テストデータとして利用 ◼ 結果がかなり悪く、正解度を求めるレベルではなかった ◼ 感情の精度が低い&属性を割り当てる範囲が違う ◼ 文章の一部にしか属性が割り当てられない ◼ 例:じゃあ今日は、おすすめの公園に、連れて行くね ◆BERTで学習して精度を測定 ◆原因:推論時に属性を求める範囲を指定できない ◼ 属性を割り当てる範囲は確定している ◼ 固有表現抽出タスクでは割り当てる範囲を指定できない ◆結論:固有表現抽出タスクは向いていなかった 標準 喜び

Slide 18

Slide 18 text

18/61 文章分類タスクによる感情分析

Slide 19

Slide 19 text

19/61 文章分類タスクによる感情分析(導入) ◼ 一番簡単な文章分類タスクを試してみた ◼ 1行単位、句読点単位で試す ◆そもそも感情分析はどの程度できるのか? ◆1行単位の文章分類 ◆句読点ごとの文章分類

Slide 20

Slide 20 text

20/61 1行単位の文章分類 ◼ しかし1行に複数の感情が入っている ◼ 「標準」は登場頻度が高い ◼ 5種類、3種類に分類 シナリオの1行を感情ごとに分類してみる 学習してテスト(学習は1時間弱) 5種類に分類 標準のみ 標準+喜び 標準+悲しみ 標準+ポジティブ(喜び+照れ) 標準+ネガティブ(悲しみ+怒り) 3種類に分類 標準のみ 標準+ポジティブ(喜び+照れ) 標準+ネガティブ(悲しみ+怒り) ◼ 9:1に分割して学習データ、テストデータとして利用

Slide 21

Slide 21 text

21/61 文章の水増しでデータセットを増やす ◆かかり受けを利用した文章水増し(参考文献) ◼ 例:赤い大きな甘いリンゴ > 甘い赤い大きなリンゴ ◼ 「赤い」「大きな」「甘い」は「リンゴ」を修飾 ◼ この3つは入れ替えが可能 > 甘い赤い大きなリンゴ ◆BERTによる文章水増し ◼ ランダムに文章中の単語をマスクし、BERTで別の単語を割り当てる ◼ 例:赤い[MASK]甘いリンゴ > 赤い小さな甘いリンゴ ◆いずれの方法でも精度は上がらなかった ◼ 新しい文章として学習してくれなかった ◆類義語辞書を使った単語入れ替え ◼ 類義語検索モジュールchikkarpyを使用

Slide 22

Slide 22 text

22/61 1行単位の文章分類(結果) 5種類に分類したときのデータの比率と精度 行数:86,000 標準のみ 標準+喜び 標準+悲しみ 標準+ポジティブ 標準+ネガティブ 標準のみ 標準+喜び 標準+ポジティブ 標準+ネガティブ 標準+悲しみ 行数:86,000 正解率 49%

Slide 23

Slide 23 text

23/61 1行単位の文章分類(結果) 3種類に分類したときのデータの比率と精度 感情分析は可能 標準のみ 標準+ポジティブ 標準+ネガティブ 行数:86,000 標準のみ 標準+ポジティブ 標準+ネガティブ 行数:86,000 正解率 69%

Slide 24

Slide 24 text

24/61 句読点単位の感情分析 ◼ 実際のスクリプトでは句読点単位に感情が設定されている ◼ この単位で高い精度が出れば実現できそう ◆句読点単位で分類 ◆学習してテスト ◼ 満足いく精度は出なかった ◼ 句読点区切りの単位では文字数が少ない=情報量が少ない ◼ 前後の文章の情報がない ◼ 例:「そうですね……」これだけでは判断がつかない ◆別のアプローチが必要

Slide 25

Slide 25 text

25/61 質問応答タスクによる感情分析

Slide 26

Slide 26 text

26/61 要件を整理 ◼ 感情を求めたい文章 ◼ その前後の文章 ◆推論時には以下2つの情報を渡したい ◆Transformer系モデルのタスクを調べる ◆質問応答タスクが応用できる

Slide 27

Slide 27 text

27/61 質問応答タスクとは? ◼ コンテキスト:伊藤博文は日本の初代内閣総理大臣です ◼ 質問:日本の最初の内閣総理大臣は誰ですか? ◼ 回答:伊藤博文 コンテキストと質問から回答を返すタスク 伊藤博文 伊藤博文は日本の初代内閣総理大臣です 質問:日本の最初の内閣総理大臣は誰ですか? コンテキスト 回答

Slide 28

Slide 28 text

28/61 質問応答タスクとは? 今回の感情分析への適用 ◼ コンテキスト:感情を求めたい文章&前後の文章 ◼ 質問:感情を求めたい文章 ◼ 回答:求めたい感情(0〜4) 0(標準) 今日は、おすすめの公園に、連れて行くね 質問:おすすめの公園にの感情 コンテキスト 回答 今日は、おすすめの公園に、連れて行くね コンテキスト 1(喜び) 質問:連れていくねの感情 回答

Slide 29

Slide 29 text

29/61 抽出型、生成型 ◼ 抽出型:コンテキストの文章から回答を抽出 ◼ 生成型:回答の文章を新たに生成 ◆質問応答タスクは抽出型と生成型の2つ ◆0から4の数値を返すだけ 抽出型 ◼ 簡単な分、精度が高くなる ◆コンテキストの先頭に選択肢を追加 ◼ コンテキスト=0 1 2 3 4 : 今日は、おすすめの公園に、連れて行くね ◼ 数値以外が返る場合は「標準」扱いに

Slide 30

Slide 30 text

30/61 質問応答タスクによる感情分析 ◼ これまでで一番高い精度 ◼ 事前学習モデルによって精度が変わってくる ◼ RTX4090で9時間程度 ◆BERTで学習してテスト ◆学習データの作成 ◼ 既存のスクリプトから22万件のデータセットを作成 ◼ 9:1に分割して学習データ、テストデータとして利用 ◼ コンテキストには可能な限り前後の行の文章を追加

Slide 31

Slide 31 text

31/61 改善点(うまくいったケース①) ◼ バッチサイズは限界まで大きい方がよい(48が限界) ◼ VRAM 24GB RTX 4090で学習 ◆バッチサイズを変更してテスト ◆BERT系のモデルはどれがよいか? ◼ 質問応答に使えるBERT系モデルではRoBERTaが最高精度 ◼ RoBERTa : BERTの改良版 ◼ RoBERTa+日本語+質問応答のモデルが公開済 ◼ やりたいことに一番近いモデルが最適だった

Slide 32

Slide 32 text

32/61 改善点(うまくいったケース②) ◼ 今までは基本感情の5種類以外は「標準」に置き換え(全体の20%) ◼ 基本感情以外のものを、基本感情で置き換える表を用意してもらった ◼ これにより学習データの質が向上、数%正解率が向上 基本感情以外のデータも利用する 基本感情の5種類で置き換える 感情 標準 喜び 悲しみ 怒り 照れ 喜び+目閉 悲しみ+目閉 その他1 その他2 置き換え 標準 喜び 悲しみ 怒り 照れ 喜び 悲しみ 怒り 照れ 感情 標準 喜び 悲しみ 怒り 照れ 喜び+目閉 悲しみ+目閉 その他1 その他2 置き換え 標準 喜び 悲しみ 怒り 照れ 標準 標準 標準 標準

Slide 33

Slide 33 text

33/61 改善点(うまくいかなかったケース) ◼ かかり受け/類義語/BERT ◼ 水増しで精度が上がることはなかった ◆学習データを水増し ◆モデルのトークン数を増やしてみた ◼ 質問応答系のモデルでは380程度が標準 ◼ 前後の文章をより長く与える学習データを作成 ◼ 精度は上がらなかった

Slide 34

Slide 34 text

34/61 最終結果:混同行列 ◼ 怒り・照れ:精度低い ◼ ポジティブ・ネガティブを間違えることは少ない 精度高い 標準 喜び 悲しみ 怒り 照れ 喜 び 悲しみ 標準 ポジティブ ネガティブ 5種類 3種類 正解率 66% 正解率 70%

Slide 35

Slide 35 text

35/61 考察 ◼ 「怒り」「照れ」はデータ数が少ない ◼ 怒り:6.3% ◼ 照れ:4.2% ◼ 学習が難しい ◆登場頻度の差 感情の比率 標準 喜び 怒り 悲しみ 照れ ◆人間でも判断が難しい 例:うん……(喜び) ふふっ(照れ) あ、いえ。(悲しみ) その、えっと……(怒り)

Slide 36

Slide 36 text

36/61 人間がやってみた場合 ◼ 1シナリオ 400問 プロジェクト以外のエンジニア 3名 ◼ 「怒り」「照れ」の正解率が低い。全体的にAIより低い結果 テスト問題を作って測定 標準 喜び 悲しみ 怒り 照れ 人間の結果 質問応答タスク ※再掲 標準 喜び 悲しみ 怒り 照れ 正解率 57% 正解率 66%

Slide 37

Slide 37 text

37/61 音声解析による感情分析

Slide 38

Slide 38 text

38/61 音声の感情分析ってどうやるんだろう? ◼ 無料で一定回数利用できるAPIを試してみた ◼ (元気よく)「おはようございます!」>悲しみ、怒り ◼ 精度がかなり低く、使えるレベルではなかった ◆有料で利用できる感情分析システム ◆感情分析ができる音声解析モデル ◼ CNNを利用したモデル ◼ Wav2Vec2を利用したモデル

Slide 39

Slide 39 text

39/61 CNNを使った感情分析

Slide 40

Slide 40 text

40/61 CNNによる効果音分類モデル ◼ 簡単に試せる状態だったので適用してみた ◼ 特徴量抽出+CNNタイプの簡単なもの ◆別件で効果音の分類を試していた ◆例:「電話のベル+会話」の音声 ◼ 会話: 0.89 ◼ 電話のベル: 0.75 ◼ 室内、小さい部屋: 0.23 ◆今回利用したモデル ◼ PANNs: Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition ◼ 効果音を分類するためのモデル ◼ 大きな効果音のデータセットで学習済み 数値は類似度(1〜0)

Slide 41

Slide 41 text

41/61 学習データの準備 ◼ スクリプトには文字の表示タイミングを調整するための数値が含まれる ◼ ffmpegで音声区間・無音区間を取得して計算したもの ◼ こちらの数値を使うとある程度の精度で切り出せる ◼ (後ほどやり方を改善) 句読点ごとに音声ファイルを分割 有音区間 有音区間 無音区間

Slide 42

Slide 42 text

42/61 学習データのファイル数 分割後のファイル数:105,000 標準 喜び 悲しみ 怒り 照れ 学習データのファイル数と比率 59,000 122,000 元のwavファイルの数 分割後のファイル数

Slide 43

Slide 43 text

43/61 学習してテスト ◼ 効果音分類のための事前学習モデル ◼ 感情分析に向いていない ◼ そもそも音声が正しく分割されている保証がない ◆学習後の正解率: 30.8% ◆いったん諦めて自然言語処理の作業を進める ◼ 数ヶ月後に便利なモデルを発見したので再開

Slide 44

Slide 44 text

44/61 Wav2Vec2を使った感情分析

Slide 45

Slide 45 text

45/61 新しい感情分析モデル ◼ 音声解析のためのパッケージ ◼ 感情分析のサンプル: recipes/IEMOCAP/emotion_recognition ◼ 内部的にはWav2Vec2を利用 ◆SpeechBrain ◆データセットが利用できなかった ◼ 研究機関のみダウンロード可能 ◼ 感情分析系のデータセットは利用規約が厳しい ◆実際のデータで試す ◼ 精度が高い ◼ 学習データを作り直す

Slide 46

Slide 46 text

46/61 Wav2Vec2 ◼ wav2vec 2.0: A Framework for Self-Supervised Learning of Speech Representations ◼ CNN + Transformerの組み合わせ ◼ ラベルなしデータでの「自己教師あり学習」が特徴 ◆Facebook AIの音声認識モデル

Slide 47

Slide 47 text

47/61 学習データの作り直し ◼ 分割した結果が正しいのかチェックできない ◆音声ファイルの分割の問題 ◆音声認識モデルWhisper ◼ OpenAIから公開された音声認識モデル ◼ 音声ファイルを分割 > Whisperでチェック

Slide 48

Slide 48 text

48/61 Whisperを活用した音声ファイルの確認 分割した音声を書き起こして比較 ◼ 編集距離:2つの文章の差を数値で表す(同じ場合0) ◼ ひらがなへの変換はMeCabを利用 ◼ 「編集距離/文章の長さ」が一定以下なら採用 小さい場合 大きい場合 採 用 編 集 距 離 不 採 用 ①書き起こし ②編集距離 ③採用 編集距離の差が… 音声データ 元のテキスト Whisperでテキスト化 ひ ら が な 変 換

Slide 49

Slide 49 text

49/61 WhisperXを使って分割 ◆WhisperX ◼ 文字単位のタイムスタンプを取得できる ◼ 文章の分割に合わせて音声を切り出せる ◼ 音声分割の精度が上がる > 利用できるデータを増やせた ◆ただし不具合あり ◼ タイムスタンプと音声のタイミングが不一致 ◼ 試した時点の情報なので現在は解決されているかも {'text': 'お', 'start': 0.10, 'end': 0.12} {'text': 'は', 'start': 0.30, 'end': 0.32} {'text': 'よ', 'start': 0.44, 'end': 0.52} {'text': 'う', 'start': 0.72, 'end': 0.82}

Slide 50

Slide 50 text

50/61 SpeechBrainを使って学習・テスト ◆感情分析のサンプルコードを利用 ◼ WhisperXを利用して作成したデータセットを利用 ◼ 9:1に分割して、学習データ、テストデータとする ◼ SpeechBrainを利用することで少ないコードで学習可能 ◆学習は8時間程度 ◼ RTX2080を2枚搭載したPC

Slide 51

Slide 51 text

51/61 結果 学習してテスト ◼ 自然言語処理と同じ傾向 ◼ 該当部分の音声しか使えていない ◼ 連続した音声を渡せると精度の向上が期待できる 標準 ポジティブ ネガティブ 標準 喜び 悲しみ 怒り 照れ 5種類 3種類 正解率 63% 正解率 66%

Slide 52

Slide 52 text

52/61 最終的な実装

Slide 53

Slide 53 text

53/61 最終的な実装 ◼ 自然言語処理のほうが全般的に精度が高い ◼ 自然言語処理の結果のみ利用 自然言語処理と音声解析の結果を比較 標準 喜び 悲しみ 怒り 照れ 正解率 63% 正解率 66% 自然言語処理 音声解析

Slide 54

Slide 54 text

54/61 感情分析ツールの提供

Slide 55

Slide 55 text

55/61 従来のワークフロー 音声ファイルを 共有フォルダから コピー コマンドライン ツールを実行 ・表情を設定 ・エフェクト追加 シナリオ執筆ツールから シナリオをダウンロード スクリプト作成

Slide 56

Slide 56 text

56/61 新しいワークフロー Jenkinsで シナリオのIDを 指定して実行 スクリプト作成 ・表情を調整 ・エフェクト追加

Slide 57

Slide 57 text

57/61 システム構成 ◼ 当初は音声解析にGPUを使う予定だったのでローカルPC ◼ クラウドのGPUインスタンスは高額なため ◆社内のWindowsPCで実行 ◆1シナリオ 5〜10分程度 ◼ 音声のダウンロードと処理が長い(AIではなく、ゲーム側で利用) ◼ AIの処理は1〜2分程度 ◼ 処理に時間がかかってもいい用途なのでCPU実行 ◼ GPUでも実行可能だが使っていない

Slide 58

Slide 58 text

58/61 得られた成果 ◆スクリプトチーム全体で10%程度の効率化 ◆ツールの統合化が助かった ◆AIだけでなくJenkinsも役に立った ◼ 新規合流者が慣れるまで一月ぐらい > 大幅に改善 ◼ スクリプトチームはプロジェクト間の移動が多い部署なので助かった

Slide 59

Slide 59 text

59/61 まとめ

Slide 60

Slide 60 text

60/61 まとめ ◆「期待通りのものが提供された」とフィードバック ◆音声解析を使えなかったのが残念 ◼ 自然言語処理の精度を超えることができなかった ◼ 音声による感情分析は既存事例が少ない ◼ 最近増えてきたのでまた試したい ◆最終的な正解率:66% ◼ ポジティブ・ネガティブの間違いは少ないので、そのまま使えるレベル ◆「データ数の少ない感情」の精度が低かった ◼ 「怒り」「照れ」の推定が難しい

Slide 61

Slide 61 text

61/61 CygamesではAIの強みを活かして、 最高のコンテンツを作り続けていきます

Slide 62

Slide 62 text

62/61 補足資料&参考文献

Slide 63

Slide 63 text

63/61 精度周りの数値(全て5パターンの場合) 文章分類タスク 質問応答タスク 人間でテスト Wav2Vec2 Accuracy 0.49 Precision 0.42 Recall 0.37 F1 score 0.36 Accuracy 0.63 Precision 0.42 Recall 0.33 F1 score 0.33 Accuracy 0.57 Precision 0.34 Recall 0.37 F1 score 0.34 Accuracy 0.66 Precision 0.50 Recall 0.41 F1 score 0.41

Slide 64

Slide 64 text

64/61 シナリオ執筆ツール「こえぼん」 社内で広く利用されているWebアプリ ◼ シナリオの執筆、監修、台本出力まで可能 ◼ AIによる表記揺れ、誤字検出 ◼ Youtubeで講演動画が視聴可能 ◼ https://youtu.be/g7uY5zRpz4g?list=PLSx6MdBnoFbAzBFI-gBTYO0-GowOZx3Nc

Slide 65

Slide 65 text

65/61 参考文献 ◆テキスト分類学習における文節入れ替えによる データ水増し手法 ◼ https://www.jstage.jst.go.jp/article/pjsai/JSAI2021/0/JSAI2021_3J1G S6a04/_pdf/-char/ja ◆SpeechBrain ◼ https://speechbrain.github.io/ ◆PANNs ◼ PANNs: Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition ◼ https://github.com/qiuqiangkong/audioset_tagging_cnn

Slide 66

Slide 66 text

66/61 参考文献 ◆Whisper ◼ https://github.com/openai/whisper ◆WhisperX ◼ https://github.com/m-bain/whisperX ◼ This product includes software developed by Max Bain.

Slide 67

Slide 67 text

67/61 質問用のスライド

Slide 68

Slide 68 text

68/61 質問応答タスクの学習のコード ◆transformersのexampleのコードを利用 ◼ 設定を渡すことで各種パラメータ、事前学習モデルの指定が可能 ◼ 学習データはSQuAD 2.0形式を利用

Slide 69

Slide 69 text

69/61 キャラクターの表情≠感情分析 ◆今回は感情分析として扱ったが適切だったのか ◼ キャラクターの表情の変化は純粋に感情の変化を反映するわけではない ◼ 人間を使ったテストを自分でやってみてわかった ◼ 同じ表情だと単調になるので、表情を変えているケースもありそう ◆1行の感情をまとめて推定する手法 ◼ 1行の感情をまとめて推定することで表情の変化を扱えそう ◼ 記号などを使って文章中の区切りをAIに知らせる

Slide 70

Slide 70 text

70/61 LLMを使う場合は? ◆日本語理解力が高いほど有利 ◼ 該当キャラクターの感情のパターンをいくつか与える方法 ◆Few shotで事例を数件与える方法 ◆オープンなLLMで学習する方法 ◆キャラクターの性格・タイプを渡す方法 ◼ キャラクターの特徴や口癖などをプロンプトに入れてしまう方法 ◼ 文章を渡すと感情を返すように学習させる