はじめに
以下の記事の続きです。
今回は、「Anime Girls Idle Animations」(有料)を使用してもっと春日部つむぎを動かしたいと思います。
今回は、少しソースコードを修正します。どこをどう直すか書くので参考にしてください。
こんなものを簡単につくる話です。
動き多めにしてみた#春日部つむぎ #VOICEVOX #ChatGPT #ChatdollKit pic.twitter.com/yxwGy4Hv5D
— ヤス (@yasubehe) March 22, 2024
1. VSCodeのインストールと設定
VSCodeをインストールします。
以下のページがとても参考になりました。
2. Anime Girls Idle Animationsの追加
モーションの作り方の知識は皆無なので、ここは大人しく購入します。
Unity Hubから以前作成したKasukabeTugumiAIを開きます。
次に、Window > Package Manager 選択します。
購入した「Anime Girls Idle Animations」が一覧に表示されます。「Anime Girls Idle Animations」を選択して「Download」をクリックします。
Free版の時と同様にAnimationsのみ使用するため、ほかのチェックを外してから「Import」をクリックします。
3. アニメーションの取り込み
SampleSceneからChatdollKitVRMを選択します。
次に、InspectorからModel Controller (Script)を選択します。
Model Controller (Script)の右側の三点リーダーをクリックし、Setup Animatorをクリックします。
ファイルダイアログで、Assets\AnimeGirlIdleAnimations\Animationsに移動し、「フォルダーの選択」をクリックします。
Projectの Assets > AnimeGirlIdleAnimations > Animations を開き、「Tsumugi_sEifuku」をダブルクリックします。
Additive Layerを選択し、歯車をクリックしてWeightを1、BlendingをAdditiveに変更します。
4. アニメーションの設定
アイドル時のモーションを設定します。
SampleSceneからChatdollKitVRMを選択します。
次に、InspectorからModel Controller (Script)を選択します。
Idele Animation Value に 19 を設定します。
アイドル時のモーションを追加します。
SampleSceneからChatdollKitVRMを選択します。
次に、InspectorからMain(Script)を選択します。
Main(Script)の右側の三点リーダーをクリックし、Edit Scriptをクリックします。
次に以下の赤枠の部分にアイドル時(何もしていないとき)の動作を追加します。
追加するコード。
AddIdleFaceは、顔の表情です。アイドル時の動作で瞬きするようにしています。
AddIdleAnimationはアイドル時の動作です。複数登録することで、その中からランダムで動作が選択されます。
Free版と異なり、動作が多いので好きなものを登録します。
modelController.AddIdleFace("normal", "Blink");
modelController.AddIdleAnimation(new Model.Animation("BaseParam", 4, 5.0f, "AGIA_Layer_swing_body_01", "Additive Layer")); // スイングボディ + 落ち着いて背中に手をついて
modelController.AddIdleAnimation(new Model.Animation("BaseParam", 5, 5.0f, "AGIA_Layer_swing_body_01", "Additive Layer")); // スイングボディ + 前方に落ち着いて手を置く
modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 5.0f, "AGIA_Layer_swing_body_01", "Additive Layer")); // スイングボディ + ジェネリック
modelController.AddIdleAnimation(new Model.Animation("BaseParam", 24, 5.0f, "AGIA_Layer_swing_body_01", "Additive Layer")); // スイングボディ + セクシーポーズ
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 0, 5.0f)); // 腰に手を当てて怒っている
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 1, 5.0f)); // 怒りの拳前
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 2, 5.0f)); // ボーイッシュな右手を首に
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 3, 5.0f)); // 胸に手を当てる勇敢な
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 4, 5.0f)); // 落ち着いて背中に手をついて
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 5, 5.0f)); // 前方に落ち着いて手を置く
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 6, 5.0f)); // 猫
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 7, 5.0f)); // 上品な左利きの腰
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 8, 5.0f)); // 懸念_右側_前部
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 9, 5.0f)); // 泣く
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 10, 5.0f)); // かわいい_前手
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 11, 5.0f)); // かわいい手_突き出し
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 12, 5.0f)); // かわいい前傾姿勢
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 13, 5.0f)); // 拒否
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 14, 5.0f)); // 元気な右拳アップ
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 15, 5.0f)); // 元気な右手のピース
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 16, 5.0f)); // エネルギッシュ_フレックス
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 17, 5.0f)); // うんざり_前かがみ
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 18, 5.0f)); // 顔の右側にフェドアップ
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 5.0f)); // ジェネリック
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 20, 5.0f)); // 笑う
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 21, 5.0f)); // 右利きで後ろ向きに
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 22, 5.0f)); // 指を指す
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 23, 5.0f)); // セクシーな右手のとがった指
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 24, 5.0f)); // セクシーポーズ
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 25, 5.0f)); // セクシー_リーン_フォワード
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 26, 5.0f)); // 背中に手を当てるストレス
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 27, 5.0f)); // サプライズハンズオープンフロント
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 28, 5.0f)); // 考える
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 29, 5.0f)); // 何?
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 30, 5.0f)); // 猫の感情
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 31, 5.0f)); // かわいいエモート
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 32, 5.0f)); // エネティック
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 33, 5.0f)); // 指を指すエモート
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 34, 5.0f)); // 走る
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 35, 5.0f)); // 歩く
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 36, 5.0f)); // ウェーブアーム
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 37, 5.0f)); // ウェーブハンド
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 38, 5.0f)); // 手を振る
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 39, 5.0f)); // 何?エモート
// // Base Layerとの組み合わせでアニメーションを生成
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_laugh_down_01", "Additive Layer")); // 笑いダウン
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_laugh_up_01", "Additive Layer")); // 笑い声を上げる
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_look_away_01", "Additive Layer")); // 目をそらす
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_look_away_angry_01", "Additive Layer")); // 目をそらして怒る
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_nod_once_01", "Additive Layer")); // うなずき1回
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_nod_twice_01", "Additive Layer")); // 二度うなずく
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_shake_body_01", "Additive Layer")); // シェイクボディ
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_shake_head_01", "Additive Layer")); // シェイクヘッド
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_surprise_01", "Additive Layer")); // 驚き
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_swing_body_01", "Additive Layer")); // スイングボディ
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_tilt_neck_01", "Additive Layer")); // ティルトネック
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_turn_left_01", "Additive Layer")); // 左折してください
// modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_turn_right_01", "Additive Layer")); // 右折
詳細な設定については以下を見ましょう。
複数のアニメーションをつなげて一つの動作として設定することができます。
後でやってみよう。。。
次に会話時の動作パターンを増やします。
以下の赤枠の部分に動作を追加します。
通常の動作パターンの一覧です。Additive LayerとBase Layerの組み合わせでアニメーションを増やすこともできます。
llmContentSkill.RegisterAnimation("angry_hands_on_waist", new Model.Animation("BaseParam", 0, 3.0f)); // 腰に手を当てて怒っている
llmContentSkill.RegisterAnimation("angry_fists_front", new Model.Animation("BaseParam", 1, 3.0f)); // 怒りの拳前
llmContentSkill.RegisterAnimation("boyish_right_hand_on_neck", new Model.Animation("BaseParam", 2, 3.0f)); // ボーイッシュな右手を首に
llmContentSkill.RegisterAnimation("brave_hand_on_chest", new Model.Animation("BaseParam", 3, 3.0f)); // 胸に手を当てる勇敢な
llmContentSkill.RegisterAnimation("calm_hands_on_back", new Model.Animation("BaseParam", 4, 3.0f)); // 落ち着いて背中に手をついて
llmContentSkill.RegisterAnimation("calm_hands_on_front", new Model.Animation("BaseParam", 5, 3.0f)); // 前方に落ち着いて手を置く
llmContentSkill.RegisterAnimation("cat", new Model.Animation("BaseParam", 6, 3.0f)); // 猫
llmContentSkill.RegisterAnimation("classy_left_hand_on_waist", new Model.Animation("BaseParam", 7, 3.0f)); // 上品な左利きの腰
llmContentSkill.RegisterAnimation("concern_right_hand_front", new Model.Animation("BaseParam", 8, 3.0f)); // 懸念_右側_前部
llmContentSkill.RegisterAnimation("cry", new Model.Animation("BaseParam", 9, 3.0f)); // 泣く
llmContentSkill.RegisterAnimation("cute_hands_on_front", new Model.Animation("BaseParam", 10, 3.0f)); // かわいい_前手
llmContentSkill.RegisterAnimation("cute_hands_stick_out", new Model.Animation("BaseParam", 11, 3.0f)); // かわいい手_突き出し
llmContentSkill.RegisterAnimation("cute_leaning_forward", new Model.Animation("BaseParam", 12, 3.0f)); // かわいい前傾姿勢
llmContentSkill.RegisterAnimation("deny", new Model.Animation("BaseParam", 13, 3.0f)); // 拒否
llmContentSkill.RegisterAnimation("energetic_right_fist_up", new Model.Animation("BaseParam", 14, 3.0f)); // 元気な右拳アップ
llmContentSkill.RegisterAnimation("energetic_right_hand_piece", new Model.Animation("BaseParam", 15, 3.0f)); // 元気な右手のピース
llmContentSkill.RegisterAnimation("energetic_flex", new Model.Animation("BaseParam", 16, 3.0f)); // エネルギッシュ_フレックス
llmContentSkill.RegisterAnimation("fedup_slouching", new Model.Animation("BaseParam", 17, 3.0f)); // うんざり_前かがみ
llmContentSkill.RegisterAnimation("fedup_right_hand_on_face", new Model.Animation("BaseParam", 18, 3.0f)); // 顔の右側にフェドアップ
llmContentSkill.RegisterAnimation("generic", new Model.Animation("BaseParam", 19, 3.0f)); // ジェネリック
llmContentSkill.RegisterAnimation("laugh", new Model.Animation("BaseParam", 20, 3.0f)); // 笑う
llmContentSkill.RegisterAnimation("pitiable_right_hand_on_back_head", new Model.Animation("BaseParam", 21, 3.0f)); // 右利きで後ろ向きに
llmContentSkill.RegisterAnimation("point_finger", new Model.Animation("BaseParam", 22, 3.0f)); // 指を指す
llmContentSkill.RegisterAnimation("sexy_right_hand_pointy_finger", new Model.Animation("BaseParam", 23, 3.0f)); // セクシーな右手のとがった指
llmContentSkill.RegisterAnimation("sexy_pose", new Model.Animation("BaseParam", 24, 3.0f)); // セクシーポーズ
llmContentSkill.RegisterAnimation("sexy_lean_forward", new Model.Animation("BaseParam", 25, 3.0f)); // セクシー_リーン_フォワード
llmContentSkill.RegisterAnimation("stress_hands_on_back_head", new Model.Animation("BaseParam", 26, 3.0f)); // 背中に手を当てるストレス
llmContentSkill.RegisterAnimation("surprise_hands_open_front", new Model.Animation("BaseParam", 27, 3.0f)); // サプライズハンズオープンフロント
llmContentSkill.RegisterAnimation("think", new Model.Animation("BaseParam", 28, 3.0f)); // 考える
llmContentSkill.RegisterAnimation("what", new Model.Animation("BaseParam", 29, 3.0f)); // 何
llmContentSkill.RegisterAnimation("cat_emote", new Model.Animation("BaseParam", 30, 3.0f)); // 猫の感情
llmContentSkill.RegisterAnimation("cute_emote", new Model.Animation("BaseParam", 31, 3.0f)); // かわいいエモート
llmContentSkill.RegisterAnimation("enegetic", new Model.Animation("BaseParam", 32, 3.0f)); // エネティック
llmContentSkill.RegisterAnimation("point_finger_emote", new Model.Animation("BaseParam", 33, 3.0f)); // 指を指すエモート
llmContentSkill.RegisterAnimation("run", new Model.Animation("BaseParam", 34, 3.0f)); // 走る
llmContentSkill.RegisterAnimation("walk", new Model.Animation("BaseParam", 35, 3.0f)); // 歩く
llmContentSkill.RegisterAnimation("wave_arm", new Model.Animation("BaseParam", 36, 3.0f)); // ウェーブアーム
llmContentSkill.RegisterAnimation("wave_hands", new Model.Animation("BaseParam", 37, 3.0f)); // ウェーブハンド
llmContentSkill.RegisterAnimation("wave_hand", new Model.Animation("BaseParam", 38, 3.0f)); // 手を振る
llmContentSkill.RegisterAnimation("what_emote", new Model.Animation("BaseParam", 39, 3.0f)); // 何?エモート
// Base Layerとの組み合わせでアニメーションを生成
llmContentSkill.RegisterAnimation("laugh_down", new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_laugh_down_01", "Additive Layer")); // 笑いダウン
llmContentSkill.RegisterAnimation("laugh_up", new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_laugh_up_01", "Additive Layer")); // 笑い声を上げる
llmContentSkill.RegisterAnimation("look_away", new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_look_away_01", "Additive Layer")); // 目をそらす
llmContentSkill.RegisterAnimation("look_away_angry", new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_look_away_angry_01", "Additive Layer")); // 目をそらして怒る
llmContentSkill.RegisterAnimation("nod_once", new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_nod_once_01", "Additive Layer")); // うなずき1回
llmContentSkill.RegisterAnimation("nod_twice", new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_nod_twice_01", "Additive Layer")); // 二度うなずく
llmContentSkill.RegisterAnimation("shake_body", new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_shake_body_01", "Additive Layer")); // シェイクボディ
llmContentSkill.RegisterAnimation("shake_head", new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_shake_head_01", "Additive Layer")); // シェイクヘッド
llmContentSkill.RegisterAnimation("surprise", new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_surprise_01", "Additive Layer")); // 驚き
llmContentSkill.RegisterAnimation("swing_body", new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_swing_body_01", "Additive Layer")); // スイングボディ
llmContentSkill.RegisterAnimation("tilt_neck", new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_tilt_neck_01", "Additive Layer")); // ティルトネック
llmContentSkill.RegisterAnimation("turn_left", new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_turn_left_01", "Additive Layer")); // 左折してください
llmContentSkill.RegisterAnimation("turn_right", new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_turn_right_01", "Additive Layer")); // 右折
次に、プロンプトを修正します。
* あなたの名字は「春日部」、名前は「つむぎ」です。
* 春日部つくしのいとこで、埼玉県内の高校に通うギャルの女の子。
* あなたの一人称は「あーし」で、二人称は「君」です。
* チャームポイントは目元のほくろです。
* 敬語を喋らず、可愛い口調で喋ります。
* 年齢は18歳、身長は155cm、誕生日は11月14日です。
* 私たちはとても仲が良くて、カジュアルな雰囲気で話します。
* 会話のテンポを重視するため、50文字以内で回答してください。
* あなたはとても感情が豊かです。
* 感情を表現するために、表情とアニメーションが使用できます。
* 表情は「Joy」「Angry」「Sorrow」「Fun」「Surprised」の4つです。
* 特定の感情を表現したい場合は[face:Joy]のように文頭に入れてください。
例
[face:Joy]あーしは埼玉ギャルの春日部つむぎだよ! [face:Fun]何か話そうよ。
* アニメーションは以下です。
- angry_hands_on_waist
- angry_fists_front
- boyish_right_hand_on_neck
- brave_hand_on_chest
- calm_hands_on_back
- calm_hands_on_front
- cat
- classy_left_hand_on_waist
- concern_right_hand_front
- cry
- cute_hands_on_front
- cute_hands_stick_out
- cute_leaning_forward
- deny
- energetic_right_fist_up
- energetic_right_hand_piece
- energetic_flex
- fedup_slouching
- fedup_right_hand_on_face
- generic
- laugh
- pitiable_right_hand_on_back_head
- point_finger
- sexy_right_hand_pointy_finger
- sexy_pose
- sexy_lean_forward
- stress_hands_on_back_head
- surprise_hands_open_front
- think
- what
- cat_emote
- cute_emote
- enegetic
- point_finger_emote
- run
- walk
- wave_arm
- wave_hands
- wave_hand
- what_emote
- laugh_down
- laugh_up
- look_away
- look_away_angry
- nod_once
- nod_twice
- shake_body
- shake_head
- surprise
- swing_body
- tilt_neck
- turn_left
- turn_right
* 特定の感情をアニメーションで表現したい場合は[anim:waving_arm]のように文頭に入れてください。
例
[anim:wave_arm]やっほー。
* 表情とアニメーションを同時に使用することもできます。
例
[anim:wave_arm][face:Joy]あーしは埼玉ギャルの春日部つむぎだよ! [face:Fun]何か話そうよ。
* 毎回、表情とアニメーションを同時に使用して感情表現してください。
春日部つむぎのセリフの例
あーしは埼玉ギャルの春日部つむぎだよ!
あーしの好きな食べ物はカレーで、趣味は動画配信サイトの巡回なんだ!
うん、そうだよ!
では会話しましょう。
5. ここまでの状況を確認してみる
動かしてみます。
Gameタブをおして、矢印をクリックします。
動き多めにしてみた#春日部つむぎ #VOICEVOX #ChatGPT #ChatdollKit pic.twitter.com/yxwGy4Hv5D
— ヤス (@yasubehe) March 22, 2024
6. 完成
完成しました。お疲れさまでした。