Skip to content

Commit

Permalink
整理: UserDictionary メソッドへ関数を移植 (#1241)
Browse files Browse the repository at this point in the history
* refactor: `_apply_word()` を解体

* refactor: `_rewrite_word()` を解体

* refactor: `_delete_word()` を解体

* refactor: `_import_user_dict()` を解体
  • Loading branch information
tarepan authored May 17, 2024
1 parent 3b1bf09 commit 81a9360
Showing 1 changed file with 75 additions and 223 deletions.
298 changes: 75 additions & 223 deletions voicevox_engine/user_dict/user_dict.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,220 +257,6 @@ def _create_word(
)


def _apply_word(
surface: str,
pronunciation: str,
accent_type: int,
word_type: WordTypes | None,
priority: int | None,
default_dict_path: Path,
user_dict_path: Path,
compiled_dict_path: Path,
) -> str:
"""
新規単語の追加
Parameters
----------
surface : str
単語情報
pronunciation : str
単語情報
accent_type : int
単語情報
word_type : WordTypes | None
品詞
priority : int | None
優先度
default_dict_path: Path
デフォルト辞書ファイルのパス
user_dict_path : Path
ユーザー辞書ファイルのパス
compiled_dict_path : Path
コンパイル済み辞書ファイルのパス
Returns
-------
word_uuid : UserDictWord
追加された単語に発行されたUUID
"""
# 新規単語の追加による辞書データの更新
word = _create_word(
surface=surface,
pronunciation=pronunciation,
accent_type=accent_type,
word_type=word_type,
priority=priority,
)
user_dict = _read_dict(user_dict_path=user_dict_path)
word_uuid = str(uuid4())
user_dict[word_uuid] = word

# 更新された辞書データの保存と適用
_write_to_json(user_dict, user_dict_path)
_update_dict(
default_dict_path=default_dict_path,
user_dict_path=user_dict_path,
compiled_dict_path=compiled_dict_path,
)

return word_uuid


def _rewrite_word(
word_uuid: str,
surface: str,
pronunciation: str,
accent_type: int,
word_type: WordTypes | None,
priority: int | None,
default_dict_path: Path,
user_dict_path: Path,
compiled_dict_path: Path,
) -> None:
"""
既存単語の上書き更新
Parameters
----------
word_uuid : str
単語UUID
surface : str
単語情報
pronunciation : str
単語情報
accent_type : int
単語情報
word_type : WordTypes | None
品詞
priority : int | None
優先度
default_dict_path : Path
デフォルト辞書ファイルのパス
user_dict_path : Path
ユーザー辞書ファイルのパス
compiled_dict_path : Path
コンパイル済み辞書ファイルのパス
"""
word = _create_word(
surface=surface,
pronunciation=pronunciation,
accent_type=accent_type,
word_type=word_type,
priority=priority,
)

# 既存単語の上書きによる辞書データの更新
user_dict = _read_dict(user_dict_path=user_dict_path)
if word_uuid not in user_dict:
raise UserDictInputError("UUIDに該当するワードが見つかりませんでした")
user_dict[word_uuid] = word

# 更新された辞書データの保存と適用
_write_to_json(user_dict, user_dict_path)
_update_dict(
default_dict_path=default_dict_path,
user_dict_path=user_dict_path,
compiled_dict_path=compiled_dict_path,
)


def _delete_word(
word_uuid: str,
default_dict_path: Path,
user_dict_path: Path,
compiled_dict_path: Path,
) -> None:
"""
単語の削除
Parameters
----------
word_uuid : str
単語UUID
default_dict_path : Path
デフォルト辞書ファイルのパス
user_dict_path : Path
ユーザー辞書ファイルのパス
compiled_dict_path : Path
コンパイル済み辞書ファイルのパス
"""
# 既存単語の削除による辞書データの更新
user_dict = _read_dict(user_dict_path=user_dict_path)
if word_uuid not in user_dict:
raise UserDictInputError("IDに該当するワードが見つかりませんでした")
del user_dict[word_uuid]

# 更新された辞書データの保存と適用
_write_to_json(user_dict, user_dict_path)
_update_dict(
default_dict_path=default_dict_path,
user_dict_path=user_dict_path,
compiled_dict_path=compiled_dict_path,
)


def _import_user_dict(
dict_data: dict[str, UserDictWord],
override: bool,
user_dict_path: Path,
default_dict_path: Path,
compiled_dict_path: Path,
) -> None:
"""
ユーザー辞書のインポート
Parameters
----------
dict_data : dict[str, UserDictWord]
インポートするユーザー辞書のデータ
override : bool
重複したエントリがあった場合、上書きするかどうか
user_dict_path : Path
ユーザー辞書ファイルのパス
default_dict_path : Path
デフォルト辞書ファイルのパス
compiled_dict_path : Path
コンパイル済み辞書ファイルのパス
"""
# インポートする辞書データのバリデーション
for word_uuid, word in dict_data.items():
UUID(word_uuid)
assert isinstance(word, UserDictWord)
for pos_detail in part_of_speech_data.values():
if word.context_id == pos_detail.context_id:
assert word.part_of_speech == pos_detail.part_of_speech
assert (
word.part_of_speech_detail_1 == pos_detail.part_of_speech_detail_1
)
assert (
word.part_of_speech_detail_2 == pos_detail.part_of_speech_detail_2
)
assert (
word.part_of_speech_detail_3 == pos_detail.part_of_speech_detail_3
)
assert (
word.accent_associative_rule in pos_detail.accent_associative_rules
)
break
else:
raise ValueError("対応していない品詞です")

# 既存辞書の読み出し
old_dict = _read_dict(user_dict_path=user_dict_path)

# 辞書データの更新
# 重複エントリの上書き
if override:
new_dict = {**old_dict, **dict_data}
# 重複エントリの保持
else:
new_dict = {**dict_data, **old_dict}

# 更新された辞書データの保存と適用
_write_to_json(user_dict=new_dict, user_dict_path=user_dict_path)
_update_dict(
default_dict_path=default_dict_path,
user_dict_path=user_dict_path,
compiled_dict_path=compiled_dict_path,
)


def _search_cost_candidates(context_id: int) -> list[int]:
for value in part_of_speech_data.values():
if value.context_id == context_id:
Expand Down Expand Up @@ -540,11 +326,49 @@ def import_user_dict(
override : bool
重複したエントリがあった場合、上書きするかどうか
"""
_import_user_dict(
dict_data=dict_data,
override=override,
user_dict_path=self._user_dict_path,
# インポートする辞書データのバリデーション
for word_uuid, word in dict_data.items():
UUID(word_uuid)
assert isinstance(word, UserDictWord)
for pos_detail in part_of_speech_data.values():
if word.context_id == pos_detail.context_id:
assert word.part_of_speech == pos_detail.part_of_speech
assert (
word.part_of_speech_detail_1
== pos_detail.part_of_speech_detail_1
)
assert (
word.part_of_speech_detail_2
== pos_detail.part_of_speech_detail_2
)
assert (
word.part_of_speech_detail_3
== pos_detail.part_of_speech_detail_3
)
assert (
word.accent_associative_rule
in pos_detail.accent_associative_rules
)
break
else:
raise ValueError("対応していない品詞です")

# 既存辞書の読み出し
old_dict = _read_dict(user_dict_path=self._user_dict_path)

# 辞書データの更新
# 重複エントリの上書き
if override:
new_dict = {**old_dict, **dict_data}
# 重複エントリの保持
else:
new_dict = {**dict_data, **old_dict}

# 更新された辞書データの保存と適用
_write_to_json(user_dict=new_dict, user_dict_path=self._user_dict_path)
_update_dict(
default_dict_path=self._default_dict_path,
user_dict_path=self._user_dict_path,
compiled_dict_path=self._compiled_dict_path,
)

Expand Down Expand Up @@ -575,17 +399,28 @@ def apply_word(
word_uuid : UserDictWord
追加された単語に発行されたUUID
"""
return _apply_word(
# 新規単語の追加による辞書データの更新
word = _create_word(
surface=surface,
pronunciation=pronunciation,
accent_type=accent_type,
word_type=word_type,
priority=priority,
)
user_dict = _read_dict(user_dict_path=self._user_dict_path)
word_uuid = str(uuid4())
user_dict[word_uuid] = word

# 更新された辞書データの保存と適用
_write_to_json(user_dict, self._user_dict_path)
_update_dict(
default_dict_path=self._default_dict_path,
user_dict_path=self._user_dict_path,
compiled_dict_path=self._compiled_dict_path,
)

return word_uuid

def rewrite_word(
self,
word_uuid: str,
Expand All @@ -612,22 +447,39 @@ def rewrite_word(
priority : int | None
優先度
"""
_rewrite_word(
word_uuid=word_uuid,
word = _create_word(
surface=surface,
pronunciation=pronunciation,
accent_type=accent_type,
word_type=word_type,
priority=priority,
)

# 既存単語の上書きによる辞書データの更新
user_dict = _read_dict(user_dict_path=self._user_dict_path)
if word_uuid not in user_dict:
raise UserDictInputError("UUIDに該当するワードが見つかりませんでした")
user_dict[word_uuid] = word

# 更新された辞書データの保存と適用
_write_to_json(user_dict, self._user_dict_path)
_update_dict(
default_dict_path=self._default_dict_path,
user_dict_path=self._user_dict_path,
compiled_dict_path=self._compiled_dict_path,
)

def delete_word(self, word_uuid: str) -> None:
"""単語UUIDで指定された単語を削除する。"""
_delete_word(
word_uuid=word_uuid,
# 既存単語の削除による辞書データの更新
user_dict = _read_dict(user_dict_path=self._user_dict_path)
if word_uuid not in user_dict:
raise UserDictInputError("IDに該当するワードが見つかりませんでした")
del user_dict[word_uuid]

# 更新された辞書データの保存と適用
_write_to_json(user_dict, self._user_dict_path)
_update_dict(
default_dict_path=self._default_dict_path,
user_dict_path=self._user_dict_path,
compiled_dict_path=self._compiled_dict_path,
Expand Down

0 comments on commit 81a9360

Please sign in to comment.