見出し画像

AITuberに魂を吹き込むキャラクターモーション【VTube Studioキーバインド】実装について考えてみる

ふと考えてみると自分は現在のVTuber事情を知らない

AIを使ったVTuber、すなわち「AITuber」を作成することを考え始めてから約2ヶ月が経過しましたが、重要な点を見落としていました。
それは「私は現在の人間のVTuber事情を全く知らない」と言う事です。
AI技術の面白さに夢中になっていましたが、AITuber制作においてはそろそろそれだけでは不十分かもしれないと感じてきています。

2022年にエニーカラー、2023年にはカバーが上場したので、決算説明資料などは目を通しており、紙の上でのVTuber界隈の情報は知っていましたが、コンテンツとしての体験は「バーチャルYouTuber四天王」時代、2017~2018年くらいにで止まっているんですね。当時は輝夜月ちゃんが好きでよく見ていました。
趣味とは言え、この感覚ではAIのVTuberを作る上で致命的な気もします。
人間のVTuberの模倣がAITuberにとっての全ての正解では無いですが、現在何が「人気」で、「面白い」のか、そして「どのように配信されているか」を理解することは重要です。そんなこんなで最近はチラチラと人気VTuberさんの配信を見ています。やはり一番好きなのはマリン船長です。


VTube Studioで表情や効果音を入れてみる

また前置きは長くなりましたが今回はプログラムで自動化する前に、
まず、「人間の模倣をしてみよう」とそんな感じです。
AITuberによる全自動の配信に前段階として、有人でVTuber配信をする場合と同じようなツールを導入し「表情やポーズ」「効果音」と言ったものを用意して動かしてみました。

こちらが今回のテスト動画になります。


簡単に説明をすると、ベーシックとしてアバターはVTube Studioでリップシンクと待機モーション、台本テキストをStyle-Bert-VITS2で音声合成し読み上げています。これを元に人力(マウスクリック)で表情やモーション、効果音を付けてみた感じですね。
人の手で出来る事は自動化できる。と、いつもそんな発想です。

まず、動画の左上はOBS内で簡単に効果音を入れられる「効果音ラボ」を導入しました。マウスクリックで音を出すことができ、動画の表現がリッチになります。

左下は、自作しました「アバターの表情やモーション」をコントロールするGUIアプリです。ソースコードも載せておきます。
これは、Pythonの「PyAutoGUI」と言うマウス操作やキーボード操作を自動化するためのライブラリを使ったもので、GUI上のボタンをクリックすることでキャラクターの表情やモーションを操作できます。
常に他のウィンドウの前面に表示されるようにしているので、効果音ボタンとの併用もやり易いようにしてあります。これはVTube Studio側にキーバインドを設定しておかないと動作しませんが、アバターに感情表現やリアクションがあるとグッと親しみが沸く感じがします。
調べたらSTREAM DECKという外部機器でキーバインドを設定している人も居ますね。これはそのソフトバージョンですね。

地味ですが、人間のVTuberが使う際に便利なツールかもしれません。

以下はソースコードになります。
このアプリと「VTube Studio」を立ち上げれば使えるはずです。
キーバインドのコマンドだけ自分のアバターに合わせてカスタムで。

import pyautogui
import tkinter as tk
from tkinter import ttk

# 各キーボード操作を実行する関数
def execute_hotkey(key_combination):
    print(f"Alt+{key_combination[-1]} を実行します")
    pyautogui.hotkey('alt', key_combination, interval=0.05)

# GUIを作成する関数
def create_gui():
    root = tk.Tk()
    root.title("VTube Studio Controller")

    # このアプリを常に全てのウィンドウの前面に表示
    root.attributes('-topmost', True)

    # カテゴリごとにフレームを作成
    categories = {
        "目": [("全リセット", 'q'), ("照れ", 'w'), ("キラキラ", 'e'), ("ハート", '4'), 
               ("涙", 't'), ("ぐるぐる", 'y')],
        "表情": [("怒り", 'a'), ("悲しみ", 's'), ("青ざめ", 'd'), ("ジト目", 'g'), ("><目", 'b')],
        "特殊効果": [("猫耳", 'x'), ("ほっぺぷく", 'c'), ("舌出し", 'v'), ("マイク持ち", 'f')],
        "モード": [("カメラ目線モード", 'up'), ("左向き固定", 'left'), ("右向き固定", 'right')],
        "モーション": [("拍手", 'p'), ("お辞儀", 'o'), ("両手でバイバイ", 'i'), ("片手でバイバイ", 'u'), 
                        ("ハートの手", 'l'), ("ガオーー", 'k'), ("お次は", '9'), ("胸に手を", 'm'), 
                        ("腰に手を", 'k'), ("ハートマーク", 'space')]
    }

    # カテゴリごとのボタン色
    colors = {
        "目": "light blue",
        "表情": "light green",
        "特殊効果": "light pink",
        "モード": "light yellow",
        "モーション": "light coral"
    }

    for category, buttons in categories.items():
        frame = ttk.Frame(root)
        frame.pack(padx=10, pady=5, fill=tk.X)
        ttk.Label(frame, text=category).pack(side=tk.LEFT)
        button_frame = ttk.Frame(frame)
        button_frame.pack(side=tk.RIGHT, expand=True)

        for i, (label, key) in enumerate(buttons):
            button_color = colors[category]
            button = tk.Button(button_frame, text=label, command=lambda k=key: execute_hotkey(k), height=2, width=20, bg=button_color)
            button.grid(row=i//4, column=i%4, padx=5, pady=5)

    root.mainloop()

if __name__ == "__main__":
    create_gui()

自分で作るとわかる人間の複雑さ

色々と試すとわかる、人間の複雑さや再現する難しさ感じます。
多彩な感情表現、「えーと」や「あー」といった、つなぎ表現(これをフィラーと言うらしい)あと笑い声。良い意味での会話の広がりやまとまりの無さ。表情やボディランゲージ、その組み合わせやランダム性。

この辺りも、ふと面白いと思ったのが「DTMの打ち込み」で必死にナマの楽器に似せようとMIDIをいじってる感覚にも近いです。
いつまでもナマ楽器はナマだし、打ち込みは幾ら似せても打ち込みなんですよね。でもそこにも面白さがある。そして打ち込みには打ち込みでしかできない事もある訳で。
AITuberってのは、そんな過渡期にある感じがします。


これをAITuberにどのように実装するか

今回のアバターの表情やモーション、効果音をリアルタイムで生成されるテキストの感情を分析し、その結果に基づいて特定の指示(例:キー操作)を出すプログラムをChatGPTに考えてもらいました。

  1. リアルタイムテキスト入力の受け取り
    リアルタイムテキストは、ストリーミングAPI、WebSocket、またはリアルタイムデータベース更新のリスニングなど、さまざまな方法で取得できます。どの技術を使用するかは、テキストのソースによって異なります。

  2. テキストの文節分割
    日本語テキストを文節に分割するには、形態素解析ライブラリ(例:MeCab, Kuromoji)を使用します。これにより、テキストを文節や単語に分割し、後続の感情分析のための前処理を行います。

  3. 感情分析
    各文節に対して感情分析を行い、8つの基本感情(喜び、悲しみ、期待、驚き、怒り、恐れ、嫌悪、信頼)を判定します。このためには、感情分析APIや自然言語処理ライブラリ(例:NLTK, TextBlob, Transformersライブラリを使用したBERTモデル)を利用できます。特に、日本語テキストの感情分析には、日本語に対応したモデルやライブラリの選択が重要です。

  4. 感情に基づいた指示の生成
    各感情に対応する指示(例:喜びなら「alt+eキーを押す」)を定義します。プログラムは感情分析の結果をもとに、適切な指示を選択し、ユーザーに提示するか、または自動的に実行します。

  5. キー操作の自動化
    プログラムがコンピューターに対して物理的なキー操作をシミュレートするには、キーボードイベントを生成するライブラリ{(例:Pythonのpyautoguiやpynput)を使用します。これらのライブラリを利用して、特定のキー操作をプログラムから自動で実行させることができます。


この実装のアドバイスを見る限りでは、現状のOBSにテキスト生成した文章を字幕として出すために分割したテキスト送っているものを分岐して、感情分析した方が良いのか、それとも特定のキーワードをキースイッチにして表情などが変わるようにしたら良いのか。と言ったところでしょうか。
この辺りは深いテーマで「人間の感情」を掘り下げて分析し、勉強をしないとな感じがするので、もう少し考えてみようと思います。

(追記:2024/02/03 19:15)
ChatGPTに感情と感情語を色々と出力してもらいました。

{感情}{感情を表す言葉}
愛着・愛情	愛おしむ
愛着・愛情	恩愛
愛着・愛情	情熱
愛着・愛情	心酔
愛着・愛情	親愛
愛着・愛情	慕う
悔やむ	モヤモヤ
悔やむ	悔しい
悔やむ	悔やむ
悔やむ	悔恨
悔やむ	胸が痛む
悔やむ	後ろめたい
悔やむ	後悔
悔やむ	後悔する
悔やむ	罪悪感
悔やむ	残念
悔やむ	思い残す
悔やむ	深い後悔
悔やむ	惜しむ
悔やむ	二度と繰り返さない
悔やむ	反省する
悔やむ	負い目
悔やむ	負い目を感じる
楽観	楽観
楽観	楽天的
楽観	希望
楽観	期待
楽観	前向き
楽観	明朗
楽観	陽気
感謝	恩義
感謝	感激
感謝	感謝
感謝	感謝の念
感謝	感謝感激
感謝	謝意
感謝	誠意を示す
感動	印象に残る
感動	感慨深い
感動	感激する
感動	感心する
感動	感動する
感動	感銘を受ける
感動	胸に響く
感動	魂が震える
感動	心が洗われる
感動	心を揺さぶられる
感動	心温まる
感動	心打たれる
感動	涙が止まらない
喜び	スッキリ
喜び	ワクワク
喜び	悦び
喜び	快哉を叫ぶ
喜び	懐かしい
喜び	楽しい
喜び	感心
喜び	感動
喜び	歓喜
喜び	嬉しい
喜び	気持ちいい
喜び	興奮する
喜び	光栄
喜び	幸せ
喜び	幸福感を噛み締める
喜び	高ぶる
喜び	笑い
喜び	心弾む
喜び	爽快
喜び	大喜び
喜び	爆笑
喜び	満ち足りる
喜び	満足
喜び	愉快
喜び	癒される
喜び	落ち着く
喜び	和む
期待・希望	願望
期待・希望	希望に満ちる
期待・希望	期待感
期待・希望	待望
期待・希望	熱望
期待・希望	夢見る
期待・希望	予期
恐怖・不安	おっかない
恐怖・不安	おどおど
恐怖・不安	ひやひや
恐怖・不安	ぼんやりする
恐怖・不安	やきもき
恐怖・不安	畏れ
恐怖・不安	萎縮
恐怖・不安	気がかり
恐怖・不安	気掛かり
恐怖・不安	気苦労
恐怖・不安	恐れ
恐怖・不安	恐ろしい
恐怖・不安	恐ろしさ
恐怖・不安	恐怖を感じる
恐怖・不安	恐怖心
恐怖・不安	苦笑
恐怖・不安	苦悶
恐怖・不安	懸念
恐怖・不安	慌てる
恐怖・不安	焦る
恐怖・不安	心遣い
恐怖・不安	心細い
恐怖・不安	心配
恐怖・不安	心配り
恐怖・不安	心労
恐怖・不安	震えが止まらない
恐怖・不安	震える
恐怖・不安	震え上がらせる
恐怖・不安	青ざめる
恐怖・不安	絶望
恐怖・不安	絶望的な恐怖
恐怖・不安	戦慄
恐怖・不安	息苦しい
恐怖・不安	鳥肌が立つ
恐怖・不安	悩ましい
恐怖・不安	悩む
恐怖・不安	悲嘆
恐怖・不安	不安
恐怖・不安	不穏
恐怖・不安	不気味
恐怖・不安	不気味な予感
恐怖・不安	不吉
恐怖・不安	不信感
恐怖・不安	怖い
恐怖・不安	怖じ気
恐怖・不安	怖れ
恐怖・不安	憂い
恐怖・不安	憂虞
恐怖・不安	予想外
恐怖・不安	落ち込む
恐怖・不安	躊躇
興奮・緊張	したい
興奮・緊張	じれったい
興奮・緊張	すっきりする
興奮・緊張	ドキドキ
興奮・緊張	のぼせる
興奮・緊張	ハイになる
興奮・緊張	安心する
興奮・緊張	萎縮する
興奮・緊張	苛立ち
興奮・緊張	頑張る
興奮・緊張	気が急く
興奮・緊張	逆上
興奮・緊張	泣けてくる
興奮・緊張	強張る
興奮・緊張	興奮
興奮・緊張	興奮が抑えられない
興奮・緊張	緊張
興奮・緊張	緊張で息が詰まる
興奮・緊張	激する
興奮・緊張	血が騒ぐ
興奮・緊張	自信がある
興奮・緊張	張り詰める
興奮・緊張	熱狂
興奮・緊張	躍動感
興奮・緊張	欲しい
興奮・緊張	乱心
興奮・緊張	理性を失う
驚き	あっと驚く
驚き	あっと言わせる
驚き	ギクッと
驚き	ギクリと
驚き	ギョッと
驚き	ドキッと
驚き	ハッと
驚き	ハッとさせられる
驚き	ビクッと
驚き	びっくり
驚き	ヒヤッと
驚き	ヒヤリと
驚き	奇想天外
驚き	脅威の
驚き	驚かす
驚き	驚き
驚き	驚異
驚き	驚異的
驚き	驚愕
驚き	驚愕する
驚き	仰天の
驚き	衝撃の
驚き	信じられない
驚き	度肝を抜く
驚き	凍りつかせる
驚き	呆然とする
驚き	目を丸くする
驚き	目を見張る
驚き	瞠目する
驚嘆・賞賛	感服
驚嘆・賞賛	驚嘆
驚嘆・賞賛	敬意
驚嘆・賞賛	称賛
驚嘆・賞賛	賞賛
驚嘆・賞賛	羨望
驚嘆・賞賛	尊敬の念
嫌い	怨む
嫌い	顔も見たくない
嫌い	忌みきらう
嫌い	忌む
嫌い	苦笑する
嫌い	嫌い
嫌い	嫌う
嫌い	嫌がる
嫌い	見下す
嫌い	恨む
嫌い	嫉妬
嫌い	憎む
嫌い	憎悪
嫌い	抵抗感
嫌い	馬鹿にする
嫌い	反感
嫌い	反発を感じる
嫌い	不快感
嫌い	毛嫌い
好き	いつくしみ
好き	ラブ
好き	愛
好き	愛する
好き	愛情
好き	愛情のこもった
好き	愛着
好き	気遣う
好き	好き
好き	好み
好き	好意
好き	惚れ込む
好き	魂を揺さぶられる
好き	思いやり
好き	慈愛
好き	心惹かれる
好き	尊敬
好き	尊敬する
好き	同情
好き	憧れる
好き	熱中する
好き	魅了される
好き	魅力を感じる
好き	優しい
好き	欲する
好き	恋する
幸福・満足	安心感
幸福・満足	安堵
幸福・満足	温もり
幸福・満足	喜悦
幸福・満足	誇り
幸福・満足	幸運
幸福・満足	幸福感
幸福・満足	充実感
幸福・満足	祝福
幸福・満足	心地良い
幸福・満足	満悦
思慮・反省	思索
思慮・反省	自省
思慮・反省	熟考
思慮・反省	深慮
思慮・反省	内省
思慮・反省	反省
思慮・反省	瞑想
焦燥・イライラ	ムカムカ
焦燥・イライラ	苛立つ
焦燥・イライラ	焦り
焦燥・イライラ	切迫感
焦燥・イライラ	短気
焦燥・イライラ	不満
心が傷つく	ショックな
心が傷つく	せつない
心が傷つく	つらい
心が傷つく	胸に突き刺さる
心が傷つく	苦しい
心が傷つく	傷つく
心が傷つく	心がざわつく
心が傷つく	心が傷つく
心が傷つく	心に来る
心が傷つく	心の傷
心が傷つく	心苦しい
心が傷つく	精神的に傷つく
心が傷つく	精神的に来る
心が傷つく	精神的打撃
心が傷つく	打ちのめされる
心が傷つく	恥ずかしい
心が傷つく	落胆する
退屈	だれる
退屈	ぼんやり
退屈	我慢
退屈	倦怠
退屈	時間が経つのが遅い
退屈	辛抱
退屈	耐える
退屈	諦め
退屈	諦念
退屈	飽きる
退屈	飽き飽きする
退屈	無為
退屈	無関心
退屈	冷める
恥じらい・羞恥	屈辱感
恥じらい・羞恥	照れ屋
恥じらい・羞恥	赤面
恥じらい・羞恥	恥じらい
恥じらい・羞恥	内気
恥じらい・羞恥	羞恥感
恥じらい・羞恥	羞恥心
怒り	イライラ
怒り	火を吹く
怒り	我慢できない
怒り	激しい憤り
怒り	激昂
怒り	激怒
怒り	叱る
怒り	煮えくり返る
怒り	憎しみ
怒り	怒
怒り	怒気
怒り	怒鳴る
怒り	不機嫌
怒り	不愉快
怒り	腹が立つ
怒り	腹立ち
怒り	憤り
怒り	憤慨
怒り	憤激
怒り	文句を言う
怒り	呆れる
怒り	立腹
怒り	鬱憤
悲しみ	がっかり
悲しみ	かわいそう
悲しみ	ため息
悲しみ	ヘコむ
悲しみ	哀しみ
悲しみ	哀れ
悲しみ	哀愁
悲しみ	萎える
悲しみ	気分が晴れない
悲しみ	泣ける
悲しみ	虚しい
悲しみ	苦労
悲しみ	屈辱
悲しみ	孤独
悲しみ	戸惑う
悲しみ	困る
悲しみ	惨め
悲しみ	失意
悲しみ	失望
悲しみ	寂しい
悲しみ	重苦しい
悲しみ	傷心
悲しみ	情けない
悲しみ	心が折れる
悲しみ	心が沈む
悲しみ	心が痛む
悲しみ	辛い
悲しみ	切ない
悲しみ	絶望感
悲しみ	喪失感
悲しみ	嘆き
悲しみ	途方に暮れる
悲しみ	悲しい
悲しみ	悲しさ
悲しみ	悲哀
悲しみ	悲観
悲しみ	不幸
悲しみ	不幸せ
悲しみ	憂い事
悲しみ	憂き目
悲しみ	憂鬱
悲しみ	落胆
悲しみ	落胆感
悲しみ	涙が出る
悲しみ	涙腺が崩壊する
悲しみ	憐れ
疲労・倦怠感	気力の消耗
疲労・倦怠感	倦怠感
疲労・倦怠感	精神的疲労
疲労・倦怠感	燃え尽き症候群
疲労・倦怠感	疲れ
疲労・倦怠感	疲弊
疲労・倦怠感	力尽きる
不安・恐怖	おびえ
不安・恐怖	疑念
不安・恐怖	恐慌
不安・恐怖	緊張感
不安・恐怖	不安感
不安・恐怖	不安定
不安・恐怖	不信


この記事が参加している募集

AIとやってみた

この記事が気に入ったらサポートをしてみませんか?