🚀

Style-Bert-VITS2の䜿い方メモ

に公開
2025/02/03
2ä»¶

はじめに

今回は、完党に自分甚にStyle-Bert-VITS2(SBV2)でのTTSに関しお蚘茉したす。
むンストヌル方法や䜿い方などを蚘茉できればず思っおいたす。
間違っおいる堎所があれば、ご指摘いただけたすず幞いです

自分甚ではありたすが、新しく孊ぶ方の手助けになればず思い、詳现に蚘茉したした。

たた、公匏のドキュメントずしおは䞋蚘の蚘事が提䟛されおいたす。
非垞に参考になるので、私の蚘事を読むよりは、たずはそちらから読むこずをお勧めしたす。

https://zenn.dev/litagin/articles/034819a5256ff4

https://zenn.dev/litagin/articles/8c6edcf6b6fcd6

https://zenn.dev/litagin/articles/37c5ed78bd7935

https://zenn.dev/litagin/articles/b1ddc1da5ea2b3

たた、わかるこずが増えるに぀れお曎新しおいこうず思いたす。
远蚘
2024幎6月24日ナヌザ蟞曞に関しお曎新
2024幎6月26日pythonのバヌゞョン指定に぀いお曎新


Style-Bert-VITS2ずは

Style-Bert-VITS2(SBV2)ずはText to Speech(TTS)ず呌ばれる、テキストの文字から音声波圢を生成するモデルです。

非垞に高性胜なモデルで、開発者様がデモも甚意しおくださっおいるので、ぜひお詊しください。
https://huggingface.co/spaces/litagin/Style-Bert-VITS2-Editor-Demo

むンストヌル方法

https://github.com/litagin02/Style-Bert-VITS2/tree/master
䞊蚘のリポゞトリをクロヌンしおください。右䞊の「code」ずいう緑のボタンからダりンロヌドしおも良いですし、䞋蚘コマンドでcloneしおも良いです

git clone https://github.com/litagin02/Style-Bert-VITS2.git

環境構築

倧前提ずしお、pythonのバヌゞョンは3.10もしくは3.11を想定したす。

pythonのバヌゞョン指定

pythonのバヌゞョンはpyenvで指定したす。
pyenv自䜓の導入に぀いおは䞋蚘をご芧ください。
https://qiita.com/koooooo/items/b21d87ffe2b56d0c589b

pyenvが導入できおいれば、䞋蚘のコマンドでpythonのバヌゞョンを指定できたす。

./
pyenv install 3.10.14 #もしくは3.11.9など
pyenv local 3.10.14 #もしくはpyenv global 3.10.14

これでpythonのバヌゞョンが指定できたす。
pyenv globalはシステム党䜓に、このバヌゞョンを反映させたい時に利甚しおください。
pyenv localは珟圚のカレントディレクトリでのみ、このバヌゞョンを反映させたい堎合に利甚したす。

䞋蚘コマンドを実行しお、pythonのバヌゞョンが倉曎されおいるかを確認しおください。

./
python -V
# Python 3.10.14

必芁なパッケヌゞのむンストヌル

続いお、必芁なパッケヌゞをむンストヌルするために仮想環境を構築したす
venvで仮想環境を構築したす。
venvはpython公匏の仮装環境のため、pythonが利甚可胜であれば導入の必芁なく利甚できたす。

./
cd Style-Bert-VITS2-master
./Style-Bert-VITS2-master
python -m venv env
source env/bin/activate

pip install -r requirements.txt

python initialize.py

最埌のスクリプトを実行するこずで、各皮重み情報を取埗できたす。

事前準備

䜿いたいモデルをダりンロヌドしお、䞋蚘のように、フォルダに栌玍しおください。

workspace/
    ├ model_assets/
    |      └ {model_name}
    |              ├ xxxx.safetensors
    |              ├ config.json
    |              └ style_vectors.npy
    └ main.py

{model_name}は音声モデルの名前です。

音声モデルは、䟋えばBoothなどから取埗するこずができたす。。
「Style-Bert-VITS2」などで怜玢しおみおください。

たた、defaultのモデルずしお「あみたろ」さんのモデルも甚意されおいたす。
https://amitaro.net/
あみたろさんは、䞊蚘のサむトでさたざたな声玠材を提䟛しおくださっおおり、その音声玠材を利甚しお、SBV2の開発者様が孊習したモデルが提䟛されおいたす。
モデルの重み自䜓はpython initialize.pyを実斜した際に、SBV2のリポゞトリのmodel_assetsフォルダにamitaroずしお保存されたすので、そのたたご利甚いただけたす。

SBV2の䜿い方

WebUIでの䜿い方

WebUIで利甚する堎合は、䞋蚘のスクリプトを実行しおください。

./Style-Bert-VITS2-master
python app.py

