VC Clientをより低遅延で使えるようになるまでの長い道のり

誰の参考にもならない気がするけど、この長い戦いを忘れ去るのも勿体ない気がしたので。あと、いつか環境を再構築できるよう備忘録も兼ねて。



VC Clientってなぁに?(超ざっくり概要)


VC Clientというボイスチェンジャーソフトがあります。

最新のAI技術で構築された「RVC」というオープンソースの音声変換ツールがあるのですが、これをボイスチェンジャーソフトとして利用しやすいクライアント機能が追加されたものが「VC Client」です。

(なお、この記事ではVC Clientの導入方法などは特に触れていません。必要な方は自力で調べてね♪)

VC Clientを使うことでRVCをボイスチェンジャーとして簡単に使えるようになります。書いててややこしいので、以降は「VC Client」でひとくくりにしますね。

単純にピッチ変更などを行うボイスチェンジャーはほぼ遅延がありません。頑張って探せば「ゼロ遅延」とされるものもあるそうです。
しかし、VC Clientではリアルタイムで機械学習的な推論処理を行って音声の変換を行うため、それらに比べると大きく遅延が発生します。(といっても十分リアルタイムなのですが)

VC Clientは音声の「変換品質」と「変換速度」をトレードオフで設定できます。高品質の音声変換を求めれば変換に時間がかかるし、変換速度を求めれば、変換品質が下がります。

なんだかんだ設定を試してみて、私の環境でも納得できる品質・速度でボイスをチェンジできるようになりました。VC Clientの表示上では400~500ミリ秒で変換ができているようです。0.5秒。まぁ、これくらいなら普通に会話もできますよね?たぶん。いい感じ。

仮想オーディオデバイスの遅延解消編(沼1歩目)

さて、変換した音声を外部アプリケーション(OBSやDiscordなど)にわたすためには一般的に「仮想オーディオデバイス」というものを使用します。アプリケーション間の音声の入出力を行うためのものです。私は以下のものを使用しました。

VB-Cableを経由してOBSに変換後の音声を出してみました。
ミキサーのゲージを見てもちゃんと音声が出力されています。ここで気づいたのですが、

あれ、思ったより遅延が大きいね…?

仮想オーディオデバイスを経由してOBSに入力された音声が、元の声の入力から1秒近く遅延していたのです。
音声変換にかかる時間は500ミリ秒くらいじゃなかったの!?なんで2倍になってるの?ナンデ!?

他のボイスチェンジャーソフトを使ってみたり、色々調べた上での推測ですが、どうやら仮想オーディオデバイスを経由している部分で時間がかかっている…という結論に至ります。

・VC Clientをserverモードで動かしてみたりもしました(clientとserverの2つの実行モードがありまして、色々バイパスしてくれるserverモードのほうがより低遅延なのです)。
・VB-Cableの英語マニュアルを読んで(PDFだから翻訳しづらいったらありゃしない)内部バッファサイズも調整しました。
・オーディオインターフェースのループバック出力も試してみました。
・VC ClientをWSL2上で起動してみましたが、WSL2がメモリを大量消費するので断念しました。
・VC Clientのソースコードを眺めました。

このあたりの試行錯誤は色々やりすぎてあまり覚えてませんw
探しても「VB-Cableが遅くて困る…」という声をあまりネットで見かけないので、いわゆる「おま環」という話なのかもしれません。

色々調べる中で、とにかくWindowsはオーディオ周りの対応がとても悪い(Macに比べて)ということも知りました。OBSのアプリケーション音声キャプチャで声がガビるのもWindows側のバグが原因って話でしたし…。

まぁ、なんだかんだで数十ミリ秒の遅延低減に成功しました。一旦はこれで納得していましたが、同時に「VC Clientの音声入出力をASIOにしたらめっちゃ遅延減るよ」という情報を入手してしまいます。

仮想がダメなら物理で殴る編(沼2歩目)

詳細な説明を省いてざっくり言うと、ASIO(アジオ)とは「オーディオインターフェースからの入力を、DAWに超低遅延で接続する用途で開発された、オーディオインターフェース付属のドライバ」です。(かなり語弊がありますがご容赦を)

Windows上では専用ソフト(DAWとか)でないとASIO経由でデバイスは扱えないのですが、VC Clientはserverモードで起動するときに限り、ASIOデバイスが扱えるのです。

試しに手持ちのオーディオインターフェース(PreSonusのRevelator IO 24)にASIOで出力してみたところ…遅延が500ミリ秒まで低減しましたやはり最後は物理か…!
これならほぼ、VC Client上での音声変換にかかる時間のみと言えるでしょう。伝送遅延が解消されました!

しかし、VC Clientの都合でオーディオインターフェースへの出力チャンネルの制御ができません。
手持ちのオーディオインターフェースはループバックチャンネルが3つあって、それらを自由にミキシングできて色々使い勝手がいい代物なのですが、これら全てのチャンネルに変換後音声が出力されてしまうのです。一番のセールスポイントである機能がほぼ使えなくなります。うーん……
(ここでASIO4ALLなども試したのですが、私のPCでは安定動作しなかったので不採用)

