Update, maybe v1.0

This commit is contained in:
litagin02
2023-12-27 19:29:34 +09:00
parent 33c6f175e5
commit 1fc82960d0
7 changed files with 80 additions and 37 deletions

View File

@@ -4,13 +4,14 @@ Bert-VITS2 with more controllable voice styles.
This repository is based on [Bert-VITS2](https://github.com/fishaudio/Bert-VITS2) v2.1, so many thanks to the original author! This repository is based on [Bert-VITS2](https://github.com/fishaudio/Bert-VITS2) v2.1, so many thanks to the original author!
## これは何? **概要**
- [Bert-VITS2](https://github.com/fishaudio/Bert-VITS2)のv2.1を元に、正確に感情や発話スタイルを強弱混みで指定して音声を生成することができるようにしたものです。 - [Bert-VITS2](https://github.com/fishaudio/Bert-VITS2)のv2.1を元に、正確に感情や発話スタイルを強弱混みで指定して音声を生成することができるようにしたものです。
- [EasyBertVits2](https://github.com/Zuntan03/EasyBertVits2/)のように、GitやPythonがない人でも簡単にインストールできるやつもありますまだ少し未検証 - GitやPythonがない人でもWindowsユーザーでNVIDIAのグラボがあるなら簡単にインストールでき、学習もできます (多くを[EasyBertVits2](https://github.com/Zuntan03/EasyBertVits2/)からお借りしました)
## 使い方 ## 使い方
詳しくは[こちら](docs/tutorial.md)を参照してください。 <!-- 詳しくは[こちら](docs/tutorial.md)を参照してください。 -->
### インストール ### インストール
@@ -18,11 +19,15 @@ Windows環境で最近のNVIDIA製グラボがあることを前提にしてい
#### GitやPythonに馴染みが無い方 #### GitやPythonに馴染みが無い方
[これ](https://github.com/litagin02/Style-Bert-VITS2/raw/master/scripts/Install-Style-Bert-VITS2.bat)をダウンロードして、スペースを含まない英数字のみのパスで実行してください(まだ動作未確認なので後でちゃんとチェックします 1. [このzipファイル](TODO)をダウンロードして展開し、中にある`Install-Style-Bert-VITS2.bat`をダブルクリックします。
2. 待つと自動で必要な環境がインストールされます。
3. その後、自動的に音声合成するためのWebUIが起動したらインストール成功です。デフォルトのモデルがダウンロードされるので、そのまま遊ぶことができます。
またアップデートをしたい場合は、`Update-Style-Bert-VITS2.bat`をダブルクリックしてください。
#### GitやPython使える人 #### GitやPython使える人
Python 3.10で動作確認しています。 Windowsの通常環境のPython 3.10で動作確認しています。
```bash ```bash
git clone https://github.com/litagin02/Style-Bert-VITS2.git git clone https://github.com/litagin02/Style-Bert-VITS2.git
@@ -39,7 +44,7 @@ python initialize.py
`App.bat`をダブルクリックするとWebUIが起動します。 `App.bat`をダブルクリックするとWebUIが起動します。
ディレクトリ構造: 合成に必要なモデルファイルたちは以下のように配置します。
``` ```
model_assets model_assets
├── your_model ├── your_model
@@ -67,11 +72,17 @@ model_assets
- `Dataset.bat`をダブルクリックすると、音声ファイルからデータセットを作るためのWebUIが起動します。音声ファイルのみからでもこれを使って学習できます。 - `Dataset.bat`をダブルクリックすると、音声ファイルからデータセットを作るためのWebUIが起動します。音声ファイルのみからでもこれを使って学習できます。
## Bert-VITS2 v2.1と違う点 ## Bert-VITS2 v2.1との関係
基本的にはBert-VITS2 v2.1のモデル構造を少し改造しただけです。[事前学習モデル](https://huggingface.co/litagin/style_bert_vits2_jvnv)も、実質Bert-VITS2 v2.1と同じものを使用しています不要な重みを削ってsafetensorsに変換したもの
具体的には以下の点が異なります。
- [EasyBertVits2](https://github.com/Zuntan03/EasyBertVits2)のように、PythonやGitを知らない人でも簡単に使える。
- 感情埋め込みのモデルを変更([wav2vec2-large-robust-12-ft-emotion-msp-dim](https://huggingface.co/audeering/wav2vec2-large-robust-12-ft-emotion-msp-dim)から[wespeaker-voxceleb-resnet34-LM](https://huggingface.co/pyannote/wespeaker-voxceleb-resnet34-LM)へ、感情埋め込みというより正確には話者埋め込みが近い) - 感情埋め込みのモデルを変更([wav2vec2-large-robust-12-ft-emotion-msp-dim](https://huggingface.co/audeering/wav2vec2-large-robust-12-ft-emotion-msp-dim)から[wespeaker-voxceleb-resnet34-LM](https://huggingface.co/pyannote/wespeaker-voxceleb-resnet34-LM)へ、感情埋め込みというより正確には話者埋め込みが近い)
- 埋め込みもベクトル量子化を取り払い、単なる全結合層に。 - 埋め込みもベクトル量子化を取り払い、単なる全結合層に。
- スタイルベクトルファイル`style_vectors.npy`を作ることで、そのスタイルを使って効果の強さも連続的に指定しつつ音声を生成することができる。 - スタイルベクトルファイル`style_vectors.npy`を作ることで、そのスタイルを使って効果の強さも連続的に指定しつつ音声を生成することができる。
- 各種WebUIを作成(事前準備・学習・スタイルベクトルの生成・音声合成) - 各種WebUIを作成
- bf16での学習のサポート - bf16での学習のサポート
- safetensors形式のサポート、デフォルトでsafetensorsを使用するように - safetensors形式のサポート、デフォルトでsafetensorsを使用するように
- その他軽微なbugfixやリファクタリング - その他軽微なbugfixやリファクタリング
@@ -81,8 +92,6 @@ model_assets
- [ ] 本家のver 2.1, 2.2, 2.3モデルの推論対応ver 2.1以外は明らかにめんどいのでたぶんやらない) - [ ] 本家のver 2.1, 2.2, 2.3モデルの推論対応ver 2.1以外は明らかにめんどいのでたぶんやらない)
- [ ] `server_fastapi.py`の対応、とくにAPIで使えるようになると嬉しい人が増えるのかもしれない - [ ] `server_fastapi.py`の対応、とくにAPIで使えるようになると嬉しい人が増えるのかもしれない
## Bert-VITS2 v2.1と同じ点
- [事前学習モデル](https://huggingface.co/litagin/style_bert_vits2_jvnv)は、実質Bert-VITS2 v2.1と同じものを使用しています不要な重みを削ってsafetensorsに変換したもの
## 実験したいこと ## 実験したいこと
- [ ] 複数話者での学習の実験(原理的にはできるはず、スタイルがどう効くかが未知) - [ ] 複数話者での学習の実験(原理的にはできるはず、スタイルがどう効くかが未知)

23
app.py
View File

@@ -1,17 +1,18 @@
import argparse import argparse
import datetime
import os import os
import sys import sys
import warnings
import gradio as gr import gradio as gr
import numpy as np import numpy as np
import torch import torch
import warnings
from gradio.processing_utils import convert_to_16_bit_wav from gradio.processing_utils import convert_to_16_bit_wav
import utils import utils
from config import config
from infer import get_net_g, infer from infer import get_net_g, infer
from tools.log import logger from tools.log import logger
from config import config
is_hf_spaces = os.getenv("SYSTEM") == "spaces" is_hf_spaces = os.getenv("SYSTEM") == "spaces"
limit = 100 limit = 100
@@ -226,6 +227,8 @@ def tts_fn(
assert model_holder.current_model is not None assert model_holder.current_model is not None
start_time = datetime.datetime.now()
sr, audio = model_holder.current_model.infer( sr, audio = model_holder.current_model.infer(
text=text, text=text,
language=language, language=language,
@@ -242,7 +245,10 @@ def tts_fn(
style=emotion, style=emotion,
emotion_weight=emotion_weight, emotion_weight=emotion_weight,
) )
return "Success", (sr, audio)
end_time = datetime.datetime.now()
duration = (end_time - start_time).total_seconds()
return f"Success, time: {duration} seconds.", (sr, audio)
initial_text = "こんにちは、初めまして。あなたの名前はなんていうの?" initial_text = "こんにちは、初めまして。あなたの名前はなんていうの?"
@@ -345,7 +351,8 @@ TODO: 現在のところはspeaker_id = 0に固定しており複数話者の合
style_md = """ style_md = """
- プリセットまたは音声ファイルから読み上げの声音・感情・スタイルのようなものを制御できます。 - プリセットまたは音声ファイルから読み上げの声音・感情・スタイルのようなものを制御できます。
- デフォルトのNeutralでも、十分に読み上げる文に応じた感情で感情豊かに読み上げられます。このスタイル制御は、それを重み付きで上書きするような感じです。 - デフォルトのNeutralでも、十分に読み上げる文に応じた感情で感情豊かに読み上げられます。このスタイル制御は、それを重み付きで上書きするような感じです。
- 重みを大きくしすぎると発音が変になったり声にならなかったりと崩壊することがあります。 - 強さを大きくしすぎると発音が変になったり声にならなかったりと崩壊することがあります。
- どのくらいに強さがいいかはモデルやスタイルによって異なるようです。
- 音声ファイルを入力する場合は、学習データと似た声音の話者(特に同じ性別)でないとよい効果が出ないかもしれません。 - 音声ファイルを入力する場合は、学習データと似た声音の話者(特に同じ性別)でないとよい効果が出ないかもしれません。
""" """
@@ -415,7 +422,7 @@ if __name__ == "__main__":
line_split = gr.Checkbox(label="改行で分けて生成", value=True) line_split = gr.Checkbox(label="改行で分けて生成", value=True)
split_interval = gr.Slider( split_interval = gr.Slider(
minimum=0.1, minimum=0.0,
maximum=2, maximum=2,
value=0.5, value=0.5,
step=0.1, step=0.1,
@@ -464,11 +471,13 @@ if __name__ == "__main__":
value="プリセットから選ぶ", value="プリセットから選ぶ",
) )
style = gr.Dropdown( style = gr.Dropdown(
label="スタイルNeutralが平均スタイル", choices=["モデルをロードしてください"], value=0 label="スタイルNeutralが平均スタイル",
choices=["モデルをロードしてください"],
value="モデルをロードしてください",
) )
style_weight = gr.Slider( style_weight = gr.Slider(
minimum=0, minimum=0,
maximum=20, maximum=50,
value=1, value=1,
step=0.1, step=0.1,
label="スタイルの強さ", label="スタイルの強さ",

View File

@@ -47,9 +47,9 @@ def download_jvnv_models():
"jvnv-M1/config.json", "jvnv-M1/config.json",
"jvnv-M1/jvnv-M1.safetensors", "jvnv-M1/jvnv-M1.safetensors",
"jvnv-M1/style_vectors.npy", "jvnv-M1/style_vectors.npy",
# "jvnv-M2/config.json", "jvnv-M2/config.json",
# "jvnv-M2/jvnv-M2.safetensors", "jvnv-M2/jvnv-M2.safetensors",
# "jvnv-M2/style_vectors.npy", "jvnv-M2/style_vectors.npy",
] ]
for file in files: for file in files:
if not Path(f"model_assets/{file}").exists(): if not Path(f"model_assets/{file}").exists():

View File

@@ -5,6 +5,7 @@ import torch
from torch import nn from torch import nn
from torch.nn import Conv1d, Conv2d, ConvTranspose1d from torch.nn import Conv1d, Conv2d, ConvTranspose1d
from torch.nn import functional as F from torch.nn import functional as F
from torch.nn.utils import remove_weight_norm, spectral_norm, weight_norm
import attentions import attentions
import commons import commons
@@ -13,10 +14,6 @@ import monotonic_align
from commons import get_padding, init_weights from commons import get_padding, init_weights
from text import num_languages, num_tones, symbols from text import num_languages, num_tones, symbols
with warnings.catch_warnings():
warnings.simplefilter("ignore")
from torch.nn.utils import remove_weight_norm, spectral_norm, weight_norm
class DurationDiscriminator(nn.Module): # vits2 class DurationDiscriminator(nn.Module): # vits2
def __init__( def __init__(

View File

@@ -5,16 +5,13 @@ import torch
from torch import nn from torch import nn
from torch.nn import Conv1d from torch.nn import Conv1d
from torch.nn import functional as F from torch.nn import functional as F
from torch.nn.utils import remove_weight_norm, weight_norm
import commons import commons
from attentions import Encoder from attentions import Encoder
from commons import get_padding, init_weights from commons import get_padding, init_weights
from transforms import piecewise_rational_quadratic_transform from transforms import piecewise_rational_quadratic_transform
with warnings.catch_warnings():
warnings.simplefilter("ignore")
from torch.nn.utils import remove_weight_norm, weight_norm
LRELU_SLOPE = 0.1 LRELU_SLOPE = 0.1

View File

@@ -1,14 +1,8 @@
chcp 65001 > NUL chcp 65001 > NUL
@REM ↑文字コードのおまじないらしい @echo off
@REM https://github.com/Zuntan03/EasyBertVits2 より引用・改変 @REM https://github.com/Zuntan03/EasyBertVits2 より引用・改変
@REM 2. Style-Bert-VITS2.zip を解凍名前がBert-VITS2-masterになる
@REM 3. Style-Bert-VITS2-master を Style-Bert-VITS2 にリネーム
@echo off
pushd %~dp0 pushd %~dp0
set PS_CMD=PowerShell -Version 5.1 -ExecutionPolicy Bypass set PS_CMD=PowerShell -Version 5.1 -ExecutionPolicy Bypass
@@ -30,11 +24,13 @@ if %errorlevel% neq 0 ( pause & popd & exit /b %errorlevel% )
%PS_CMD% Expand-Archive -Path Style-Bert-VITS2.zip -DestinationPath . -Force %PS_CMD% Expand-Archive -Path Style-Bert-VITS2.zip -DestinationPath . -Force
if %errorlevel% neq 0 ( pause & popd & exit /b %errorlevel% ) if %errorlevel% neq 0 ( pause & popd & exit /b %errorlevel% )
@REM 元のzipを削除しStyle-Bert-VITS2-master を Style-Bert-VITS2 にリネーム @REM 元のzipを削除
del Style-Bert-VITS2.zip del Style-Bert-VITS2.zip
if %errorlevel% neq 0 ( pause & popd & exit /b %errorlevel% ) if %errorlevel% neq 0 ( pause & popd & exit /b %errorlevel% )
ren Style-Bert-VITS2-master Style-Bert-VITS2 @REM Bert-VITS2-masterの中身をStyle-Bert-VITS2に上書き移動
xcopy /QSY .\Style-Bert-VITS2-master .\Style-Bert-VITS2
rmdir /s /q Style-Bert-VITS2-master
@REM Pythonと仮想環境のセットアップを呼び出す仮想環境が有効化されて戻ってくる @REM Pythonと仮想環境のセットアップを呼び出す仮想環境が有効化されて戻ってくる
call Style-Bert-VITS2\scripts\Setup-Python.bat ..\..\lib\python ..\venv call Style-Bert-VITS2\scripts\Setup-Python.bat ..\..\lib\python ..\venv

View File

@@ -0,0 +1,35 @@
chcp 65001 > NUL
@echo off
pushd %~dp0
set PS_CMD=PowerShell -Version 5.1 -ExecutionPolicy Bypass
set CURL_CMD=C:\Windows\System32\curl.exe
if not exist %CURL_CMD% (
echo [ERROR] %CURL_CMD% が見つかりません。
pause & popd & exit /b 1
)
@REM Style-Bert-VITS2.zip をGitHubのmasterの最新のものをダウンロード
%CURL_CMD% -Lo Style-Bert-VITS2.zip^
https://github.com/litagin02/Style-Bert-VITS2/archive/refs/heads/master.zip
if %errorlevel% neq 0 ( pause & popd & exit /b %errorlevel% )
@REM Style-Bert-VITS2.zip を解凍フォルダ名前がBert-VITS2-masterになる
%PS_CMD% Expand-Archive -Path Style-Bert-VITS2.zip -DestinationPath . -Force
if %errorlevel% neq 0 ( pause & popd & exit /b %errorlevel% )
@REM 元のzipを削除
del Style-Bert-VITS2.zip
if %errorlevel% neq 0 ( pause & popd & exit /b %errorlevel% )
@REM Bert-VITS2-masterの中身をStyle-Bert-VITS2に上書き移動
xcopy /QSY .\Style-Bert-VITS2-master .\Style-Bert-VITS2
rmdir /s /q Style-Bert-VITS2-master
if %errorlevel% neq 0 ( pause & popd & exit /b %errorlevel% )
echo Style-Bert-VITS2のアップデートが完了しました。
pause
popd