セーブポイント

特にジャンルの決まってない雑記です。

読み上げ白上フブキを作り直してみた

3ヶ月前くらいに読み上げ白上フブキを作っていたのですが、色々気になる点も多かったので作り直してみました。読み上げ白上フブキ 3.0です。

new-file.hatenablog.com

ついでに、so-vits-svc向けのデータセットの作り方をメモ書き程度に解説しておきます。

前回との違い

まず、so-vits-svcのバージョンが4.0から4.1 (Stable)に新しくなりました。

github.com

なんか世間では一瞬でRVCが流行って過ぎ去っていった気がしますが、個人的にRVCはあまり好みじゃなかったので、前回から引き続きso-vits-svcを利用しています。

前にやったときは最初にDiff-SVC向けに作ったデータセットをずっと使いまわしていましたが、今回はデータセットを1からちゃんと作り直しました。
前に使っていたデータセットは音声の切り方が雑だったり、背景雑音が残っていたりしたので、そのあたりを中心に改善しました。

今回は主にこの話をしたいと思います。

データセットの作り方

①まず元となる音声を用意します。自分の場合は、今回も適当な配信を使っています。

音声データの中で明らかに要らない区間があるときは、ここでざっくり編集して必要な部分だけ残しておきます。

前回データセットの音声データの総量は3時間分くらいにしてましたが、今回は70分程度の長さにしました。推奨される長さについては相変わらず公式から特に何も提示されていないのでよく分かりません。たくさんデータがあるなら使ったほうが良いと思います。

次に、②背景雑音の除去をします。①で用意したデータに元々BGMや他の人の声などが含まれていない場合には、このステップが飛ばしてよいです。

ここでは特に音声データにBGMが含まれている場合の話をします。

ultimatevocalremover.com

今回はUltimate Vocal Remover (UVR)を使いました。Vocal Removerというアプリ名ですが声を音源から抽出する作業もできます。

UVRを使いますがやることは前と同じで、モデルはDemucs (v4)を利用しました。GUIだから操作が楽というだけです。

UVR等を利用して背景雑音の除去ができたら、③音声データを分割します。

このステップにはso-vits-svcのドキュメント内で紹介されているAudio Slicerを利用しました。

github.com

学習データセット内の1つの音声の長さは5秒から15秒の長さにすることが推奨されているので、これに従って用意した音声データを分割します。

Audio SlicerのMinimum Lengthの設定はデフォルトで5000msになっているのですが、なぜかこの設定のまま分割処理をすると3秒とかのデータが発生したので、8000msでやるといい感じでした。(バグ?)

最後に、④音声データの音量調整をします。このステップも、既に調整済みの場合はしなくてよいです。

今回はffmpeg-normalizeというユーティリティを使ってみました。

github.com

ラウドネス正規化というやつだと思いますが、正直そこらへんのことはよく分かってません。なんかいい感じに音量をブーストしてもらいました。

以上が今回のデータセット作りの過程です。前回よりは格段に良いものになったと思います。

学習の結果

学習データセットとしては8秒から10秒程度の音声クリップが460個で、480epoch(7200steps)まで学習させました。
また、Speech Encoderとしてはvec768l12、F0 predictorはdioを選択しました。デフォルト値です。

F0 predictorについてまだ良く分かっていないのですが、調べても論文くらいしか出てこないので読むしかないのか。どういう差異があるのかくらいは知りたいのですが、分かりやすい文献とか欲しいです。

あと、4.1になってからRVCっぽいFeature retrievalができるようになってたので、これ用のインデックスもついでに訓練しました。いくつかの種類の音声データの変換をやってみたのですが、元が人間の音声の場合はこの機能を使わないほうが自然で、元が合成音声(VOICEVOX)とかの場合は使ったほうが自然?(あまり差異が明らかでない)という感じでした。この機能については要検証です。

以下は生成サンプルです。いつも通りあみたろさんのITAコーパス読み上げ音声を変換しています。
推論時のF0 predictorはpmにしています。harvestは微妙でした。