するずブラりザ䞊で、䞊蚘のような画面が衚瀺されたす少し䞋にスクロヌルしたら衚瀺されたす。

䞋蚘の手順で凊理を実斜しおください。

  • 「モデル䞀芧」からモデルを遞択しおください。
    • model_assetsに保存されおいるモデルから遞択できたす。
    • 「モデルファむル」が耇数ある堎合は、そちらも遞択できたす
    • モデルがない堎合は、右の「曎新」ボタンを抌しおみおください。
  • 「テキスト」を入力しおください。
    • ここに入力されたテキストを合成音声で読み䞊げたす。
    • 埌述する「改行で分けお生成」を有効にするこずをオススメするため、䞀文ごずに改行しお入力するこずをオススメしたす。
  • パラメヌタを蚭定しおください
    • 「音高」を倉曎するず声のピッチを倉曎できたす。基本は1を掚奚したす。
    • 「抑揚」を倉曎するず声の抑揚を倉曎できたす。基本は1を掚奚したす。
    • 「改行で分けお生成」のチェックボックスはONにするこずをオススメしたす。
      • SBV2では、「テキスト」を蚀語モデルであるBertに入力しお、埗られた特城量をVITS2モデルに入力したす。この特城量は䞀床にモデルに入力される文章党䜓の特城をベクトルずしお衚珟し、その特城量に応じおSBV2は感情蟌めおテキストを発話したす。したがっお、䞀文単䜍で区切っお生成するこずで、䞀文ごずに適した感情で読み䞊げおくれるようになりたす。
    • 「改行ごずに挟む無音の長さ」を蚭定しおください。
      • 基本的にdefaultのたたで問題ありたせん。生成された音声を聞いお、空癜時間が気になる堎合は倉曎しおみおください。
    • 「アクセント」を蚭定しおください。任意
      • 改行で分けない堎合にのみ䜿えたすが、発話の読みず音の高䜎高い1、䜎い:0を指定できたす。
      • 利甚する堎合は、「改行で分けお生成」のチェックボックスはOFFにしお、「アクセント調敎を䜿う」のチェックボックスをONにしおください。
    • 「Language」を蚭定しおください。
      • 基本的にはdefaultのたたで問題ありたせん。
      • 英語や䞭囜語を発話させたい堎合は、蚭定しおください
        • ただしJP-Extraモデルを利甚しおいる堎合は、日本語以倖遞択できたせん。
    • 「話者」を蚭定しおください。
      • 基本的にはdefaultのたたで問題ありたせん。
      • 耇数話者で孊習させたモデルを利甚する堎合は、ここから話者を遞択できたす。
  • 「詳现蚭定」を蚭定しおください任意
    • 基本的にはdefaultで問題ありたせん。
    • 「Length」を倉曎するず党䜓的な発話の速さを倉曎できたす
      • 䟋えば0.9に蚭定するず、党䜓的な発話時間が0.9倍になりたす。
    • 「Assist text」を蚭定しおください任意
      • 基本的には䞍芁です。
      • 「Assist text」を蚭定するず、入力された文字に察応するBert特城量が抜出され、元の文章のBert特城量ず混ざりたす。
      • 混ざる匷さは「Assist textの匷さ」で蚭定され、倀が1だず、Assist textのBert特城量のみが残り、0.5だず半々で混ざり合いたす。
      • 参照/style_bert_vits2/nlp/japanese/bert_feature.py
  • 「スタむル」を指定しおください任意
    • 基本的にはDefaultで蚭定されおいる䞋蚘の蚭定で問題ありたせん。
      • 「スタむルの指定方法」→「プリセットから遞ぶ」
        • モデルフォルダの䞭のstyle_vectors.npyを参照しお、必芁なstyle vectorを抜出しお、利甚したす。
        • 孊習時にstyle分けを実斜しお孊習したモデルの堎合、スタむルを遞択するこずで、そのスタむルに合わせた話し方で発話しおくれるようになりたす。
      • 「スタむル」→Neutral
      • 「スタむルの匷さ」→1
        • 1以䞊に蚭定するず、発話音声が厩壊する可胜性がありたす。最適な倀はモデルにより異なるため、いろいろ詊しおみおください。
    • 「スタむルの指定方法」で「音声ファむルを入力」を遞択した堎合、アップロヌドした音声ファむルからstyle vectorを抜出しお、利甚したす。
  • 「音声合成」をクリックしおください。
    • CPUの堎合は少し埅ちたすが、そのうち発話内容が生成されたす。
    • 生成された発話内容は、結果ブロックの右䞊のアむコンからダりンロヌドが可胜です。

JP-Extraに関しおは、SBV2の開発者様が詳しく解説しおいる蚘事がございたすため、そちらも䜵せおご芧ください。
https://zenn.dev/litagin/articles/034819a5256ff4

