$30 off During Our Annual Pro Sale. View Details »

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

    View Slide

  2. 2/61
    はじめに

    View Slide

  3. 3/61
    今回の講演について

    AIを活用してキャラクターの表情を自動で求めるツールの紹介
    ◆ゲーム内会話パートの感情分析の事例紹介

    AIを用いた感情分析を行う手法に関するノウハウ

    自然言語処理・音声解析の2パターン
    ◆この講演で得られること

    View Slide

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

    View Slide

  5. 5/61
    スクリプトチームからツール作成の相談

    ゲームのストーリーパートのスクリプト作成が大変

    シナリオと音声からキャラクターの表情を設定したい

    ツールの実行も簡単にしたい
    スクリプト作成を効率化したい

    View Slide

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

    View Slide

  7. 7/61
    ストーリーパートのスクリプトとは?

    登場するキャラクター、セリフ、表情などを指定

    背景・音声も指定

    テキスト形式、制御用のコマンドが含まれる

    今回は表情部分をAIで求めたい
    ゲーム中のストーリーパートの制御を行うもの
    背景:公園
    <表情1>こんにちは<表情2>また会ったね!
    <表情1>やあ!<表情3>今日はどうする?
    BGM:曲A
    キャラクターA
    キャラクターB

    View Slide

  8. 8/61
    解決したい問題

    View Slide

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

    View Slide

  10. 10/61
    感情を設定するシナリオについて

    1行=スマートフォンゲームのストーリーパートの1単位

    対象は会話文のみ(地の文は対象外)

    感情は「句読点・記号区切り」で設定される(最低限の長さは考慮)

    文章のすべての部分に感情が割り振られる
    ◆仕様
    標 準 喜 び
    こんにちは。 今日も元気です!
    1行

    View Slide

  11. 11/61
    キャラクターの感情
    ◆基本感情は5種類

    実際にはキャラクターごとにバリエーションがある(8〜16種類)

    5種類以外は「標準」として扱っておく
    ◆3種類に分類するケースも調べる
    標 準 喜 び 悲しみ 怒 り 照 れ
    標 準 ポジティブ ネガティブ
    喜び・照れ 悲しみ・怒り

    View Slide

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

    View Slide

  13. 13/61
    AIを活用した感情分析
    ◆自然言語処理による感情分析
    ◆音声解析による感情分析

    CNNを使った分類タスク

    Wav2Vec2を使った感情分析

    固有表現抽出タスク

    文章分類タスク

    質問応答タスク

    View Slide

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

    View Slide

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

    View Slide

  16. 16/61
    固有表現抽出タスクによる感情分析(導入)

    今回はすべてのテキストに5種類の感情(属性)を割り当てる

    属性といえば固有表現抽出タスク!
    ◆感情分析=テキストの部分ごとに属性を付ける
    ◆学習データを作成
    株式会社Cygamesの所在地は東京です
    会社名
    はい。よろしくお願いします!
    標 準 喜 び
    地 名

    View Slide

  17. 17/61
    固有表現抽出タスクによる感情分析(結果)

    9:1で分割して学習データ、テストデータとして利用

    結果がかなり悪く、正解度を求めるレベルではなかった

    感情の精度が低い&属性を割り当てる範囲が違う

    文章の一部にしか属性が割り当てられない

    例:じゃあ今日は、おすすめの公園に、連れて行くね
    ◆BERTで学習して精度を測定
    ◆原因:推論時に属性を求める範囲を指定できない

    属性を割り当てる範囲は確定している

    固有表現抽出タスクでは割り当てる範囲を指定できない
    ◆結論:固有表現抽出タスクは向いていなかった
    標準 喜び

    View Slide

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

    View Slide

  19. 19/61
    文章分類タスクによる感情分析(導入)

    一番簡単な文章分類タスクを試してみた

    1行単位、句読点単位で試す
    ◆そもそも感情分析はどの程度できるのか?
    ◆1行単位の文章分類
    ◆句読点ごとの文章分類

    View Slide

  20. 20/61
    1行単位の文章分類

    しかし1行に複数の感情が入っている

    「標準」は登場頻度が高い

    5種類、3種類に分類
    シナリオの1行を感情ごとに分類してみる
    学習してテスト(学習は1時間弱)
    5種類に分類
    標準のみ
    標準+喜び
    標準+悲しみ
    標準+ポジティブ(喜び+照れ)
    標準+ネガティブ(悲しみ+怒り)
    3種類に分類
    標準のみ
    標準+ポジティブ(喜び+照れ)
    標準+ネガティブ(悲しみ+怒り)

    9:1に分割して学習データ、テストデータとして利用

    View Slide

  21. 21/61
    文章の水増しでデータセットを増やす
    ◆かかり受けを利用した文章水増し(参考文献)

    例:赤い大きな甘いリンゴ > 甘い赤い大きなリンゴ

    「赤い」「大きな」「甘い」は「リンゴ」を修飾

    この3つは入れ替えが可能 > 甘い赤い大きなリンゴ
    ◆BERTによる文章水増し

    ランダムに文章中の単語をマスクし、BERTで別の単語を割り当てる

    例:赤い[MASK]甘いリンゴ > 赤い小さな甘いリンゴ
    ◆いずれの方法でも精度は上がらなかった

    新しい文章として学習してくれなかった
    ◆類義語辞書を使った単語入れ替え

    類義語検索モジュールchikkarpyを使用

    View Slide

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

    View Slide

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

    View Slide

  24. 24/61
    句読点単位の感情分析

    実際のスクリプトでは句読点単位に感情が設定されている

    この単位で高い精度が出れば実現できそう
    ◆句読点単位で分類
    ◆学習してテスト

    満足いく精度は出なかった

    句読点区切りの単位では文字数が少ない=情報量が少ない

    前後の文章の情報がない

    例:「そうですね……」これだけでは判断がつかない
    ◆別のアプローチが必要

    View Slide

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

    View Slide

  26. 26/61
    要件を整理

    感情を求めたい文章

    その前後の文章
    ◆推論時には以下2つの情報を渡したい
    ◆Transformer系モデルのタスクを調べる
    ◆質問応答タスクが応用できる

    View Slide

  27. 27/61
    質問応答タスクとは?

    コンテキスト:伊藤博文は日本の初代内閣総理大臣です

    質問:日本の最初の内閣総理大臣は誰ですか?

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

    View Slide

  28. 28/61
    質問応答タスクとは?
    今回の感情分析への適用 ◼
    コンテキスト:感情を求めたい文章&前後の文章

    質問:感情を求めたい文章

    回答:求めたい感情(0〜4)
    0(標準)
    今日は、おすすめの公園に、連れて行くね
    質問:おすすめの公園にの感情
    コンテキスト
    回答
    今日は、おすすめの公園に、連れて行くね
    コンテキスト
    1(喜び)
    質問:連れていくねの感情
    回答

    View Slide

  29. 29/61
    抽出型、生成型

    抽出型:コンテキストの文章から回答を抽出

    生成型:回答の文章を新たに生成
    ◆質問応答タスクは抽出型と生成型の2つ
    ◆0から4の数値を返すだけ 抽出型

    簡単な分、精度が高くなる
    ◆コンテキストの先頭に選択肢を追加

    コンテキスト=0 1 2 3 4 : 今日は、おすすめの公園に、連れて行くね

    数値以外が返る場合は「標準」扱いに

    View Slide

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

    これまでで一番高い精度

    事前学習モデルによって精度が変わってくる

    RTX4090で9時間程度
    ◆BERTで学習してテスト
    ◆学習データの作成

    既存のスクリプトから22万件のデータセットを作成

    9:1に分割して学習データ、テストデータとして利用

    コンテキストには可能な限り前後の行の文章を追加

    View Slide

  31. 31/61
    改善点(うまくいったケース①)

    バッチサイズは限界まで大きい方がよい(48が限界)

    VRAM 24GB RTX 4090で学習
    ◆バッチサイズを変更してテスト
    ◆BERT系のモデルはどれがよいか?

    質問応答に使えるBERT系モデルではRoBERTaが最高精度

    RoBERTa : BERTの改良版

    RoBERTa+日本語+質問応答のモデルが公開済

    やりたいことに一番近いモデルが最適だった

    View Slide

  32. 32/61
    改善点(うまくいったケース②)

    今までは基本感情の5種類以外は「標準」に置き換え(全体の20%)

    基本感情以外のものを、基本感情で置き換える表を用意してもらった

    これにより学習データの質が向上、数%正解率が向上
    基本感情以外のデータも利用する
    基本感情の5種類で置き換える
    感情 標準 喜び 悲しみ 怒り 照れ 喜び+目閉 悲しみ+目閉 その他1 その他2
    置き換え 標準 喜び 悲しみ 怒り 照れ 喜び 悲しみ 怒り 照れ
    感情 標準 喜び 悲しみ 怒り 照れ 喜び+目閉 悲しみ+目閉 その他1 その他2
    置き換え 標準 喜び 悲しみ 怒り 照れ 標準 標準 標準 標準

    View Slide

  33. 33/61
    改善点(うまくいかなかったケース)

    かかり受け/類義語/BERT

    水増しで精度が上がることはなかった
    ◆学習データを水増し
    ◆モデルのトークン数を増やしてみた

    質問応答系のモデルでは380程度が標準

    前後の文章をより長く与える学習データを作成

    精度は上がらなかった

    View Slide

  34. 34/61
    最終結果:混同行列

    怒り・照れ:精度低い

    ポジティブ・ネガティブを間違えることは少ない
    精度高い
    標準
    喜び
    悲しみ
    怒り
    照れ
    喜 び 悲しみ
    標準
    ポジティブ
    ネガティブ
    5種類 3種類
    正解率 66% 正解率 70%

    View Slide

  35. 35/61
    考察

    「怒り」「照れ」はデータ数が少ない

    怒り:6.3%

    照れ:4.2%

    学習が難しい
    ◆登場頻度の差 感情の比率
    標準
    喜び
    怒り
    悲しみ
    照れ
    ◆人間でも判断が難しい
    例:うん……(喜び)
    ふふっ(照れ)
    あ、いえ。(悲しみ)
    その、えっと……(怒り)

    View Slide

  36. 36/61
    人間がやってみた場合

    1シナリオ 400問 プロジェクト以外のエンジニア 3名

    「怒り」「照れ」の正解率が低い。全体的にAIより低い結果
    テスト問題を作って測定
    標準
    喜び
    悲しみ
    怒り
    照れ
    人間の結果 質問応答タスク
    ※再掲
    標準
    喜び
    悲しみ
    怒り
    照れ
    正解率 57% 正解率 66%

    View Slide

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

    View Slide

  38. 38/61
    音声の感情分析ってどうやるんだろう?

    無料で一定回数利用できるAPIを試してみた

    (元気よく)「おはようございます!」>悲しみ、怒り

    精度がかなり低く、使えるレベルではなかった
    ◆有料で利用できる感情分析システム
    ◆感情分析ができる音声解析モデル

    CNNを利用したモデル

    Wav2Vec2を利用したモデル

    View Slide

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

    View Slide

  40. 40/61
    CNNによる効果音分類モデル

    簡単に試せる状態だったので適用してみた

    特徴量抽出+CNNタイプの簡単なもの
    ◆別件で効果音の分類を試していた
    ◆例:「電話のベル+会話」の音声

    会話: 0.89

    電話のベル: 0.75

    室内、小さい部屋: 0.23
    ◆今回利用したモデル

    PANNs: Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition

    効果音を分類するためのモデル

    大きな効果音のデータセットで学習済み
    数値は類似度(1〜0)

    View Slide

  41. 41/61
    学習データの準備

    スクリプトには文字の表示タイミングを調整するための数値が含まれる

    ffmpegで音声区間・無音区間を取得して計算したもの

    こちらの数値を使うとある程度の精度で切り出せる

    (後ほどやり方を改善)
    句読点ごとに音声ファイルを分割
    有音区間 有音区間
    無音区間

    View Slide

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

    View Slide

  43. 43/61
    学習してテスト

    効果音分類のための事前学習モデル

    感情分析に向いていない

    そもそも音声が正しく分割されている保証がない
    ◆学習後の正解率: 30.8%
    ◆いったん諦めて自然言語処理の作業を進める

    数ヶ月後に便利なモデルを発見したので再開

    View Slide

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

    View Slide

  45. 45/61
    新しい感情分析モデル

    音声解析のためのパッケージ

    感情分析のサンプル: recipes/IEMOCAP/emotion_recognition

    内部的にはWav2Vec2を利用
    ◆SpeechBrain
    ◆データセットが利用できなかった

    研究機関のみダウンロード可能

    感情分析系のデータセットは利用規約が厳しい
    ◆実際のデータで試す

    精度が高い

    学習データを作り直す

    View Slide

  46. 46/61
    Wav2Vec2

    wav2vec 2.0: A Framework for Self-Supervised Learning of Speech Representations

    CNN + Transformerの組み合わせ

    ラベルなしデータでの「自己教師あり学習」が特徴
    ◆Facebook AIの音声認識モデル

    View Slide

  47. 47/61
    学習データの作り直し

    分割した結果が正しいのかチェックできない
    ◆音声ファイルの分割の問題
    ◆音声認識モデルWhisper

    OpenAIから公開された音声認識モデル

    音声ファイルを分割 > Whisperでチェック

    View Slide

  48. 48/61
    Whisperを活用した音声ファイルの確認
    分割した音声を書き起こして比較

    編集距離:2つの文章の差を数値で表す(同じ場合0)

    ひらがなへの変換はMeCabを利用

    「編集距離/文章の長さ」が一定以下なら採用
    小さい場合
    大きい場合









    ①書き起こし ②編集距離 ③採用
    編集距離の差が…
    音声データ
    元のテキスト
    Whisperでテキスト化






    View Slide

  49. 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}

    View Slide

  50. 50/61
    SpeechBrainを使って学習・テスト
    ◆感情分析のサンプルコードを利用

    WhisperXを利用して作成したデータセットを利用

    9:1に分割して、学習データ、テストデータとする

    SpeechBrainを利用することで少ないコードで学習可能
    ◆学習は8時間程度

    RTX2080を2枚搭載したPC

    View Slide

  51. 51/61
    結果
    学習してテスト ◼
    自然言語処理と同じ傾向

    該当部分の音声しか使えていない

    連続した音声を渡せると精度の向上が期待できる
    標準
    ポジティブ
    ネガティブ
    標準
    喜び
    悲しみ
    怒り
    照れ
    5種類 3種類
    正解率 63% 正解率 66%

    View Slide

  52. 52/61
    最終的な実装

    View Slide

  53. 53/61
    最終的な実装

    自然言語処理のほうが全般的に精度が高い

    自然言語処理の結果のみ利用
    自然言語処理と音声解析の結果を比較
    標準
    喜び
    悲しみ
    怒り
    照れ
    正解率 63%
    正解率 66%
    自然言語処理 音声解析

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  57. 57/61
    システム構成

    当初は音声解析にGPUを使う予定だったのでローカルPC

    クラウドのGPUインスタンスは高額なため
    ◆社内のWindowsPCで実行
    ◆1シナリオ 5〜10分程度

    音声のダウンロードと処理が長い(AIではなく、ゲーム側で利用)

    AIの処理は1〜2分程度

    処理に時間がかかってもいい用途なのでCPU実行

    GPUでも実行可能だが使っていない

    View Slide

  58. 58/61
    得られた成果
    ◆スクリプトチーム全体で10%程度の効率化
    ◆ツールの統合化が助かった
    ◆AIだけでなくJenkinsも役に立った

    新規合流者が慣れるまで一月ぐらい > 大幅に改善

    スクリプトチームはプロジェクト間の移動が多い部署なので助かった

    View Slide

  59. 59/61
    まとめ

    View Slide

  60. 60/61
    まとめ
    ◆「期待通りのものが提供された」とフィードバック
    ◆音声解析を使えなかったのが残念

    自然言語処理の精度を超えることができなかった

    音声による感情分析は既存事例が少ない

    最近増えてきたのでまた試したい
    ◆最終的な正解率:66%

    ポジティブ・ネガティブの間違いは少ないので、そのまま使えるレベル
    ◆「データ数の少ない感情」の精度が低かった

    「怒り」「照れ」の推定が難しい

    View Slide

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

    View Slide

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

    View Slide

  63. 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

    View Slide

  64. 64/61
    シナリオ執筆ツール「こえぼん」
    社内で広く利用されているWebアプリ

    シナリオの執筆、監修、台本出力まで可能

    AIによる表記揺れ、誤字検出

    Youtubeで講演動画が視聴可能

    https://youtu.be/g7uY5zRpz4g?list=PLSx6MdBnoFbAzBFI-gBTYO0-GowOZx3Nc

    View Slide

  65. 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

    View Slide

  66. 66/61
    参考文献
    ◆Whisper

    https://github.com/openai/whisper
    ◆WhisperX

    https://github.com/m-bain/whisperX

    This product includes software developed by Max Bain.

    View Slide

  67. 67/61
    質問用のスライド

    View Slide

  68. 68/61
    質問応答タスクの学習のコード
    ◆transformersのexampleのコードを利用

    設定を渡すことで各種パラメータ、事前学習モデルの指定が可能

    学習データはSQuAD 2.0形式を利用

    View Slide

  69. 69/61
    キャラクターの表情≠感情分析
    ◆今回は感情分析として扱ったが適切だったのか

    キャラクターの表情の変化は純粋に感情の変化を反映するわけではない

    人間を使ったテストを自分でやってみてわかった

    同じ表情だと単調になるので、表情を変えているケースもありそう
    ◆1行の感情をまとめて推定する手法

    1行の感情をまとめて推定することで表情の変化を扱えそう

    記号などを使って文章中の区切りをAIに知らせる

    View Slide

  70. 70/61
    LLMを使う場合は?
    ◆日本語理解力が高いほど有利

    該当キャラクターの感情のパターンをいくつか与える方法
    ◆Few shotで事例を数件与える方法
    ◆オープンなLLMで学習する方法
    ◆キャラクターの性格・タイプを渡す方法

    キャラクターの特徴や口癖などをプロンプトに入れてしまう方法

    文章を渡すと感情を返すように学習させる

    View Slide