RECITATION324_016:

RECITATION324_025:

RECITATION324_268:

以前のモデルでは学習データの背景雑音が除去できていなかったためか生成時に声が二重になったりなどの課題があったのですが、それは解決できている気がします。

変換後の音声にはまだ違和感はありますが、声質の変換自体は特に問題無いようです。とりあえず満足しました。

Lama Cleanerでローカルで消しゴムマジックをしてBB素材を作ろう

Lama Cleanerというローカルで簡単に画像から物体を取り除く編集ができるツールが便利なので紹介します。

github.com

必要なもの

インストール方法

まず適当な場所にLama Cleaner用の仮想環境をvenvで作ります。

$ python -m venv venv
$ cd venv
$ ./venv/Scripts/activate

別に必ずしも環境を分けなくてもいいですが、一応。

CUDAに対応しているGPUを持っていてそれをLama Cleanerで利用したい場合は、先にPyTorchを今作成した環境内にインストールしておきます。

$ pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

公式のドキュメントではPyTorch 1.13.1が利用されているのですが、2.0.1でも問題なく動作していそうなのでこれでいいと思います。(手元で確認済み)

あとは、Lama Cleaner本体をpipでインストールするだけです。

$ pip install -U lama-cleaner

xFormersによる高速化

Lama CleanerではxFormersによる最適化を利用することができます。Lama Cleanerの動作自体かなり高速なのですが、対応しているGPUを持っているなら使っておくとよいでしょう。
先程作成した環境に以下でインストールすればOKです。

$ pip install -U xformers

Lama Cleanerを起動する際に起動オプションに --enable-xformers を追加してください

How to 起動

以下のコマンドで起動できます。(CUDA対応GPUを使う場合)
Windowsなら適当にバッチファイルとか書いておくと起動するのに便利です。

$ lama-cleaner --model=lama --device=cuda --port=8080

もしGTX 16xx系のGPUを使っている場合、起動オプションに追加で--no-halfが必要かもしれません*1。出力がいつも真っ黒の画像などになるときはこの設定をしてください。

初回起動時、自動で使用するモデルのダウンロードが開始されます。デフォルトでは~/.cacheWindowsの場合、%UserProfile%/.cache)以下に保存されるようになっているのですが、ユーザー名に日本語が入っていたりするとエラーが出ます(もしかしたら今は修正済みかも)。

エラーが出る場合、起動オプションに--model-dir=[適当なパス]を追加して自分でモデルのチェックポイントの保存先を指定してください。


Lama Cleanerを起動すると、ターミナル上に以下のような出力がされると思います。自分の環境では既にAnimeSegのプラグインが入っているので若干出力が異なると思いますが、ターミナル上にRunning on http://127.0.0.1:[port]の文言が出ていたら問題ありません。

起動時のターミナル画面

さっき起動オプションで指定したポートに対応するリンクが表示されていると思いますので、そこにアクセスします。

Lama CleanerのGUI

図のようなページが開けていれば、正しくLama Cleanerが動作しています。あとは、画面中央に画像をドラッグ&ドロップで簡単に使い始めることができます。

設定

Lama Cleanerのページを開いて右上の歯車ボタンを押すと細かい設定ができます。この中から、Manual Inpainting Modeをオンにしておくのが個人的にはオススメです。

実際に使ってみる

Lama Cleanerですが、リアルな画像の修正にもイラストの修正にも利用できます。

とりあえずこのフワちゃんを消してみます。

https://twitter.com/fuwa876/status/1643973999502970881?s=20

消したい部分をブラシでなぞって、

下のメニューバーの一番右にある消しゴムボタンを押します。

消しゴムマジックで消してやるのさ

消えました。

なんか霊圧は残ってますが割と自然だと思います。加工した画像はメニューバーの保存マークを押すことでダウンロードできます。

自動で背景除去をする

