From 87e4ab0cb7708dfa3307d8759c54b513fbdfcd16 Mon Sep 17 00:00:00 2001 From: wataru Date: Tue, 25 Apr 2023 15:01:19 +0900 Subject: [PATCH] bugfix: same slot select --- client/demo/dist/index.js | 2 +- .../demo/components/204_ModelSwitchRow.tsx | 6 ++-- server/voice_changer/RVC/RVC.py | 36 ++++++------------- 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/client/demo/dist/index.js b/client/demo/dist/index.js index 7878bb12..f3242851 100644 --- a/client/demo/dist/index.js +++ b/client/demo/dist/index.js @@ -356,7 +356,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ModelSwitchRow\": () => (/* binding */ ModelSwitchRow)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _001_provider_001_AppStateProvider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../001_provider/001_AppStateProvider */ \"./src/001_provider/001_AppStateProvider.tsx\");\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\n\nvar ModelSwitchRow = function ModelSwitchRow(_props) {\n var appState = (0,_001_provider_001_AppStateProvider__WEBPACK_IMPORTED_MODULE_2__.useAppState)();\n var modelSwitchRow = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(function () {\n var slot = appState.serverSetting.serverSetting.modelSlotIndex;\n var onSwitchModelClicked = function onSwitchModelClicked(index, filename) {\n var framework = filename.endsWith(\".onnx\") ? \"ONNX\" : \"PyTorch\";\n console.log(\"Framework:::\", filename, framework);\n appState.serverSetting.updateServerSettings(_objectSpread(_objectSpread({}, appState.serverSetting.serverSetting), {}, {\n modelSlotIndex: index,\n framework: framework\n }));\n };\n var modelOptions = appState.serverSetting.serverSetting.modelSlots.map(function (x, index) {\n var className = index == slot ? \"body-button-active left-margin-1\" : \"body-button left-margin-1\";\n var filename = \"\";\n if (x.pyTorchModelFile && x.pyTorchModelFile.length > 0) {\n filename = x.pyTorchModelFile.replace(/^.*[\\\\\\/]/, '');\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n key: index,\n className: className,\n onClick: function onClick() {\n onSwitchModelClicked(index, filename);\n }\n }, filename);\n } else if (x.onnxModelFile && x.onnxModelFile.length > 0) {\n filename = x.onnxModelFile.replace(/^.*[\\\\\\/]/, '');\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n key: index,\n className: className,\n onClick: function onClick() {\n onSwitchModelClicked(index, filename);\n }\n }, filename);\n } else {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n key: index\n });\n }\n });\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement((react__WEBPACK_IMPORTED_MODULE_1___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"body-row split-3-7 left-padding-1 guided\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"body-item-title left-padding-1\"\n }, \"Swicth Model\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"body-button-container\"\n }, modelOptions)));\n }, [appState.getInfo, appState.serverSetting.serverSetting]);\n return modelSwitchRow;\n};\n\n//# sourceURL=webpack://demo/./src/components/demo/components/204_ModelSwitchRow.tsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ModelSwitchRow\": () => (/* binding */ ModelSwitchRow)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _001_provider_001_AppStateProvider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../001_provider/001_AppStateProvider */ \"./src/001_provider/001_AppStateProvider.tsx\");\n\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\n\nvar ModelSwitchRow = function ModelSwitchRow(_props) {\n var appState = (0,_001_provider_001_AppStateProvider__WEBPACK_IMPORTED_MODULE_4__.useAppState)();\n var modelSwitchRow = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () {\n var slot = appState.serverSetting.serverSetting.modelSlotIndex;\n var onSwitchModelClicked = /*#__PURE__*/function () {\n var _ref = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee(index, filename) {\n var framework, dummyModelSlotIndex;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n framework = filename.endsWith(\".onnx\") ? \"ONNX\" : \"PyTorch\";\n console.log(\"Framework:::\", filename, framework);\n\n // Quick hack for same slot is selected. 下3桁が実際のSlotID\n dummyModelSlotIndex = Math.floor(Date.now() / 1000) * 1000 + index;\n _context.next = 5;\n return appState.serverSetting.updateServerSettings(_objectSpread(_objectSpread({}, appState.serverSetting.serverSetting), {}, {\n modelSlotIndex: dummyModelSlotIndex,\n framework: framework\n }));\n case 5:\n case \"end\":\n return _context.stop();\n }\n }, _callee);\n }));\n return function onSwitchModelClicked(_x, _x2) {\n return _ref.apply(this, arguments);\n };\n }();\n var modelOptions = appState.serverSetting.serverSetting.modelSlots.map(function (x, index) {\n var className = index == slot ? \"body-button-active left-margin-1\" : \"body-button left-margin-1\";\n var filename = \"\";\n if (x.pyTorchModelFile && x.pyTorchModelFile.length > 0) {\n filename = x.pyTorchModelFile.replace(/^.*[\\\\\\/]/, '');\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"div\", {\n key: index,\n className: className,\n onClick: function onClick() {\n onSwitchModelClicked(index, filename);\n }\n }, filename);\n } else if (x.onnxModelFile && x.onnxModelFile.length > 0) {\n filename = x.onnxModelFile.replace(/^.*[\\\\\\/]/, '');\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"div\", {\n key: index,\n className: className,\n onClick: function onClick() {\n onSwitchModelClicked(index, filename);\n }\n }, filename);\n } else {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"div\", {\n key: index\n });\n }\n });\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement((react__WEBPACK_IMPORTED_MODULE_3___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"div\", {\n className: \"body-row split-3-7 left-padding-1 guided\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"div\", {\n className: \"body-item-title left-padding-1\"\n }, \"Swicth Model\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"div\", {\n className: \"body-button-container\"\n }, modelOptions)));\n }, [appState.getInfo, appState.serverSetting.serverSetting]);\n return modelSwitchRow;\n};\n\n//# sourceURL=webpack://demo/./src/components/demo/components/204_ModelSwitchRow.tsx?"); /***/ }), diff --git a/client/demo/src/components/demo/components/204_ModelSwitchRow.tsx b/client/demo/src/components/demo/components/204_ModelSwitchRow.tsx index 1a131be3..66c16f19 100644 --- a/client/demo/src/components/demo/components/204_ModelSwitchRow.tsx +++ b/client/demo/src/components/demo/components/204_ModelSwitchRow.tsx @@ -12,11 +12,13 @@ export const ModelSwitchRow = (_props: ModelSwitchRowProps) => { const modelSwitchRow = useMemo(() => { const slot = appState.serverSetting.serverSetting.modelSlotIndex - const onSwitchModelClicked = (index: number, filename: string) => { + const onSwitchModelClicked = async (index: number, filename: string) => { const framework: Framework = filename.endsWith(".onnx") ? "ONNX" : "PyTorch" console.log("Framework:::", filename, framework) - appState.serverSetting.updateServerSettings({ ...appState.serverSetting.serverSetting, modelSlotIndex: index, framework: framework }) + // Quick hack for same slot is selected. 下3桁が実際のSlotID + const dummyModelSlotIndex = (Math.floor(Date.now() / 1000)) * 1000 + index + await appState.serverSetting.updateServerSettings({ ...appState.serverSetting.serverSetting, modelSlotIndex: dummyModelSlotIndex, framework: framework }) } const modelOptions = appState.serverSetting.serverSetting.modelSlots.map((x, index) => { const className = index == slot ? "body-button-active left-margin-1" : "body-button left-margin-1" diff --git a/server/voice_changer/RVC/RVC.py b/server/voice_changer/RVC/RVC.py index 18199feb..6fac0b0a 100644 --- a/server/voice_changer/RVC/RVC.py +++ b/server/voice_changer/RVC/RVC.py @@ -114,19 +114,11 @@ class RVC: def loadModel(self, props): self.is_half = props["isHalf"] - self.tmp_slot = props["slot"] + tmp_slot = props["slot"] params_str = props["params"] params = json.loads(params_str) - # self.settings.modelSlots[self.tmp_slot] = ModelSlot( - # pyTorchModelFile=props["files"]["pyTorchModelFilename"], - # onnxModelFile=props["files"]["onnxModelFilename"], - # featureFile=props["files"]["featureFilename"], - # indexFile=props["files"]["indexFilename"], - # defaultTrans=params["trans"] - # ) - - newSlot = asdict(self.settings.modelSlots[self.tmp_slot]) + newSlot = asdict(self.settings.modelSlots[tmp_slot]) newSlot.update({ "pyTorchModelFile": props["files"]["pyTorchModelFilename"], "onnxModelFile": props["files"]["onnxModelFilename"], @@ -134,16 +126,9 @@ class RVC: "indexFile": props["files"]["indexFilename"], "defaultTrans": params["trans"] }) - # .update({ - # pyTorchModelFile: props["files"]["pyTorchModelFilename"], - # onnxModelFile: props["files"]["onnxModelFilename"], - # featureFile: props["files"]["featureFilename"], - # indexFile: props["files"]["indexFilename"], - # defaultTrans: params["trans"] - # }) - self.settings.modelSlots[self.tmp_slot] = ModelSlot(**newSlot) + self.settings.modelSlots[tmp_slot] = ModelSlot(**newSlot) - print("[Voice Changer] RVC loading... slot:", self.tmp_slot) + print("[Voice Changer] RVC loading... slot:", tmp_slot) try: hubert_path = self.params["hubert_base"] @@ -158,8 +143,8 @@ class RVC: print("EXCEPTION during loading hubert/contentvec model", e) if self.initialLoad: - self.prepareModel(self.tmp_slot) - self.settings.modelSlotIndex = self.tmp_slot + self.prepareModel(tmp_slot) + self.settings.modelSlotIndex = tmp_slot self.currentSlot = self.settings.modelSlotIndex self.switchModel() self.initialLoad = False @@ -290,8 +275,9 @@ class RVC: self.onnx_session.set_providers(providers=["CUDAExecutionProvider"], provider_options=provider_options) if key == "modelSlotIndex": # self.switchModel(int(val)) - self.tmp_slot = int(val) - self.prepareModel(self.tmp_slot) + val = int(val) % 1000 # Quick hack for same slot is selected + self.prepareModel(val) + self.currentSlot = -1 setattr(self.settings, key, int(val)) elif key in self.settings.floatData: setattr(self.settings, key, float(val)) @@ -431,8 +417,8 @@ class RVC: return result def inference(self, data): - if self.settings.modelSlotIndex < -1: - print("[Voice Changer] No model uploaded.") + if self.settings.modelSlotIndex < 0: + print("[Voice Changer] wait for loading model...", self.settings.modelSlotIndex, self.currentSlot) raise NoModeLoadedException("model_common") if self.currentSlot != self.settings.modelSlotIndex: