diff --git a/README.md b/README.md index 1837f24..1d558a2 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ You can install via `pip install style-bert-vits2` (inference only), see [librar - [Zennの解説記事](https://zenn.dev/litagin/articles/034819a5256ff4) - [**リリースページ**](https://github.com/litagin02/Style-Bert-VITS2/releases/)、[更新履歴](/docs/CHANGELOG.md) + - 2024-06-16: Ver 2.6.0 (モデルの差分マージ・加重マージ・ヌルモデルマージの追加) - 2024-06-14: Ver 2.5.1 (利用規約をお願いへ変更したのみ) - 2024-06-02: Ver 2.5.0 (**[利用規約](/docs/TERMS_OF_USE.md)の追加**、フォルダ分けからのスタイル生成、小春音アミ・あみたろモデルの追加、インストールの高速化等) - 2024-03-16: ver 2.4.1 (**batファイルによるインストール方法の変更**) diff --git a/colab.ipynb b/colab.ipynb index 4f8d939..b617a28 100644 --- a/colab.ipynb +++ b/colab.ipynb @@ -6,7 +6,7 @@ "id": "F7aJhsgLAWvO" }, "source": [ - "# Style-Bert-VITS2 (ver 2.5.1) のGoogle Colabでの学習\n", + "# Style-Bert-VITS2 (ver 2.6.0) のGoogle Colabでの学習\n", "\n", "Google Colab上でStyle-Bert-VITS2の学習を行うことができます。\n", "\n", diff --git a/configs/config.json b/configs/config.json index a360f66..abaae81 100644 --- a/configs/config.json +++ b/configs/config.json @@ -69,5 +69,5 @@ "use_spectral_norm": false, "gin_channels": 256 }, - "version": "2.5.1" + "version": "2.6.0" } diff --git a/configs/config_jp_extra.json b/configs/config_jp_extra.json index c478b8f..b6edffb 100644 --- a/configs/config_jp_extra.json +++ b/configs/config_jp_extra.json @@ -76,5 +76,5 @@ "initial_channel": 64 } }, - "version": "2.5.1-JP-Extra" + "version": "2.6.0-JP-Extra" } diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index f87de27..b7bd5de 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## v2.6.0 (2024-06-16) + +### 新機能 +モデルのマージ時に、今までの `new = (1 - weight) * A + weight * B` の他に、次を追加 +- `new = A + weight * (B - C)`: 差分マージ +- `new = a * A + b * B + c * C`: 加重和マージ +- `new = A + weight * B`: ヌルモデルのマージ +差分マージは、例えばBを「Cと同じ話者だけど囁いているモデル」とすると、`B - C`が囁きベクトル的なものだと思えるので、それをAに足すことで、Aの話者が囁いているような音声を生成できるようになります。 + +また、加重和で`new = A - B`を作って、それをヌルモデルマージで別のモデルに足せば、実質差分マージを実現できます。また謎に`new = -A`や`new = 41 * A`等のモデルも作ることができます。 + +これらのマージの活用法については各自いろいろ考えて実験してみて、面白い使い方があればぜひ共有してください。 + ## v2.5.1 (2024-06-14) ライセンスとのコンフリクトから、[利用規約](/docs/TERMS_OF_USE.md)を[開発陣からのお願いとデフォルトモデルの利用規約](/docs/TERMS_OF_USE.md)に変更しました。 diff --git a/gradio_tabs/merge.py b/gradio_tabs/merge.py index abcf5f0..a73937e 100644 --- a/gradio_tabs/merge.py +++ b/gradio_tabs/merge.py @@ -228,7 +228,7 @@ def merge_style_weighted_sum( return list(new_style2id.keys()) -def merge_style_add_zero( +def merge_style_add_null( model_name_a: str, model_name_b: str, weight: float, @@ -535,7 +535,7 @@ def merge_models_weighted_sum( return merged_model_path -def merge_models_add_zero( +def merge_models_add_null( model_path_a: str, model_path_b: str, voice_weight: float, @@ -567,7 +567,7 @@ def merge_models_add_zero( save_file(merged_model_weight, merged_model_path) info = { - "method": "add_zero", + "method": "add_null", "model_a": model_path_a, "model_b": model_path_b, "voice_weight": voice_weight, @@ -628,7 +628,7 @@ def merge_models_gr( "usual", "add_diff", "weighted_sum", - "add_zero", + "add_null", ], f"Invalid method: {method}" model_a_name = Path(model_path_a).parent.name model_b_name = Path(model_path_b).parent.name @@ -671,10 +671,10 @@ def merge_models_gr( model_c_coeff, output_name, ) - else: # add_zero + else: # add_null if output_name in [model_a_name, model_b_name]: return "Error: マージ元のモデル名と同じ名前は使用できません。", None - merged_model_path = merge_models_add_zero( + merged_model_path = merge_models_add_null( model_path_a, model_path_b, voice_weight, @@ -759,7 +759,7 @@ def merge_style_weighted_sum_gr( ) -def merge_style_add_zero_gr( +def merge_style_add_null_gr( model_name_a: str, model_name_b: str, weight: float, @@ -768,7 +768,7 @@ def merge_style_add_zero_gr( ): if output_name == "": return "Error: 新しいモデル名を入力してください。", None - new_styles = merge_style_add_zero( + new_styles = merge_style_add_null( model_name_a, model_name_b, weight, @@ -852,9 +852,9 @@ initial_md = """ - 例えば、Bが「Cと同じ人だけど囁いているモデル」とすると、`B - C`は「囁きを表すベクトル」だと思えるので、それをAに足すことで、Aの声のままで囁き声を出すモデルができたりする - 他にも活用例はいろいろありそう - 重み付き和 `new = a * A + b * B + c * C`: AとBとCのモデルを指定して、各モデルの係数を指定して混ぜる - - 例えば`new = A - B` としておくと、結果としてできたモデルを別のモデルと「ゼロモデルの加算」で使うことで、差分マージが実現できる + - 例えば`new = A - B` としておくと、結果としてできたモデルを別のモデルと「ヌルモデルの加算」で使うことで、差分マージが実現できる - 他にも何らかの活用法があるかもしれない -- ゼロモデルの加算 `new = A + weight * B`: AとBのモデルを指定して、Bのモデルに要素ごとに比率をかけたものをAに足す +- ヌルモデルの加算 `new = A + weight * B`: AとBのモデルを指定して、Bのモデルに要素ごとに比率をかけたものをAに足す - Bのモデルは重み付き和などで `C - D` などとして作っている場合を想定している - 他にも何らかの活用法があるかもしれない @@ -922,18 +922,20 @@ new_model = a * A + b * B + c * C ## TIPS - A, B, C が全て通常モデルで、通常モデルを作りたい場合は、`a + b + c = 1`となるようにするのがよいと思います。 -- `a + b + c = 0` とすると(たとえば `A - B`)、話者性を持たないゼロモデルを作ることができ、「ゼロモデルとの和」で結果を使うことが出来ます(差分マージの材料などに) +- `a + b + c = 0` とすると(たとえば `A - B`)、話者性を持たないヌルモデルを作ることができ、「ヌルモデルとの和」で結果を使うことが出来ます(差分マージの材料などに) - 他にも、`a = 0.5, b = c = 0`などでモデルAを謎に小さくしたり大きくしたり負にしたりできるので、実験に使ってください。 """ -add_zero_md = """ -「ゼロモデル」を、いくつかのモデルの加重和であってその係数の和が0であるようなものとします(例えば `C - D` など)。 +add_null_md = """ +「ヌルモデル」を、いくつかのモデルの加重和であってその係数の和が0であるようなものとします(例えば `C - D` など)。 -そうして作ったゼロモデルBと通常モデルAに対して、`weight` を下の各スライダーで定める数値とすると、各要素ごとに、 +そうして作ったヌルモデルBと通常モデルAに対して、`weight` を下の各スライダーで定める数値とすると、各要素ごとに、 ``` new_model = A + weight * B ``` としてマージされます。 + +実際にはヌルモデルでないBに対しても使えますが、その場合はおそらく音声が正常に生成されないモデルができる気がします。が、もしかしたら何かに使えるかもしれません。 """ tts_md = f""" @@ -948,7 +950,7 @@ def method_change(x: str): "usual", "add_diff", "weighted_sum", - "add_zero", + "add_null", ], f"Invalid method: {x}" # model_desc, c_col, model_a_coeff, model_b_coeff, model_c_coeff, weight_row, use_slerp_instead_of_lerp if x == "usual": @@ -971,9 +973,9 @@ def method_change(x: str): gr.Row(visible=True), gr.Checkbox(visible=False), ) - elif x == "add_zero": + elif x == "add_null": return ( - gr.Markdown(add_zero_md), + gr.Markdown(add_null_md), gr.Column(visible=False), gr.Number(visible=False), gr.Number(visible=False), @@ -1011,7 +1013,7 @@ def create_merge_app(model_holder: TTSModelHolder) -> gr.Blocks: with gr.Blocks(theme=GRADIO_THEME) as app: gr.Markdown( - "2つのStyle-Bert-VITS2モデルから、声質・話し方・話す速さを取り替えたり混ぜたりできます。" + "複数のStyle-Bert-VITS2モデルから、声質・話し方・話す速さを取り替えたり混ぜたり引いたりして新しいモデルを作成できます。" ) with gr.Accordion(label="使い方", open=False): gr.Markdown(initial_md) @@ -1021,7 +1023,7 @@ def create_merge_app(model_holder: TTSModelHolder) -> gr.Blocks: ("通常マージ", "usual"), ("差分マージ", "add_diff"), ("加重和", "weighted_sum"), - ("ゼロモデルマージ", "add_zero"), + ("ヌルモデルマージ", "add_null"), ], value="usual", ) @@ -1177,14 +1179,11 @@ def create_merge_app(model_holder: TTSModelHolder) -> gr.Blocks: def render_style( style_count, style_a_list, style_b_list, style_c_list, method ): - print( - f"{style_count=}, {method=}, {style_a_list=}, {style_b_list=}, {style_c_list=}" - ) a_components = [] b_components = [] c_components = [] out_components = [] - if method in ["usual", "add_zero"]: + if method in ["usual", "add_null"]: for i in range(style_count): with gr.Row(): style_a = gr.Dropdown( @@ -1252,17 +1251,17 @@ def create_merge_app(model_holder: TTSModelHolder) -> gr.Blocks: ), outputs=[info_style_merge, style], ) - else: # add_zero + else: # add_null - def _merge_add_zero(data): - print("Method is add_zero") + def _merge_add_null(data): + print("Method is add_null") style_tuple_list = [ (data[a], data[b], data[out]) for a, b, out in zip( a_components, b_components, out_components ) ] - return merge_style_add_zero_gr( + return merge_style_add_null_gr( data[model_name_a], data[model_name_b], data[speech_style_slider], @@ -1271,7 +1270,7 @@ def create_merge_app(model_holder: TTSModelHolder) -> gr.Blocks: ) style_merge_btn.click( - _merge_add_zero, + _merge_add_null, inputs=set( a_components + b_components diff --git a/style_bert_vits2/constants.py b/style_bert_vits2/constants.py index 15c2611..c0df22b 100644 --- a/style_bert_vits2/constants.py +++ b/style_bert_vits2/constants.py @@ -4,7 +4,7 @@ from style_bert_vits2.utils.strenum import StrEnum # Style-Bert-VITS2 のバージョン -VERSION = "2.5.1" +VERSION = "2.6.0" # Style-Bert-VITS2 のベースディレクトリ BASE_DIR = Path(__file__).parent.parent