Merge pull request #95 from zunan-islands/dev-refactor

細かな修正 (#92 を参照)
This commit is contained in:
litagin02
2024-03-13 09:45:55 +09:00
committed by GitHub
10 changed files with 77 additions and 32 deletions

View File

@@ -73,10 +73,10 @@ if __name__ == "__main__":
config_path = args.config config_path = args.config
hps = HyperParameters.load_from_json(config_path) hps = HyperParameters.load_from_json(config_path)
lines = [] lines = []
with open(hps.data.training_files, encoding="utf-8") as f: with open(hps.data.training_files, "r", encoding="utf-8") as f:
lines.extend(f.readlines()) lines.extend(f.readlines())
with open(hps.data.validation_files, encoding="utf-8") as f: with open(hps.data.validation_files, "r", encoding="utf-8") as f:
lines.extend(f.readlines()) lines.extend(f.readlines())
add_blank = [hps.data.add_blank] * len(lines) add_blank = [hps.data.add_blank] * len(lines)

View File

@@ -238,7 +238,7 @@ class Config:
"If you have no special needs, please do not modify default_config.yml." "If you have no special needs, please do not modify default_config.yml."
) )
# sys.exit(0) # sys.exit(0)
with open(file=config_path, mode="r", encoding="utf-8") as file: with open(config_path, "r", encoding="utf-8") as file:
yaml_config: Dict[str, any] = yaml.safe_load(file.read()) yaml_config: Dict[str, any] = yaml.safe_load(file.read())
model_name: str = yaml_config["model_name"] model_name: str = yaml_config["model_name"]
self.model_name: str = model_name self.model_name: str = model_name

View File

