クリパと年末年始はリアルタイムボイスチェンジャーを使ってずむだもんと遊ぼう。


# はじめに
QiitaのAdvent CalendarにZoomも協賛しているということで、[Qiita Engineer Festa 2022](https://qiita.com/official-campaigns/engineer-festa/2022)でお世話になった身ですので、微力ながらも協力したいと思い、今回も参加させていただきます。少し時間的にぎりぎりですが、一応２本書くつもり。

今回の１本目は、[Qiita Engineer Festa 2022](https://qiita.com/official-campaigns/engineer-festa/2022)でのリベンジ企画です。前回までにZoom Meeting SDKを用いてZoomミーティングにアバターで参加する方法をいくつかご紹介してきました。そのなかで、アバターを使うのだから映像だけではなく、音声も全く自分とは違ったものにしてしまおう、という試みを行いました。結果としては、当時の私の力量不足により、リアルタイムで音声を変換することができず、音声認識＋テキスト読み上げ、という方法を提案する形となりました。[参考記事:Zoom Meeting SDKでなんちゃってボイスチェンジャー](https://qiita.com/wok/items/08c9505d5c3c95d8956d)。

しかし、昨今の技術の進展は目覚ましく、AIを用いて自分の声をほぼリアルタイムで好きな声に変換できる[MMVC](https://github.com/isletennos/MMVC_Trainer)というソフトウェアが公開されました。今回は、これを使ってリベンジしようと思います。

なお、MMVCでは、東北応援キャラクターである[ずんだもん](https://dic.nicovideo.jp/a/%E3%81%9A%E3%82%93%E3%81%A0%E3%82%82%E3%82%93)のトレーニング用の音声が配布されているなど、ずんだもん推しな感じになっています。かわいくていいですよね。よいのですが、Zoom + MMVCで企画を考えているうちに、ずむだもん(Zoomだもん)というおやじギャグを思いついてしまい、頭を離れなくなってしまいました。ということで、タイトルは「ずむだもんと遊ぼう」となっています。そして、下記がZoomを使うずんだもんをStable Diffusionに書いてもらった結果です。いつの日かZoomとずんだもんでコラボしてほしいですね。

![image](https://user-images.githubusercontent.com/48346627/208301664-4d961252-c427-4ff6-9e4b-8569bebf532e.png)


ということで、今回作るものはこんな感じのものです。かなりいい感じに音声変換できているのではないでしょうか。


https://user-images.githubusercontent.com/48346627/208338019-b73bdc03-5319-423e-b891-314a05097e45.mp4


# ソフトウェアの構成

前回までは、テキストから生成された音声ストリームをZoom Meeting SDKにわたす構成にしていました([参考](https://qiita.com/wok/items/0450c8620f11a371bd8b))。今回は、マイクから入力された音声ストリームから別の音声ストリームを生成し、Zoom Meeting SDKにわたす必要があります。

これを行うために、本アプリケーションでは、Zoom Meeting SDKの外側で、予めマイク入力から音声ストリームを取得しておきます。取得した音声ストリームは、サーバとして稼働するようにエンハンスしたMMVCに転送し変換を行います。Zoom Meeting SDKがマイク入力を要求した際には、この変換後の音声ストリームをわたすようにします。これにより、MMVCで変換した音声をZoom Meetingに乗せることができるようになります。

![image](https://user-images.githubusercontent.com/48346627/208305121-99722683-8cf8-41f7-9ada-cc503d8782e3.png)

そのほか、前回は３Ｄアバターを使用していましたが、ずんだもんになるということで、ずんだもんの映像をZoom Meeting SDKにわたすようにしています。このずんだもんの映像は音声に合わせて口を動かします。この辺のつくりは、以前の３Ｄアバターを使用した時に紹介した方法とほぼ同じですので、[そちら記事](https://qiita.com/wok/items/1bccd567e844ac4e8979)を参照してください。


# 使用方法

## 事前準備１
使用するためにはZoom Meeting SDKのSDK KeyとSDK Secretが必要になります。
[こちらの記事](https://qiita.com/yosuke-sawamura/items/de69e73e47335cd61d68)を参考に取得してください。SDK Keyと SDK Secretの管理には十分にご注意ください。

## 事前準備２
本アプリケーションはGithubのリポジトリに公開しています。
使用するためには、MMVCのAIモデルをトレーニングしてご準備いただく必要があります。MMVCのAIのトレーニング方法は[公式のページ](https://github.com/isletennos/MMVC_Trainer)を参照いただくか、[こちらのヘルパーアプリケーション](https://github.com/w-okada/voice-changer)でご紹介している方法で行ってください。なお、今回のアプリケーションで使用しているサーバ化されたMMVCはこのヘルパーアプリケーションの一部です。

## 音声サーバの起動方法（MMVCサーバ）

本アプリケーションは、リアルタイム音声変換にMMVCのサーバを利用します。このサーバを起動するには次のコマンドで行ってください。

```
$ git clone --depth 1  https://github.com/w-okada/voice-changer.git -b z001_qiita_advent_calendar_2022_zoom
$ cd voice-changer
$ bash start2.sh MMVC
```

GPUが無い環境で起動させる場合は、最後の行を次のように置き換えてください。

```
$ USE_GPU=off bash start2.sh MMVC
```

## 音声サーバの起動方法（Voicevox）

リアルタイム音声変換以外にも、Voicevoxを用いたテキスト読み上げ、Google Speechを用いた音声認識+Voicevoxで音声データの生成を行うこともできます。Vocievoxの起動には次のコマンドを用いてください。

```
$ docker run --rm --gpus all --entrypoint="" -p 50021:50021 voicevox/voicevox_engine:nvidia-ubuntu20.04-latest gosu user /opt/python/bin/python3 ./run.py --use_gpu --voicelib_dir /opt/voicevox_core/ --runtime_dir /opt/onnxruntime/lib --host 0.0.0.0 --cors_policy_mode all
```

GPUが無い環境で起動させる場合は、次のコマンドで実行してください。

```
$ docker run --rm -it --entrypoint="" -p '50021:50021' voicevox/voicevox_engine:cpu-ubuntu20.04-latest gosu user /opt/python/bin/python3 ./run.py --voicelib_dir /opt/voicevox_core/ --runtime_dir /opt/onnxruntime/lib --host 0.0.0.0 --cors_policy_mode all
```



## GUIの起動

また、アプリケーション本体はGithub pagesにホストしています。
次のアドレスにアクセスしてください。

[Zoom Meeting Plus](https://w-okada.github.io/zoom-meeting-plus/)

下の画面が出てきたらClick to startを押してください。

![image](https://user-images.githubusercontent.com/48346627/208299383-4cd84c8e-74be-4459-84ea-1f6044e5cac7.png)



下の画面に遷移したら「会議室でのユーザ名」「ミーティング番号」「ミーティングのパスワード」「SDK Key(前述したもの)」「SDK Secret(前述したもの)」を入力してEnterを押してください。

![image](https://user-images.githubusercontent.com/48346627/208299820-f92bf2bf-df07-473f-92af-b469af708277.png)



下の画面が出たらjoinボタンを押してください。Zoom会議に参加できます。

![image](https://user-images.githubusercontent.com/48346627/208299866-5959a910-be52-4180-bd3d-db57d768a866.png)


画面右側のパネルでは各種操作が可能になっています。

下の部分では、Zoomミーティングに送信される画面が表示されています。画像下のボタンでアバターの動作を変えることができます。また、音声を発しているときには自動的にtalkin状態になります。

![image](https://user-images.githubusercontent.com/48346627/208299933-7ef76e13-0d0e-4321-9fce-6afc4d2c69ed.png)


下の部分ではリアルタイムボイスチェンジャ(MMVCサーバ)の各種制御が行えます。

![image](https://user-images.githubusercontent.com/48346627/208300257-84eeca50-d4b9-4c39-ba41-07eb86315dd2.png)


下の部分ではVoicevoxの各種制御が行えます。またGoogle Speechによる音声認識＋Voicevoxでの音声発話も可能です。

![image](https://user-images.githubusercontent.com/48346627/208300432-275029c1-52c6-4ff2-98df-f73d406e0655.png
)
## 終了処理

今回のブログ向けに作成したβ版となります。音声サーバの起動方法はcorsの制約を緩めています。使用終了したらサーバを落としてください(ctrl+c)。

# デモ
MMVCを使ったデモとVoicevoxを使ったデモです。音質の面ではVoicevoxはさすがという感じです。MMVCはまだまだという感じですが、これはモデルのトレーニングの仕方でもう少し向上できると思います。また、MMVCは、現在さらなる品質向上を目指して鋭意開発が進められているので、さらに良くなるはずです。今後が楽しみです。

## リアルタイムボイスチェンジャ(MMVC)
https://user-images.githubusercontent.com/48346627/208338019-b73bdc03-5319-423e-b891-314a05097e45.mp4


## Text-to-Speech（Voicevox)
https://user-images.githubusercontent.com/48346627/208339120-8aa7c4ac-7d67-4ec1-8d99-8ade1b1607f1.mp4


# リポジトリ

デモのリポジトリはこちらです。

https://github.com/w-okada/zoom-meeting-plus

# さいごに
以上、Zoom Meeting SDKにリアルタイムボイスチェンジャを組み込んでみました。MMVCのようにリアルタイムで精度の高い音声変換がでてくると、こういったアプリケーションがどんどん出てくるのではないかと思います。今回の記事がその先駆けとなってくれればいいなと思います。

それはさておき、今年のクリパや年末年始にZoomでパーティーを企画されている方は是非使ってみてください。盛り上がること間違いなし。


今回使ったMMVCサーバや、それにアクセスするためのTypescriptのクライアントは下記のリポジトリで公開されています。興味を持たれた方は是非ご活用ください。

https://github.com/w-okada/voice-changer


# 宣伝

弊社 FLECT は、Salesforce を中心に AWS, GCP, Azure を用いたマルチクラウドシステムの提案、開発を行っております。 また、ビデオ会議システムについては、Zoom SDK, Amazon Chime SDK, Twillio など各種ビデオ会議用 SDK を用いたシステムの開発しており、サービス化の実績も多数あります。 ご興味をお持ちいただけたら是非ご相談ください。