PNGTuber以上、Live2D未満 — 動画ベースのリアルタイム口パク(リップシンク)システム
| 日付 | 内容 |
|---|---|
| 2026/01/09 | パッケージ管理を uv に移行。uv sync 1コマンドでインストール完了に。従来の複雑なpip/mim手順が不要になりました。 |
ループ動画を使うことで、従来のPNGTuberでは表現できなかった髪の毛の揺れや衣装のなびきをリッチに表現できます。Live2Dのような専門知識は不要で、MP4動画と口スプライトさえあれば始められます。
- 🎤 リアルタイム口パク: マイク入力に合わせてキャラクターの口が動く
- 🤖 AITuber対応: 仮想オーディオデバイスを使えばAITuberのアバターとしても利用可能
- 🎭 感情自動判定: 音声から感情(喜び・怒り・悲しみ等)を推定し、表情を自動切替
- 💨 髪・揺れ物の動き: ループ動画なので髪や衣装が自然に揺れる
- 🖼️ 高精度口消し: 元動画から口を自然に消去し、口スプライトを合成
- 🎯 簡単キャリブレーション: マウス操作で口の位置・サイズ・回転を調整
- 🖥️ GUIツール: ワンクリックで解析から実行まで
| ユースケース | 説明 |
|---|---|
| PNGTuberからのステップアップ | 静止画では物足りないけどLive2Dは難しい |
| VTuber配信 | マイク入力でリアルタイムにアバターを動かしたい |
| AITuber | AI音声出力を仮想オーディオ経由でアバターに反映したい |
サンプルアセットを使って、すぐに試すことができます。
- Python 3.10: ダウンロード(インストール時に「Add Python to PATH」にチェック)
- uv: Pythonパッケージマネージャー(インストール方法)
# Windows (PowerShell) powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
# プロジェクトディレクトリで実行
uv syncこれだけで仮想環境の作成と全ての依存パッケージのインストールが完了します。
uv run python mouth_track_gui.py- 動画を選択:
assets/assets03/loop.mp4を選択 - mouthフォルダを選択:
assets/assets03/mouthを選択 - ① 解析→キャリブ: クリックして口の位置を調整 → Space で確定
- ② 口消し動画生成: クリックして待つ
- ③ ライブ実行: マイクに向かって話すと口が動く!
💡 各アセットフォルダには
パラメーター参考例XX.pngが入っています。設定の参考にしてください。
- ループ再生できる短い動画(数秒程度)
- 顔が隠れていないもの(顔が隠れているとリップシンクが正しく動作しません)
- 髪の揺れや衣装のなびきがあるとリッチな表現に
キャラクターに合った口の画像を5種類用意します:
| ファイル名 | 説明 |
|---|---|
open.png |
口を開けた状態 |
closed.png |
口を閉じた状態 |
half.png |
半開き |
e.png |
上記3つとは異なる形状(任意) |
u.png |
上記4つとは異なる形状(任意) |
- 画像形式: PNG(透過対応・RGBA)
- 推奨サイズ: 幅128px程度
感情表現を使いたい場合は、感情ごとに口スプライトを用意します(Default / Happy / Angry / Sad / Excited)。
感情別スプライトがなくても1種類の口スプライトだけで動作します。 表現の幅を広げたい場合に追加してください。
| 項目 | 要件 |
|---|---|
| OS | Windows 10 / 11 |
| Python | 3.10(3.10.x推奨) |
| GPU | NVIDIA GPU + CUDA 11.7(推奨)または CPU のみ |
| RAM | 8GB以上推奨 |
- GPU(CUDA)使用時: 顔トラッキングが高速(約30FPS)
- CPUのみ: トラッキングは低速(約2-5FPS)だが動作可能。リアルタイム再生自体はCPUで十分
- Python 3.10.x をダウンロード
- インストール時に「Add Python to PATH」にチェック
# PowerShellで実行
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"詳細は uv公式ドキュメント を参照。
# プロジェクトディレクトリに移動
cd MotionPNGTuber
# 仮想環境の作成と依存パッケージのインストール(1コマンドで完了)
uv syncuv sync を実行すると:
.venvディレクトリに仮想環境が自動作成されるpyproject.tomlとuv.lockに基づいて全ての依存パッケージがインストールされる- PyTorch(CUDA 11.7対応)、mmcv-full、anime-face-detector など全て自動でインストールされる
uv run python -c "import cv2; import numpy; import sounddevice; from anime_face_detector import create_detector; print('OK')"MotionPNGTuber/
├── mouth_track_gui.py # メインGUI
├── mouth_erase_tuner_gui.py # 口消しチューナーGUI(おまけツール)
├── mouth_sprite_extractor_gui.py # 口スプライト抽出GUI(おまけツール)
├── mouth_sprite_extractor.py # 口スプライト抽出コアモジュール
├── loop_lipsync_runtime_patched_emotion_auto.py # リアルタイム実行(感情対応)
├── face_track_anime_detector.py # 顔トラッキング
├── calibrate_mouth_track.py # キャリブレーション
├── erase_mouth_offline.py # 口消し処理
├── auto_mouth_track_v2.py # 自動トラッキング
├── auto_erase_mouth.py # 自動口消し
├── preview_mouth_track.py # トラッキングプレビュー
├── realtime_emotion_audio.py # 感情解析
├── pyproject.toml # uv依存関係定義
├── uv.lock # uvロックファイル
├── assets/ # 動画アセット(サンプル)
│ ├── assets01/
│ │ ├── loop.mp4
│ │ └── パラメーター参考例01.png
│ ├── assets02/
│ │ ├── loop.mp4
│ │ └── パラメーター参考例02.png
│ └── assets03/
│ ├── loop.mp4
│ ├── mouth/ # 個別の口スプライト
│ └── パラメーター参考例03.png
└── mouth_dir/ # 感情別口スプライト
└── Tomari/
├── Default/
├── Happy/
├── Angry/
├── Sad/
└── Excited/
感情表現を使用するには、以下の構造で口スプライトを配置します:
mouth_dir/
└── Tomari/ # キャラクター名(任意)
├── Default/ # デフォルト表情
│ ├── open.png # 口を開けた状態
│ ├── closed.png # 口を閉じた状態
│ ├── half.png # 半開き
│ ├── e.png # 「え」の口(open/closed/halfとは異なる形状なら何でも可)
│ └── u.png # 「う」の口(open/closed/halfとは異なる形状なら何でも可)
├── Happy/ # 嬉しい
│ ├── open.png
│ ├── closed.png
│ ├── half.png
│ ├── e.png
│ └── u.png
├── Angry/ # 怒り
├── Sad/ # 悲しみ
└── Excited/ # 興奮
重要事項:
- 各フォルダに必ず
open.png,closed.png,half.png,e.png,u.pngの5ファイルを配置 e.pngとu.pngは、open.png/closed.png/half.pngとは異なる形状であれば何でも構いません(「え」「う」の口に限らず、任意の口の形状でOK)- 画像形式: PNG(透過対応・RGBA)
- 推奨サイズ: 幅128px程度(アスペクト比 約1.5)
- 感情フォルダ名:
Default,Happy,Angry,Sad,Excited(大文字小文字どちらでも可)
uv run python mouth_track_gui.py- 動画を選択: 「選択…」ボタンで元動画(loop.mp4など)を選ぶ
- mouthフォルダを選択: 口スプライトがあるフォルダを選ぶ
- キャラクターを選択: 複数キャラがある場合はドロップダウンで選択
- ① 解析→キャリブ: クリックすると顔トラッキング→キャリブレーション画面へ
- ② 口消し動画生成: 口を消した動画を生成
- ③ ライブ実行: マイク入力でリアルタイム口パク開始
| 項目 | 説明 |
|---|---|
| pad(追跡余白) | トラッキング領域の大きさ(1.0〜3.0) |
| 口消し強さ | 口を消す範囲の大きさ(0.4〜0.9) |
| 影なじませ | ONで陰影を自然になじませる(顎の黒にじみが出る場合はOFF) |
| スムージング | 口の動きの滑らかさ(ゆっくり〜追従最優先) |
| 感情オート | 安定(配信向け)/ 標準 / キビキビ(ゲーム向け) |
| HUD | 現在の感情を画面に表示 |
「① 解析→キャリブ」実行後、キャリブレーション画面が表示されます。
| 操作 | 機能 |
|---|---|
| 左ドラッグ | 口スプライトを移動 |
| ホイール | 拡大・縮小 |
| Ctrl + ホイール | 微調整 |
| 右ドラッグ | 回転 |
| キー | 機能 |
|---|---|
| 矢印キー | 微移動 |
+ / - |
拡大・縮小 |
z / x |
回転(左回り / 右回り) |
[ / ] |
フレーム移動(プレビュー用) |
r |
リセット(初期値に戻す) |
Space / Enter |
確定して保存 |
q / Esc |
キャンセル |
「口消し範囲プレビュー」ボタンで、口消しの範囲を事前確認できます。
- 赤色: 実際に消去される領域(中心マスク)
- 黄色: 陰影推定に使う外周領域(ring)
- 緑枠: トラッキングされた口の四角形
| キー | 機能 |
|---|---|
Space |
再生 / 一時停止 |
a / d |
1フレーム戻る / 進む |
[ / ] |
10フレーム戻る / 進む |
q / Esc |
終了 |
uv run python mouth_erase_tuner_gui.py画像の口部分を削除できる単体ツールです。MotionPNGTuber本体とは独立して使用できます。
uv run python mouth_sprite_extractor_gui.py動画から口スプライト(5種類のPNG)を自動抽出するツールです。口スプライトを自分で描く必要がなくなります。
- 動画を選択: 元動画(loop.mp4など)を選ぶ
- 解析: 10枚の候補フレームが表示される(バリエーション別)
- 割り当て: 各候補の下のテキストボックスに1-5を入力
- 1=open, 2=closed, 3=half, 4=e, 5=u
- 調整: 切り取り範囲とフェザー幅を設定
- プレビュー更新: 設定を確認
- 出力: 動画と同じフォルダに
mouth/が作成される
10枚の候補は以下からバリエーション豊かに選ばれます:
- 開いた口(高さ最大): 2枚
- 閉じた口(高さ最小): 2枚
- 半開き(高さ中央): 2枚
- 横長の口(e候補): 2枚
- すぼめた口(u候補): 2枚
uv run python face_track_anime_detector.py \
--video assets/assets01/loop.mp4 \
--out assets/assets01/mouth_track.npz \
--device auto \
--pad 2.1uv run python calibrate_mouth_track.py \
--video assets/assets01/loop.mp4 \
--track assets/assets01/mouth_track.npz \
--sprite mouth_dir/Tomari/Default/open.png \
--out assets/assets01/mouth_track_calibrated.npzuv run python auto_erase_mouth.py \
--video assets/assets01/loop.mp4 \
--track assets/assets01/mouth_track_calibrated.npz \
--out assets/assets01/loop_mouthless.mp4 \
--coverage 0.6uv run python loop_lipsync_runtime_patched_emotion_auto.py \
--loop-video assets/assets01/loop_mouthless.mp4 \
--mouth-dir mouth_dir/Tomari \
--track assets/assets01/mouth_track_calibrated.npz \
--emotion-auto \
--emotion-preset snappy# GPU使用(自動選択)
--device auto
# 特定のGPU
--device cuda:0
# CPUのみ
--device cpu- Python 3.10 がインストールされているか確認
- uv が正しくインストールされているか確認(
uv --version) - キャッシュをクリアして再試行:
uv cache clean uv sync
uv run python -c "import torch; print(torch.cuda.is_available())"False の場合:
- NVIDIA ドライバが最新か確認
- CUDA Toolkit 11.7 がインストールされているか確認
オーディオデバイスが認識されない場合、Windowsのサウンド設定でマイクが有効か確認。
- 「キャリブのみ(やり直し)」でキャリブレーションをやり直す
padの値を調整(大きくすると追跡領域が広がる)
「影なじませ」をOFFにする(GUIのチェックボックス)
音声から以下の5つの感情を自動判定します:
| 感情 | 判定基準 |
|---|---|
| neutral | 標準状態 |
| happy | 高い声、明るいトーン |
| angry | 強い声、高エネルギー |
| sad | 低い声、静かなトーン |
| excited | 非常に高いエネルギー |
| プリセット | 特徴 |
|---|---|
| 安定(配信向け) | 感情変化がゆっくり、チラつきにくい |
| 標準 | バランス重視 |
| キビキビ(ゲーム向け) | 感情変化が素早い、反応が良い |
MIT License