@@ -51,6 +51,27 @@ Source = "https://github.com/litagin02/Style-Bert-VITS2"
[tool.hatch.version] [tool.hatch.version]
path = "style_bert_vits2/constants.py" path = "style_bert_vits2/constants.py"
[tool.hatch.build.targets.sdist]
only-include = [
".vscode",
"dict_data/default.csv",
"docs",
"style_bert_vits2",
"tests",
"LGPL_LICENSE",
"LICENSE",
"pyproject.toml",
"README.md",
]
exclude = [
".git",
".gitignore",
".gitattributes",
]
[tool.hatch.build.targets.wheel]
packages = ["style_bert_vits2"]
[tool.hatch.envs.test] [tool.hatch.envs.test]
dependencies = [ dependencies = [
"coverage[toml]>=6.5", "coverage[toml]>=6.5",
@@ -75,18 +96,18 @@ cov = [
[tool.hatch.envs.style] [tool.hatch.envs.style]
detached = true detached = true
dependencies = [ dependencies = [
"black", "black",
"isort", "isort",
] ]
[tool.hatch.envs.style.scripts] [tool.hatch.envs.style.scripts]
check = [ check = [
"black --check --diff .", "black --check --diff .",
"isort --check-only --diff --profile black --gitignore --lai 2 .", "isort --check-only --diff --profile black --gitignore --lai 2 .",
] ]
fmt = [ fmt = [
"black .", "black .",
"isort --profile black --gitignore --lai 2 .", "isort --profile black --gitignore --lai 2 .",
"check", "check",
] ]
[[tool.hatch.envs.test.matrix]] [[tool.hatch.envs.test.matrix]]

View File

@@ -180,7 +180,7 @@ def load_filepaths_and_text(
list[list[str]]: ファイルパスとテキストのリスト list[list[str]]: ファイルパスとテキストのリスト
""" """
with open(filename, encoding="utf-8") as f: with open(filename, "r", encoding="utf-8") as f:
filepaths_and_text = [line.strip().split(split) for line in f] filepaths_and_text = [line.strip().split(split) for line in f]
return filepaths_and_text return filepaths_and_text
@@ -249,7 +249,8 @@ def check_git_hash(model_dir_path: Union[str, Path]) -> None:
path = os.path.join(model_dir_path, "githash") path = os.path.join(model_dir_path, "githash")
if os.path.exists(path): if os.path.exists(path):
saved_hash = open(path).read() with open(path, "r", encoding="utf-8") as f:
saved_hash = f.read()
if saved_hash != cur_hash: if saved_hash != cur_hash:
logger.warning( logger.warning(
"git hash values are different. {}(saved) != {}(current)".format( "git hash values are different. {}(saved) != {}(current)".format(
@@ -257,4 +258,5 @@ def check_git_hash(model_dir_path: Union[str, Path]) -> None:
) )
) )
else: else:
open(path, "w").write(cur_hash) with open(path, "w", encoding="utf-8") as f:
f.write(cur_hash)

View File

@@ -85,7 +85,7 @@ def load_checkpoint(
else: else:
model.load_state_dict(new_state_dict, strict=False) model.load_state_dict(new_state_dict, strict=False)
logger.info("Loaded '{}' (iteration {})".format(checkpoint_path, iteration)) logger.info(f"Loaded '{checkpoint_path}' (iteration {iteration})")
return model, optimizer, learning_rate, iteration return model, optimizer, learning_rate, iteration

View File

@@ -38,12 +38,15 @@ __loaded_tokenizers: dict[
def load_model( def load_model(
language: Languages, language: Languages,
pretrained_model_name_or_path: Optional[str] = None, pretrained_model_name_or_path: Optional[str] = None,
cache_dir: Optional[str] = None,
revision: str = "main",
) -> Union[PreTrainedModel, DebertaV2Model]: ) -> Union[PreTrainedModel, DebertaV2Model]:
""" """
指定された言語の BERT モデルをロードし、ロード済みの BERT モデルを返す。 指定された言語の BERT モデルをロードし、ロード済みの BERT モデルを返す。
一度ロードされていれば、ロード済みの BERT モデルを即座に返す。 一度ロードされていれば、ロード済みの BERT モデルを即座に返す。
ライブラリ利用時は常に pretrain_model_name_or_path (Hugging Face のリポジトリ名 or ローカルのファイルパス) を指定する必要がある。 ライブラリ利用時は常に必ず pretrain_model_name_or_path (Hugging Face のリポジトリ名 or ローカルのファイルパス) を指定する必要がある。
ロードにはそれなりに時間がかかるため、ライブラリ利用前に明示的に pretrained_model_name_or_path を指定してロードしておくべき。 ロードにはそれなりに時間がかかるため、ライブラリ利用前に明示的に pretrained_model_name_or_path を指定してロードしておくべき。
cache_dir と revision は pretrain_model_name_or_path がリポジトリ名の場合のみ有効。
Style-Bert-VITS2 では、BERT モデルに下記の 3 つが利用されている。 Style-Bert-VITS2 では、BERT モデルに下記の 3 つが利用されている。
これ以外の BERT モデルを指定した場合は正常に動作しない可能性が高い。 これ以外の BERT モデルを指定した場合は正常に動作しない可能性が高い。
@@ -54,6 +57,8 @@ def load_model(
Args: Args:
language (Languages): ロードする学習済みモデルの対象言語 language (Languages): ロードする学習済みモデルの対象言語
pretrained_model_name_or_path (Optional[str]): ロードする学習済みモデルの名前またはパス。指定しない場合はデフォルトのパスが利用される (デフォルト: None) pretrained_model_name_or_path (Optional[str]): ロードする学習済みモデルの名前またはパス。指定しない場合はデフォルトのパスが利用される (デフォルト: None)
cache_dir (Optional[str]): モデルのキャッシュディレクトリ。指定しない場合はデフォルトのキャッシュディレクトリが利用される (デフォルト: None)
revision (str): モデルの Hugging Face 上の Git リビジョン。指定しない場合は最新の main ブランチの内容が利用される (デフォルト: None)
Returns: Returns:
Union[PreTrainedModel, DebertaV2Model]: ロード済みの BERT モデル Union[PreTrainedModel, DebertaV2Model]: ロード済みの BERT モデル
@@ -75,10 +80,14 @@ def load_model(
if language == Languages.EN: if language == Languages.EN:
model = cast( model = cast(
DebertaV2Model, DebertaV2Model,
DebertaV2Model.from_pretrained(pretrained_model_name_or_path), DebertaV2Model.from_pretrained(
pretrained_model_name_or_path, cache_dir=cache_dir, revision=revision
),
) )
else: else:
model = AutoModelForMaskedLM.from_pretrained(pretrained_model_name_or_path) model = AutoModelForMaskedLM.from_pretrained(
pretrained_model_name_or_path, cache_dir=cache_dir, revision=revision
)
__loaded_models[language] = model __loaded_models[language] = model
logger.info( logger.info(
f"Loaded the {language} BERT model from {pretrained_model_name_or_path}" f"Loaded the {language} BERT model from {pretrained_model_name_or_path}"
@@ -90,12 +99,15 @@ def load_model(
def load_tokenizer( def load_tokenizer(
language: Languages, language: Languages,
pretrained_model_name_or_path: Optional[str] = None, pretrained_model_name_or_path: Optional[str] = None,
cache_dir: Optional[str] = None,
revision: str = "main",
) -> Union[PreTrainedTokenizer, PreTrainedTokenizerFast, DebertaV2Tokenizer]: ) -> Union[PreTrainedTokenizer, PreTrainedTokenizerFast, DebertaV2Tokenizer]:
""" """
指定された言語の BERT モデルをロードし、ロード済みの BERT トークナイザーを返す。 指定された言語の BERT モデルをロードし、ロード済みの BERT トークナイザーを返す。
一度ロードされていれば、ロード済みの BERT トークナイザーを即座に返す。 一度ロードされていれば、ロード済みの BERT トークナイザーを即座に返す。
ライブラリ利用時は常に pretrain_model_name_or_path (Hugging Face のリポジトリ名 or ローカルのファイルパス) を指定する必要がある。 ライブラリ利用時は常に必ず pretrain_model_name_or_path (Hugging Face のリポジトリ名 or ローカルのファイルパス) を指定する必要がある。
ロードにはそれなりに時間がかかるため、ライブラリ利用前に明示的に pretrained_model_name_or_path を指定してロードしておくべき。 ロードにはそれなりに時間がかかるため、ライブラリ利用前に明示的に pretrained_model_name_or_path を指定してロードしておくべき。
cache_dir と revision は pretrain_model_name_or_path がリポジトリ名の場合のみ有効。
Style-Bert-VITS2 では、BERT モデルに下記の 3 つが利用されている。 Style-Bert-VITS2 では、BERT モデルに下記の 3 つが利用されている。
これ以外の BERT モデルを指定した場合は正常に動作しない可能性が高い。 これ以外の BERT モデルを指定した場合は正常に動作しない可能性が高い。
@@ -106,6 +118,8 @@ def load_tokenizer(
Args: Args:
language (Languages): ロードする学習済みモデルの対象言語 language (Languages): ロードする学習済みモデルの対象言語
pretrained_model_name_or_path (Optional[str]): ロードする学習済みモデルの名前またはパス。指定しない場合はデフォルトのパスが利用される (デフォルト: None) pretrained_model_name_or_path (Optional[str]): ロードする学習済みモデルの名前またはパス。指定しない場合はデフォルトのパスが利用される (デフォルト: None)
cache_dir (Optional[str]): モデルのキャッシュディレクトリ。指定しない場合はデフォルトのキャッシュディレクトリが利用される (デフォルト: None)
revision (str): モデルの Hugging Face 上の Git リビジョン。指定しない場合は最新の main ブランチの内容が利用される (デフォルト: None)
Returns: Returns:
Union[PreTrainedTokenizer, PreTrainedTokenizerFast, DebertaV2Tokenizer]: ロード済みの BERT トークナイザー Union[PreTrainedTokenizer, PreTrainedTokenizerFast, DebertaV2Tokenizer]: ロード済みの BERT トークナイザー
@@ -125,9 +139,17 @@ def load_tokenizer(
# BERT トークナイザーをロードし、辞書に格納して返す # BERT トークナイザーをロードし、辞書に格納して返す
## 英語のみ DebertaV2Tokenizer でロードする必要がある ## 英語のみ DebertaV2Tokenizer でロードする必要がある
if language == Languages.EN: if language == Languages.EN:
tokenizer = DebertaV2Tokenizer.from_pretrained(pretrained_model_name_or_path) tokenizer = DebertaV2Tokenizer.from_pretrained(
pretrained_model_name_or_path,
cache_dir=cache_dir,
revision=revision,
)
else: else:
tokenizer = AutoTokenizer.from_pretrained(pretrained_model_name_or_path) tokenizer = AutoTokenizer.from_pretrained(
pretrained_model_name_or_path,
cache_dir=cache_dir,
revision=revision,
)
__loaded_tokenizers[language] = tokenizer __loaded_tokenizers[language] = tokenizer
logger.info( logger.info(
f"Loaded the {language} BERT tokenizer from {pretrained_model_name_or_path}" f"Loaded the {language} BERT tokenizer from {pretrained_model_name_or_path}"

View File

@@ -8,10 +8,10 @@ from style_bert_vits2.nlp.chinese.tone_sandhi import ToneSandhi
from style_bert_vits2.nlp.symbols import PUNCTUATIONS from style_bert_vits2.nlp.symbols import PUNCTUATIONS
__PINYIN_TO_SYMBOL_MAP = { with open(Path(__file__).parent / "opencpop-strict.txt", "r", encoding="utf-8") as f:
line.split("\t")[0]: line.strip().split("\t")[1] __PINYIN_TO_SYMBOL_MAP = {
for line in open(Path(__file__).parent / "opencpop-strict.txt").readlines() line.split("\t")[0]: line.strip().split("\t")[1] for line in f.readlines()
} }
def g2p(text: str) -> tuple[list[str], list[int], list[int]]: def g2p(text: str) -> tuple[list[str], list[int], list[int]]:

View File

@@ -20,7 +20,7 @@ def get_dict() -> dict[str, list[list[str]]]:
def read_dict() -> dict[str, list[list[str]]]: def read_dict() -> dict[str, list[list[str]]]:
g2p_dict = {} g2p_dict = {}
start_line = 49 start_line = 49
with open(CMU_DICT_PATH) as f: with open(CMU_DICT_PATH, "r", encoding="utf-8") as f:
line = f.readline() line = f.readline()
line_index = 1 line_index = 1
while line: while line:

View File

@@ -73,7 +73,7 @@ if __name__ == "__main__":
device = config.style_gen_config.device device = config.style_gen_config.device
training_lines: list[str] = [] training_lines: list[str] = []
with open(hps.data.training_files, encoding="utf-8") as f: with open(hps.data.training_files, "r", encoding="utf-8") as f:
training_lines.extend(f.readlines()) training_lines.extend(f.readlines())
with ThreadPoolExecutor(max_workers=num_processes) as executor: with ThreadPoolExecutor(max_workers=num_processes) as executor:
training_results = list( training_results = list(
@@ -94,7 +94,7 @@ if __name__ == "__main__":
) )
val_lines: list[str] = [] val_lines: list[str] = []
with open(hps.data.validation_files, encoding="utf-8") as f: with open(hps.data.validation_files, "r", encoding="utf-8") as f:
val_lines.extend(f.readlines()) val_lines.extend(f.readlines())
with ThreadPoolExecutor(max_workers=num_processes) as executor: with ThreadPoolExecutor(max_workers=num_processes) as executor:

View File

@@ -47,11 +47,11 @@ def merge_style(model_name_a, model_name_b, weight, output_name, style_triple_li
os.path.join(assets_root, model_name_b, "style_vectors.npy") os.path.join(assets_root, model_name_b, "style_vectors.npy")
) # (style_num_b, 256) ) # (style_num_b, 256)
with open( with open(
os.path.join(assets_root, model_name_a, "config.json"), encoding="utf-8" os.path.join(assets_root, model_name_a, "config.json"), "r", encoding="utf-8"
) as f: ) as f:
config_a = json.load(f) config_a = json.load(f)
with open( with open(
os.path.join(assets_root, model_name_b, "config.json"), encoding="utf-8" os.path.join(assets_root, model_name_b, "config.json"), "r", encoding="utf-8"
) as f: ) as f:
config_b = json.load(f) config_b = json.load(f)
style2id_a = config_a["data"]["style2id"] style2id_a = config_a["data"]["style2id"]
@@ -88,7 +88,7 @@ def merge_style(model_name_a, model_name_b, weight, output_name, style_triple_li
# recipe.jsonを読み込んで、style_triple_listを追記 # recipe.jsonを読み込んで、style_triple_listを追記
info_path = os.path.join(assets_root, output_name, "recipe.json") info_path = os.path.join(assets_root, output_name, "recipe.json")
if os.path.exists(info_path): if os.path.exists(info_path):
with open(info_path, encoding="utf-8") as f: with open(info_path, "r", encoding="utf-8") as f:
info = json.load(f) info = json.load(f)
else: else:
info = {} info = {}
@@ -261,12 +261,12 @@ def update_two_model_names_dropdown(model_holder: TTSModelHolder):
def load_styles_gr(model_name_a, model_name_b): def load_styles_gr(model_name_a, model_name_b):
config_path_a = os.path.join(assets_root, model_name_a, "config.json") config_path_a = os.path.join(assets_root, model_name_a, "config.json")
with open(config_path_a, encoding="utf-8") as f: with open(config_path_a, "r", encoding="utf-8") as f:
config_a = json.load(f) config_a = json.load(f)
styles_a = list(config_a["data"]["style2id"].keys()) styles_a = list(config_a["data"]["style2id"].keys())
config_path_b = os.path.join(assets_root, model_name_b, "config.json") config_path_b = os.path.join(assets_root, model_name_b, "config.json")
with open(config_path_b, encoding="utf-8") as f: with open(config_path_b, "r", encoding="utf-8") as f:
config_b = json.load(f) config_b = json.load(f)
styles_b = list(config_b["data"]["style2id"].keys()) styles_b = list(config_b["data"]["style2id"].keys())