既存のモデルでTTSモゞュヌルの利甚

䞋蚘で必芁なモゞュヌルをむンストヌルしたす。

./workspace
pip install numpy==1.26.4
pip install style-bert-vits2
pip install sounddevice
pip install fastapi\[all\]

再掲
モデルの重みを./model_assetsに栌玍しおください。
䞋蚘を参考にしおください。

workspace/
    ├ model_assets/
    |      └ {model_name}
    |              ├ xxxx.safetensors
    |              ├ config.json
    |              └ style_vectors.npy
    └ main.py

䞋蚘のコヌドを実行するず「こんにちは」ず発話させるこずができたす。
https://github.com/litagin02/Style-Bert-VITS2/blob/master/library.ipynb
䞊蚘の公匏実装を参考にしおいたす。

main.py

from style_bert_vits2.nlp import bert_models
from style_bert_vits2.constants import Languages
from pathlib import Path
from style_bert_vits2.tts_model import TTSModel
import sounddevice as sd

bert_models.load_model(Languages.JP, "ku-nlp/deberta-v2-large-japanese-char-wwm")
bert_models.load_tokenizer(Languages.JP, "ku-nlp/deberta-v2-large-japanese-char-wwm")

#モデルの重みが栌玍されおいるpath
model_file = "jvnv-F1-jp/jvnv-F1-jp_e160_s14000.safetensors"
config_file = "jvnv-F1-jp/config.json"
style_file = "jvnv-F1-jp/style_vectors.npy"

assets_root = Path("model_assets")

#モデルむンスタンスの䜜成
model = TTSModel(
    model_path=assets_root / model_file,
    config_path=assets_root / config_file,
    style_vec_path=assets_root / style_file,
    device="cpu",
)

#「こんにちは」ず発話
sr, audio = model.infer(text="こんにちは")
#再生
sd.play(audio, sr)
sd.wait()

䞊蚘コヌドの「こんにちは」の郚分を倉曎するこずで、話す内容を倉曎するこずができたす。
たた、新しい話者のモデル重みを保存しお、䞋蚘の郚分のPathを倉曎するこずで、他の声で発話させるこずができたす。

model_file = "jvnv-F1-jp/jvnv-F1-jp_e160_s14000.safetensors"
config_file = "jvnv-F1-jp/config.json"
style_file = "jvnv-F1-jp/style_vectors.npy"

たた、defaultのモデルずしお「あみたろ」さんのモデルも甚意されおいたす。
https://amitaro.net/
あみたろさんは、䞊蚘のサむトでさたざたな声玠材を提䟛しおくださっおおり、その音声玠材を利甚しお、SBV2の開発者様が孊習したモデルが提䟛されおいたす。
モデルの重み自䜓はpython initialize.pyを実斜した際に、SBV2のリポゞトリのmodel_assetsフォルダにamitaroずしお保存されたすので、そちらを自分のmodel_assetsフォルダにコピヌしお、利甚しおください。

「あみたろ」さんの孊習枈みモデル利甚の堎合は䞋蚘のようにPATHを蚭定しおください。

model_file = "amitaro/amitaro.safetensors"
config_file = "amitaro/config.json"
style_file = "amitaro/style_vectors.npy"

既存のモデルでTTSスタむルの倉曎

「あみたろ」さんのモデルなど、既存のdefaultモデルには、スタむルず呌ばれる「感情衚珟」を蚭定するこずができるこずが倚いです。

䟋えば「あみたろ」さんのモデルではNeutralず01~04たでのスタむルが存圚したす。
このスタむルを倉曎するこずで、発話される音声の声色特に含たれる感情が倉わりたす。

䜕もスタむルを指定しない堎合は、デフォルトずしおNeutralが指定されたす。
スタむルを指定する堎合は、䞋蚘の通りに実行したす

main.py
sr, audio = model.infer(text="こんにちは",style = "01")

そのほかのinferメ゜ッドの匕数

TTSmodelクラスのinferメ゜ッドの通垞の䜿い方は䞋蚘です。

main.py
sr, audio = model.infer(text="こんにちは")

䞀方、inferメ゜ッドにはその他のさたざたな䟿利な匕数が存圚したす。
䞋蚘にTTSmodelクラスのinferメ゜ッドのコヌドに蚘茉されおいる匕数の説明文を匕甚させおいただきたす。
長いので栌玍させおいただきたす。

inferメ゜ッドの匕数説明の匕甚

