4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

NYAVATARのアバターをSora2で動かしてみた

Last updated at Posted at 2025-12-25

はじめに

初めまして、ゆり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

手順紹介

動作概要

  1. Sora2でリアルルックな人間の動画を生成
  2. OBSの仮想カメラから、Sora2で生成した動画を取得
  3. VTube StudioのWebカメラトラッキングでOBS Virtual Cameraを選択
  4. PythonでOBS上に流す動画を自動切り替え

1.Sora2でリアルルックな人間の動画を生成

キャリブレーションの設定が各個人で異なるため、出力する動画は全て同一人物であることが求められます。
そこで、Sora2のリミックス機能を用いて最初に出力した人物を引き継ぐことにしました。

基本的な生成方法については下記を参照させていただきました。

    try:
        video = client.videos.remix(
            video_id=video_id,
            prompt=prompt
        )

video_idには、最初に生成した動画のIDを入力します。
promptには「〇〇を××に変更してください」等、変更したい部分のみ記載することにより他の部分は基本的に据え置きで出力されます。
また、動画の尺は元の動画に依存します。

2. OBSの仮想カメラから、Sora2で生成した動画を取得

「+」からメディアソースを追加し、Sora2で生成した動画を流します。

image.png

仮想カメラを開始します。

image.png

次に、VTube Studioの設定を行います。

3.VTube StudioのWebカメラトラッキングでOBS Virtual Cameraを選択

VTubeStudioのWebカメラトラッキングにて、「カメラを選択する」からOBS Virtual Cameraを選択します。

image.png

以上で、動作の準備が完了しました。

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度訪れてみてください。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?