Lama Cleaner自体は画像から物を消すという編集ができるツールなのですが、他のツールをプラグインとして一緒に使うことができたりします。

ここで、Anime Segmentationを紹介したいと思います。

github.com

これは、イラストからキャラクターの切り抜きを自動化してくれるもので、精度もかなり高くて個人的に評価高めのツールです。これをLama Cleanerの中で利用することができます。

Lama Cleaner内でAnimeSegを利用するには、起動オプションに--enable-anime-segを追加するだけでよいです。必要なモデルは同様に勝手にダウンロードしてくれます。

AnimeSegの使い方は簡単で、画像を読み込んだら左上の方にあるプレステのボタンマークみたいなのを押すとAnimeSegが選べるようになっています。

これ

「AnimeSeg」を押すと、後は自動で背景を消してくれます。

これが

こんな感じ かわいいね

このケースでは若干背景が残っていますが、あとは自分でなんとかなるレベルかなと。とりあえずさっと背景消したいときには良いと思います。

以上、Lama Cleanerの紹介でした。

*1:半精度の演算に対応していないため

身内Minecraft鯖運営から学んだ荒らし対策の教訓

最近身内向けにMinecraftのサーバーを運営していたら人生で初めて荒らし被害にあったので、二度と再発しないように願いを込めて書きます。

24時間開けっ放しで鯖運営している人向けです。遊ぶときだけ開けている人(自分のPCでプレイしながら鯖も建てている人など)は荒らしに遭遇してもその場で対処できると思うのであまり気にしなくてもいいかもしれませんが、対策はしておいて損は無いでしょう。

前提

自分は最近バニラのサーバーを建てる際には専らPaperがさらに最適化されたフォークであるPurpurを利用しています。

purpurmc.org

Paper自体Spigotの後継であり、Spigotプラグインが利用できます。鯖の挙動をバニラに寄せるために少し設定を変更したりする必要はありますが、バニラに強く依存している鯖でなければ現状Purpurを使っておけば問題無いと思っています。
よほどのサバイバルガチ勢でなければ。

実際に受けた被害

4月の初め頃から身内向けにMinecraftのマルチサーバーを運用していました。Oracle Cloud Infrastructureインスタンスを借りています。

で、ある日サーバーにログインするとこんな感じに……。

初期スポーン地点周辺

画像の手前のところは倉庫だったのですが、溶岩を使ったのかTNTを使ったのか、ほとんど燃やされているといった状態でした。

サーバー側のログも取得してあり、以下のようになっていました。

ログイン時の挙動

荒らし行為を行ったユーザーのUUIDは7db2c642-8e0a-4728-bb61-664d11ad5c40であり、IPアドレスを逆引きしてみたところロシアからのアクセスらしい。暇なんか?

初めにplコマンドを使っているのは、荒らし対策プラグインの有無を確認している?荒らしにある程度慣れていそうで気持ちが悪いです。

このときの敗因は下に挙げた対策を全てしていなかったことです……。どれか一つでもやっておけばなんとかなったかもしれないのに、本当に自分がバカでした。

対策1. ホワイトリストを使う

これはPurpurに限らず、公式のサーバーでもできる対策です。正直これだけできていれば全て済む*1

デメリットとして、新しく人に参加してもらうときに手動で鯖の管理者やモデレーターがホワイトリスト機能のオンオフをしないといけなくなりますが、逆にそれだけです。

メリットの方が絶対大きいので、やっておきましょう。

また、荒らしを受けた鯖でもホワイトリスト機能自体は利用していたのですが、メンバーを追加する際一時的にオフにしたまま戻し忘れていました。鍵のかけ忘れには気をつけましょう

対策2. サーバーで利用するポートを変更する

そもそもの話、荒らし被害に会う前にIPアドレスを外に公開しなければよくない?と思っている人もいるかと思うのですが、これって実は大嘘です。

身内だけにしかサーバーのアドレスを公開しなくとも、総当り攻撃でサーバーのアドレスを割ってくる人が存在します。そのためのホワイトリストというわけです。

