AI技術が加速し近い未来、AIが動画の配信で雑談したりゲームをしたりするのが普通になる日が来るでしょう。
今回の内容はAI Vtuberを実現するために、必要になる準備をまとめた記事になります。
※リップシンクについて触れている記事が他サイトで見つけられなかったので、一番下の所で追記という形でざっくりやり方を書いておきました。
Vtuberのモデルを準備
AI VtuberのモデルはStable Diffusion web UIなどの画像生成AIを使い素になる画像を生成します。
Stable Diffusion web UIの使い方はこちらの記事を参考にしてください。
画像生成AIで出力するときは画像の背景を黒背景にしておくと良いと思います。
モデルをLive2Dで動かしたい場合はpsdデータを作ります。PSDデータで保存できるならどのペイントソフトを使っても構いません。
私はCLIP STUDIO PAINTを使ってパーツ分け&塗り足し作業をしました。
PSDデータの分け方及びLive2Dの使い方については公式のマニュアルが最強なのでそちらを参照して下さい。
会話文を生成するAI
雑談をするAIを作るためには、①何かしらの方法で入力文を持ってきて②応答文をAIで生成して③生成した応答文を読み上げるの3つの工程が必要になります。
ここではその方法の例を紹介します。
配信コメントから入力文
まずはコメント文を取得する方法を見ていきます。コメント文を取得するにはPythonと呼ばれるプログラミング言語を使う方法が一番簡単で楽だと思います。というのも他の言語で同じことはできるのですがAIで応答文を生成したり、音声を出力したりはPython以外ではやりづらいのでそれを見越してここもPythonで実装すると後が楽になります。
Pythonのインストールが終わったら、コマンドプロント(Macならターミナル)を使って以下のコマンドを実行してください。
Pythonで使えるpytchatというライブラリを使えるようにします。
pip install pytchat
ライブラリの準備が終わったら以下のコードを拡張子 .py にして名前を付けて保存します。ここでは get-comment.py としておきます。
import pytchat
# Live Streaming 設定
# https://https://www.youtube.com/watch?v=(ココの英数字列をコピーしてダブルクォーテーションの間に貼り付け)
stream = pytchat.create(video_id = "")
AllComments = []
cnt = 0
while stream.is_alive():
data = stream.get()
items = data.items
for c in items:
AllComments.append([c.author.name,c.message])
print(f"{c.author.name}:{c.message}\n")
cnt += 1
実行すると配信のコメントが取得され、AllCommentsという配列の中にデータが格納されつつコメントが表示されていきます。テスト配信か他の人の過去の配信アーカイブを使って試してみると良いでしょう。
私にとってなじみがあるのはYoutubeなのでそれ以外は割愛しますが、APIを使えば他の動画サイトや配信サービスでも似たようなことはできると思います。
応答文の生成AI
ココが配信の肝と言える項目で、ここでどのAIモデルを使うかによってAI Vtuberの質が変わってきます。しかしながら日本語を扱えるAIモデルは少なく、現状openAIのものぐらいですが従量課金形式でお金がかかるので中々手が出せません。
考える指標としては『応答文の生成にかかる時間』『応答文のクオリティ』の2つを見比べながら選ぶと良いでしょう。
現在有力なのはOpenAIのChatGPTになるわけですが、ここではあえて無料で使える範囲で探してみます。
miibo(mebo)
miiboは会話型のAIサービスで1ヶ月毎に使える量が契約プランによって決まっています。この中の無料プランが1000会話/月(Month)となっているので、こちらを使って配信する方法を考えます。
上手く応えられなかった会話は画像1のようにmiibo側に記録されるので、後からその情報に対する応答を学習させることが可能です。
5分で15会話なら、1000会話は概ね5.5時間前後になるので、無料枠で使うなら週1回の1時間配信程度なら無料枠でいけそうですね。1時間のうち配信内でAIの会話部分を使うのを40分だけに制限して20分は別のコンテンツを挟むなど、工夫をしていかないと週2時間配信には届かないかなと言った感触。
詳しい使い方については以下の記事に使ってみた記録があるので、そちらを参照していただくとわかりやすいと思います。
T5
T5というのはグーグルが開発しているAIモデルになります。実はWikipediaなどの日本語コーパスを使った事前学習済みのモデルがsonoisaさんによって公開されており、そちらをベースに転移学習を施して応答AIを作る方法があります。ただしこちらの方法はある程度Pythonが読めないと、公開されているcolabのコードを学習データに合わせて書き換えることができないため、Pythonの初歩的なことぐらいは分かっていないと厳しいです。解説記事もあるので詳しいことはこちらを参照して下さい。
T5のモデルでは学習データを使ってファインチューニングをするのですが、学習に使うデータもTwitter APIなどを活用して独自に収集する必要があるので難易度は高めです。
雑談メインの配信ではなく、ゲーム配信の脇に置いておく程度ならこちらのモデルでも十分でしょう。
応答文の読み上げ
応答文の読み上げはvoicevoxを使います。詳しくはこちらの記事を参考にしてもらうとわかりやすいかなと思います。
ちなみにvoicepeakを買ってそちらを使いたい人は私の使っているコードをトグルの中に貼り付けておくので持っていって下さい。
voicepeakのナレーション6商用可モデルをPythonで呼び出して音声を流すコードです。
import os
import subprocess
import winsound
def playVoicePeak(script , narrator = "Japanese Female 1", happy=20, sad=10, angry=10, fun=50):
"""
任意のテキストをVOICEPEAKのナレーターに読み上げさせる関数
script: 読み上げるテキスト(文字列)
narrator: ナレーターの名前(文字列)
happy: 嬉しさの度合い
sad: 悲しさの度合い
angry: 怒りの度合い
fun: 楽しさの度合い
"""
# voicepeak.exeのパス
exepath = "C:/Program Files/VOICEPEAK/voicepeak.exe"
# wav出力先
outpath = "output.wav"
# 引数を作成
args = [
exepath,
"-s", script,
"-n", narrator,
"-o", outpath,
"-e", f"happy={happy},sad={sad},angry={angry},fun={fun}"
]
# プロセスを実行
process = subprocess.Popen(args)
# プロセスが終了するまで待機
process.communicate()
# 音声を再生
winsound.PlaySound(outpath, winsound.SND_FILENAME)
# wavファイルを削除
os.remove(outpath)
if __name == "__main__":
# 応答文を引数で渡す(ここではこんにちはを連呼するだけ)
playVoicePeak('こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。')
残っている細かい事
これだけ準備できれば最低限、配信はできるようになります。ただ音声に合わせて応答文の字幕を出したり、応答文読み上げ時にLive2Dで作ったモデルにリップシンクさせたり、OBSの配信画面を作ったりと細かな部分は残っています。
そのほかにも配信中のマナーを書いた文章やコメントを使ったちょっとしたコマンド機能、TwitterなどSNS用のファンタグやアカウントの準備などもあると便利ですね。
このサイトではAIの記事を中心に扱いたいのでその辺の解説はしませんが、余裕があれば是非挑戦してみて下さい。
(追記)AI Vtuberのリップシンクについて書かれた記事が見当たらなかったので、考えられる2つのパターンを簡単に書置きしておきます。
①VB Cableというソフトで仮想オーディオを作るパターン。仮想的に音声の入出力をするソフトを介してVtube Studioに音声を認識させる方法です。Pythonのコードを実行したときの音声だけVB Cableに流れるように指定してあげればOK
②Vtube Studioのキーバインドを使ってLive2dで作った口の開閉アニメーションを結び付けておいて、pythonのキーボード操作のライブラリを通して呼び出す方法。こちらはpythonのキーボードを操作できるライブラリでキーを押す/離すを指定して無理やり実行する方法です。裏でゲーム操作をしながら使うには不向きかも。
またこの記事が役に立ったと感じたら広めてもらえると嬉しいです。