本作品はChatGPTの使用を選択できるようになっております。(以降、GPTモード選択機能)
本作品はchatGPTを用いなくても動作には問題ないですが
GPTモード選択機能があることにより、審査に不利益が生じる場合は、
お手数ですが、GPTモード選択機能を無効化の設定を行ったうえで審査をお願いいたします。
無効化の設定はこちら。
大変恐れ入りますが、OpenAI keyの用意はございませんので、必要に応じて取得してください。
※Azureは非対応なので、使用されえる際はOpenaiのAPI KEYをご用意ください。
本作品は、人工無脳とLive2Dを用いてチャットベースのコミュニケーションを実現した作品です。
作品は、ミクさんの控室や握手会といった空間をイメージしており、
チャットを入力し、その入力をリアルタイムに解析し、結果に応じてミクさんが
言葉と仕草で反応してくれます。
また、楽曲再生やボリュームの変更もすべてチャットベースで操作可能です。
さらに、楽曲再生中には、TextAliveAPIから取得できる覚醒度と感情価から仕草を判定して
楽曲再生中もミクさんがいろんな仕草をして楽しませてくれます。
※ミクさんの応答はchatGPTによって作成し、仕草は独断と偏見によって割り振りました。皆さんのイメージにマッチしない部分もあるかと思いますがご了承ください。
最初の画面では次のようなボタンが表示されます。 「PRESS TO START」をクリックすることによりメイン画面に進みます。
この画面では、ミクさんと対話や楽曲を再生することができます。
チャット機能
チャットを入力し送信をクリックすると、次の図のようにミクがコメントと反応を返してくれます。
通常のチャット以外にも次の機能も含まれております。
※1 : ある程度の表現の揺れには対応していますので、必ずしも上記の通り入力する必要はありません。(参照箇所:コードへのリンク)
楽曲再生中
図のように歌詞モニタに歌詞が表示されます。※2
また、TextAliveAPIのビート情報をもとにスポットライトが点滅します。※2
さらに、ミクの動きは上述したとおり、TextAliveAPIの覚醒度と感情価から動きを決定しています。
もちろん、チャットを送ることも可能です。
※2 毎回演出が変わるように仕組んでいます。
画面の説明
ここでは次の項目を設定できる
人工無脳とは、深層学習モデル等を必要とせずに、あらかじめ決められたルールに従って応答を返す技術です。
人工無脳を用いた理由は後述。
1000対の対話データをかさまし
//かさまし前
質問:こんにちは, 解答:こんにちは
//かさまし後 質問:こんにちは, 解答:こんにちは 質問:やぁ, 解答:こんにちは 質問:ハロー, 解答:こんにちは
chatData/syushi.js
を作成する。事前準備
chatData/syushi.js
の質問文のリストから、ミクさんが知っている単語(形態素)を
重複無く全て取得しボキャブラリとして情報を保持する。
応答内容の判定
src/responseRules.js
の中からランダムに選ばれる。src/responseRules.js
の中からランダムに選ばれる。src/responseRules.js
の中からランダムに選ばれる。chatData/syushi.js
で定義されているワードリストを用いて応答を選択する。src/config.js
の1行目を次のように変更する。
//変更前
let disableGPTMode = false//Trueの場合GPTモードの選択を可能にする
//変更後
let disableGPTMode = true//Trueの場合GPTモードの選択を可能にする
モーションは次の15種類を用意。
src/responseRules.js
にあらかじめ、解答に対して、どの動作をするかを紐づけている。
画面chatを反映するタイミングで、Live2Dのアニメーションを発火させている。
後述の演出に関してを参照
スクリプトを取得する。
cd ${YOUR_WORKING_DIR}
git clone https://github.com/Motohiro-Otsuka/magical_mirai2023.git
ディレクトリ構成は下記の通り。
./
├─ReadMe.md
├─index.html
├─chatData //chatbot用のデータ
├─css
│ └─fonts
├─dict //kuromoji.js用のデータ
├─favicon
├─img //背景画像
├─miku2023 //ミクのLive2Dモデル
│ ├─HatsuneMiku.2048
│ └─motion
└─src //Appを構成するスクリプト群
HTTPサーバ上に本スクリプトを配置し、index.htmlにアクセスしてプログラムを実行する。 方法は問わないが、動作確認した方法2つを挙げる。
code magical_mirai2023
をVSCodeの統合ターミナルに入力してEnterを入力。$ cd magical_mirai2023
$ http-server
※Windows上で実行する場合は、セキュリティエラーが出る環境がある。その場合は下記のコマンドを実行すると回避できる。(参考)
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
※対応端末は、PCの想定です。スマホ、タブレットは未検証。
※ただし、src/musicList.js
に楽曲情報を追加するとSongleで公開されている楽曲すべて利用可能。
作品名:言葉と仕草で想いを紡ぐバーチャル歌姫
開発者はミクに「言葉」や「仕草」を教え、
それらを使ってミクさんが気持ち伝える際に、
「言葉」と「仕草」を丁寧に考え言動を起こすことをイメージして
「紡ぐ」というワードを使用してこのタイトルになりました。
昨年は、思いが届くバーチャル歌姫を入選作品に選んでいただきありがとうございます。
とてもいい経験をさせていただきました。
また、友人らにもその話をして、沢山褒めていただけました。
ただそんな中で、こんな話が出ました。
「(昔に)リアルにリンちゃんを召喚するとか言ってましたよ」と言われハッと気づかされました。 (※リーダはリン廃です。)
正直なところ、一個人が実現できるわけがない馬鹿げた夢ではありますが、
「何としてでも夢に近づけたい。」でも、「できる気がしない」と葛藤をしていました。
月日は流れて今年1月、GPTの登場によりプロコン出す意味を失いそうになりました。
しかし、GPTは巨大なGPUが必要でありコストもかかる...
さらに、GPTだけでは歌うことはできない。歌わせることができるのはTextAliveAPIを使うしかない。
そう思い立ち、今年も作品の制作を決意。
プロコンの開催が公式発表されるまで、事前に知識を集めはじめました。
それと同時に、メンバーの募集もかけて3人が新たにメンバーとして加わりました。
作品の制作開始から、ミクさんに命を吹き込みたいという気持ちでいっぱいでした。 それぞれの担当のそれぞれの苦労が、日に日に1つになっていく喜びをメンバーと分かち合いました。
Live2Dのモデルは、原画の作成から苦労の連続でした。 誰もLive2Dの仕様を知らなかったので、貰った絵が使えないなどのトラブルがあり、 描きなおしが発生していました。
何とかして作成した苦労の塊のミクさんを、PCをまともに使いこなせない超初心者がLive2Dで命を吹き込み始めました。 最初はミクさんが可愛そうなぐらい形がいびつだったりしたこともありましたが、 ただ、着実にミクさんが動くようになり、チーム全員で喜びました。
まだ、ちょっと不器用な動きもありますが、そんなミクさんもとても可愛いです!
一方、チャットの方はすべての工程で苦戦しました。
当初の狙いではseq2seqで、精度の高いchatbotのモデルを作ろうと検討していました。 しかし、seq2seqでモデルを作るには数万件以上のデータが必要だといわれています。
そこでchatGPTを駆使して60万件ほどのデータは何とか作り上げましたが、 学習時間が有限時間内に終わらず...
次にデータ量を減らし1万件ほどの学習データで学習。 さらに、WebApp上で動くようにモデルを軽量化も施しました。 そして、ミクさんが初めて言葉を発しました。しかし、ほとんど日本語とは言えず...泣く泣く没案。
確実に解答が返ってくるようにと、1万件のデータをクラス分類タスクとして学習。 一応、まともな日本語では応答してくれるようになりましたが、挨拶などの基本事項が出来なくて没...。
もうこの辺りで、ミクさん喋ってくれないのかと心が折れかけていました。 しかし、Live2Dのミクさんにも励まされながら何とか知恵をひねり出し人口無脳を用いて実装することにしました。
人口無脳のミクさんは日本語が苦手な感じはしますが、学習したモデルを使うよりかは
日本語を話してくれるようになり、とても嬉しかったです!
昨年の知見があったとはいえ、なるべくTextAliveAPIを利用したいと考え様々な機能を実装しました。 使ってみると、もっとこだわりたくなるようなAPIもあり作業遅延の原因にも良くなっていました(笑)
正直間に合うかがかなりきわどかったですが、メンバーの的確なアドバイスのもの何とか間に合わせることができました。
我々のミクさんはちょっと不器用だったり、変な日本語返したりしますが、我々の中では立派なミクさんです。 そんなミクさんをよろしくお願いいたします!