自分が運営していたサーバーもIPアドレスTwitterなどで一般公開したことはなく、Discordのコミュニティ上でのみ共有していました。

この問題への(部分的な)対策として、ホワイトリストとは別にポートを変更するという方法もあります。

Minecraftのサーバーはデフォルトだと通信に25565番のポート(TCP/UDP)を利用することになっています。このとき、例えばMinecraftサーバーを動かしているマシンのIPアドレス111.112.113.114であるとすると正しいサーバーアドレスは111.112.113.114:25565になりますが、省略して111.112.113.114マルチプレイサーバーに接続できます。

で、これだと問題があって先程言ったようなIPアドレスブルートフォース攻撃に弱いです。サーバーに使うポート番号を25565以外に設定してあげることで単純な総当り攻撃に耐性を持たせることができます。(SSHのポートを22以外にするのと似たような感じでしょうか)

使うポートを変えてもポートスキャンなどによって探索される可能性もまだありますが、そこまでやってくる荒らしには今のところ遭遇したことがありません。

24時間稼働のサーバーを建てる際にはこの対策も検討すると良いと思います。

対策3. ワールドのロールバックができるプラグインを入れる

これはSpigot鯖特有の対策です。

有名な荒らし対策用のプラグインとして、CoreProtectというものがあります。

詳しい解説などは既にネット上に存在する記事などを参照してもらうと良いと思いますが、このプラグインは各プレイヤーの操作を記録し、必要に応じてワールドの状態の巻き戻し・復元を可能にしてくれます。
しかも、これは単純なロールバック処理ではなく荒らしプレイヤーが関与したブロックの変更などのみを対象にロールバックを行うことができ、他の人の作業が同時に巻き戻ってしまう問題を解決してくれます。

サーバーに導入しておくだけでこのメリットを享受することができるため、入れるだけ入れておくと良いでしょう。使う機会が無いことが一番いいですが、備えは大事です。

また、CoreProtect以外にもWorldGuard(ワールドの領域保護)やLWC(チェストのロック機能)といった有名プラグインがありますが、これらは身内鯖というより大規模の公開サーバー向けな気がするので省略します。

対策4. ワールドのバックアップを取る(重要)

これもSpigot関係なしにできる根本的な対策ですが、本当に重要だと実感しました。

前の項でCoreProtectを紹介しましたが、やっぱり多少手間はかかるので定期的にバックアップをとってそこにロールバックをしてしまうというのが一番速い解決策な気がします。

バックアップ間隔などの設定によってはかなり作業が巻き戻ってしまうこともあると思うので、そういう場合にはCoreProtectを利用するとよいでしょう。ただし、CoreProtectを利用しても荒らしの程度によっては復元が本当に可能か怪しいので*2、CoreProtectと物理バックアップは併用した方が好ましいと思います。

また、定期的にバックアップを残してくれる機能を持つSpigotプラグインもあります。

server-backup.net

Linuxサーバーの場合cronとかでやってもいいですがサーバーを止める必要があります。こういったプラグインを利用することでサーバーを起動した状態のまま動的にバックアップを作成できます。こちらも入れておくだけで初期設定では毎日バックアップが作成されるようになっているので、使いやすいと思います。

対策5. MCBansを利用する

こちらも割と有名だと思いますが、MCBansという他のサーバーとユーザーのBAN情報を共有できるプラグインがあります。

www.mcbans.com

サーバーに導入しておくだけでも、評価値が一定より低いユーザーはサーバーに参加できなくなるようです。

MCBansにあまり詳しくないので他の対策方法と比べるとオススメ度は個人的には低いですが、導入しておくと荒らしユーザーに対して多少の威圧にはなりそうな感じです。

まとめ

今回は5つ荒らし対策の手法を紹介しましたが、正直ホワイトリスト機能さえ使えていれば他の対策は要らなくなるくらい強力です。これだけはやっておきましょう。本当に。

