WIP:multi 2

This commit is contained in:
wataru 2023-04-16 09:56:12 +09:00
parent e1e1f94fa3
commit e2f08a17d4
8 changed files with 67 additions and 45 deletions

File diff suppressed because one or more lines are too long

View File

@ -110,10 +110,11 @@ export class ServerConfigurator {
}
// !! 注意!! hubertTorchModelは固定値で上書きされるため、設定しても効果ない。
loadModel = async (configFilename: string, pyTorchModelFilename: string | null, onnxModelFilename: string | null, clusterTorchModelFilename: string | null, featureFilename: string | null, indexFilename: string | null, isHalf: boolean) => {
loadModel = async (slot: number | null, configFilename: string, pyTorchModelFilename: string | null, onnxModelFilename: string | null, clusterTorchModelFilename: string | null, featureFilename: string | null, indexFilename: string | null, isHalf: boolean) => {
const url = this.serverUrl + "/load_model"
const info = new Promise<ServerInfo>(async (resolve) => {
const formData = new FormData();
formData.append("slot", "" + slot || "-");
formData.append("pyTorchModelFilename", pyTorchModelFilename || "-");
formData.append("onnxModelFilename", onnxModelFilename || "-");
formData.append("configFilename", configFilename);

View File

@ -282,6 +282,7 @@ export class VoiceChangerClient {
return this.configurator.concatUploadedFile(filename, chunkNum)
}
loadModel = (
slot: number | null,
configFilename: string,
pyTorchModelFilename: string | null,
onnxModelFilename: string | null,
@ -291,7 +292,7 @@ export class VoiceChangerClient {
isHalf: boolean
) => {
// !! 注意!! hubertTorchModelは固定値で上書きされるため、設定しても効果ない。
return this.configurator.loadModel(configFilename, pyTorchModelFilename, onnxModelFilename, clusterTorchModelFilename, featureFilename, indexFilename, isHalf)
return this.configurator.loadModel(slot, configFilename, pyTorchModelFilename, onnxModelFilename, clusterTorchModelFilename, featureFilename, indexFilename, isHalf)
}
//## Worklet ##//

View File

@ -256,6 +256,7 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
const configFileName = fileUploadSetting.configFile ? fileUploadSetting.configFile.filename || "-" : "-"
console.log("IS HALF", fileUploadSetting.isHalf)
const loadPromise = props.voiceChangerClient.loadModel(
0,
configFileName,
fileUploadSetting.pyTorchModel?.filename || null,
fileUploadSetting.onnxModel?.filename || null,

View File

@ -63,6 +63,20 @@ class MMVC_Rest_Fileuploader:
isHalf: bool = Form(...),
):
props = {
"slot": slot,
"isHalf": isHalf,
"files": {
"configFilename": configFilename,
"pyTorchModelFilename": pyTorchModelFilename,
"onnxModelFilename": onnxModelFilename,
"clusterTorchModelFilename": clusterTorchModelFilename,
"featureFilename": featureFilename,
"indexFilename": indexFilename
}
}
# print("---------------------------------------------------->", props)
# # Upload File Path
# pyTorchModelFilePath = os.path.join(UPLOAD_DIR, pyTorchModelFilename) if pyTorchModelFilename != "-" else None
# onnxModelFilePath = os.path.join(UPLOAD_DIR, onnxModelFilename) if onnxModelFilename != "-" else None
@ -85,22 +99,20 @@ class MMVC_Rest_Fileuploader:
# pyTorchModelStoredFilePath = os.path.join(UPLOAD_DIR, f"{slot}", pyTorchModelFilename)
# shutil.move(pyTorchModelFilePath, pyTorchModelStoredFilePath)
paths = []
for x in [pyTorchModelFilename, onnxModelFilename, configFilename, clusterTorchModelFilename, featureFilename, indexFilename]:
if x != "-":
uploadPath = os.path.join(UPLOAD_DIR, x)
# Change Filepath
for key, val in props["files"].items():
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, x)
storePath = os.path.join(storeDir, val)
shutil.move(uploadPath, storePath)
paths.push(storePath)
props["files"][key] = storePath
else:
paths.push(None)
pyTorchModelStoredFilePath, onnxModelStoredFilePath, configStoredFilePath, clusterTorchModelStoredFilePath, featureStoredFilePath, indexStoredFilePath = paths
props["files"][key] = None
# print("---------------------------------------------------2>", props)
info = self.voiceChangerManager.loadModel(slot, configStoredFilePath, pyTorchModelStoredFilePath, onnxModelStoredFilePath,
clusterTorchModelStoredFilePath, featureStoredFilePath, indexStoredFilePath,
isHalf)
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}"}

View File

@ -77,11 +77,19 @@ class RVC:
self.params = params
print("RVC initialization: ", params)
def loadModel(self, config: str, pyTorch_model_file: str = None, onnx_model_file: str = None, feature_file: str = None, index_file: str = None, is_half: bool = True):
self.settings.configFile = config
self.feature_file = feature_file
self.index_file = index_file
self.is_half = is_half
def loadModel(self, props):
self.settings.configFile = props["files"]["configFilename"]
self.settings.pyTorchModelFile = props["files"]["pyTorchModelFilename"]
self.settings.onnxModelFile = props["files"]["onnxModelFilename"]
self.feature_file = props["files"]["featureFilename"]
self.index_file = props["files"]["indexFilename"]
self.is_half = props["isHalf"]
self.slot = props["slot"]
print("[Voice Changer] RVC loading... slot:", self.slot)
try:
hubert_path = self.params["hubert"]
@ -95,14 +103,14 @@ class RVC:
except Exception as e:
print("EXCEPTION during loading hubert/contentvec model", e)
if pyTorch_model_file != None:
self.settings.pyTorchModelFile = pyTorch_model_file
if onnx_model_file:
self.settings.onnxModelFile = onnx_model_file
# if pyTorch_model_file != None:
# self.settings.pyTorchModelFile = pyTorch_model_file
# if onnx_model_file:
# self.settings.onnxModelFile = onnx_model_file
# PyTorchモデル生成
if pyTorch_model_file != None:
cpt = torch.load(pyTorch_model_file, map_location="cpu")
if self.settings.pyTorchModelFile != None:
cpt = torch.load(self.settings.pyTorchModelFile, map_location="cpu")
self.settings.modelSamplingRate = cpt["config"][-1]
net_g = SynthesizerTrnMs256NSFsid(*cpt["config"], is_half=self.is_half)
net_g.eval()
@ -112,8 +120,8 @@ class RVC:
self.net_g = net_g
# ONNXモデル生成
if onnx_model_file != None:
self.onnx_session = ModelWrapper(onnx_model_file)
if self.settings.onnxModelFile != None:
self.onnx_session = ModelWrapper(self.settings.onnxModelFile)
return self.get_info()
def update_settings(self, key: str, val: any):

View File

@ -108,29 +108,28 @@ class VoiceChanger():
def loadModel(
self,
slot: number,
config: str,
pyTorch_model_file: Optional[str] = None,
onnx_model_file: Optional[str] = None,
clusterTorchModel: Optional[str] = None,
feature_file: Optional[str] = None,
index_file: Optional[str] = None,
is_half: bool = True,
props,
):
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)
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"):

View File

@ -11,8 +11,8 @@ class VoiceChangerManager():
cls._instance.voiceChanger = VoiceChanger(params)
return cls._instance
def loadModel(self, slot, config, model, onnx_model, clusterTorchModel, feature_file, index_file, is_half: bool = True):
info = self.voiceChanger.loadModel(slot, config, model, onnx_model, clusterTorchModel, feature_file, index_file, is_half)
def loadModel(self, props):
info = self.voiceChanger.loadModel(props)
if hasattr(info, "status") and info["status"] == "NG":
return info
else: