Spaces:
Build error
Build error
| import json | |
| from pathlib import Path | |
| from typing import TYPE_CHECKING, Dict, List, Tuple | |
| from voicevox_engine.metas.Metas import CoreSpeaker, EngineSpeaker, Speaker, StyleInfo | |
| if TYPE_CHECKING: | |
| from voicevox_engine.synthesis_engine.synthesis_engine_base import ( | |
| SynthesisEngineBase, | |
| ) | |
| class MetasStore: | |
| """ | |
| 話者やスタイルのメタ情報を管理する | |
| """ | |
| def __init__(self, engine_speakers_path: Path) -> None: | |
| self._engine_speakers_path = engine_speakers_path | |
| self._loaded_metas: Dict[str, EngineSpeaker] = { | |
| folder.name: EngineSpeaker( | |
| **json.loads((folder / "metas.json").read_text(encoding="utf-8")) | |
| ) | |
| for folder in engine_speakers_path.iterdir() | |
| } | |
| def speaker_engine_metas(self, speaker_uuid: str) -> EngineSpeaker: | |
| return self.loaded_metas[speaker_uuid] | |
| def combine_metas(self, core_metas: List[CoreSpeaker]) -> List[Speaker]: | |
| """ | |
| 与えられたmetaにエンジンのコア情報を付加して返す | |
| core_metas: コアのmetas()が返すJSONのModel | |
| """ | |
| return [ | |
| Speaker( | |
| **self.speaker_engine_metas(speaker_meta.speaker_uuid).dict(), | |
| **speaker_meta.dict(), | |
| ) | |
| for speaker_meta in core_metas | |
| ] | |
| # FIXME: engineではなくList[CoreSpeaker]を渡す形にすることで | |
| # SynthesisEngineBaseによる循環importを修正する | |
| def load_combined_metas(self, engine: "SynthesisEngineBase") -> List[Speaker]: | |
| """ | |
| 与えられたエンジンから、コア・エンジン両方の情報を含んだMetasを返す | |
| """ | |
| core_metas = [CoreSpeaker(**speaker) for speaker in json.loads(engine.speakers)] | |
| return self.combine_metas(core_metas) | |
| def engine_speakers_path(self) -> Path: | |
| return self._engine_speakers_path | |
| def loaded_metas(self) -> Dict[str, EngineSpeaker]: | |
| return self._loaded_metas | |
| def construct_lookup(speakers: List[Speaker]) -> Dict[int, Tuple[Speaker, StyleInfo]]: | |
| """ | |
| `{style.id: StyleInfo}`の変換テーブル | |
| """ | |
| lookup_table = dict() | |
| for speaker in speakers: | |
| for style in speaker.styles: | |
| lookup_table[style.id] = (speaker, style) | |
| return lookup_table | |