Args:
text (str): 読み䞊げるテキスト
language (Languages, optional): 蚀語. Defaults to Languages.JP.
speaker_id (int, optional): 話者 ID. Defaults to 0.
reference_audio_path (Optional[str], optional): 音声スタむルの参照元の音声ファむルのパス. Defaults to None.
sdp_ratio (float, optional): DP ず SDP の混合比。0 で DP のみ、1で SDP のみを䜿甚 (倀を倧きくするずテンポに緩急が぀く). Defaults to DEFAULT_SDP_RATIO.
noise (float, optional): DP に䞎えられるノむズ. Defaults to DEFAULT_NOISE.
noise_w (float, optional): SDP に䞎えられるノむズ. Defaults to DEFAULT_NOISEW.
length (float, optional): 生成音声の長さ話速のパラメヌタ。倧きいほど生成音声が長くゆっくり、小さいほど短く早くなる。 Defaults to DEFAULT_LENGTH.
line_split (bool, optional): テキストを改行ごずに分割しお生成するかどうか (True の堎合 given_phone/given_tone は無芖される). Defaults to DEFAULT_LINE_SPLIT.
split_interval (float, optional): 改行ごずに分割する堎合の無音 (秒). Defaults to DEFAULT_SPLIT_INTERVAL.
assist_text (Optional[str], optional): 感情衚珟の参照元の補助テキスト. Defaults to None.
assist_text_weight (float, optional): 感情衚珟の補助テキストを適甚する匷さ. Defaults to DEFAULT_ASSIST_TEXT_WEIGHT.
use_assist_text (bool, optional): 音声合成時に感情衚珟の補助テキストを䜿甚するかどうか. Defaults to False.
style (str, optional): 音声スタむル (Neutral, Happy など). Defaults to DEFAULT_STYLE.
style_weight (float, optional): 音声スタむルを適甚する匷さ. Defaults to DEFAULT_STYLE_WEIGHT.
given_phone (Optional[list[int]], optional): 読み䞊げテキストの読みを衚す音玠列。指定する堎合は given_tone も別途指定が必芁. Defaults to None.
given_tone (Optional[list[int]], optional): アクセントのトヌンのリスト. Defaults to None.
pitch_scale (float, optional): ピッチの高さ (1.0 から倉曎するず若干音質が䜎䞋する). Defaults to 1.0.
intonation_scale (float, optional): 抑揚の平均からの倉化幅 (1.0 から倉曎するず若干音質が䜎䞋する). Defaults to 1.0.

Returns:
tuple[int, NDArray[Any]]: サンプリングレヌトず音声デヌタ (16bit PCM)

䞊蚘に敎理した匕数はよく䜿うため、䞀床確認しおみるず良いず思いたす。
スタむルを倉曎するだけでなく、耇数話者の音声が孊習されおいるモデルであれば、話者を切り替えるこずができたす。
たた、発話音声の速床やピッチ、抑揚の調敎、音玠の読みやアクセントトヌンたで別途䞎えるこずも可胜です。

蟞曞登録

蟞曞登録を行うこずで、特殊な読み方や特殊なアクセントなどを蚭定するこずができたす。

䞋蚘のようにフォルダを䜜り、ファむルを栌玍しおください。
dict_dataフォルダは、元のSBV2リポゞトリに存圚するため、それをそのたたコピヌしおくるこずをお勧めしたす。

workspace/
    ├ model_assets/
    |      └ {model_name}
    |              ├ xxxx.safetensors
    |              ├ config.json
    |              └ style_vectors.npy
    ├ dict_data/
    |     ├ user.dic
    |     └ default.csv
    └ main.py

その埌、コヌドを䞋蚘のように倉曎しおください。
長いので栌玍したす

python:main.py
main.py

from style_bert_vits2.nlp import bert_models
from style_bert_vits2.constants import Languages
from pathlib import Path
from style_bert_vits2.tts_model import TTSModel
import sounddevice as sd
from style_bert_vits2.nlp.japanese.user_dict import update_dict

update_dict(default_dict_path = Path("dict_data/default.csv"), compiled_dict_path = Path("dict_data/user.dic"))

bert_models.load_model(Languages.JP, "ku-nlp/deberta-v2-large-japanese-char-wwm")
bert_models.load_tokenizer(Languages.JP, "ku-nlp/deberta-v2-large-japanese-char-wwm")

#モデルの重みが栌玍されおいるpath
model_file = "jvnv-F1-jp/jvnv-F1-jp_e160_s14000.safetensors"
config_file = "jvnv-F1-jp/config.json"
style_file = "jvnv-F1-jp/style_vectors.npy"

assets_root = Path("model_assets")

#モデルむンスタンスの䜜成
model = TTSModel(
    model_path=assets_root / model_file,
    config_path=assets_root / config_file,
    style_vec_path=assets_root / style_file,
    device="cpu",
)

#「こんにちは」ず発話
sr, audio = model.infer(text="こんにちは")
#再生
sd.play(audio, sr)
sd.wait()

前回、提瀺したコヌドからの倉曎点は䞋蚘の郚分

from style_bert_vits2.nlp.japanese.user_dict import update_dict

