| |
| """ |
| VOICEVOX user dictionary creation script. |
| Creates and saves a user dictionary with custom word pronunciations. |
| """ |
|
|
| import sys |
| from pathlib import Path |
|
|
| |
| project_root = Path(__file__).parent.parent |
| sys.path.insert(0, str(project_root)) |
|
|
| from voicevox_core import UserDictWord |
| from voicevox_core.blocking import UserDict |
| from yomitalk.utils.logger import logger |
|
|
|
|
| def create_user_dictionary(): |
| """Create a user dictionary with custom word pronunciations.""" |
|
|
| |
| VOICEVOX_BASE_PATH = Path("voicevox_core/voicevox_core") |
| VOICEVOX_DICT_PATH = VOICEVOX_BASE_PATH / "dict/open_jtalk_dic_utf_8-1.11" |
|
|
| |
| if not VOICEVOX_DICT_PATH.exists(): |
| logger.error(f"VOICEVOX dictionary path not found: {VOICEVOX_DICT_PATH}") |
| logger.error("Please run 'make download-voicevox-core' to set up VOICEVOX.") |
| return False |
|
|
| try: |
| |
| logger.info("Creating user dictionary...") |
| user_dict = UserDict() |
|
|
| |
| |
| entries = [ |
| ("RAG", "ラグ", 1, "PROPER_NOUN", 8), |
| ("yomitalk", "ヨミトーク", 3, "PROPER_NOUN", 8), |
| ("Claude", "クロード", 2, "PROPER_NOUN", 8), |
| ("AI", "エーアイ", 1, "COMMON_NOUN", 7), |
| ("API", "エーピーアイ", 1, "COMMON_NOUN", 7), |
| ("gpt", "ジーピーティー", 5, "PROPER_NOUN", 8), |
| ("GPT", "ジーピーティー", 5, "PROPER_NOUN", 8), |
| ("NVIDIA", "エヌビディア", 4, "PROPER_NOUN", 8), |
| ("GITHUB", "ギットハブ", 3, "PROPER_NOUN", 8), |
| ("GAFA", "ガーファ", 2, "PROPER_NOUN", 8), |
| ("速度場", "ソクドバ", 3, "COMMON_NOUN", 7), |
| ("DAPO", "ディーエーピーオー", 7, "PROPER_NOUN", 8), |
| ("LiDAR", "ライダー", 3, "PROPER_NOUN", 8), |
| ("SLAM", "スラム", 2, "PROPER_NOUN", 8), |
| ("Hz", "ヘルツ", 1, "COMMON_NOUN", 7), |
| ("KV", "ケーブイ", 2, "COMMON_NOUN", 7), |
| ("章", "ショウ", 1, "COMMON_NOUN", 7), |
| ("他に", "ホカニ", 2, "COMMON_NOUN", 6), |
| ("見せ所", "ミセドコロ", 4, "COMMON_NOUN", 7), |
| ("前頭", "ゼントウ", 2, "COMMON_NOUN", 8), |
| ("前頭前野", "ゼントウゼンヤ", 5, "COMMON_NOUN", 7), |
| ("前頭野", "ゼントウヤ", 3, "COMMON_NOUN", 7), |
| ("前頭葉", "ゼントウヨウ", 4, "COMMON_NOUN", 7), |
| ("前頭皮質", "ゼントウヒシツ", 5, "COMMON_NOUN", 7), |
| ("前頭部", "ゼントウブ", 3, "COMMON_NOUN", 7), |
| ("頭頂野", "トウチョウヤ", 3, "COMMON_NOUN", 7), |
| ("側頭野", "ソクトウヤ", 3, "COMMON_NOUN", 7), |
| ("後頭野", "コウトウヤ", 3, "COMMON_NOUN", 7), |
| ("海馬", "カイバ", 2, "COMMON_NOUN", 7), |
| ("扁桃体", "ヘントウタイ", 4, "COMMON_NOUN", 7), |
| ("視床", "シショウ", 2, "COMMON_NOUN", 7), |
| ("視床下部", "シショウカブ", 4, "COMMON_NOUN", 7), |
| ("大脳皮質", "ダイノウヒシツ", 5, "COMMON_NOUN", 7), |
| ("二分法", "ニブンホウ", 3, "COMMON_NOUN", 7), |
| ] |
|
|
| |
| logger.info("Adding dictionary entries...") |
| for surface, pronunciation, accent_type, word_type, priority in entries: |
| try: |
| user_dict_word = UserDictWord( |
| surface=surface, |
| pronunciation=pronunciation, |
| accent_type=accent_type, |
| word_type=word_type, |
| priority=priority, |
| ) |
| word_uuid = user_dict.add_word(user_dict_word) |
| logger.info(f"Added: '{surface}' -> '{pronunciation}' (accent: {accent_type}, type: {word_type}, priority: {priority}) UUID: {word_uuid}") |
| except Exception as e: |
| logger.error(f"Failed to add word '{surface}': {e}") |
|
|
| |
| dict_dir = Path("assets/dictionaries") |
| dict_dir.mkdir(parents=True, exist_ok=True) |
|
|
| |
| dict_file_path = dict_dir / "user_dictionary.json" |
| logger.info(f"Saving user dictionary to: {dict_file_path}") |
|
|
| user_dict.save(str(dict_file_path)) |
|
|
| logger.info(f"User dictionary saved successfully to {dict_file_path}") |
| logger.info(f"Dictionary contains {len(entries)} entries (including cognitive neuroscience terms)") |
|
|
| return True |
|
|
| except Exception as e: |
| logger.error(f"Error creating user dictionary: {e}") |
| return False |
|
|
|
|
| if __name__ == "__main__": |
| logger.info("VOICEVOX User Dictionary Creator") |
| logger.info("=" * 40) |
|
|
| success = create_user_dictionary() |
|
|
| if success: |
| logger.info("✅ User dictionary created successfully!") |
| logger.info("The dictionary file is saved in assets/dictionaries/user_dictionary.json") |
| else: |
| logger.error("❌ Failed to create user dictionary") |
| sys.exit(1) |
|
|