diff --git a/voicevox_engine/user_dict/user_dict.py b/voicevox_engine/user_dict/user_dict.py index b9b724519..29dd194c3 100644 --- a/voicevox_engine/user_dict/user_dict.py +++ b/voicevox_engine/user_dict/user_dict.py @@ -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: @@ -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, ) @@ -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, @@ -612,13 +447,23 @@ 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, @@ -626,8 +471,15 @@ def rewrite_word( 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,