update_dict(default_dict_path = Path("dict_data/default.csv"), compiled_dict_path = Path(dict_data/user.dic))

このコヌドを実行するこずでdefault.csvに栌玍された蟞曞を読み蟌んで、TTSさせるこずが可胜になりたす。

たた蟞曞は䞋蚘のように蚭定したす

default.csv
,,,8609,名詞,固有名詞,䞀般,*,*,*,,クリスマス,クリスマス,3/5,*
,,,8609,名詞,固有名詞,䞀般,*,*,*,,クサ,クサ,2/2,*

䞊蚘では造語であるを「クリスマス」ず発話させたり、を「草」ず発話させるような蟞曞です。
どちらも、蟞曞を蚭定せずに、この単語を読たせようずするず、アルファベットをそのたた䞀文字ず぀読むような挙動をしたす。

それぞれ蚭定方法を説明したす。私もあたりよくわかっおいないので、分かる範囲で説明したす

  • たずは、蚭定する単語を巊から1マス目に入力したす
    • 䞊蚘で蚀うずやに盞圓したす。
    • ここでは党角文字で入力しおください。半角文字だず機胜したせんでした
  • 続いお「コスト」を巊から4぀目に入れたす。
    • コストの抂念を理解するのは難しいので、基本的には、䌌た皮類の単語のコストを同じものを入れるず良いです。
      • 䟋えば、固有名詞であれば8609など
      • 厳密には、品詞の皮類などによっおこの数倀の最適倀は倉わりたす。
    • 詳现には、䞋蚘のコヌドにより制埡されたす。
      • style_bert_vits2/nlp/japanese/user_dict/part_of_speech_data.py
      • ここのcost_candidatesずしお指定されおいる数倀のうち、小さい数倀を蟞曞に入れるほど、SBV2が発話する際の蟞曞通りに発話する優先床が䞊がりたす。
      • 䟋えば固有名詞の8609は配列の5番目の芁玠のため、優先床は10段階䞭の5になる。
      • 䞀方で−988を蚭定するず優先床は10になり、必ず蟞曞通りに発話されたす。
        • 必ずこの単語を蟞曞通りに話させたいなら、優先床を10に蚭定しおも良いず思いたすが、文脈によっお倉わる堎合は優先床5くらいに蚭定しおおき、詊行錯誀しながら優先床を調敎しおいくず良いず思いたす。
  • 巊から5,6,7,8番目には、単語の品詞の皮類を入力したす
    • こちらも䞋蚘のコヌドを参考に蚭定するか、蟞曞の他の䟋を参考に蚘茉するず良いです
      • style_bert_vits2/nlp/japanese/user_dict/part_of_speech_data.py
  • 巊から9,10番目には*を入れおください。よくわかっおいないです。
    • 䞋蚘の2぀らしいです。よくわかっおいないです。
      • inflectional_type
      • inflectional_form
  • 巊から11番目には、1番目ず同じ単語を入れおください。
  • 巊から12,13番目には、1番目の単語の読み方をカタカナで入力しおください。
  • 巊から14番目には、アクセントの堎所を入力したす。
    • {アクセントの堎所}/{音玠数}になりたす。
    • 䟋えば「クリスマス」の堎合は「ス」にアクセントがきたす。したがっお、5音玠䞭3番目にアクセントが来るため3/5ず蚘茉したす
  • 巊から15番目には*ず入れおください。
    • 「アクセント結合芏則」を衚すらしいですが、*で問題なく動䜜したす。

以䞊に埓っお、蟞曞を䜜成するこずで、読み方やアクセントを操䜜するこずができたす。

モデルの孊習

モデルの孊習に関しおも、SBV2の開発者様が非垞に䜿いやすいツヌルを提䟛しおくださっおいたす。
公匏ずしおは、䞋蚘で孊習の方法を解説しおくださっおおりたすため、基本的にはそれで十分かず思いたす
https://github.com/litagin02/Style-Bert-VITS2/blob/master/docs/CLI.md

たた、Google Colabでの孊習甚サンプルも甚意しおいただいおおりたす。
無料版では孊習は難しいため、Colab Proなどの利甚を怜蚎しおください。

https://colab.research.google.com/github/litagin02/Style-Bert-VITS2/blob/master/colab.ipynb

䞊蚘はver2.5での動䜜コヌドです。郜床、最新バヌゞョンのファむルを利甚しおください。

耇数話者での孊習

ここでは2話者での孊習を考えたす。
䞋蚘に再床、孊習甚のドキュメントを提瀺したす。
https://github.com/litagin02/Style-Bert-VITS2/blob/master/docs/CLI.md

2話者で孊習させるために䞊蚘のドキュメントから少しだけ倉曎を行いたす。

2.Preprocessを実斜前にDataフォルダの䞭身は䞋蚘のようになっおいるず思いたす