あとは、鯖荒らし以外でもバックアップが必要になることが極稀にあるので*3、対策1と4は常にやっておくといいかな~と思います。

なんらかの事情でホワイトリスト機能は使いたくないという場合には、対策1以外全てやっておくと良いと思います。LuckPermsなどを利用した権限の管理も忘れずに。

*1:ただし、大規模鯖の場合はDDoSとかもありうると思います。

*2:自分のワールドの場合も村人が殺害されたりチェストの中身が消滅していたりしたので、本当に全部綺麗に巻き戻せるのか不明

*3:なんらかの原因により急にサーバーのマシンが落ちてチャンクのデータが破損するなど

白上フブキちゃんに歌を歌ってもらうやつ【so-vits-svc 4.0】

読み上げ白上シリーズのさらに続き。

new-file.hatenablog.com

実際に歌声の変換の方をやってみました。

youtu.be

今回はこれを作った話を書いていきます。

ボーカルの音源なんてありません

so-vits-svcを使うにあたって元となる音源が必要ですが、世の中にoff vocalの音源はあれど逆のボーカルのみの音源なんて都合よく公開されていない方が普通です。

というわけで、こういう動画を作ろうと思ったらまずボーカル音源をなんとかして用意する必要があります。これが第一の壁。

原曲の音源とoff vocalの音源があれば、理論上「逆位相で足してあげればボーカル取り出せるんじゃね?」と思うんですが、ボーカルって単一のパートだけじゃなくてハモリのパートが下にあったりとかするので、これだと実は上手くできない。(エフェクトとかも乗った状態の声が抽出できるだけなので実際役に立つか不明)

Demucsとか使っても結局同じことになるので、他の方法が必要です。

そうだ、耳コピしよう

「既存の音源からボーカルを取り出したりするのが面倒くさい」ということなので、今回は1からボーカルを合成するという手段を取りました。

どこで知ったのかは忘れましたが最近都合よくこういうのがあるというのを知っていたので、「じゃあNEUTRINOを使ってみるか」と。

studio-neutrino.com

最近の高品質な歌声合成ソフトといえばSynthesizer Vの方が有名かな?と思いますが、こちらは無料で使えるというのだから有り難い限りです*1。グラボ持っててよかった~。

NEUTRINOを使うのはガチの初めてだったので、以下のサイトなどを参考にしました。

www.gigafree.net

NEUTRINOはあくまで入力された歌メロのデータから実際に音声を合成してくれるのみで、合成に使うデータをさらに別のソフトなどで作成する必要があります。

今回は上のサイトの通り、Domino(音程の打ち込み)とMuseScore(歌詞振り)を使うスタイルでやりました。これがまあそこそこ大変でした……。なんせ耳コピなんぞしたことなかったものですから……。

耳コピをするときの補助として大いに助けられたソフトが、WaveToneです。てか、補助というより必須

forest.watch.impress.co.jp

習慣的に作曲をしていて、音感が十分にある人ならこういうソフトも要らないと思うのですが、一般人がやるなら本当に不可欠だと思います。

抽出したボーカル音源を読み込ませた図

こんな感じでWaveToneで解析したスペクトログラムを横に置きながら、Dominoで歌メロの打ち込みをしていきます。

歌い始めを実際に打ち込んだ図

耳コピ初心者すぎて、本当に最初は音楽の「調」の勉強とかしました……。途中、WaveToneでなぜかうまく音を拾ってくれないゾーンがあったりするので、そういう部分は勘を頼りに音を置いたり消したりしていたのですが、本当にこれがめちゃくちゃ。一つ前の音より次の音が高いか低いかすら分からないんですよね。マジで自分の音感が破滅していることがわかりました。これって鍛えられるんでしょうか…。

普通に耳コピパートの作業に数日かけました。

打ち込みが終わったら、MIDIの書き出しをして今度はMuseScore上で作業します。

歌詞の打ち込みをした

