ailia SDKを試す<第6回>Bert-VITS2 JP-Extraを利用した音声合成

 今回は,ailia-SDKを用いた音声合成の実装について紹介します.音声合成は,筆者が特に関心を持っている分野であり,これまでにInterface誌にて「喋るAI猫」の記事を執筆した経験もあります.
 ailia-modelsには,音声合成のサンプルとしてbert-vits2が登録されていましたので,今回はこのサンプルを実際に試してみます.本サンプルは,多言語対応の高品質TTS(Text-to-Speech)モデルであるBert-VITS2をベースとしており,BERTによる文脈表現とVITS2音声生成モデルを組み合わせた構成になっています.
 なお,ailia-modelsで使用されているのは,日本語に特化した派生モデルBert-VITS2 JP-Extraです.開発元によると,このモデルでは,元のBert-VITS2に含まれていた英語および中国語に関するデータが削除されており,日本語音声の合成に最適化されているとのことです.

 

●実行環境
 今回使用したシステム構成を表1に示します.

名 称 内 容
OS Windows11 Pro
CPU インテル® プロセッサ N100
RAM 16GB
Python python-3.10.11-amd64
ailia-SDK Version 1.5.0.0
ailia-models v1.4.0
https://github.com/axinc-ai/ailia-models

表1 システム構成一覧

 

●環境構築
 本サンプルを動作させるために必要な開発ツールのインストール手順を次に示します.
▲ステップ1:Microsoft C++ Build Toolsのインストール
 このサンプルを動作させるには,C++のビルド環境が必要です.そのため,まずは開発環境として Microsoft C++ Build Toolsをインストールします.
 次のダウンロード・ページ
*****
https://visualstudio.microsoft.com/ja/visual-cpp-build-tools/
*****
へいき,インストール時に図1のコンポーネントを追加で選択してください.

 


図1 「C++によるデスクトップ開発」を選択

 

 インストール後,次のパスを環境変数PATHに追加します(バージョンは,実際の値で換えてください).バージョン番号は実際にインストールされた内容に応じて読み替えてください.
******
C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\xx.xx.xxxx\bin\Hostx64\x64
******
▲ステップ2:Python用パッケージをインストール
 手順をリスト1に示します.
******
> python –version
Python 3.10.11
> git clone https://github.com/axinc-ai/ailia-models.git
> cd ailia-models
> python -m venv .venv       <―― Pythonの仮想環境 作成
> .venv\Scripts\activate       <―― 仮想環境 で作業してください
> python -m pip install –upgrade pip
> pip install setuptools wheel
#  matplotlib、scikit-image、pillow に関しては依存するバージョンがあります
> pip install matplotlib==3.8    
> pip install “scikit-image<0.20” “pillow<10”
> pip install ailia
> pip install -r requirements.txt
> cd audio_processing\bert-vits2
> pip install -r requirements.txt <―― bert-vits2のrequirements
> pip install librosa         <―― bert-vits2用に追加するモジュール
******
リスト1 パッケージのインストール

 

●サンプルの実行と結果
 サンプル・スクリプトは,公式の手順通りに実行します.初回の実行時には,リスト2に示す実行ログの通り,多数のファイルがインターネット経由で自動的にダウンロードされます(実行ログは誌面の都合により一部を省略/整形しています).

******
(.venv) PS ailia-models\audio_processing\bert-vits2> python bert-vits2.py –text 吾輩は猫である –emo 私は今とても嬉しいです -e 0
 INFO arg_utils.py (13) : Start!
 INFO arg_utils.py (163) : env_id: 0
 INFO arg_utils.py (166) : CPU
 INFO model_utils.py (107) : Downloading unidic-lite.zip…
 INFO model_utils.py (109) : unidic-lite.zip is prepared!0% ( 46539KB )]
 INFO model_utils.py (74) : Downloading onnx file… (save path: BertVits2.2PT_enc_p.onnx)
 INFO model_utils.py (80) : ======================= 100.00% ( 37711KB )]
 INFO model_utils.py (82) : Downloading prototxt file… (save path: BertVits2.2PT_enc_p.onnx.prototxt)
 INFO model_utils.py (88) : ======================= 100.00% ( 297KB )]
 INFO model_utils.py (89) : ONNX file and Prototxt file are prepared!
 INFO license.py (81) : ailiaへようこそ。ailia SDKは商用ライブラリです。特定の条件下では、無償使用いただけますが、原則として有償ソフトウェアです。詳細は https://ailia.ai/license/ を参照してください。
 INFO model_utils.py (74) : Downloading onnx file… (save path: BertVits2.2PT_emb.onnx)
 INFO model_utils.py (80) : ======================= 100.00% ( 1700KB )]
 INFO model_utils.py (82) : Downloading prototxt file… (save path: BertVits2.2PT_emb.onnx.prototxt)
 INFO model_utils.py (88) : ======================= 100.00% ( 1KB )]
 INFO model_utils.py (89) : ONNX file and Prototxt file are prepared!
 INFO model_utils.py (74) : Downloading onnx file… (save path: BertVits2.2PT_dp.onnx)
 INFO model_utils.py (80) : ======================= 100.00% ( 1741KB )]
 INFO model_utils.py (82) : Downloading prototxt file… (save path: BertVits2.2PT_dp.onnx.prototxt)
 INFO model_utils.py (88) : ======================= 100.00% ( 10KB )]
 INFO model_utils.py (89) : ONNX file and Prototxt file are prepared!
 INFO model_utils.py (74) : Downloading onnx file… (save path: BertVits2.2PT_sdp.onnx)
 INFO model_utils.py (80) : ======================= 100.00% ( 2731KB )]
 INFO model_utils.py (82) : Downloading prototxt file… (save path: BertVits2.2PT_sdp.onnx.prototxt)
 INFO model_utils.py (88) : ======================= 100.00% ( 321KB )]
 INFO model_utils.py (89) : ONNX file and Prototxt file are prepared!
 INFO model_utils.py (74) : Downloading onnx file… (save path: BertVits2.2PT_flow.onnx)
 INFO model_utils.py (80) : ======================= 100.00% ( 155282KB )]
 INFO model_utils.py (82) : Downloading prototxt file… (save path: BertVits2.2PT_flow.onnx.prototxt)
 INFO model_utils.py (88) : ======================= 100.00% ( 1137KB )]
 INFO model_utils.py (89) : ONNX file and Prototxt file are prepared!
 INFO model_utils.py (74) : Downloading onnx file… (save path: BertVits2.2PT_dec.onnx)
 INFO model_utils.py (80) : ======================= 100.00% ( 57281KB )]
 INFO model_utils.py (82) : Downloading prototxt file… (save path: BertVits2.2PT_dec.onnx.prototxt)
 INFO model_utils.py (88) : ======================= 100.00% ( 111KB )]
 INFO model_utils.py (89) : ONNX file and Prototxt file are prepared!
 INFO model_utils.py (74) : Downloading onnx file… (save path: emo_clap.onnx)
 INFO model_utils.py (80) : ======================= 100.00% ( 489655KB )]
 INFO model_utils.py (82) : Downloading prototxt file… (save path: emo_clap.onnx.prototxt)
 INFO model_utils.py (88) : ======================= 100.00% ( 277KB )]
 INFO model_utils.py (89) : ONNX file and Prototxt file are prepared!
 INFO model_utils.py (74) : Downloading onnx file… (save path: debertav2lc.onnx)
 INFO model_utils.py (80) : ======================= 100.00% ( 1185874KB )]
 INFO model_utils.py (82) : Downloading prototxt file… (save path: debertav2lc.onnx.prototxt)
 INFO model_utils.py (88) : ======================= 100.00% ( 1350KB )]
 INFO model_utils.py (89) : ONNX file and Prototxt file are prepared!
 INFO model_utils.py (74) : Downloading onnx file… (save path: emo_clap_audio.onnx)
 INFO model_utils.py (80) : ======================= 100.00% ( 113969KB )]
 INFO model_utils.py (82) : Downloading prototxt file… (save path: emo_clap_audio.onnx.prototxt)
 INFO model_utils.py (88) : ======================= 100.00% ( 1460KB )]
 INFO model_utils.py (89) : ONNX file and Prototxt file are prepared!
 INFO bert-vits2.py (328) : Script finished successfully.