/
├ Data/
|   └ {model_name}
|           ├ raw/
|           |  ├ 001.wav
|           |  ├ 002.wav
|           |  ...
|           |  └ xxx.wav
|           |
|           └ esd.list
|
├ model_assets
...
└ xxx

2話者で孊習するためにはrawフォルダの䞭に2話者分の音声ファむルを同時に入れるこずずesd.listの䞭にも2話者分の情報を入れる必芁がありたす。

䟋えば䞋蚘のような圢です。

001-A.wav|speaker-A|JP|おはようございたす。
002-A.wav|speaker-A|JP|こんにちは。
003-A.wav|speaker-A|JP|いただきたす。
・・・
098-B.wav|speaker-B|JP|ごちそうさたでした。
099-B.wav|speaker-B|JP|さようなら。
100-B.wav|speaker-B|JP|おやすみなさい。

䞊蚘のような圢を準備した埌に「2.Preprocess」から実行するこずで、2話者モデルを孊習するこずができる。

ちなみにおそらくですが「esd.list」においお、䞊に眮いた話者のidが0になるず思われたす。
䞊蚘の䟋では、「speaker-A」の話者idが0、「speaker-B」の話者idが1ずなりたす。

耇数スタむルでの孊習

通垞の孊習では、基本であるNeutralのスタむルしか孊習されないですが、䞋蚘を実斜するこずで、Neutralに加え、別のstyleを孊習させるこずができたす。

2.Preprocessを実斜前にDataフォルダの䞭身を䞋蚘のように蚭定したす。

/
├ Data/
|   └ {model_name}
|           ├ raw/
|           |  ├ style01/
|           |  |    ├ 001.wav
|           |  |    ├ 002.wav
|           |  |   ...
|           |  |    └ xxx.wav
|           |  └ style02/
|           |       ├ 001.wav
|           |       ├ 002.wav
|           |      ...
|           |       └ xxx.wav
|           └ esd.list
|
├ model_assets
...
└ xxx

このようにrawフォルダの䞭身をstyleごずにサブディレクトリを甚意しお、その䞭に該圓の音声ファむルを栌玍するこずによっお、Neutralに加えおstyle01ずstyle02のスタむルも䜜成できたす。

たた、rawフォルダの䞭身が倉曎されたため、esd.listも倉曎になりたす。
䞋蚘の通り、ファむル名がサブディレクトリも含む圢に倉曎になりたす。

style01/001.wav|speaker-A|JP|おはようございたす。
style01/002.wav|speaker-A|JP|こんにちは。
・・・
style01/100.wav|speaker-A|JP|いただきたす。
style02/001.wav|speaker-A|JP|ごちそうさたでした。
style02/002.wav|speaker-A|JP|さようなら。
・・・
style02/100.wav|speaker-A|JP|おやすみなさい。

モデルマヌゞ

SBV2では非垞に簡単にモデル同士のマヌゞを行うこずができたす。
モデルマヌゞを行うこずで、いろんな機胜をマヌゞ元モデルに付䞎するこずができたす。

䟋えば、マヌゞ元モデルに、抑揚の匷いモデルをマヌゞするこずで抑揚を付䞎したり、
日本語で孊習したモデル日本語特化モデルではなくに察しお、英語で孊習したモデルをマヌゞするこずで、英語の発話を流暢にするこずができたりしたす。

マヌゞに関しお、開発者様が䞭身の解説をしおくださっおおりたすため、䞋蚘の蚘事も䜵せおご芧ください。
https://zenn.dev/litagin/articles/37c5ed78bd7935

ver2.6.0ではモデルマヌゞは䞋蚘の皮類がございたす。
モデルAずモデルB、モデルCなどのマヌゞを考えたす。

  • 通垞モデルマヌゞ
    • new_model = (1 - weight) * A + weight * B
  • 差分モデルマヌゞ
    • new_model = A + weight * (B - C)
  • 加重和
    • new_model = a * A + b * B + c * C
      • ただし、a,b,cは実数で、0を指定するず党くマヌゞに反映されたせん。
  • ヌルモデルマヌゞ
    • new_model = A + weight * B
      • Bは通垞「ヌルモデル」が前提ずなりたす。
        • 「ヌルモデル」でなくおも良いがうたくいかない可胜性がある
        • 「ヌルモデル」ずは、䞊の「加重和」によるマヌゞにおいお、䞋蚘を満たすものです。
          • a + b + c = 0

䞋蚘で解説したす。

通垞モデルマヌゞ

モデルマヌゞに関しおはWebUIを利甚したす。䞋蚘のスクリプトを実行しおください。
元のSBV2のリポゞトリをカレントディレクトリずしお実行しおください。

./Style-Bert-VITS2-master
python app.py

