From 308fd190f368077287ce230125e52e8834fce687 Mon Sep 17 00:00:00 2001 From: wataru Date: Fri, 28 Apr 2023 06:39:51 +0900 Subject: [PATCH] WIP: refactoring --- server/.vscode/settings.json | 2 +- server/Exceptions.py | 7 +- server/const.py | 52 +++++++++-- server/restapi/MMVC_Rest_Fileuploader.py | 79 +++++------------ server/sio/MMVC_Namespace.py | 1 - server/tmp.wav | Bin 111660 -> 0 bytes server/tmp2.wav | Bin 71724 -> 0 bytes server/voice_changer/RVC/RVC.py | 73 ++++++++-------- server/voice_changer/RVC/const.py | 8 -- server/voice_changer/VoiceChanger.py | 81 +++++++----------- server/voice_changer/VoiceChangerManager.py | 8 +- server/voice_changer/utils/LoadModelParams.py | 19 ++++ .../voice_changer/utils/VoiceChangerModel.py | 30 +++++-- 13 files changed, 182 insertions(+), 178 deletions(-) delete mode 100644 server/tmp.wav delete mode 100644 server/tmp2.wav create mode 100644 server/voice_changer/utils/LoadModelParams.py diff --git a/server/.vscode/settings.json b/server/.vscode/settings.json index 88a7b800..810d061e 100644 --- a/server/.vscode/settings.json +++ b/server/.vscode/settings.json @@ -9,7 +9,7 @@ "editor.formatOnSave": true // ファイル保存時に自動フォーマット }, "flake8.args": [ - "--ignore=E501" + "--ignore=E501,E402,W503" // "--max-line-length=150", // "--max-complexity=20" ] diff --git a/server/Exceptions.py b/server/Exceptions.py index 82819c8d..2fc4a21e 100644 --- a/server/Exceptions.py +++ b/server/Exceptions.py @@ -1,12 +1,13 @@ - class NoModeLoadedException(Exception): def __init__(self, framework): self.framework = framework def __str__(self): - return repr(f"No model for {self.framework} loaded. Please confirm the model uploaded.") + return repr( + f"No model for {self.framework} loaded. Please confirm the model uploaded." + ) class ONNXInputArgumentException(Exception): def __str__(self): - return repr(f"ONNX received invalid argument.") + return repr("ONNX received invalid argument.") diff --git a/server/const.py b/server/const.py index fe877166..7f8e406c 100644 --- a/server/const.py +++ b/server/const.py @@ -4,7 +4,15 @@ import tempfile from typing import Literal, TypeAlias -ModelType: TypeAlias = Literal['MMVCv15', 'MMVCv13', 'so-vits-svc-40v2', 'so-vits-svc-40', 'so-vits-svc-40_c', 'DDSP-SVC', 'RVC'] +ModelType: TypeAlias = Literal[ + "MMVCv15", + "MMVCv13", + "so-vits-svc-40v2", + "so-vits-svc-40", + "so-vits-svc-40_c", + "DDSP-SVC", + "RVC", +] ERROR_NO_ONNX_SESSION = "ERROR_NO_ONNX_SESSION" @@ -13,19 +21,45 @@ tmpdir = tempfile.TemporaryDirectory() # print("generate tmpdir:::",tmpdir) SSL_KEY_DIR = os.path.join(tmpdir.name, "keys") if hasattr(sys, "_MEIPASS") else "keys" MODEL_DIR = os.path.join(tmpdir.name, "logs") if hasattr(sys, "_MEIPASS") else "logs" -UPLOAD_DIR = os.path.join(tmpdir.name, "upload_dir") if hasattr(sys, "_MEIPASS") else "upload_dir" -NATIVE_CLIENT_FILE_WIN = os.path.join(sys._MEIPASS, "voice-changer-native-client.exe") if hasattr(sys, "_MEIPASS") else "voice-changer-native-client" -NATIVE_CLIENT_FILE_MAC = os.path.join(sys._MEIPASS, "voice-changer-native-client.app", "Contents", "MacOS", - "voice-changer-native-client") if hasattr(sys, "_MEIPASS") else "voice-changer-native-client" +UPLOAD_DIR = ( + os.path.join(tmpdir.name, "upload_dir") + if hasattr(sys, "_MEIPASS") + else "upload_dir" +) +NATIVE_CLIENT_FILE_WIN = ( + os.path.join(sys._MEIPASS, "voice-changer-native-client.exe") # type: ignore + if hasattr(sys, "_MEIPASS") + else "voice-changer-native-client" +) +NATIVE_CLIENT_FILE_MAC = ( + os.path.join( + sys._MEIPASS, # type: ignore + "voice-changer-native-client.app", + "Contents", + "MacOS", + "voice-changer-native-client", + ) + if hasattr(sys, "_MEIPASS") + else "voice-changer-native-client" +) -HUBERT_ONNX_MODEL_PATH = os.path.join(sys._MEIPASS, "model_hubert/hubert_simple.onnx") if hasattr(sys, - "_MEIPASS") else "model_hubert/hubert_simple.onnx" +HUBERT_ONNX_MODEL_PATH = ( + os.path.join(sys._MEIPASS, "model_hubert/hubert_simple.onnx") # type: ignore + if hasattr(sys, "_MEIPASS") + else "model_hubert/hubert_simple.onnx" +) -TMP_DIR = os.path.join(tmpdir.name, "tmp_dir") if hasattr(sys, "_MEIPASS") else "tmp_dir" +TMP_DIR = ( + os.path.join(tmpdir.name, "tmp_dir") if hasattr(sys, "_MEIPASS") else "tmp_dir" +) os.makedirs(TMP_DIR, exist_ok=True) def getFrontendPath(): - frontend_path = os.path.join(sys._MEIPASS, "dist") if hasattr(sys, "_MEIPASS") else "../client/demo/dist" + frontend_path = ( + os.path.join(sys._MEIPASS, "dist") + if hasattr(sys, "_MEIPASS") + else "../client/demo/dist" + ) return frontend_path diff --git a/server/restapi/MMVC_Rest_Fileuploader.py b/server/restapi/MMVC_Rest_Fileuploader.py index fa1b5a93..a0b247eb 100644 --- a/server/restapi/MMVC_Rest_Fileuploader.py +++ b/server/restapi/MMVC_Rest_Fileuploader.py @@ -10,6 +10,9 @@ from restapi.mods.FileUploader import upload_file, concat_file_chunks from voice_changer.VoiceChangerManager import VoiceChangerManager from const import MODEL_DIR, UPLOAD_DIR, ModelType +from voice_changer.utils.LoadModelParams import FilePaths, LoadModelParams + +from dataclasses import fields os.makedirs(UPLOAD_DIR, exist_ok=True) os.makedirs(MODEL_DIR, exist_ok=True) @@ -30,12 +33,6 @@ class MMVC_Rest_Fileuploader: "/update_settings", self.post_update_settings, methods=["POST"] ) self.router.add_api_route("/load_model", self.post_load_model, methods=["POST"]) - self.router.add_api_route( - "/load_model_for_train", self.post_load_model_for_train, methods=["POST"] - ) - self.router.add_api_route( - "/extract_voices", self.post_extract_voices, methods=["POST"] - ) self.router.add_api_route("/model_type", self.post_model_type, methods=["POST"]) self.router.add_api_route("/model_type", self.get_model_type, methods=["GET"]) self.router.add_api_route("/onnx", self.get_onnx, methods=["GET"]) @@ -80,74 +77,42 @@ class MMVC_Rest_Fileuploader: isHalf: bool = Form(...), params: str = Form(...), ): - props = { - "slot": slot, - "isHalf": isHalf, - "files": { - "configFilename": configFilename, - "pyTorchModelFilename": pyTorchModelFilename, - "onnxModelFilename": onnxModelFilename, - "clusterTorchModelFilename": clusterTorchModelFilename, - "featureFilename": featureFilename, - "indexFilename": indexFilename, - }, - "params": params, - } + files = FilePaths( + configFilename=configFilename, + pyTorchModelFilename=pyTorchModelFilename, + onnxModelFilename=onnxModelFilename, + clusterTorchModelFilename=clusterTorchModelFilename, + featureFilename=featureFilename, + indexFilename=indexFilename, + ) + props: LoadModelParams = LoadModelParams( + slot=slot, isHalf=isHalf, params=params, files=files + ) + # Change Filepath - for key, val in props["files"].items(): + for field in fields(props.files): + key = field.name + val = getattr(props.files, key) if val != "-": uploadPath = os.path.join(UPLOAD_DIR, val) storeDir = os.path.join(UPLOAD_DIR, f"{slot}") os.makedirs(storeDir, exist_ok=True) storePath = os.path.join(storeDir, val) shutil.move(uploadPath, storePath) - props["files"][key] = storePath + setattr(props.files, key, storePath) else: - props["files"][key] = None - # print("---------------------------------------------------2>", props) + setattr(props.files, key, None) info = self.voiceChangerManager.loadModel(props) json_compatible_item_data = jsonable_encoder(info) return JSONResponse(content=json_compatible_item_data) - # return {"load": f"{configFilePath}, {pyTorchModelFilePath}, {onnxModelFilePath}"} - def post_load_model_for_train( - self, - modelGFilename: str = Form(...), - modelGFilenameChunkNum: int = Form(...), - modelDFilename: str = Form(...), - modelDFilenameChunkNum: int = Form(...), - ): - modelGFilePath = concat_file_chunks( - UPLOAD_DIR, modelGFilename, modelGFilenameChunkNum, MODEL_DIR - ) - modelDFilePath = concat_file_chunks( - UPLOAD_DIR, modelDFilename, modelDFilenameChunkNum, MODEL_DIR - ) - return {"File saved": f"{modelGFilePath}, {modelDFilePath}"} - - def post_extract_voices( - self, - zipFilename: str = Form(...), - zipFileChunkNum: int = Form(...), - ): - zipFilePath = concat_file_chunks( - UPLOAD_DIR, zipFilename, zipFileChunkNum, UPLOAD_DIR - ) - shutil.unpack_archive(zipFilePath, "MMVC_Trainer/dataset/textful/") - return {"Zip file unpacked": f"{zipFilePath}"} - - def post_model_type( - self, - modelType: ModelType = Form(...), - ): + def post_model_type(self, modelType: ModelType = Form(...)): info = self.voiceChangerManager.switchModelType(modelType) json_compatible_item_data = jsonable_encoder(info) return JSONResponse(content=json_compatible_item_data) - def get_model_type( - self, - ): + def get_model_type(self): info = self.voiceChangerManager.getModelType() json_compatible_item_data = jsonable_encoder(info) return JSONResponse(content=json_compatible_item_data) diff --git a/server/sio/MMVC_Namespace.py b/server/sio/MMVC_Namespace.py index f19293f6..ce4088f7 100644 --- a/server/sio/MMVC_Namespace.py +++ b/server/sio/MMVC_Namespace.py @@ -30,7 +30,6 @@ class MMVC_Namespace(socketio.AsyncNamespace): else: unpackedData = np.array(struct.unpack('<%sh' % (len(data) // struct.calcsize('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 PG6wEk)VW4+!rRTF*K&IN diff --git a/server/tmp2.wav b/server/tmp2.wav deleted file mode 100644 index 3bc5ea9c5d78c2b810c35b31a77acac8b10d716d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71724 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 self.gpu_num: self.settings.gpu = 0 @@ -345,7 +344,7 @@ class RVC: key == "gpu" and val >= 0 and val < self.gpu_num - and self.onnx_session != None + and self.onnx_session is not None ): providers = self.onnx_session.get_providers() print("Providers:", providers) @@ -374,11 +373,11 @@ class RVC: data = asdict(self.settings) data["onnxExecutionProviders"] = ( - self.onnx_session.get_providers() if self.onnx_session != None else [] + self.onnx_session.get_providers() if self.onnx_session is not None else [] ) files = ["configFile", "pyTorchModelFile", "onnxModelFile"] for f in files: - if data[f] != None and os.path.exists(data[f]): + if data[f] is not None and os.path.exists(data[f]): data[f] = os.path.basename(data[f]) else: data[f] = "" @@ -477,7 +476,7 @@ class RVC: return result def _pyTorch_inference(self, data): - if hasattr(self, "net_g") == False or self.net_g == None: + if hasattr(self, "net_g") is False or self.net_g is None: print( "[Voice Changer] No pyTorch session.", hasattr(self, "net_g"), @@ -485,7 +484,7 @@ class RVC: ) raise NoModeLoadedException("pytorch") - if self.settings.gpu < 0 or (self.gpu_num == 0 and self.mps_enabled == False): + if self.settings.gpu < 0 or (self.gpu_num == 0 and self.mps_enabled is False): dev = torch.device("cpu") elif self.mps_enabled: dev = torch.device("mps") diff --git a/server/voice_changer/RVC/const.py b/server/voice_changer/RVC/const.py index 561b9d4e..205a9ef3 100644 --- a/server/voice_changer/RVC/const.py +++ b/server/voice_changer/RVC/const.py @@ -1,10 +1,2 @@ -# RVC_MODEL_TYPE_NORMAL = 0 -# RVC_MODEL_TYPE_PITCHLESS = 1 -# RVC_MODEL_TYPE_WEBUI_256_NORMAL = 2 -# RVC_MODEL_TYPE_WEBUI_256_PITCHLESS = 3 -# RVC_MODEL_TYPE_WEBUI_768_NORMAL = 4 -# RVC_MODEL_TYPE_WEBUI_768_PITCHLESS = 5 -# RVC_MODEL_TYPE_UNKNOWN = 99 - RVC_MODEL_TYPE_RVC = 0 RVC_MODEL_TYPE_WEBUI = 1 diff --git a/server/voice_changer/VoiceChanger.py b/server/voice_changer/VoiceChanger.py index f60045ec..f38aa4e0 100755 --- a/server/voice_changer/VoiceChanger.py +++ b/server/voice_changer/VoiceChanger.py @@ -1,4 +1,4 @@ -from typing import Any, Callable, Optional, Protocol, TypeAlias, Union, cast +from typing import Any, Union, cast from const import TMP_DIR, ModelType import torch import os @@ -9,6 +9,7 @@ import resampy from voice_changer.IORecorder import IORecorder +from voice_changer.utils.LoadModelParams import LoadModelParams from voice_changer.utils.Timer import Timer from voice_changer.utils.VoiceChangerModel import VoiceChangerModel, AudioInOut @@ -24,8 +25,6 @@ providers = [ STREAM_INPUT_FILE = os.path.join(TMP_DIR, "in.wav") STREAM_OUTPUT_FILE = os.path.join(TMP_DIR, "out.wav") -STREAM_ANALYZE_FILE_DIO = os.path.join(TMP_DIR, "analyze-dio.png") -STREAM_ANALYZE_FILE_HARVEST = os.path.join(TMP_DIR, "analyze-harvest.png") @dataclass @@ -51,18 +50,20 @@ class VoiceChangerSettings: class VoiceChanger: settings: VoiceChangerSettings voiceChanger: VoiceChangerModel + ioRecorder: IORecorder + sola_buffer: AudioInOut def __init__(self, params: VoiceChangerParams): # 初期化 self.settings = VoiceChangerSettings() self.onnx_session = None - self.currentCrossFadeOffsetRate = 0 - self.currentCrossFadeEndRate = 0 + self.currentCrossFadeOffsetRate = 0.0 + self.currentCrossFadeEndRate = 0.0 self.currentCrossFadeOverlapSize = 0 # setting self.crossfadeSize = 0 # calculated self.voiceChanger = None - self.modelType = None + self.modelType: ModelType | None = None self.params = params self.gpu_num = torch.cuda.device_count() self.prev_audio = np.zeros(4096) @@ -76,7 +77,7 @@ class VoiceChanger: ) def switchModelType(self, modelType: ModelType): - if hasattr(self, "voiceChanger") and self.voiceChanger != None: + if hasattr(self, "voiceChanger") and self.voiceChanger is not None: # return {"status": "ERROR", "msg": "vc is already selected. currently re-select is not implemented"} del self.voiceChanger self.voiceChanger = None @@ -114,34 +115,18 @@ class VoiceChanger: return {"status": "OK", "msg": "vc is switched."} def getModelType(self): - if self.modelType != None: + if self.modelType is not None: return {"status": "OK", "vc": self.modelType} else: return {"status": "OK", "vc": "none"} - def loadModel( - self, - props, - ): + def loadModel(self, props: LoadModelParams): try: return self.voiceChanger.loadModel(props) except Exception as e: print("[Voice Changer] Model Load Error! Check your model is valid.", e) return {"status": "NG"} - # try: - # if self.modelType == "MMVCv15" or self.modelType == "MMVCv13": - # return self.voiceChanger.loadModel(config, pyTorch_model_file, onnx_model_file) - # elif self.modelType == "so-vits-svc-40" or self.modelType == "so-vits-svc-40_c" or self.modelType == "so-vits-svc-40v2": - # return self.voiceChanger.loadModel(config, pyTorch_model_file, onnx_model_file, clusterTorchModel) - # elif self.modelType == "RVC": - # return self.voiceChanger.loadModel(slot, config, pyTorch_model_file, onnx_model_file, feature_file, index_file, is_half) - # else: - # return self.voiceChanger.loadModel(config, pyTorch_model_file, onnx_model_file, clusterTorchModel) - # except Exception as e: - # print("[Voice Changer] Model Load Error! Check your model is valid.", e) - # return {"status": "NG"} - def get_info(self): data = asdict(self.settings) if hasattr(self, "voiceChanger"): @@ -167,14 +152,6 @@ class VoiceChanger: if hasattr(self, "ioRecorder"): self.ioRecorder.close() - # if hasattr(self, "ioAnalyzer") == False: - # self.ioAnalyzer = IOAnalyzer() - - # try: - # self.ioAnalyzer.analyze(STREAM_INPUT_FILE, STREAM_ANALYZE_FILE_DIO, STREAM_ANALYZE_FILE_HARVEST, self.settings.inputSampleRate) - - # except Exception as e: - # print("recordIO exception", e) elif key in self.settings.floatData: setattr(self.settings, key, float(val)) elif key in self.settings.strData: @@ -182,10 +159,10 @@ class VoiceChanger: else: if hasattr(self, "voiceChanger"): ret = self.voiceChanger.update_settings(key, val) - if ret == False: + if ret is False: print(f"{key} is not mutable variable or unknown variable!") else: - print(f"voice changer is not initialized!") + print("voice changer is not initialized!") return self.get_info() def _generate_strength(self, crossfadeSize: int): @@ -228,9 +205,9 @@ class VoiceChanger: ) # ひとつ前の結果とサイズが変わるため、記録は消去する。 - if hasattr(self, "np_prev_audio1") == True: + if hasattr(self, "np_prev_audio1") is True: delattr(self, "np_prev_audio1") - if hasattr(self, "sola_buffer"): + if hasattr(self, "sola_buffer") is True: del self.sola_buffer # receivedData: tuple of short @@ -275,9 +252,14 @@ class VoiceChanger: # Inference audio = self.voiceChanger.inference(data) - if hasattr(self, "sola_buffer") == True: + if hasattr(self, "sola_buffer") is True: np.set_printoptions(threshold=10000) - audio = audio[-sola_search_frame - crossfade_frame - block_frame :] + audio_offset = -1 * ( + sola_search_frame + crossfade_frame + block_frame + ) + audio = audio[audio_offset:] + a = 0 + audio = audio[a:] # SOLA algorithm from https://github.com/yxlllc/DDSP-SVC, https://github.com/liujing04/Retrieval-based-Voice-Conversion-WebUI cor_nom = np.convolve( audio[: crossfade_frame + sola_search_frame], @@ -292,11 +274,9 @@ class VoiceChanger: ) + 1e-3 ) - sola_offset = np.argmax(cor_nom / cor_den) - - output_wav = audio[sola_offset : sola_offset + block_frame].astype( - np.float64 - ) + sola_offset = int(np.argmax(cor_nom / cor_den)) + sola_end = sola_offset + block_frame + output_wav = audio[sola_offset:sola_end].astype(np.float64) output_wav[:crossfade_frame] *= self.np_cur_strength output_wav[:crossfade_frame] += self.sola_buffer[:] @@ -306,15 +286,12 @@ class VoiceChanger: result = np.zeros(4096).astype(np.int16) if ( - hasattr(self, "sola_buffer") == True + hasattr(self, "sola_buffer") is True and sola_offset < sola_search_frame ): - sola_buf_org = audio[ - -sola_search_frame - - crossfade_frame - + sola_offset : -sola_search_frame - + sola_offset - ] + offset = -1 * (sola_search_frame + crossfade_frame - sola_offset) + end = -1 * (sola_search_frame - sola_offset) + sola_buf_org = audio[offset:end] self.sola_buffer = sola_buf_org * self.np_prev_strength else: self.sola_buffer = audio[-crossfade_frame:] * self.np_prev_strength @@ -379,7 +356,7 @@ PRINT_CONVERT_PROCESSING: bool = False def print_convert_processing(mess: str): - if PRINT_CONVERT_PROCESSING == True: + if PRINT_CONVERT_PROCESSING is True: print(mess) diff --git a/server/voice_changer/VoiceChangerManager.py b/server/voice_changer/VoiceChangerManager.py index 03bb6149..080afa7c 100644 --- a/server/voice_changer/VoiceChangerManager.py +++ b/server/voice_changer/VoiceChangerManager.py @@ -1,6 +1,8 @@ import numpy as np from voice_changer.VoiceChanger import VoiceChanger from const import ModelType +from voice_changer.utils.LoadModelParams import LoadModelParams +from voice_changer.utils.VoiceChangerModel import AudioInOut from voice_changer.utils.VoiceChangerParams import VoiceChangerParams @@ -15,7 +17,7 @@ class VoiceChangerManager(object): cls._instance.voiceChanger = VoiceChanger(params) return cls._instance - def loadModel(self, props): + def loadModel(self, props: LoadModelParams): info = self.voiceChanger.loadModel(props) if hasattr(info, "status") and info["status"] == "NG": return info @@ -31,7 +33,7 @@ class VoiceChangerManager(object): else: return {"status": "ERROR", "msg": "no model loaded"} - def update_settings(self, key: str, val: any): + def update_settings(self, key: str, val: str | int | float): if hasattr(self, "voiceChanger"): info = self.voiceChanger.update_settings(key, val) info["status"] = "OK" @@ -39,7 +41,7 @@ class VoiceChangerManager(object): else: return {"status": "ERROR", "msg": "no model loaded"} - def changeVoice(self, receivedData: any): + def changeVoice(self, receivedData: AudioInOut): if hasattr(self, "voiceChanger") is True: return self.voiceChanger.on_request(receivedData) else: diff --git a/server/voice_changer/utils/LoadModelParams.py b/server/voice_changer/utils/LoadModelParams.py new file mode 100644 index 00000000..dd99f8ec --- /dev/null +++ b/server/voice_changer/utils/LoadModelParams.py @@ -0,0 +1,19 @@ +from dataclasses import dataclass + + +@dataclass +class FilePaths: + configFilename: str + pyTorchModelFilename: str + onnxModelFilename: str + clusterTorchModelFilename: str + featureFilename: str + indexFilename: str + + +@dataclass +class LoadModelParams: + slot: int + isHalf: bool + files: FilePaths + params: str diff --git a/server/voice_changer/utils/VoiceChangerModel.py b/server/voice_changer/utils/VoiceChangerModel.py index cebe1a99..d2ca6410 100644 --- a/server/voice_changer/utils/VoiceChangerModel.py +++ b/server/voice_changer/utils/VoiceChangerModel.py @@ -1,14 +1,30 @@ -from typing import Any, Callable, Protocol, TypeAlias +from typing import Any, Protocol, TypeAlias import numpy as np +from voice_changer.utils.LoadModelParams import LoadModelParams + AudioInOut: TypeAlias = np.ndarray[Any, np.dtype[np.int16]] class VoiceChangerModel(Protocol): - loadModel: Callable[..., dict[str, Any]] - def get_processing_sampling_rate(self) -> int: ... - def get_info(self) -> dict[str, Any]: ... - def inference(self, data: tuple[Any, ...]) -> Any: ... - def generate_input(self, newData: AudioInOut, inputSize: int, crossfadeSize: int) -> tuple[Any, ...]: ... - def update_settings(self, key: str, val: Any) -> bool: ... + # loadModel: Callable[..., dict[str, Any]] + def loadModel(self, params: LoadModelParams): + ... + + def get_processing_sampling_rate(self) -> int: + ... + + def get_info(self) -> dict[str, Any]: + ... + + def inference(self, data: tuple[Any, ...]) -> Any: + ... + + def generate_input( + self, newData: AudioInOut, inputSize: int, crossfadeSize: int + ) -> tuple[Any, ...]: + ... + + def update_settings(self, key: str, val: Any) -> bool: + ...