このパートは本当に歌詞を振るだけなので作業。助詞の「は」を「わ」にするとかを忘れずに。

これでMusicXMLの完成です。

歌声を合成してみる

ここまで来たら、NEUTRINOで歌声が合成できます。

so-vits-svcで音声変換をしても元の声の癖はそのまま残ってしまうので、変換したい人と似てそうな歌声ライブラリを選択すると良いと思います。

今回は最初「めろう」さんのまま使おうとしたんですが、実際に合成→変換してみたところなんか違うなあという感じだったので「No. 7」さんにしています。もしかしたらもっと似ている人がいるかも。要検証。

ピッチとかフォルマントの設定値は特に弄りませんでした。よく分からなかったので。

NEUTRINOはWORLDとNSFという2つの手法で音声を合成してくれますが、今回はNSFの方を採用しています。(質が良いらしい)

ボーカルの音源の長さは今回1分くらいだったと思いますが、合成は10秒くらいでできるのですごいですね。

ボーカルのミックスって、なんですか

普通にここが一番悩みました。まさかのボーカルのミックスとかいう作業を自分がやることになってしまい……。

当初はAudacityで適当に混ぜたらよくね?と思っていたのですが、Audacityの操作がよく分からなくて(←?)、手元にあるDAWCakewalkを最終的に使いました。こちらもフリー。

エフェクトとか

Cakewalk ボーカル ミックス」などで検索して出てきた記事などが大いに参考になりました。本当にありがとうございます。

ボーカル音源をエレクトロサチュレイタのあの感じにするにはどうしたらいいのかと、とりあえずリバーブだけつけたりしてみたんですが。リバーブ1つとっても設定値たくさんあるし、より近づけるにはどうしたらよかったのか、考えるべき点はたくさんです……。

でもまあ、素人感は満載にしてもそれらしくはできたかなと……。作曲なんてしていないのにこんなところでDAWを触ることになるとは思っていませんでした。不思議なこともありますね。

so-vits-svcについて

音声変換をするときにいくつか学んだことがあるのでメモです。

まず、推論時に-aオプションを付けることで自動でピッチの推定をしてくれるみたいな機能がso-vits-svcにはありますが、自分の環境では逆にこれを付けると音程が壊れました。よく分かりません。何もオプション追加しなくても普通にピッチを狂わせること無く変換できました。

あと、学習する時間の長さについて。

前回の記事を書いたとき(と、動画を作ったとき)は230epochくらい訓練したモデルを使用していましたが、今回は追加で学習をして777epochまで訓練を回しました。

なんか「so-vits-svc」で検索かけて出てくる情報を見るとみんな当たり前のように1000epoch以上訓練を回しているのですが、そんなに必要なんですかね……?
今ちょっと検索したら10k epochとかのやつもあってビックリしています。そういうもんなんでしょうか。

個人的には、今回使用したモデルで既に品質かなり良いのではと思っているのですが。(これ以上を目指すのはデータセットを綺麗にする必要がありそうだと考えています)

これからの話

今訓練したモデルでリアルタイムでボイチェンして遊べないかなあと格闘してます。

github.com

VC Clientを使ってみたのですが、なぜか出力がノイズにしかならず……。なんででしょう。

動いたら嬉しいな~。

*1:一部有償で別に販売されている歌声ライブラリもあります。

読み上げ白上フブキ ver2.1 / so-vits-svc 4.0 解説

new-file.hatenablog.com

この記事のさらに続きです。

モデルを作って普通に放置してたのですが、気がついたらひと月の間にリポジトリが消えたりバージョン4.0が出たりなんだりしてたみたいです。

今のリポジトリはここらしいです。(03/14時点)

github.com

そういうわけで、バージョン4.0で訓練し直して簡単な動画にしてみました。

youtu.be

訓練の時間をより長く(126epoch→236epoch)してみたのもあるかもしれませんが、3.0のときよりかなり品質が良い感じがします。