結局、ASIOに対応したオーディオインターフェースを買い足しました。
ZOOM AMS-22という機種です。
既にあるオーディオインターフェースの設置場所にちょっと悩んでる状況で、小型であることと、まぁ失敗してクローゼットにしまい込むことになっても場所取らないよね…?この手の製品としてはかなり安いほうだよね?……などなど、理論武装(言い訳)は完璧です。

さて、届いたAMS-22をPCに接続します。
マイク → AMS-22 → VC Client → AMS-22(ASIO)→ RevelatorIO24  …という構成にすることで、安定動作する・(ほぼ)伝送遅延のないVC Client環境が完成したのでした!しかもこの構成ならRevelator上でボイチェン後の声にエコーとかかけられます!使う予定ないけど!

VC Client上で変換にかかる時間はどうしようもない必要経費です。いずれパソコンを買い替えるときが来るでしょうし、何よりソフトウェア側の進歩にも期待です。

めでたし、めでたし。

ノイズとの戦い編(沼3歩目)

オーディオインターフェース2台という、わけのわからない構成にしてしまったので音量調整が大変です。そのあたりチョロチョロ触ってて、ふと気づきます。あれ、ボイチェン後の音声に「ビーーーー」って低めのノイズが乗ってる…!?
Revelator側に内蔵されてるノイズゲート機能で誤魔化せる程度なのですが、一度気づいてしまったからには忘れることはできません。…なんとかしなきゃ!

まずは原因箇所の特定です。
Revelator側の入力ゲインに合わせてノイズ音量も上下していたので、後から買い足したオーディオインターフェースのAMS-22からノイズが出ていると判断できました。

VC Clientを起動していなくても、マイクを外していてもノイズは流れ続けます。ひとつひとつ怪しいものを排除していきます。
試しにAMS-22をPCから外してモバイルバッテリーからの給電のみで起動してみると、ノイズがキレイさっぱり消えました。ほほう…つまり、パソコン由来のノイズだな…!? で、どうしたらいいの??

対処方法がわからないので、思いついたことやネットで調べて出てきた情報を片っ端から試していきます。
・2台のオーディオインターフェース間の接続ケーブルをTSからTRSに変えてみた。
・AMS-22からの出力を背面の標準ジャックから前面のモニター用のステレオミニプラグ経由に変えてみた。
・手当たり次第ノイズ出てそうなケーブルにフェライトコアつけてみた。
・ケーブルの配線が直角に交差しないように整理しようとして、諦めた。

…全部ダメでした。

今度こそは…!という祈りとともにケーブルやら変換プラグやらを買い足してるなか、「まぁ効果あるかわかんないけど試してみるか…安いし」とポチっていたグランドループアイソレーターという機器があったのですが、これを2台のオーディオインターフェース間のケーブルに繋いだところ、あっさりノイズが消えました。
(厳密にはゼロにはなってないのですが、よほどゲインを上げない限り気づかない程度になった)

結論としては、オーディオインターフェース2台で入出力させることでループ状の配線となり、いわゆる「ループノイズ」が発生していた…ということのようです。なるほど、そういうことだったのね…ふーん(よくわかってない)

(今振り返ると、AMS-22をモバイルバッテリーで起動したときノイズが消えていことが、ループノイズが原因であることの識別になっていたらしい…ですよ?)

というわけで、これにて長い長い戦いに終止符が打たれたのでした。
めでたし、めでたし。


覚書として起こした最終的な構成図…うん、ループしてたね…



以下は完全に私の個人的な覚書になります。
個々人の環境により一切参考にならないと思うので読まなくて大丈夫です!

【マイク】
ATR2100x-USB(ダイナミックマイク)


【ams-22の設定】
モニター、ループバック類のスイッチはOFF
GAINのダイヤル:6
OUTPUTのダイヤル:10(MAX)
ASIOのバッファサイズ:128
サンプルレート:48kHz

【vcclientの設定】
In:1.0
Out:5.0 ※ここはモデルデータによっても変わる感じ??(わかんない)
F0 Det.:rmvpe
CHUNK:128
EXTRA:16384
S.Thresh.:0.00001

Audio:server mode
SR:48000
Input:[Windows WASAPI]ライン入力(Zoom AMS-22 Audio)
Output:[ASIO] ZOOM AMS-22 Asio Driver
Monitor:none
GAIN:1

※OutputのみASIOを選ぶのがポイント(入力もASIOで取ろうとするとエラーになる)

(Advanced Setting)
Protocol:sio
Crossfade:overlap:4096 start:0.2 end:0.8
Trancate:300
SilenceFront:on
Protect:0.5
RVC Quality:low
Skip Pass through confirmation:No

↓このへん参考にした
https://rentry.co/VoiceChangerGuide#gpu-chart-for-known-working-chunkextra


【revelator io 24の設定】
SR:48.0kHz
ブロックサイズ:512
channel1のゲイン:25dB


いいなと思ったら応援しよう!