はじめに
初めまして、ゆりPです。
私は大学院で情報工学について学んでおり、普段は文章の感情分類・AIキャラクターとのコミュニケーションについて研究を行っています。趣味でイラストやLive2D、Unityなどの制作にも取り組んでいます。
ホップスコッチ株式会社では、専攻での知識や趣味の経験を活かして、リアルタイムで対話することができるAIキャラクターNYAVATARのキャラクターイラスト・Live2D制作、VTube Studio APIやLLM APIを統合的に制御するシステム開発、配信プロデュースまで全てをひとりで担当しています。
背景
NYAVATARの開発を進める中で、研究の延長でAIキャラクターとのコミュニケーションをより自然にする表現や動きについて、半年近く試行錯誤を行ってきました。
最初はVTube Studio APIを用いてホットキーを指定したり、LLMから直接パラメータの指示を行っていましたが、この手法では動きがぎこちなく、パターンが少なくなり、不自然な動きになってしまいました。
そんな中、10月にSora2がリリースされたことで、生成した動画を活用してLive2Dで作成したキャラクターモデルを自動で、かつ自然に動かすことができるのではないかと検証した内容をご紹介します。
今回の手法を用いたAIキャラクター黒宮すずが、2026年1月1日に配信を行います!
よろしければ1度訪れてみてください。
実行環境
- Windows11
- Sora2
- VTube Studio
- Webカメラトラッキング設定:OBS Virtual Camera
- OBS
- 仮想カメラON
- Python
手順紹介
動作概要
- Sora2でリアルルックな人間の動画を生成
- OBSの仮想カメラから、Sora2で生成した動画を取得
- VTube StudioのWebカメラトラッキングでOBS Virtual Cameraを選択
- PythonでOBS上に流す動画を自動切り替え
1.Sora2でリアルルックな人間の動画を生成
キャリブレーションの設定が各個人で異なるため、出力する動画は全て同一人物であることが求められます。
そこで、Sora2のリミックス機能を用いて最初に出力した人物を引き継ぐことにしました。
基本的な生成方法については下記を参照させていただきました。
try:
video = client.videos.remix(
video_id=video_id,
prompt=prompt
)
video_idには、最初に生成した動画のIDを入力します。
promptには「〇〇を××に変更してください」等、変更したい部分のみ記載することにより他の部分は基本的に据え置きで出力されます。
また、動画の尺は元の動画に依存します。
2. OBSの仮想カメラから、Sora2で生成した動画を取得
「+」からメディアソースを追加し、Sora2で生成した動画を流します。
仮想カメラを開始します。
次に、VTube Studioの設定を行います。
3.VTube StudioのWebカメラトラッキングでOBS Virtual Cameraを選択
VTubeStudioのWebカメラトラッキングにて、「カメラを選択する」からOBS Virtual Cameraを選択します。
以上で、動作の準備が完了しました。
4.PythonでOBS上に流す動画を自動切り替え
OBS Studioをwebsocket経由で操作することができるAPIを用いて、メディアソースに流し込む動画を自動で変更します。
接続方法については下記を参考にさせていただきました。
接続が完了したら、メディアソースを取得します。
def find_media_source(self):
"""最初に見つかったメディアソースを取得"""
if not self.client:
raise ConnectionError("OBSに接続していません")
try:
inputs = self.client.get_input_list()
for input_item in inputs.inputs:
if input_item['inputKind'] == 'ffmpeg_source':
return input_item['inputName']
return None
except Exception as e:
print(f"メディアソースの検索に失敗: {e}")
return None
そして、取得したメディアソース内のファイルを指定ファイルに置き換えます。
def set_media_file(self, file_path: str):
"""メディアソースのファイルを変更"""
if not self.client or not self.media_source_name:
return False
if not file_path or pd.isna(file_path) or file_path.strip() == "":
return False
try:
self.client.set_input_settings(
name=self.media_source_name,
settings={'local_file': str(Path(file_path).resolve())},
overlay=True
)
return True
except Exception as e:
print(f" ⚠ 動画の設定に失敗: {e}")
return False
コマンドラインからpythonプログラムを操作することで、OBS上のファイルを切り替えることが可能になります。
まとめ
Sora2で生成した動画をOBSに流し、OBS上のメディアソースのファイル変更を自動で行うことにより、Live2Dモデルの自然な動きを実現することができました。
今回の手法を用いたAIキャラクター黒宮すずが、2026年1月1日に配信を行います!
よろしければ1度訪れてみてください。