学習の方法自体は3.0のときから大きく変わってないと思いますが、一応解説ということで書き残しておきます。
例のごとく、基本は公式のREADMEに従えばいいだけなので、学習の際に困ったポイントについてのみ書いていきます。

学習データの量は?

公式からどれくらいの量の音声データがあればいいのか提示されていないので、これいまいちよく分かりません。

Diff-SVCのときから学習データセットを使いまわしてるので私は200分くらいの長さ(15秒x804個)のデータセットを訓練に利用しています。

動画にも書きましたが、最低30分とかでもいいとか?

学習済みモデルがリンク切れしてる

so-vits-svcは学習の際、事前に学習済みのG_0.pthD_0.pth*1を利用することが推奨されています。が、昔あったhuggingfaceのリポジトリが今は消えていてダウンロードできない状況です。

なので、ここにこっそりインターネットの海から拾ってきたバックアップを置いておきます。44.1kHz用のモデルなので注意

特に再配布は問題なさそう?なんですが、まあなんかあったら消します。

configの値について

学習中の出力

  • log_interval: 損失関数の値を何stepごと(epochじゃないので注意)に出力するか。上の画像におけるLossesから始まる行。
  • eval_interval: 何stepごとにチェックポイントを保存するか。800だと長いな~という場合は400とかにすればいいです。
  • epochs: 多分ここに設定した値の分だけ学習したら自動で終了する。寝てる間などに訓練を回したい場合は500とか1000とかにしておくといいかも。(1000は過学習になるかも?要検証)
  • keep_ckpts: 学習したチェックポイントはそこそこサイズが大きい(500MBとかになる)ので、デフォルトだと新しい3つのみ保持され古いチェックポイントは順次削除されるようになっています。もっとたくさん保持しておきたい場合は数値を大きくしておく。いくつか保持しておくと過学習したときなどにロールバックできます。

バッチサイズ(batch_size)についてですが、24だと学習中のVRAM使用量は20GBくらいでした。線形に増減するんでしょうか?誰か試してほしい。

確かデフォルト値が6とかだったと思うので、そのままの場合VRAM8GB(RTX 3070など)でも学習できると思います。

これ以外のパラメータは門外漢なのでよく分かりません…。特に触る必要も無いと思います。

Pythonのパッケージの準備

まず、requirements.txtからPyTorch関係とバージョン指定を除いたものを用意します。これをrequirements_slim.txtとします。

venvで仮想環境を作ったら、まずPyTorchを個別にインストールして、そのあとpip install -r requirements_slim.txtするとよいです。

あとColabで学習するときの注意点ですが、pipのバージョンが古くてfairseqのwheelのビルドに失敗するのでパッケージのインストールの前にpipのアップデートが必要です。

4.0-v2について

so-vits-svcの最終バージョンとして、4.0-v2というのが既にリリースされています。

モデルのアーキテクチャが変わっているらしく、その点で4.0と互換性がなさそうです。4.0の訓練に使用した学習済みモデルもおそらく使えないような気がするので、現時点では学習済みモデル無しで試すしかないと思います。

4.0-v2のREADMEより引用

ただ、ちょうど都合よく公式ドキュメントに配信を学習データに使ってるとあんまり良くならないよと記載されているので、自分は特に試す予定はないです。

*1:それぞれGeneratorとDiscriminatorのようです

読み上げ白上フブキ ver2? - 技術日記 2月9日号

昨日の記事の続き。

new-file.hatenablog.com

前回の記事ではDiff-SVCという手法を使ってみましたが、so-vits-svcってやつが良いらしい(上位互換?)ということでこっちでもやってみました。

github.com

↑は自分のforkです。gradioのUIを英語化したりして多少使いやすくしました。

あと、Fish Diffusionってやつもいいらしい。これもDiff-SVCの派生っぽい?

github.com

こっちはDiff-SVCのチェックポイントが使い回せるっぽいので時間があったら試したい。