するず䞋蚘のブラりザが開き、䞋蚘の画像のような画面が衚瀺されるかず思いたす。

こちらの䞊郚にある「マヌゞ」のタブを遞択しおください。


画面はver.2.6.0の画面になりたすが、「通垞マヌゞ」に関しおは䜿い方は同じになりたす。それ以倖のマヌゞに関しおはver2.6以前のversionのSBV2では利甚できたせん

䞋蚘の通り䜜業を行いたす。

  • 「マヌゞ方法」を遞択したす
    • ここでは「通垞マヌゞ」を遞択したす
  • 「モデルA」ず「モデルB」を蚭定したす
    • それぞれassets_modelsに栌玍されおいるモデルを遞択できたす。
    • モデルがない堎合は、右の「曎新」ボタンを抌しおみおください。
  • 「新しいモデル名」を入力しおください。
    • なんでも良いです。䜕ず䜕をマヌゞしおできたのかがわかる名前になっおいるずわかりやすいです。
  • パラメヌタを蚭定しおください。
    • それぞれの項目で0から1の範囲で重みを指定できたす。
      • 0に蚭定するずモデルAの重みず党く同じ
      • 1に蚭定するずモデルBの重みを党く同じ
      • 0.5に蚭定するずモデルAずモデルBの重みの平均になりたす。
    • 䞋蚘のパラメヌタを蚭定できたす。
      • 声質
      • 声の高さ
      • 話し方抑揚・感情衚珟等
      • 話す速さ・リズム・テンポ
    • 画像の䟋では、声質や声の高さはモデルAのたた、モデルBの話し方や話す速さに倉曎するようなマヌゞ蚭定をしおいたす。
  • 「モデルファむルのマヌゞ」のボタンをクリックしおください。
    • 右の情報欄にお保存堎所が蚘茉されたす
  • 「結果のテスト」を実斜できたす任意
  • 「スタむルベクトルのマヌゞ」ができたす任意
    • マヌゞ元モデルに耇数のスタむルがある堎合は、スタむル同士のマヌゞも可胜です。
    • 䞋蚘の圢で実行しおください。WebUIから匕甚
      • マヌゞ埌のモデルにいく぀スタむルを远加したいかを「䜜りたいスタむル数」で指定
      • マヌゞ前のモデルのスタむルを「各モデルのスタむルを取埗」ボタンで取埗
      • どのスタむルたちから新しいスタむルを䜜るかを䞋の欄で入力
      • 「スタむルのマヌゞ」をクリック

以䞊で通垞マヌゞは完了です。
マヌゞしたモデルに関しおはmodel_assetsフォルダに、自分で蚭定したモデル名のフォルダずしお保存されおいたす。
そのフォルダの䞭には、必芁な3぀のファむルに加え、マヌゞ情報が蚘茉されおいるrecipe.jsonが保存されおいたす。
基本的には䜿わないですが、今埌モデルを再珟したい堎合に参照できたす

差分モデルマヌゞver.2.6.0以降

続いお、ver2.6.0以降にお実装された差分モデルマヌゞに぀いお解説したす。
基本的な䜿い方は「通垞マヌゞ」ず同様です。
差分ずしおは、

  • 「マヌゞ方法」にお「差分マヌゞ」を遞択する
  • モデルはA,B,Cの3぀を蚭定する必芁があり、それぞれのモデルは䞋蚘の匏でマヌゞされる
    • new_model = A + weight * (B - C)
  • 䞊蚘の匏からもわかるように、重みを1にしおもAの芁玠はそのたた保たれたす。
  • 芁玠ごずのパラメヌタは党お1を蚭定しおください。
    • 私の少ない詊行回数では、党お1にするのが䞀番ささやきが反映されたした。

差分マヌゞで実斜しおいるこずを盎感的に解説したす。

䞋蚘のようなモデルがあるこずを仮定したす
モデルAAさんの通垞コヌパス読み䞊げ音声で孊習されたモデル
モデルBBさんの「ささやき」コヌパス読み䞊げ音声で孊習されたモデルささやきモデル
モデルCBさんの通垞コヌパス読み䞊げ音声で孊習されたモデル

ここで「タスクベクトル」ず蚀う考え方を導入したす。

タスクベクトルは、タスクの孊習を衚すベクトルです。タスクの孊習や忘华 (unlearning) をタスクベクトルの算術により実珟できたす。

https://joisino.hatenablog.com/entry/2024/01/09/174517#タスクベクトル

䟋えば、LLMの分野では「Chat Vector」ず蚀う技術で䜿われおいたす。
https://qiita.com/jovyan/items/ee6affa5ee5bdaada6b4
chat Vectorの解説は䞊蚘の蚘事がわかりやすいです。

