VMagicMirrorに命を吹き込む Pythonと Style-Bert-VITS2で リアルタイム感情表現

このチュートリアルでは、Pythonを使用してVMagicMirrorにモーションを付与する方法を説明します。VMagicMirrorは、キーボード入力とモーションを連動させることができるソフトウェアです。このプロセスでは、感情分析を行い、音声ファイルを生成し、それに基づいてキーボード入力を通じてモデルのモーションを制御します。

https://hamaruki.com/bringing-vmagicmirror-to-life-python-and-style-bert-vits2-real-time-emotional-expression/

## 構成図

![](https://hamaruki.com/wp-content/uploads/2024/02/AIキャラクター実況をStyle-Bert-VITS2とVMagicMirrorで始めよう-6.png)

## スクリプトの準備

前回同様にChatGPT4で生成します。
今回は感情表現を行うため、それを踏まえてChatGPT4に生成してもらいます

https://hamaruki.com/start-ai-character-live-commentary-with-style-bert-vits2-and-vmagicmirror/

### ChatGPT: 
了解しました。以下のようにニューススクリプトの各文にモーションを割り当て、丸で区切ります。 


1. "みなさん、こんにちは！ニュースタイムです。" 
	- **モーション:**  joy (喜び)。 
2. "本日は、大規模言語モデル（エルエルエム）の最新の進展についてお伝えします。" 
	- **モーション:**  nodding (うなずき)。 
3. "「モア エージェント イズ オール ユー ニード」という論文がこの分野に新たな光を投げかけています。" 
	- **モーション:**  good (良い)。 
4. "この研究は、ジュンヨウ リ、チン ザン、ヤンビン ユウ、チアン フ、デヘン イェによって執筆され、" 
	- **モーション:**  nodding (うなずき)。 
5. "大規模言語モデルの性能は、単純なサンプリングと投票方法を用いることで、" 
	- **モーション:**  nodding (うなずき)。 
6. "生成されるエージェントの数に比例して向上することを発見しました。" 
	- **モーション:**  joy (喜び)。 
7. "驚くべきことに、この方法は既存の複雑な手法と併用してエルエルエムをさらに強化でき、" 
	- **モーション:**  good (良い)。 
8. "その効果はタスクの難易度に関連しています。" 
	- **モーション:**  nodding (うなずき)。 
9. "研究チームは、エルエルエムのベンチマークにわたる広範な実験を行い、" 
	- **モーション:**  good (良い)。 
10. "この発見の実証と、その発生を促進する特性の研究を行いました。" 
	- **モーション:**  nodding (うなずき)。 
11. "結果は、タスクの難易度が高まるにつれて、エージェントの数を増やすことの効果が顕著になることを示しています。" 
	- **モーション:**  joy (喜び)。 
12. "この興味深い研究についてもっと知りたい方は、論文のコードが公開されています。" 
	- **モーション:**  wave (手を振る)。 
13. "オンラインで詳細を確認し、この分野の最前線に触れてみてください。" 
	- **モーション:**  nodding (うなずき)。 
14. "大規模言語モデルの可能性はまだまだ拡がりを見せています。" 
	- **モーション:**  good (良い)。 
15. "今日のニュースでした。引き続き、最新の科学技術ニュースにご注目ください。" 
	- **モーション:**  wave (手を振る)。 
16. "それでは、またお会いしましょう！" 
	- **モーション:**  clap (拍手)。

## 音声ファイルの準備

こちら記事を参考に上記のスクリプトを生成します

https://hamaruki.com/i-tried-playing-pokellmon-with-ai-style-bert-vits2/

## Pythonスクリプト

### 必要なライブラリのインストール

まず、このプロジェクトに必要なPythonライブラリをインストールします。`PyAutoGUI`と`pygame`が必要です。これらはそれぞれ、自動的にキーボード入力を行うためと、音声ファイルを再生するために使用されます。

```bash
pip install pyautogui pygame
```


### ディレクトリ構造の準備

`audio/Word2Motion`ディレクトリを作成し、そこにBert-VITS2を使用して生成した感情を含む音声ファイル（.wav形式）を配置します。ファイル名には、感情の情報が含まれている必要があります（例: `001_joy.wav`）。

![file](https://hamaruki.com/wp-content/uploads/2024/02/image-1707652332702.png)


### コードの解説

#### ライブラリのインポート

```python
import os
import re
import pyautogui
from pygame import mixer
```



これらのライブラリをインポートすることで、ファイル操作、正規表現の使用、自動キーボード操作、音声ファイルの再生が可能になります。

#### ファイル一覧の取得

```python
folder_path = 'audio/Word2Motion'
files = [file for file in os.listdir(folder_path) if file.endswith('.wav')]
```



指定されたディレクトリ内の.wavファイル一覧を取得します。

#### 感情とキーボード入力の対応付け

```python
emotion_to_number = {
    "reset": 0,
    "joy": 1,
    "angry": 2,
    "sorrow": 3,
    "fun": 4,
    "wave": 5,
    "good": 6,
    "nodding": 7,
    "shaking": 8,
    "clap": 9
}
```



この辞書を使用して、感情とVMagicMirrorに設定したキーボードショートカットとの対応付けを行います。

#### ファイルのソート

```python
sorted_files = sorted(files, key=lambda file: int(re.search(r'\d+', file).group()))
```



ファイル名に含まれる数字を基に、ファイルをソートします。

#### 音声ファイルの再生とキーボード入力

```python
mixer.init()

for file in sorted_files:
    file_path = os.path.join(folder_path, file)
    emotion = file.split('_')[-1].split('.')[0]
    print(f"再生中: {file} - 感情: {emotion} [{emotion_to_number[emotion]}]")
    
    pyautogui.typewrite(str(emotion_to_number[emotion]))
    
    mixer.music.load(file_path)
    mixer.music.play()
    
    while mixer.music.get_busy():
        continue
```

 
- `mixer.init()`: pygameのmixerモジュールを初期化します。
- ループ内で、各ファイルに対して、ファイルのフルパスを取得し、ファイル名から感情を抽出します。 
- 抽出した感情に基づき、対応するキーボード入力を`pyautogui`を使用して自動で行います。 
- `mixer.music.load(file_path)`と`mixer.music.play()`を使用して、ファイルを再生します。 
- `while mixer.music.get_busy(): continue`は、再生が完了するまで待つためのコードです。

### VMagicMirrorの設定

VMagicMirror上で、上記のキーボード入力に応じて動作するモーションを設定してください。この設定はVMagicMirrorのドキュメントや設定画面から行えます。

![file](https://hamaruki.com/wp-content/uploads/2024/02/image-1707652394023.png)


## デモ動画

<iframe width="560" height="315" src="https://www.youtube.com/embed/Qs6gSGckhTQ?si=bfe84DXQ9Z6qHITt" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## まとめ

これらのステップに従って、Pythonスクリプトを使用してVMagicMirrorにモーションを付与し、音声に合わせてリップシンクしながら動作させることができます。

## リポジトリ

https://github.com/Sunwood-ai-labs/EmoVoiceMirror