Spaces:
Build error
Build error
File size: 2,381 Bytes
f1f433f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
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)
@property
def engine_speakers_path(self) -> Path:
return self._engine_speakers_path
@property
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
|