Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AIによる自然言語処理・音声解析を用いたゲーム内会話パートの感情分析への取り組み

Cygames
August 31, 2023

 AIによる自然言語処理・音声解析を用いたゲーム内会話パートの感情分析への取り組み

2023/08/23 CEDEC2023

Cygames

August 31, 2023
Tweet

More Decks by Cygames

Other Decks in Technology

Transcript

  1. 7/61 ストーリーパートのスクリプトとは? ◼ 登場するキャラクター、セリフ、表情などを指定 ◼ 背景・音声も指定 ◼ テキスト形式、制御用のコマンドが含まれる ◼ 今回は表情部分をAIで求めたい

    ゲーム中のストーリーパートの制御を行うもの 背景:公園 <表情1>こんにちは<表情2>また会ったね! <表情1>やあ!<表情3>今日はどうする? BGM:曲A キャラクターA キャラクターB
  2. 17/61 固有表現抽出タスクによる感情分析(結果) ◼ 9:1で分割して学習データ、テストデータとして利用 ◼ 結果がかなり悪く、正解度を求めるレベルではなかった ◼ 感情の精度が低い&属性を割り当てる範囲が違う ◼ 文章の一部にしか属性が割り当てられない

    ◼ 例:じゃあ今日は、おすすめの公園に、連れて行くね ◆BERTで学習して精度を測定 ◆原因:推論時に属性を求める範囲を指定できない ◼ 属性を割り当てる範囲は確定している ◼ 固有表現抽出タスクでは割り当てる範囲を指定できない ◆結論:固有表現抽出タスクは向いていなかった 標準 喜び
  3. 20/61 1行単位の文章分類 ◼ しかし1行に複数の感情が入っている ◼ 「標準」は登場頻度が高い ◼ 5種類、3種類に分類 シナリオの1行を感情ごとに分類してみる 学習してテスト(学習は1時間弱)

    5種類に分類 標準のみ 標準+喜び 標準+悲しみ 標準+ポジティブ(喜び+照れ) 標準+ネガティブ(悲しみ+怒り) 3種類に分類 標準のみ 標準+ポジティブ(喜び+照れ) 標準+ネガティブ(悲しみ+怒り) ◼ 9:1に分割して学習データ、テストデータとして利用
  4. 21/61 文章の水増しでデータセットを増やす ◆かかり受けを利用した文章水増し(参考文献) ◼ 例:赤い大きな甘いリンゴ > 甘い赤い大きなリンゴ ◼ 「赤い」「大きな」「甘い」は「リンゴ」を修飾 ◼

    この3つは入れ替えが可能 > 甘い赤い大きなリンゴ ◆BERTによる文章水増し ◼ ランダムに文章中の単語をマスクし、BERTで別の単語を割り当てる ◼ 例:赤い[MASK]甘いリンゴ > 赤い小さな甘いリンゴ ◆いずれの方法でも精度は上がらなかった ◼ 新しい文章として学習してくれなかった ◆類義語辞書を使った単語入れ替え ◼ 類義語検索モジュールchikkarpyを使用
  5. 24/61 句読点単位の感情分析 ◼ 実際のスクリプトでは句読点単位に感情が設定されている ◼ この単位で高い精度が出れば実現できそう ◆句読点単位で分類 ◆学習してテスト ◼ 満足いく精度は出なかった

    ◼ 句読点区切りの単位では文字数が少ない=情報量が少ない ◼ 前後の文章の情報がない ◼ 例:「そうですね……」これだけでは判断がつかない ◆別のアプローチが必要
  6. 28/61 質問応答タスクとは? 今回の感情分析への適用 ◼ コンテキスト:感情を求めたい文章&前後の文章 ◼ 質問:感情を求めたい文章 ◼ 回答:求めたい感情(0〜4) 0(標準)

    今日は、おすすめの公園に、連れて行くね 質問:おすすめの公園にの感情 コンテキスト 回答 今日は、おすすめの公園に、連れて行くね コンテキスト 1(喜び) 質問:連れていくねの感情 回答
  7. 29/61 抽出型、生成型 ◼ 抽出型:コンテキストの文章から回答を抽出 ◼ 生成型:回答の文章を新たに生成 ◆質問応答タスクは抽出型と生成型の2つ ◆0から4の数値を返すだけ 抽出型 ◼

    簡単な分、精度が高くなる ◆コンテキストの先頭に選択肢を追加 ◼ コンテキスト=0 1 2 3 4 : 今日は、おすすめの公園に、連れて行くね ◼ 数値以外が返る場合は「標準」扱いに
  8. 30/61 質問応答タスクによる感情分析 ◼ これまでで一番高い精度 ◼ 事前学習モデルによって精度が変わってくる ◼ RTX4090で9時間程度 ◆BERTで学習してテスト ◆学習データの作成

    ◼ 既存のスクリプトから22万件のデータセットを作成 ◼ 9:1に分割して学習データ、テストデータとして利用 ◼ コンテキストには可能な限り前後の行の文章を追加
  9. 31/61 改善点(うまくいったケース①) ◼ バッチサイズは限界まで大きい方がよい(48が限界) ◼ VRAM 24GB RTX 4090で学習 ◆バッチサイズを変更してテスト

    ◆BERT系のモデルはどれがよいか? ◼ 質問応答に使えるBERT系モデルではRoBERTaが最高精度 ◼ RoBERTa : BERTの改良版 ◼ RoBERTa+日本語+質問応答のモデルが公開済 ◼ やりたいことに一番近いモデルが最適だった
  10. 32/61 改善点(うまくいったケース②) ◼ 今までは基本感情の5種類以外は「標準」に置き換え(全体の20%) ◼ 基本感情以外のものを、基本感情で置き換える表を用意してもらった ◼ これにより学習データの質が向上、数%正解率が向上 基本感情以外のデータも利用する 基本感情の5種類で置き換える

    感情 標準 喜び 悲しみ 怒り 照れ 喜び+目閉 悲しみ+目閉 その他1 その他2 置き換え 標準 喜び 悲しみ 怒り 照れ 喜び 悲しみ 怒り 照れ 感情 標準 喜び 悲しみ 怒り 照れ 喜び+目閉 悲しみ+目閉 その他1 その他2 置き換え 標準 喜び 悲しみ 怒り 照れ 標準 標準 標準 標準
  11. 35/61 考察 ◼ 「怒り」「照れ」はデータ数が少ない ◼ 怒り:6.3% ◼ 照れ:4.2% ◼ 学習が難しい

    ◆登場頻度の差 感情の比率 標準 喜び 怒り 悲しみ 照れ ◆人間でも判断が難しい 例:うん……(喜び) ふふっ(照れ) あ、いえ。(悲しみ) その、えっと……(怒り)
  12. 36/61 人間がやってみた場合 ◼ 1シナリオ 400問 プロジェクト以外のエンジニア 3名 ◼ 「怒り」「照れ」の正解率が低い。全体的にAIより低い結果 テスト問題を作って測定

    標準 喜び 悲しみ 怒り 照れ 人間の結果 質問応答タスク ※再掲 標準 喜び 悲しみ 怒り 照れ 正解率 57% 正解率 66%
  13. 40/61 CNNによる効果音分類モデル ◼ 簡単に試せる状態だったので適用してみた ◼ 特徴量抽出+CNNタイプの簡単なもの ◆別件で効果音の分類を試していた ◆例:「電話のベル+会話」の音声 ◼ 会話:

    0.89 ◼ 電話のベル: 0.75 ◼ 室内、小さい部屋: 0.23 ◆今回利用したモデル ◼ PANNs: Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition ◼ 効果音を分類するためのモデル ◼ 大きな効果音のデータセットで学習済み 数値は類似度(1〜0)
  14. 45/61 新しい感情分析モデル ◼ 音声解析のためのパッケージ ◼ 感情分析のサンプル: recipes/IEMOCAP/emotion_recognition ◼ 内部的にはWav2Vec2を利用 ◆SpeechBrain

    ◆データセットが利用できなかった ◼ 研究機関のみダウンロード可能 ◼ 感情分析系のデータセットは利用規約が厳しい ◆実際のデータで試す ◼ 精度が高い ◼ 学習データを作り直す
  15. 46/61 Wav2Vec2 ◼ wav2vec 2.0: A Framework for Self-Supervised Learning

    of Speech Representations ◼ CNN + Transformerの組み合わせ ◼ ラベルなしデータでの「自己教師あり学習」が特徴 ◆Facebook AIの音声認識モデル
  16. 48/61 Whisperを活用した音声ファイルの確認 分割した音声を書き起こして比較 ◼ 編集距離:2つの文章の差を数値で表す(同じ場合0) ◼ ひらがなへの変換はMeCabを利用 ◼ 「編集距離/文章の長さ」が一定以下なら採用 小さい場合

    大きい場合 採 用 編 集 距 離 不 採 用 ①書き起こし ②編集距離 ③採用 編集距離の差が… 音声データ 元のテキスト Whisperでテキスト化 ひ ら が な 変 換
  17. 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}
  18. 57/61 システム構成 ◼ 当初は音声解析にGPUを使う予定だったのでローカルPC ◼ クラウドのGPUインスタンスは高額なため ◆社内のWindowsPCで実行 ◆1シナリオ 5〜10分程度 ◼

    音声のダウンロードと処理が長い(AIではなく、ゲーム側で利用) ◼ AIの処理は1〜2分程度 ◼ 処理に時間がかかってもいい用途なのでCPU実行 ◼ GPUでも実行可能だが使っていない
  19. 60/61 まとめ ◆「期待通りのものが提供された」とフィードバック ◆音声解析を使えなかったのが残念 ◼ 自然言語処理の精度を超えることができなかった ◼ 音声による感情分析は既存事例が少ない ◼ 最近増えてきたのでまた試したい

    ◆最終的な正解率:66% ◼ ポジティブ・ネガティブの間違いは少ないので、そのまま使えるレベル ◆「データ数の少ない感情」の精度が低かった ◼ 「怒り」「照れ」の推定が難しい
  20. 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