TonevoAdventCalendar

とんえぼアドカレ企画の記事を投稿するブログです!

推しに話してもらおうの会【SBV2を利用した音声生成について】


この記事はTonevo Advent Calender 24日目の記事です。ほかのメンバーの記事はこちらから。

tonevoadventcalendar.hatenablog.com

 

みなさんこんにちは、3回目のアドカレ執筆になるHarupyonnです。

 

一昨年、昨年とそれぞれマイクラ、けん玉について書かせていただきました。

しかし、さすがに音ゲーサークルのアドカレなのに音ゲーについて一度も書いていないのもどうなのかと思い、今年は...

 

音ゲーに関係ない記事を書きます!!!!!!!!

 

...まあほら、音ゲーに関する記事ならみんな書いてるだろうし、ね?

 

というわけで、今年のテーマは、

 

推しに話してもらおう

 

です。

 

そう、気が付いたんです。推しキャラの音声は有限だということに。

 

でも...

 

もっと推しキャラの声が聴きたい!!無限に聴きたいって!!!

 

というわけで、今回は推しに好きなだけ話してもらおうと思います。それはもう好きなだけ。

 

※今回の記事は音声合成に関する記事になります。ただし、パブリシティ権の問題に配慮し、合成された音声のサンプルは記載しませんのでご了承ください。AIを使うなら著作権に気を付けましょう。特に生成物を外部に公開するときは。

 

目次

1.推しキャラボイスの準備

推しキャラに話してもらうには、まず推しキャラの音声が必要です。残念ながら声が実装されていない推しキャラには話してもらうことはできません。そりゃそうですよね。

 

音声がないと話してもらうのは流石に無理...

 

というわけで、(音声が実装されている)推しキャラの声をひたすら集めます。このとき、できるだけ声以外の音は入らないように気を付けましょう。後で使うときに邪魔になるので。

 

今回は、私の推しであるニィロウの声を集めてみました。集め方はいたってシンプル、キャラクター画面を開いてWin+Gキーで出てくるアレでゲーム画面をキャプチャしながらひたすら音声を流し続けるだけです。

 

頑張ってひたすら流し続けます。15分ぐらいかかったかな?

 

ポイントはボイス以外の音をミュートに設定しておくことです。こうすることで余分な音が混ざらなくなります。ゲームだとこれができるから本当に楽ですね。

 

キャプチャされた動画ファイルの保存形式は.mp4でした。ここから、これを.wav形式に変換し、発話単位に分割していきます。

 

import os
from moviepy.editor import AudioFileClip


# フォルダのパス
input_folder = 'inputs\mp4'
output_folder = 'outputs'


# フォルダが存在しない場合、作成
os.makedirs(input_folder, exist_ok=True)
os.makedirs(output_folder, exist_ok=True)


# inputsフォルダ内のすべての.mp4ファイルを処理
for filename in os.listdir(input_folder):
    if filename.endswith('.mp4'):
        input_path = os.path.join(input_folder, filename)
        output_path = os.path.join(output_folder, filename.replace('.mp4', '.wav'))

        # 音声を抽出してWAV形式で保存
        print(f"{filename} を変換中...")
        audio_clip = AudioFileClip(input_path)
        audio_clip.write_audiofile(output_path, codec='pcm_s16le', logger='bar')
        print(f"{output_path} に保存されました。\n")

print("すべてのファイルの変換が完了しました。")

 

形式変換にはmoviepyを使いました。一応複数の動画ファイルにも対応させていますが、今回はニィロウだけなので不要でしたね。複数の推しの声をキャプチャしてきた時には使えそうです。

 

from pydub import AudioSegment
from pydub.silence import split_on_silence
import os
import numpy as np


input_folder = 'outputs'
output_folder = 'outputs/split_audio'


os.makedirs(output_folder, exist_ok=True)


for filename in os.listdir(input_folder):
    if filename.endswith('.wav'):
        input_path = os.path.join(input_folder, filename)
        base_filename = os.path.splitext(filename)[0]

        try:
            audio = AudioSegment.from_wav(input_path)
            decibels = audio.dBFS

            # 無音区間での分割
            chunks = split_on_silence(
                audio,
                min_silence_len=1200,  # 無音と判定する最小の時間(ミリ秒)
                silence_thresh=decibels-25,  # 無音と判定するデシベル(オーディオのdBFSに基づく)
                keep_silence=250  # 分割後も無音を残す時間(ミリ秒)
            )

            # チャンクの数と内容を表示
            print(f"{filename} の分割結果: {len(chunks)} チャンクが作成されました。")

            voice_folder = os.path.join(output_folder,filename)
            os.makedirs(voice_folder,exist_ok=True)
            for i, chunk in enumerate(chunks):
                chunk_path = os.path.join(voice_folder, f"{base_filename}_chunk_{i+1}.wav")
                chunk.export(chunk_path, format="wav")
                print(f"{chunk_path} に保存しました。")

        except Exception as e:
            print(f"エラーが発生しました: {e}")


print("無音区間での分割が完了しました。") 

 

発話単位での音声分割にはpydubを利用しました。発話が連続しているか否かは無音区間の長さで判別しています。

 

と、こんな感じにコードを書いて動画から発話単位で音声を抽出したところ、113発話の音声データが得られました。いい感じですね。

無事、キャプチャした動画から113発話分の音声ファイルを抽出できました。

 

で、ここまで推しキャラの音声データを集めたわけですが、そういえば何故推しキャラの音声データが必要なのかを話していませんでした。

 

というわけで、ついに今回の主役のご紹介です。

 

2.Style-Bert-VITS2の準備

今回の主役はズバリ、

 

Style-Bert-VITS2

 

です。

 

