from lib.singleton import Singleton class AppStatus(Singleton): """アプリケーションの状態を管理するシングルトンクラス""" def __init__(self): if hasattr(self, '_initialized') and self._initialized: return # すでに初期化済みなら何もしない self.status = {} self._initialized = True def reset(self): """状態をリセット""" self.status.clear() def set_status(self, key, value): self.status[key] = value def get_status(self, key, default=None): return self.status.get(key, default) @property def input_filepath(self)-> str: """入力音声ファイルのパス""" return self.get_status('input_filepath') @input_filepath.setter def input_filepath(self, value:str): """入力音声ファイルのパス""" self.set_status('input_filepath', value) @property def request_id(self) -> str: """リクエストID""" return self.get_status('request_id') @request_id.setter def request_id(self, value: str): """リクエストID""" self.set_status('request_id', value) @property def output_base_dir(self)-> str: """出力ディレクトリのベースパス""" return self.get_status('output_base_dir', default='.output') @output_base_dir.setter def output_base_dir(self, value:str): """出力ディレクトリのベースパス""" self.set_status('output_base_dir', value) @property def output_dir(self)-> str: """出力ディレクトリのパス""" output_dir = f"{self.output_base_dir}/{self.request_id}" return output_dir @property def source_dir(self)-> str: """ソースディレクトリのパス""" source_dir = f"{self.output_base_dir}/{self.request_id}/source" return source_dir @property def preprocess_dir(self)-> str: """前処理ディレクトリのパス""" preprocess_dir = f"{self.output_base_dir}/{self.request_id}/preprocess" return preprocess_dir @property def preprocess_index(self)-> int: """前処理のインデックス""" return self.get_status('preprocess_index', default=0) @preprocess_index.setter def preprocess_index(self, value:int): """前処理のインデックス""" self.set_status('preprocess_index', value) if value == 0: self.set_status('preprocess_inputfile', self.unified_file) @property def preprocess_inputfile(self)-> str: """前処理の入力ファイルのパス""" return self.get_status('preprocess_inputfile') @preprocess_inputfile.setter def preprocess_inputfile(self, value:str): """前処理の入力ファイルのパス""" self.set_status('preprocess_inputfile', value) @property def preprocess_outputfile(self)-> str: """前処理の出力ファイルのパス""" index = self.preprocess_index filename = f"preprocess_{index:02d}.wav" output_file = f"{self.preprocess_dir}/{filename}" return output_file @property def chunk_dir(self)-> str: """チャンクディレクトリのパス""" chunk_dir = f"{self.output_base_dir}/{self.request_id}/chunk" return chunk_dir @property def chunk_manifest(self)-> str: """チャンクマニフェストのパス""" return f"{self.chunk_dir}/chunks.manifest.json" @property def transcript_dir(self)-> str: """文字起こし結果ディレクトリのパス""" transcript_dir = f"{self.output_base_dir}/{self.request_id}/transcripts" return transcript_dir @property def source_file(self)-> str: """ソースファイルのパス""" return self.get_status('source_file') @source_file.setter def source_file(self, value:str): """ソースファイルのパス""" self.set_status('source_file', value) @property def unified_file(self)-> str: """統一ファイルのパス""" return f"{self.output_dir}/unified.wav" @property def diarization_file(self)-> str: """話者分離のJSONファイルのパス""" return f"{self.output_dir}/diarization.json"