前回chatGPTを使って複数キャラにテキスト形式で会話して頂きました。
テキスト形式でも十分におもしろかったのですが、
ビジュアルと音声がついたらどれだけ存在感が増すだろうかと思い、ほぼリアルタイムに雑談してもらえるシステムを開発しました。
雑談している風景を収めたのが下記の動画です。
キャラと話の方向性を定めるために各キャラ一回だけ決め打ちの発言をさせていますが、それ以降はキャラ自身が発言内容を考えています。
見た目と音声をつけたことにより、キャラ達が会話している感がぐっと向上したと思います。
システムの概要
システムの概要図は下図のとおり
構成要素は3つあり
・チャットコントローラー
・キャラクター
・発言順に音声を再生するモジュール
です。
チャットコントローラーが会話順を決め、各キャラクターが文章作成・音声作成・立ち絵表示を行います。作成した音声オブジェクトを発言順に再生するモジュールに渡し、音声を再生します。
システムのポイント(リアルタイム性の改善)
キャラ達にリアルタイムに会話させようとすると、openaiが文章を作成する時間と音声を合成する時間が約12秒ほど発生するため、ほかのキャラクターが発話を終えてから会話の準備を始めるのでは間が空きすぎて聞くに堪えないものになります。
そのため、文章作成と音声作成、音声の再生は非同期で実行するようにしました。
これにより、キャラ達の会話が滞りなく進むようになりました。
システムのポイント(立ち絵の表示)
1台のPCで自作かつ複数のキャラクターの絵を動かす方法に悩みました。
というのも、多くのVtuber向けのシステムでは1体を動かすことを目的としており、複数のキャラクターを動かすことは目的としておりません。
また、今回の場合は音声から立ち絵を動かす必要があります。このような場合に最も適したソフトとして、Puppet3
https://github.com/leobtype/Puppet3/releases
が見つかりました。
Puppet3は立ち絵4枚から瞬きと口パクをさせるモジュールです。ランダムに瞬きをし、音量に従って口パクします。
しかし、Puppet3では最大で2体までしか動かすことができませんでした。
そのため、立ち絵を表示するモジュールを自作しました。
各キャラごとの立ち絵の表示をopencvで行い、ランダムなタイミングで瞬きする絵と音量に従って口パクするように実装しました。
さらに、キャラクターの存在感を上げるために微妙にちょっとずつ動かすようにしています。
最後にキャラごとのウィンドウをOBSで読み取り合成しました。
ライブ配信について (Youtube Live)
今回のは動画として作成しましたが、
Youtube Liveでコメント欄の情報を読み取りながらキャラ達にお喋りしてもらったら、
もっと面白くなるのではないかと考えています。
KyaraAIのtwitterを作成しましたので、ライブ配信を行う場合はこちらで告知するのでぜひフォローしてください!