はて?なんじゃそりゃ?という方のためにざっくり説明させていただきますと、

 

なんかすごい高性能な音声合成モデル

 

です。

 

音声合成の目標とする話者の音声が少しあればその特徴を掴んでそれっぽい音声を合成できるようになる、まさに夢のようなモデルです。

 

github.com

 

というわけで早速Style-Bert-VITS2をインストールしていきます。まあ、そんなすごいモデルなんだし、面倒な環境構築だの設定だのしなきゃいけないんだろうな...

 

インストールでエラー吐かれたらだるいな...

...と、思っていた時期が私にもありました。しかし、蓋を開けてみたらなんと、全部勝手にやってくれるではありませんか!!!!

 

え!?全部勝手にやってくれるの!?ラッキー!!

こんな高性能な音声合成モデルを、特に事前知識なしでも使えるようにしてくれてるとか、流石に作者様が偉大すぎる...。

 

グラボはあるのでノーマルなStyle-Bert-VITS2を選択してちゃちゃっとインストールしました。あ、CPUしかない人はローカルでの学習はできないので、もしやってみようと思う人がいればその点は気を付けてくださいね。ただ、GPU弱者のためにGoogle Colaboratoryという救済措置も用意されていましたので、CPUしか積んでないPCでやってみる人は上記GitHubの「概要」のところを読んでみるといいと思います。

 

3.書き起こしの準備

ここまで、推しの音声とStyle-Bert-VITS2を準備しました。これで、必要な準備はすべて完了したので、いよいよ学習...

 

の前に、発話内容の書き起こしを行います。

 

音声合成モデルの学習には、基本的に音声と書き起こしからなるペアデータセットが用いられます。超ざっくり学習の流れを書くと、テキストを元に音声を合成→元音声と比較して損失関数と呼ばれる式で算出される損失(Lossと呼ばれます)が小さくなるようにモデルのパラメータを更新、といった感じです。つまり、書き起こしのデータがないとモデルの学習が行えない、ということです。

 

これまたコード書くか~と思っていましたが、なんとStyle-Bert-VITS2の基本機能としてテキスト自動書き起こし機能が備わっていました。しかも、GUI操作だけで完結できるとかいうおまけつき。作者様があまりにも偉大すぎる。

 

偉大なる作者様のおかげで書き起こしも簡単にできそうなのでちゃちゃっとやっちゃいましょう。

まずは、先ほどの音声データをStyle-Bert-VITS2\Data\nilow\rawに配置して~

 

めんどくさくてダウンロードフォルダから移動しないで使ってます。まあ、動くからいいでしょ。

Visual Studio Codeを開いて仮想環境に入って~

 

 

App.batを起動して~

 

開いたWebUiでデータセット作成を選択して「音声の文字起こし」をポチっとな!

 

しばらくすると...

 

結構精度もいい感じ。スメールシティとか固有名詞なのに凄いな。

こんな感じで音声からテキストを書き起こしてくれました。すごいなStyle-Bert-VITS2。

 

4.Style-Bert-VITS2の学習

ここまでで、ニィロウの音声-書き起こしペアデータセットとStyle-Bert-VITS2の準備を終えました。今度こそ必要な物はすべてそろったので、皆さんお待ちかね、Style-Bert-VITS2の学習に入ろうと思います。

 

...といってもStyle-Bert-VITS2が便利すぎてボタン二回押すだけなんですけどね...ハハ...

 

①さっきのWebUIの学習タブから、バッチサイズを4にして「自動前処理を実行」をポチッ!

 

我が家のGPUは16GBだったのでバッチサイズを4にしました。

②下のほうにある「学習を開始する」をポチッ!

 

進捗はVSCodeのコンソールから見れます。30分ぐらいで終わりそうですね。

はい、やること終わり!

 

え?全然機械学習してる感ないって?...まあ、そんなもんです。あとは学習が終了するまで昼寝でもしてのんびり待ちましょう。

参考までに学習時のGPUの状態をば。メモリ食ってるなぁ~。

 

5.推しに話してもらおう

さて、長かった学習も終わり、ニィロウの音声合成モデルができました。

 

ということは....!?

 

ついに、ニィロウに自由に話してもらう時間が来ました!!!!

 

先ほどと同様、WebUIから音声合成タブを開いて、テキスト入力欄に話してもらいたいことを書いて~

 

 

音声合成」ボタンを押せば~~~

 

 

...できた!!!!!!!キタキタキタキタ!!!!!

 

これが合成ニィロウボイスの波形か...

さてさて、合成されたニィロウボイスの出来は...!?

合成ニィロウボイス試聴中...

 

...こ、これは...!

 

ニィロウじゃないか...!!!!!

 

間違いなくニィロウだこれ!?!?!?

 

なんだこれすげえ!!!パブリシティ権の問題でサンプルが載せられないのが悔しいレベルでニィロウだこれ!!!

 

推しキャラボイスが聴き放題だ...こりゃすげえ...

 

でもこれ、品質が凄いだけに個人的な利用の範囲を超えて使ってはならんものの代表例だな...。悪用ダメ、絶対。

 

6.おわりに

というわけで、今回はStyle-Bert-VITS2を使って推しキャラの音声を合成する方法についての記事を書かせていただきました。

 

実はStyle-Bert-VITS2、これだけでは終わらなくて、モデルマージ機能を用いることで推しキャラのささやき声なんかも合成できちゃったりします。すごい通り越して最早怖い。

 

皆さんもいい感じのGPUを積んだPCがあればぜひやってみてください。

 

あ、重ね重ねになりますが、やるときは個人利用の範囲で終わらせましょう。間違っても商用利用したり、ネット上に公開したりしないように。

 

推しキャラの迷惑になることだけは避けましょう。絶対。