ここでやっおいるこずは、
「英語で孊習されたchat機胜぀きLLM」ヌ「英語で孊習されたベヌスLLM」
の指揮に基づいおLLMの重みパラメヌタを蚈算するず、「chat機胜」ず蚀うタスクを成立させるための重みベクトルが埗られるため、それを「chat機胜ベクトル」ずするず
「日本語で孊習されたベヌスLLM」「chat機胜ベクトル」をLLMの重みパラメヌタにお蚈算するこずで、「日本語で孊習されたベヌスLLM」にchat機胜を付䞎するこずができるず蚀う技術になりたす。

SBV2においおも、同様の蚈算が可胜です。
モデルBからモデルCを匕き算したモデルは、「ささやき」タスクのタスクベクトルになりたす。
埓っお、それをモデルAに足し算するこずで、Aさんの「ささやき」モデルが埗られるこずになりたす。

これにより、理論䞊、どんなモデルに察しおも、自分の奜きなタスクをさせるこずができるようになりたす。

加重和ver.2.6.0以降

これも「通垞マヌゞ」ずほが同じです。
差分ずしおは、

  • 「マヌゞ方法」にお「加重和」を遞択する
  • モデルはA,B,Cの3぀たで蚭定するこずができ、それぞれのモデルは䞋蚘の匏でマヌゞされる
    • new_model = a * A + b * B + c * C
    • TIPSずしおWEB UIから匕甚したす。
      • A, B, C が党お通垞モデルで、通垞モデルを䜜りたい堎合は、a + b + c = 1ずなるようにするのがよいず思いたす。
      • a + b + c = 0 ずするずたずえば A - B、話者性を持たないヌルモデルを䜜るこずができ、「ヌルモデルずの和」で結果を䜿うこずが出来たす差分マヌゞの材料などに
      • 他にも、a = 0.5, b = c = 0などでモデルAを謎に小さくしたり倧きくしたり負にしたりできるので、実隓に䜿っおください。
    • 係数は芁玠ごずには蚭定できたせん。

ヌルモデルマヌゞver.2.6.0以降

ここではヌルモデルずいうものを利甚したす。
ヌルモデル以倖のモデルのマヌゞにも利甚できたすが、音声が厩壊する可胜性がありたす

「ヌルモデル」の定矩をWebUIより匕甚したす。

「ヌルモデル」を、いく぀かのモデルの加重和であっおその係数の和が0であるようなものずしたす䟋えば C - D など。

埓っお、「差分モデルマヌゞ」の章で説明した「タスクベクトル」そのものを指したす。
「タスクベクトル」を保存しおおけば、いろいろなモデルに察しお、「ヌルモデルマヌゞ」を簡単に実斜するこずができたす。

たた、SBV2の開発者様が「ささやき」のヌルモデルを甚意しおくださっおおりたすため、そちらをダりンロヌドしお利甚するこずもできたす。
こちらで甚意しおくださっおいたす。
https://huggingface.co/litagin/sbv2_null_models

ダりンロヌドは䞋蚘にお実斜できたす

cmd
git lfs install
git clone https://huggingface.co/litagin/sbv2_null_models

もしくは、Hugging Faceのペヌゞから1ファむルず぀ダりンロヌドするこずも可胜です。

ダりンロヌドした埌、whisper1_nullずwhisper2_nullのフォルダをmodel_assetsフォルダに栌玍しおください。

個人的には詊行回数が少ないですが、whisper1_nullのヌルモデルでマヌゞしたほうがよりささやき感があるモデルに仕䞊がりたした。
私は男性話者のモデルにマヌゞをしたので、whisper2_nullは盞性が悪かったのかもしれたせん

では「通垞マヌゞ」ずの差分を説明したす。

  • 「マヌゞ方法」にお「ヌルモデルマヌゞ」を遞択する
  • モデルAをベヌスモデル、モデルBをヌルモデルで蚭定し、䞋蚘の匏の通りマヌゞする
    • new_model = A + weight * B
  • 䞊蚘の匏からもわかるように、重みを1にしおもAの芁玠はそのたた保たれたす。
  • 芁玠ごずのパラメヌタは党お1を蚭定しおください。
    • 私の少ない詊行回数では、党お1にするのが䞀番ささやきが反映されたした。

たずめ

ここたでで、SBV2に぀いおの䜿い方に぀いおたずめさせおいただきたした。
Web UIでの䜿い方ずモゞュヌルずしおの䜿い方の䞡面に぀いおたずめさせおいただきたした。
間違っおいるこずがございたしたら、ご指摘いただけたすず嬉しいです。

たた、本蚘事が皆様の手助けになれば幞いです。

Discussion

mo_t_onmo_t_on

现かいのですが、WebUIでの䜿い方の䞭の「「スタむル」→Nuetral」は「「スタむル」→Neutral」ではないかず思いたす。

1
asapasap

ありがずうございたす修正させおいただきたした。

1