(.venv) PS ailia-models\audio_processing\bert-vits2>
******
リスト2 実行ログ

 

 作成されたresult.wavを再生してみたところ,自然で聞き取りやすい音声が生成されており,第一印象としては「なかなかいい感じ」の品質でした.

 

●パラメータによる音声の変化
 続いて,BERTによる文脈表現が音声合成にどのような影響を与えるのかを確認するため,各種パラメータを変更して検証を行います.併せて,指定可能な話者ID(–sid)の範囲やバリエーションについても確認し,どのような話者音声が用意されているかを調査します.
▲パラメータと音声変化の結果
 まず,パラメータを表2に示します.

引数名 オプション名 説明 デフォルト値
Text –text 音声に変換するテキスト 吾輩は猫である
emo text –emo 音声に変換される際に感情を表すテキスト 私はいまとてもうれしいです
emo audio path –emo-audio 感情を表す音声ファイルへのパス.–emoと両方指定された場合は,–emo-audioが優先的に感情の参照として使用される なし(任意)
style text –style-text StyleTextで入力したBERT特徴量が,音声に変換するテキストで入力されたBERT特徴量と混合され,出力音声が強制的にスタイライズ(特定の話し方に変換)される なし(任意)
speaker id –sid 使用する音声の種類を指定.日本語キャラクタのIDは196~427の範囲.
(このパラメータは,BERTには影響しない)
340
Output –savepath 生成した音声ファイル result.wav

表2 パラメータ一覧

 

 次に,結果を表3に示します.

パラメータ 変化の有無 備 考
emo
(感情テキスト)
ほとんどなし 「私はいまとても悲しいです」としても聞き取り可能な変化は殆どなかった
emo-audio
(感情音声ファイル)
若干あり 抑揚やイントネーションにわずかな違いが見られた
style-text
(話し方スタイル)
変化あり 話し方に変化はあったが,指定スタイルに変換されているかは不明
sid
(話者ID)
明確にあり 話者の声質/話し方に明確な違いが確認できた

表3 パラメータを変えた場合の音声変化

 

▲感情の設定
 –emo(感情テキスト)および –emo-audio(感情音声ファイル)については,変化がほとんどないか,ごくわずかに留まる結果となりました.感情表現をより顕著に反映させるための設定や使い方については,別途詳細を確認していく予定です.
▲話し方スタイルの設定
 一方で,–style-text(話し方スタイル)については,明確な変化が認められました.今回の検証では,style-textに「教師」および「老人」というキーワードを指定して音声を生成してみました.この指定方法がモデル仕様として正しいかどうかは現時点では不明ですが,話し方やトーンに違いが出たことは確認できたので,図2にその実行結果を示します.

 

図2 話し方スタイルの変化

 

▲話者IDの設定
 話者ID(–sid)には,多数の音声データが登録されていました.現時点では,それぞれの話者がどのような性別/年齢/キャラクタ設定で構成されているのかといった詳細な情報は公開されていないようですが,実際に切り替えて再生してみると,声質や話し方に明確な違いが確認できました.そのため,用途や場面に応じて話者IDを選択することで,音声の印象を柔軟に変えることが可能です.
 例えば,案内放送のような落ち着いた声,カジュアルな会話風のトーン,元気なナレーションなど,目的に応じた使い分けができそうです.

 

●まとめ
 今回は,ailia-SDKに含まれる音声合成サンプルBert-VITS2 JP-Extraを用いた基本的な音声合成の手順とパラメータの影響について紹介しました.比較的軽量な環境でも高品質な音声を生成できる点は,ローカルでの実装を検討している方にとって魅力的ではないでしょうか.
 なお,ailiaには本稿で紹介したモデル以外にも,より多機能な音声合成モジュールであるailia AI Voiceが公開されています.より高度な制御も可能なので,音声合成に興味を持たれた方は,こちらもぜひ試してみてください.

 

氏森 充(うじもり・たかし)
約30年間,(株)構造計画研究所にてIoT,ビッグデータ,機械学習,AI関連のシステム開発や実務応用に従事.退職後はLLM(大規模言語モデル)関連の情報収集や技術動向の調査・発信に注力し,雑誌「Interface」でもLLM技術に関する記事を執筆中.