はじめに
QiitaのAdvent CalendarにZoomも協賛しているということで、Qiita Engineer Festa 2022でお世話になった身ですので、微力ながらも協力したいと思い、今回も参加させていただきます。少し時間的にぎりぎりですが、一応2本書くつもり。
今回の1本目は、Qiita Engineer Festa 2022でのリベンジ企画です。前回までにZoom Meeting SDKを用いてZoomミーティングにアバターで参加する方法をいくつかご紹介してきました。そのなかで、アバターを使うのだから映像だけではなく、音声も全く自分とは違ったものにしてしまおう、という試みを行いました。結果としては、当時の私の力量不足により、リアルタイムで音声を変換することができず、音声認識+テキスト読み上げ、という方法を提案する形となりました。参考記事:Zoom Meeting SDKでなんちゃってボイスチェンジャー。
しかし、昨今の技術の進展は目覚ましく、AIを用いて自分の声をほぼリアルタイムで好きな声に変換できるMMVCというソフトウェアが公開されました。今回は、これを使ってリベンジしようと思います。
なお、MMVCでは、東北応援キャラクターであるずんだもんのトレーニング用の音声が配布されているなど、ずんだもん推しな感じになっています。かわいくていいですよね。よいのですが、Zoom + MMVCで企画を考えているうちに、ずむだもん(Zoomだもん)というおやじギャグを思いついてしまい、頭を離れなくなってしまいました。ということで、タイトルは「ずむだもんと遊ぼう」となっています。そして、下記がZoomを使うずんだもんをStable Diffusionに書いてもらった結果です。いつの日かZoomとずんだもんでコラボしてほしいですね。
ということで、今回作るものはこんな感じのものです。かなりいい感じに音声変換できているのではないでしょうか。
ソフトウェアの構成
前回までは、テキストから生成された音声ストリームをZoom Meeting SDKにわたす構成にしていました(参考)。今回は、マイクから入力された音声ストリームから別の音声ストリームを生成し、Zoom Meeting SDKにわたす必要があります。
これを行うために、本アプリケーションでは、Zoom Meeting SDKの外側で、予めマイク入力から音声ストリームを取得しておきます。取得した音声ストリームは、サーバとして稼働するようにエンハンスしたMMVCに転送し変換を行います。Zoom Meeting SDKがマイク入力を要求した際には、この変換後の音声ストリームをわたすようにします。これにより、MMVCで変換した音声をZoom Meetingに乗せることができるようになります。
そのほか、前回は3Dアバターを使用していましたが、ずんだもんになるということで、ずんだもんの映像をZoom Meeting SDKにわたすようにしています。このずんだもんの映像は音声に合わせて口を動かします。この辺のつくりは、以前の3Dアバターを使用した時に紹介した方法とほぼ同じですので、そちら記事を参照してください。
使用方法
事前準備1
使用するためにはZoom Meeting SDKのSDK KeyとSDK Secretが必要になります。
こちらの記事を参考に取得してください。SDK Keyと SDK Secretの管理には十分にご注意ください。
事前準備2
本アプリケーションはGithubのリポジトリに公開しています。
使用するためには、MMVCのAIモデルをトレーニングしてご準備いただく必要があります。MMVCのAIのトレーニング方法は公式のページを参照いただくか、こちらのヘルパーアプリケーションでご紹介している方法で行ってください。なお、今回のアプリケーションで使用しているサーバ化された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にホストしています。
次のアドレスにアクセスしてください。
下の画面が出てきたらClick to startを押してください。
下の画面に遷移したら「会議室でのユーザ名」「ミーティング番号」「ミーティングのパスワード」「SDK Key(前述したもの)」「SDK Secret(前述したもの)」を入力してEnterを押してください。
下の画面が出たらjoinボタンを押してください。Zoom会議に参加できます。
画面右側のパネルでは各種操作が可能になっています。
下の部分では、Zoomミーティングに送信される画面が表示されています。画像下のボタンでアバターの動作を変えることができます。また、音声を発しているときには自動的にtalkin状態になります。
下の部分ではリアルタイムボイスチェンジャ(MMVCサーバ)の各種制御が行えます。
下の部分ではVoicevoxの各種制御が行えます。またGoogle Speechによる音声認識+Voicevoxでの音声発話も可能です。
終了処理
今回のブログ向けに作成したβ版となります。音声サーバの起動方法はcorsの制約を緩めています。使用終了したらサーバを落としてください(ctrl+c)。
デモ
MMVCを使ったデモとVoicevoxを使ったデモです。音質の面ではVoicevoxはさすがという感じです。MMVCはまだまだという感じですが、これはモデルのトレーニングの仕方でもう少し向上できると思います。また、MMVCは、現在さらなる品質向上を目指して鋭意開発が進められているので、さらに良くなるはずです。今後が楽しみです。
リアルタイムボイスチェンジャ(MMVC)
Text-to-Speech(Voicevox)
リポジトリ
デモのリポジトリはこちらです。
さいごに
以上、Zoom Meeting SDKにリアルタイムボイスチェンジャを組み込んでみました。MMVCのようにリアルタイムで精度の高い音声変換がでてくると、こういったアプリケーションがどんどん出てくるのではないかと思います。今回の記事がその先駆けとなってくれればいいなと思います。
それはさておき、今年のクリパや年末年始にZoomでパーティーを企画されている方は是非使ってみてください。盛り上がること間違いなし。
今回使ったMMVCサーバや、それにアクセスするためのTypescriptのクライアントは下記のリポジトリで公開されています。興味を持たれた方は是非ご活用ください。
宣伝
弊社 FLECT は、Salesforce を中心に AWS, GCP, Azure を用いたマルチクラウドシステムの提案、開発を行っております。 また、ビデオ会議システムについては、Zoom SDK, Amazon Chime SDK, Twillio など各種ビデオ会議用 SDK を用いたシステムの開発しており、サービス化の実績も多数あります。 ご興味をお持ちいただけたら是非ご相談ください。