so-vits-svcの訓練について

基本的には以下の通り。

2つめの文献で触れられているスクリプトの修正についてはfork版では対応済み。Windows上で訓練する場合のみ影響があるらしく、Colabなどを使う場合は特に修正しなくても問題にならないはず。

学習データセットは前回のを使いまわしたので、コマンドを叩くだけでした。

Diff-SVCと比較したときのso-vits-svcの利点は、なんといっても全体を通して所要時間が短いこと。

前回は学習データのプリプロセスに1時間くらい、訓練に8時間くらいでしたが、今回は前処理が数分(RTX 3070を使用)、訓練は8400steps(=126エポック)くらいまでやって1時間半程度(ColabでA100を使用)でした。

「いや、前回は60000stepsだったのに8400じゃ足りてなくない?」と思うかもしれませんが、これくらいの反復だけで聴ける品質のものができます。訓練の時間が大幅に短くなったので、前回コンピューティングユニットが88くらい残ってましたがまだ60くらい残ってます。
前回はバッチサイズが45で、それで3500エポックくらいまで回したわけですが、それに比べるとso-vits-svcは学習の収束がかなり速いことが分かります。100エポックくらいでもいい感じになるとかなんとか。

VRAM消費については自分のデータセットと設定(バッチサイズ12)では訓練時に13GBとちょっとくらいだったので別にTesla T4でも動いていたのですが、なんか遅い?って感じだったのでA100を使っちゃいました。金で買うコンピューティング能力、気持ち良すぎだろ。

ただ、訓練を8400stepsで止めてもそんなに問題無いとは言えまだ気になる点はあるので、もうちょい訓練する意味はありそう。でも流石に60kステップも要らないと思います。

罠にハマったところ

Colabで訓練するときにrequirements_short.txtを使ってパッケージをインストールしたのですが、PyAudioのwheelがビルドできなくてエラーになってました。

以下のパッケージをVMにインストールすることで解決。

apt-get install libasound-dev portaudio19-dev libportaudio2 libportaudiocpp0

あとなんかjediっていうパッケージが無いよって怒られたりtensorflowの依存関係が壊れてるよってエラーが出たりしますが、今回はPyTorchで関係ないので無視。

生成したサンプル

前回やった走れメロスのやつで比較。

入力音声(つくよみちゃん):

Diff-SVC (60k steps):

so-vits-svc (8400 steps):

Diff-SVCとso-vits-svc、そんなに差が無いのではという感じがします。むしろ、この比較だとso-vits-svcの方がいいかも。

あと、普通に他の人の話声でテストしてみたりしたんですが、こっちはちょっとノイズみたいになってしまうところがあってちょっと微妙でした。Demucsでボーカル抽出をしたせいかもしれないし、訓練のステップが足りない説もまああるのでちょっとよく分からないです。そもそも、手法の限界がどれくらいなのか知りたいかも。

歌声でテストしてみたいのでボーカルだけの音源とかあったら欲しいんですけど、そういうのあるんですかね……?

Demucs使っても流石に歌の音源からキレイに声を抽出するのは限界があるので、手軽に試しにくい。

なんかブログ記事だけでもあれなので動画とか作ってみたいですね。

追記: ITAコーパスでテストしてみた

あみたろの声素材工房さんのITAコーパス読み上げ音声をお借りしました。

使用したモデルは8400stepsのやつ。出力しか載せないので、元の音声がほしい方は上記のリンクからどうぞ。

recitation007:

recitation050:

recitation055:

emoNormal003:

emoNormal006:

emoNormal022:

emoNormal042:

かなり良い品質っぽいですが、emoNormal042みたいに一部がノイズっぽくなってしまうときもあります。学習回数と言うより、学習データセットの問題かもしれないな~となんとなく思ってますがどうなんでしょ。

さらに追記

so-vits-svcがアプデされたので新バージョンで訓練してみました。今から始めるならこっちの方が良いと思います。

new-file.hatenablog.com