diff --git a/client/demo/dist/index.js b/client/demo/dist/index.js index fca8dedd..bdb1251f 100644 --- a/client/demo/dist/index.js +++ b/client/demo/dist/index.js @@ -235,7 +235,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 */ MergeLabDialog: () => (/* binding */ MergeLabDialog)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ \"./node_modules/@babel/runtime/helpers/esm/slicedToArray.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_GuiStateProvider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./001_GuiStateProvider */ \"./src/components/demo/001_GuiStateProvider.tsx\");\n/* harmony import */ var _001_provider_001_AppStateProvider__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../001_provider/001_AppStateProvider */ \"./src/001_provider/001_AppStateProvider.tsx\");\n/* harmony import */ var _dannadori_voice_changer_client_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @dannadori/voice-changer-client-js */ \"./node_modules/@dannadori/voice-changer-client-js/dist/index.js\");\n/* harmony import */ var _dannadori_voice_changer_client_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_dannadori_voice_changer_client_js__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\nvar MergeLabDialog = function MergeLabDialog() {\n var guiState = (0,_001_GuiStateProvider__WEBPACK_IMPORTED_MODULE_2__.useGuiState)();\n var _useAppState = (0,_001_provider_001_AppStateProvider__WEBPACK_IMPORTED_MODULE_3__.useAppState)(),\n serverSetting = _useAppState.serverSetting;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\"),\n _useState2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_useState, 2),\n currentFilter = _useState2[0],\n setCurrentFilter = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]),\n _useState4 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_useState3, 2),\n mergeElements = _useState4[0],\n setMergeElements = _useState4[1];\n\n // スロットが変更されたときの初期化処理\n var newSlotChangeKey = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(function () {\n if (!serverSetting.serverSetting.modelSlots) {\n return \"\";\n }\n return serverSetting.serverSetting.modelSlots.reduce(function (prev, cur) {\n return prev + \"_\" + cur.modelFile;\n }, \"\");\n }, [serverSetting.serverSetting.modelSlots]);\n var filterItems = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(function () {\n return serverSetting.serverSetting.modelSlots.reduce(function (prev, cur) {\n if (cur.voiceChangerType != \"RVC\") {\n return prev;\n }\n var curRVC = cur;\n var key = \"\".concat(curRVC.modelType, \",\").concat(cur.samplingRate, \",\").concat(curRVC.embChannels);\n var val = {\n type: curRVC.modelType,\n samplingRate: cur.samplingRate,\n embChannels: curRVC.embChannels\n };\n var existKeys = Object.keys(prev);\n if (!cur.modelFile || cur.modelFile.length == 0) {\n return prev;\n }\n if (curRVC.modelType == \"onnxRVC\" || curRVC.modelType == \"onnxRVCNono\") {\n return prev;\n }\n if (!existKeys.includes(key)) {\n prev[key] = val;\n }\n return prev;\n }, {});\n }, [newSlotChangeKey]);\n var models = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(function () {\n return serverSetting.serverSetting.modelSlots.filter(function (x) {\n if (x.voiceChangerType != \"RVC\") {\n return;\n }\n var xRVC = x;\n var filterVals = filterItems[currentFilter];\n if (!filterVals) {\n return false;\n }\n if (xRVC.modelType == filterVals.type && xRVC.samplingRate == filterVals.samplingRate && xRVC.embChannels == filterVals.embChannels) {\n return true;\n } else {\n return false;\n }\n });\n }, [filterItems, currentFilter]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () {\n if (Object.keys(filterItems).length > 0) {\n setCurrentFilter(Object.keys(filterItems)[0]);\n }\n }, [filterItems]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () {\n var newMergeElements = models.map(function (x) {\n return {\n filename: x.modelFile,\n strength: 0\n };\n });\n setMergeElements(newMergeElements);\n }, [models]);\n var dialog = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(function () {\n var closeButtonRow = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"body-row split-3-4-3 left-padding-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"body-item-text\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"body-button-container body-button-container-space-around\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"body-button\",\n onClick: function onClick() {\n guiState.stateControls.showMergeLabCheckbox.updateState(false);\n }\n }, \"close\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"body-item-text\"\n }));\n var filterOptions = Object.keys(filterItems).map(function (x) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"option\", {\n key: x,\n value: x\n }, x);\n }).filter(function (x) {\n return x != null;\n });\n var onMergeElementsChanged = function onMergeElementsChanged(filename, strength) {\n var newMergeElements = mergeElements.map(function (x) {\n if (x.filename == filename) {\n return {\n filename: x.filename,\n strength: strength\n };\n } else {\n return x;\n }\n });\n setMergeElements(newMergeElements);\n };\n var onMergeClicked = function onMergeClicked() {\n serverSetting.mergeModel({\n voiceChangerType: _dannadori_voice_changer_client_js__WEBPACK_IMPORTED_MODULE_4__.VoiceChangerType.RVC,\n command: \"mix\",\n files: mergeElements\n });\n };\n var modelList = mergeElements.map(function (x, index) {\n var _models$find;\n var name = ((_models$find = models.find(function (model) {\n return model.modelFile == x.filename;\n })) === null || _models$find === void 0 ? void 0 : _models$find.name) || \"\";\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n key: index,\n className: \"merge-lab-model-item\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", null, name), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"input\", {\n type: \"range\",\n className: \"body-item-input-slider\",\n min: \"0\",\n max: \"100\",\n step: \"1\",\n value: x.strength,\n onChange: function onChange(e) {\n onMergeElementsChanged(x.filename, Number(e.target.value));\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"span\", {\n className: \"body-item-input-slider-val\"\n }, x.strength)));\n });\n var content = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"merge-lab-container\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"merge-lab-type-filter\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", null, \"Type:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"select\", {\n value: currentFilter,\n onChange: function onChange(e) {\n setCurrentFilter(e.target.value);\n }\n }, filterOptions))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"merge-lab-manipulator\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"merge-lab-model-list\"\n }, modelList), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"merge-lab-merge-buttons\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"merge-lab-merge-buttons-notice\"\n }, \"The merged model is stored in the final slot. If you assign this slot, it will be overwritten.\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"merge-lab-merge-button\",\n onClick: onMergeClicked\n }, \"merge\"))));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"dialog-frame\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"dialog-title\"\n }, \"MergeLab\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"dialog-content\"\n }, content, closeButtonRow));\n }, [newSlotChangeKey, currentFilter, mergeElements, models]);\n return dialog;\n};\n\n//# sourceURL=webpack://demo/./src/components/demo/905_MergeLabDialog.tsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MergeLabDialog: () => (/* binding */ MergeLabDialog)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ \"./node_modules/@babel/runtime/helpers/esm/slicedToArray.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_GuiStateProvider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./001_GuiStateProvider */ \"./src/components/demo/001_GuiStateProvider.tsx\");\n/* harmony import */ var _001_provider_001_AppStateProvider__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../001_provider/001_AppStateProvider */ \"./src/001_provider/001_AppStateProvider.tsx\");\n/* harmony import */ var _dannadori_voice_changer_client_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @dannadori/voice-changer-client-js */ \"./node_modules/@dannadori/voice-changer-client-js/dist/index.js\");\n/* harmony import */ var _dannadori_voice_changer_client_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_dannadori_voice_changer_client_js__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\nvar MergeLabDialog = function MergeLabDialog() {\n var guiState = (0,_001_GuiStateProvider__WEBPACK_IMPORTED_MODULE_2__.useGuiState)();\n var _useAppState = (0,_001_provider_001_AppStateProvider__WEBPACK_IMPORTED_MODULE_3__.useAppState)(),\n serverSetting = _useAppState.serverSetting;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\"),\n _useState2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_useState, 2),\n currentFilter = _useState2[0],\n setCurrentFilter = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]),\n _useState4 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_useState3, 2),\n mergeElements = _useState4[0],\n setMergeElements = _useState4[1];\n\n // スロットが変更されたときの初期化処理\n var newSlotChangeKey = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(function () {\n if (!serverSetting.serverSetting.modelSlots) {\n return \"\";\n }\n return serverSetting.serverSetting.modelSlots.reduce(function (prev, cur) {\n return prev + \"_\" + cur.modelFile;\n }, \"\");\n }, [serverSetting.serverSetting.modelSlots]);\n var filterItems = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(function () {\n return serverSetting.serverSetting.modelSlots.reduce(function (prev, cur) {\n if (cur.voiceChangerType != \"RVC\") {\n return prev;\n }\n var curRVC = cur;\n var key = \"\".concat(curRVC.modelType, \",\").concat(cur.samplingRate, \",\").concat(curRVC.embChannels);\n var val = {\n type: curRVC.modelType,\n samplingRate: cur.samplingRate,\n embChannels: curRVC.embChannels\n };\n var existKeys = Object.keys(prev);\n if (!cur.modelFile || cur.modelFile.length == 0) {\n return prev;\n }\n if (curRVC.modelType == \"onnxRVC\" || curRVC.modelType == \"onnxRVCNono\") {\n return prev;\n }\n if (!existKeys.includes(key)) {\n prev[key] = val;\n }\n return prev;\n }, {});\n }, [newSlotChangeKey]);\n var models = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(function () {\n return serverSetting.serverSetting.modelSlots.filter(function (x) {\n if (x.voiceChangerType != \"RVC\") {\n return;\n }\n var xRVC = x;\n var filterVals = filterItems[currentFilter];\n if (!filterVals) {\n return false;\n }\n if (xRVC.modelType == filterVals.type && xRVC.samplingRate == filterVals.samplingRate && xRVC.embChannels == filterVals.embChannels) {\n return true;\n } else {\n return false;\n }\n });\n }, [filterItems, currentFilter]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () {\n if (Object.keys(filterItems).length > 0) {\n setCurrentFilter(Object.keys(filterItems)[0]);\n }\n }, [filterItems]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () {\n // models はフィルタ後の配列\n var newMergeElements = models.map(function (x) {\n return {\n slotIndex: x.slotIndex,\n filename: x.modelFile,\n strength: 0\n };\n });\n setMergeElements(newMergeElements);\n }, [models]);\n var dialog = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(function () {\n var closeButtonRow = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"body-row split-3-4-3 left-padding-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"body-item-text\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"body-button-container body-button-container-space-around\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"body-button\",\n onClick: function onClick() {\n guiState.stateControls.showMergeLabCheckbox.updateState(false);\n }\n }, \"close\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"body-item-text\"\n }));\n var filterOptions = Object.keys(filterItems).map(function (x) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"option\", {\n key: x,\n value: x\n }, x);\n }).filter(function (x) {\n return x != null;\n });\n var onMergeElementsChanged = function onMergeElementsChanged(slotIndex, strength) {\n var newMergeElements = mergeElements.map(function (x) {\n if (x.slotIndex == slotIndex) {\n return {\n slotIndex: x.slotIndex,\n filename: x.filename,\n strength: strength\n };\n } else {\n return x;\n }\n });\n setMergeElements(newMergeElements);\n };\n var onMergeClicked = function onMergeClicked() {\n var validMergeElements = mergeElements.filter(function (x) {\n return x.strength > 0;\n });\n serverSetting.mergeModel({\n voiceChangerType: _dannadori_voice_changer_client_js__WEBPACK_IMPORTED_MODULE_4__.VoiceChangerType.RVC,\n command: \"mix\",\n files: validMergeElements\n });\n };\n var modelList = mergeElements.map(function (x, index) {\n var _models$find;\n var name = ((_models$find = models.find(function (model) {\n return model.slotIndex == x.slotIndex;\n })) === null || _models$find === void 0 ? void 0 : _models$find.name) || \"\";\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n key: index,\n className: \"merge-lab-model-item\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", null, name), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"input\", {\n type: \"range\",\n className: \"body-item-input-slider\",\n min: \"0\",\n max: \"100\",\n step: \"1\",\n value: x.strength,\n onChange: function onChange(e) {\n onMergeElementsChanged(x.slotIndex, Number(e.target.value));\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"span\", {\n className: \"body-item-input-slider-val\"\n }, x.strength)));\n });\n var content = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"merge-lab-container\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"merge-lab-type-filter\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", null, \"Type:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"select\", {\n value: currentFilter,\n onChange: function onChange(e) {\n setCurrentFilter(e.target.value);\n }\n }, filterOptions))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"merge-lab-manipulator\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"merge-lab-model-list\"\n }, modelList), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"merge-lab-merge-buttons\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"merge-lab-merge-buttons-notice\"\n }, \"The merged model is stored in the final slot. If you assign this slot, it will be overwritten.\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"merge-lab-merge-button\",\n onClick: onMergeClicked\n }, \"merge\"))));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"dialog-frame\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"dialog-title\"\n }, \"MergeLab\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"dialog-content\"\n }, content, closeButtonRow));\n }, [newSlotChangeKey, currentFilter, mergeElements, models]);\n return dialog;\n};\n\n//# sourceURL=webpack://demo/./src/components/demo/905_MergeLabDialog.tsx?"); /***/ }), @@ -334,7 +334,7 @@ eval("var __filename = \"/index.js\";\n__webpack_require__.r(__webpack_exports__ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("var __filename = \"/index.js\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ModelSlotArea: () => (/* binding */ ModelSlotArea)\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_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ \"./node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _001_provider_001_AppStateProvider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../001_provider/001_AppStateProvider */ \"./src/001_provider/001_AppStateProvider.tsx\");\n/* harmony import */ var _001_GuiStateProvider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../001_GuiStateProvider */ \"./src/components/demo/001_GuiStateProvider.tsx\");\n/* harmony import */ var _hooks_useMessageBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../hooks/useMessageBuilder */ \"./src/hooks/useMessageBuilder.ts\");\n/* harmony import */ var _fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @fortawesome/react-fontawesome */ \"./node_modules/@fortawesome/react-fontawesome/index.es.js\");\n\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\n\n\n\nvar SortTypes = {\n slot: \"slot\",\n name: \"name\"\n};\nvar ModelSlotArea = function ModelSlotArea(_props) {\n var _useAppState = (0,_001_provider_001_AppStateProvider__WEBPACK_IMPORTED_MODULE_5__.useAppState)(),\n serverSetting = _useAppState.serverSetting,\n getInfo = _useAppState.getInfo;\n var guiState = (0,_001_GuiStateProvider__WEBPACK_IMPORTED_MODULE_6__.useGuiState)();\n var messageBuilderState = (0,_hooks_useMessageBuilder__WEBPACK_IMPORTED_MODULE_7__.useMessageBuilder)();\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_4__.useState)(\"slot\"),\n _useState2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(_useState, 2),\n sortType = _useState2[0],\n setSortType = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_4__.useMemo)(function () {\n messageBuilderState.setMessage(__filename, \"edit\", {\n ja: \"編集\",\n en: \"edit\"\n });\n }, []);\n var modelTiles = (0,react__WEBPACK_IMPORTED_MODULE_4__.useMemo)(function () {\n if (!serverSetting.serverSetting.modelSlots) {\n return [];\n }\n var modelSlots = sortType == \"slot\" ? serverSetting.serverSetting.modelSlots : serverSetting.serverSetting.modelSlots.slice().sort(function (a, b) {\n return a.name.localeCompare(b.name);\n });\n return modelSlots.map(function (x, index) {\n if (!x.modelFile || x.modelFile.length == 0) {\n return null;\n }\n var tileContainerClass = x.id == serverSetting.serverSetting.modelSlotIndex ? \"model-slot-tile-container-selected\" : \"model-slot-tile-container\";\n var name = x.name.length > 8 ? x.name.substring(0, 7) + \"...\" : x.name;\n var iconElem = x.iconFile.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement((react__WEBPACK_IMPORTED_MODULE_4___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"img\", {\n className: \"model-slot-tile-icon\",\n src: x.iconFile,\n alt: x.name\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-tile-vctype\"\n }, x.voiceChangerType)) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement((react__WEBPACK_IMPORTED_MODULE_4___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-tile-icon-no-entry\"\n }, \"no image\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-tile-vctype\"\n }, x.voiceChangerType));\n var clickAction = /*#__PURE__*/function () {\n var _ref = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_3___default().mark(function _callee() {\n var dummyModelSlotIndex;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_3___default().wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n dummyModelSlotIndex = Math.floor(Date.now() / 1000) * 1000 + x.id;\n _context.next = 3;\n return serverSetting.updateServerSettings(_objectSpread(_objectSpread({}, serverSetting.serverSetting), {}, {\n modelSlotIndex: dummyModelSlotIndex\n }));\n case 3:\n setTimeout(function () {\n // quick hack\n getInfo();\n }, 1000 * 2);\n case 4:\n case \"end\":\n return _context.stop();\n }\n }, _callee);\n }));\n return function clickAction() {\n return _ref.apply(this, arguments);\n };\n }();\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n key: index,\n className: tileContainerClass,\n onClick: clickAction\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-tile-icon-div\"\n }, iconElem), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-tile-dscription\"\n }, name));\n }).filter(function (x) {\n return x != null;\n });\n }, [serverSetting.serverSetting.modelSlots, serverSetting.serverSetting.modelSlotIndex, sortType]);\n var modelSlotArea = (0,react__WEBPACK_IMPORTED_MODULE_4__.useMemo)(function () {\n var onModelSlotEditClicked = function onModelSlotEditClicked() {\n guiState.stateControls.showModelSlotManagerCheckbox.updateState(true);\n };\n var sortSlotByIdClass = sortType == \"slot\" ? \"model-slot-sort-button-active\" : \"model-slot-sort-button\";\n var sortSlotByNameClass = sortType == \"name\" ? \"model-slot-sort-button-active\" : \"model-slot-sort-button\";\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-area\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-panel\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-tiles-container\"\n }, modelTiles), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-buttons\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-sort-buttons\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: sortSlotByIdClass,\n onClick: function onClick() {\n setSortType(\"slot\");\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_8__.FontAwesomeIcon, {\n icon: [\"fas\", \"arrow-down-1-9\"],\n style: {\n fontSize: \"1rem\"\n }\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: sortSlotByNameClass,\n onClick: function onClick() {\n setSortType(\"name\");\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_8__.FontAwesomeIcon, {\n icon: [\"fas\", \"arrow-down-a-z\"],\n style: {\n fontSize: \"1rem\"\n }\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-button\",\n onClick: onModelSlotEditClicked\n }, messageBuilderState.getMessage(__filename, \"edit\")))));\n }, [modelTiles, sortType]);\n return modelSlotArea;\n};\n\n//# sourceURL=webpack://demo/./src/components/demo/components2/100_ModelSlotArea.tsx?"); +eval("var __filename = \"/index.js\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ModelSlotArea: () => (/* binding */ ModelSlotArea)\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_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ \"./node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _001_provider_001_AppStateProvider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../001_provider/001_AppStateProvider */ \"./src/001_provider/001_AppStateProvider.tsx\");\n/* harmony import */ var _001_GuiStateProvider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../001_GuiStateProvider */ \"./src/components/demo/001_GuiStateProvider.tsx\");\n/* harmony import */ var _hooks_useMessageBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../hooks/useMessageBuilder */ \"./src/hooks/useMessageBuilder.ts\");\n/* harmony import */ var _fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @fortawesome/react-fontawesome */ \"./node_modules/@fortawesome/react-fontawesome/index.es.js\");\n\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\n\n\n\nvar SortTypes = {\n slot: \"slot\",\n name: \"name\"\n};\nvar ModelSlotArea = function ModelSlotArea(_props) {\n var _useAppState = (0,_001_provider_001_AppStateProvider__WEBPACK_IMPORTED_MODULE_5__.useAppState)(),\n serverSetting = _useAppState.serverSetting,\n getInfo = _useAppState.getInfo;\n var guiState = (0,_001_GuiStateProvider__WEBPACK_IMPORTED_MODULE_6__.useGuiState)();\n var messageBuilderState = (0,_hooks_useMessageBuilder__WEBPACK_IMPORTED_MODULE_7__.useMessageBuilder)();\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_4__.useState)(\"slot\"),\n _useState2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(_useState, 2),\n sortType = _useState2[0],\n setSortType = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_4__.useMemo)(function () {\n messageBuilderState.setMessage(__filename, \"edit\", {\n ja: \"編集\",\n en: \"edit\"\n });\n }, []);\n var modelTiles = (0,react__WEBPACK_IMPORTED_MODULE_4__.useMemo)(function () {\n if (!serverSetting.serverSetting.modelSlots) {\n return [];\n }\n var modelSlots = sortType == \"slot\" ? serverSetting.serverSetting.modelSlots : serverSetting.serverSetting.modelSlots.slice().sort(function (a, b) {\n return a.name.localeCompare(b.name);\n });\n return modelSlots.map(function (x, index) {\n if (!x.modelFile || x.modelFile.length == 0) {\n return null;\n }\n var tileContainerClass = x.slotIndex == serverSetting.serverSetting.modelSlotIndex ? \"model-slot-tile-container-selected\" : \"model-slot-tile-container\";\n var name = x.name.length > 8 ? x.name.substring(0, 7) + \"...\" : x.name;\n var iconElem = x.iconFile.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement((react__WEBPACK_IMPORTED_MODULE_4___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"img\", {\n className: \"model-slot-tile-icon\",\n src: x.iconFile,\n alt: x.name\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-tile-vctype\"\n }, x.voiceChangerType)) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement((react__WEBPACK_IMPORTED_MODULE_4___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-tile-icon-no-entry\"\n }, \"no image\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-tile-vctype\"\n }, x.voiceChangerType));\n var clickAction = /*#__PURE__*/function () {\n var _ref = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_3___default().mark(function _callee() {\n var dummyModelSlotIndex;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_3___default().wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n dummyModelSlotIndex = Math.floor(Date.now() / 1000) * 1000 + x.slotIndex;\n _context.next = 3;\n return serverSetting.updateServerSettings(_objectSpread(_objectSpread({}, serverSetting.serverSetting), {}, {\n modelSlotIndex: dummyModelSlotIndex\n }));\n case 3:\n setTimeout(function () {\n // quick hack\n getInfo();\n }, 1000 * 2);\n case 4:\n case \"end\":\n return _context.stop();\n }\n }, _callee);\n }));\n return function clickAction() {\n return _ref.apply(this, arguments);\n };\n }();\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n key: index,\n className: tileContainerClass,\n onClick: clickAction\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-tile-icon-div\"\n }, iconElem), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-tile-dscription\"\n }, name));\n }).filter(function (x) {\n return x != null;\n });\n }, [serverSetting.serverSetting.modelSlots, serverSetting.serverSetting.modelSlotIndex, sortType]);\n var modelSlotArea = (0,react__WEBPACK_IMPORTED_MODULE_4__.useMemo)(function () {\n var onModelSlotEditClicked = function onModelSlotEditClicked() {\n guiState.stateControls.showModelSlotManagerCheckbox.updateState(true);\n };\n var sortSlotByIdClass = sortType == \"slot\" ? \"model-slot-sort-button-active\" : \"model-slot-sort-button\";\n var sortSlotByNameClass = sortType == \"name\" ? \"model-slot-sort-button-active\" : \"model-slot-sort-button\";\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-area\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-panel\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-tiles-container\"\n }, modelTiles), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-buttons\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-sort-buttons\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: sortSlotByIdClass,\n onClick: function onClick() {\n setSortType(\"slot\");\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_8__.FontAwesomeIcon, {\n icon: [\"fas\", \"arrow-down-1-9\"],\n style: {\n fontSize: \"1rem\"\n }\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: sortSlotByNameClass,\n onClick: function onClick() {\n setSortType(\"name\");\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_8__.FontAwesomeIcon, {\n icon: [\"fas\", \"arrow-down-a-z\"],\n style: {\n fontSize: \"1rem\"\n }\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"model-slot-button\",\n onClick: onModelSlotEditClicked\n }, messageBuilderState.getMessage(__filename, \"edit\")))));\n }, [modelTiles, sortType]);\n return modelSlotArea;\n};\n\n//# sourceURL=webpack://demo/./src/components/demo/components2/100_ModelSlotArea.tsx?"); /***/ }), diff --git a/client/demo/dist/index.js.LICENSE.txt b/client/demo/dist/index.js.LICENSE.txt deleted file mode 100644 index 90ba9231..00000000 --- a/client/demo/dist/index.js.LICENSE.txt +++ /dev/null @@ -1,31 +0,0 @@ -/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ - -/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** - * @license React - * scheduler.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ diff --git a/client/demo/src/components/demo/905_MergeLabDialog.tsx b/client/demo/src/components/demo/905_MergeLabDialog.tsx index 7f7389cd..233b71bb 100644 --- a/client/demo/src/components/demo/905_MergeLabDialog.tsx +++ b/client/demo/src/components/demo/905_MergeLabDialog.tsx @@ -3,158 +3,182 @@ import { useGuiState } from "./001_GuiStateProvider"; import { useAppState } from "../../001_provider/001_AppStateProvider"; import { MergeElement, RVCModelSlot, RVCModelType, VoiceChangerType } from "@dannadori/voice-changer-client-js"; - export const MergeLabDialog = () => { - const guiState = useGuiState() + const guiState = useGuiState(); - const { serverSetting } = useAppState() - const [currentFilter, setCurrentFilter] = useState("") - const [mergeElements, setMergeElements] = useState([]) + const { serverSetting } = useAppState(); + const [currentFilter, setCurrentFilter] = useState(""); + const [mergeElements, setMergeElements] = useState([]); // スロットが変更されたときの初期化処理 const newSlotChangeKey = useMemo(() => { if (!serverSetting.serverSetting.modelSlots) { - return "" + return ""; } return serverSetting.serverSetting.modelSlots.reduce((prev, cur) => { - return prev + "_" + cur.modelFile - }, "") - }, [serverSetting.serverSetting.modelSlots]) + return prev + "_" + cur.modelFile; + }, ""); + }, [serverSetting.serverSetting.modelSlots]); const filterItems = useMemo(() => { - return serverSetting.serverSetting.modelSlots.reduce((prev, cur) => { - if (cur.voiceChangerType != "RVC") { - return prev - } - const curRVC = cur as RVCModelSlot - const key = `${curRVC.modelType},${cur.samplingRate},${curRVC.embChannels}` - const val = { type: curRVC.modelType, samplingRate: cur.samplingRate, embChannels: curRVC.embChannels } - const existKeys = Object.keys(prev) - if (!cur.modelFile || cur.modelFile.length == 0) { - return prev - } - if (curRVC.modelType == "onnxRVC" || curRVC.modelType == "onnxRVCNono") { - return prev - } - if (!existKeys.includes(key)) { - prev[key] = val - } - return prev - }, {} as { [key: string]: { type: RVCModelType, samplingRate: number, embChannels: number } }) - - }, [newSlotChangeKey]) + return serverSetting.serverSetting.modelSlots.reduce( + (prev, cur) => { + if (cur.voiceChangerType != "RVC") { + return prev; + } + const curRVC = cur as RVCModelSlot; + const key = `${curRVC.modelType},${cur.samplingRate},${curRVC.embChannels}`; + const val = { type: curRVC.modelType, samplingRate: cur.samplingRate, embChannels: curRVC.embChannels }; + const existKeys = Object.keys(prev); + if (!cur.modelFile || cur.modelFile.length == 0) { + return prev; + } + if (curRVC.modelType == "onnxRVC" || curRVC.modelType == "onnxRVCNono") { + return prev; + } + if (!existKeys.includes(key)) { + prev[key] = val; + } + return prev; + }, + {} as { [key: string]: { type: RVCModelType; samplingRate: number; embChannels: number } }, + ); + }, [newSlotChangeKey]); const models = useMemo(() => { - return serverSetting.serverSetting.modelSlots.filter(x => { + return serverSetting.serverSetting.modelSlots.filter((x) => { if (x.voiceChangerType != "RVC") { - return + return; } - const xRVC = x as RVCModelSlot - const filterVals = filterItems[currentFilter] + const xRVC = x as RVCModelSlot; + const filterVals = filterItems[currentFilter]; if (!filterVals) { - return false + return false; } if (xRVC.modelType == filterVals.type && xRVC.samplingRate == filterVals.samplingRate && xRVC.embChannels == filterVals.embChannels) { - return true + return true; } else { - return false + return false; } - }) - }, [filterItems, currentFilter]) + }); + }, [filterItems, currentFilter]); useEffect(() => { if (Object.keys(filterItems).length > 0) { - setCurrentFilter(Object.keys(filterItems)[0]) + setCurrentFilter(Object.keys(filterItems)[0]); } - }, [filterItems]) + }, [filterItems]); useEffect(() => { + // models はフィルタ後の配列 const newMergeElements = models.map((x) => { - return { filename: x.modelFile, strength: 0 } - }) - setMergeElements(newMergeElements) - }, [models]) + return { slotIndex: x.slotIndex, filename: x.modelFile, strength: 0 }; + }); + setMergeElements(newMergeElements); + }, [models]); const dialog = useMemo(() => { const closeButtonRow = (
-
-
+
-
{ guiState.stateControls.showMergeLabCheckbox.updateState(false) }} >close
+
{ + guiState.stateControls.showMergeLabCheckbox.updateState(false); + }} + > + close +
- ) + ); - - const filterOptions = Object.keys(filterItems).map(x => { - return - }).filter(x => x != null) - - const onMergeElementsChanged = (filename: string, strength: number) => { - const newMergeElements = mergeElements.map((x) => { - if (x.filename == filename) { - return { filename: x.filename, strength: strength } - } else { - return x - } + const filterOptions = Object.keys(filterItems) + .map((x) => { + return ( + + ); }) - setMergeElements(newMergeElements) - } + .filter((x) => x != null); + + const onMergeElementsChanged = (slotIndex: number, strength: number) => { + const newMergeElements = mergeElements.map((x) => { + if (x.slotIndex == slotIndex) { + return { slotIndex: x.slotIndex, filename: x.filename, strength: strength }; + } else { + return x; + } + }); + setMergeElements(newMergeElements); + }; const onMergeClicked = () => { + const validMergeElements = mergeElements.filter((x) => { + return x.strength > 0; + }); serverSetting.mergeModel({ voiceChangerType: VoiceChangerType.RVC, command: "mix", - files: mergeElements - }) - } + files: validMergeElements, + }); + }; const modelList = mergeElements.map((x, index) => { - const name = models.find(model => { return model.modelFile == x.filename })?.name || "" + const name = + models.find((model) => { + return model.slotIndex == x.slotIndex; + })?.name || ""; + return (
+
{name}
- {name} -
-
- { - onMergeElementsChanged(x.filename, Number(e.target.value)) - }}> + { + onMergeElementsChanged(x.slotIndex, Number(e.target.value)); + }} + > {x.strength}
- ) - }) - + ); + }); const content = (
+
Type:
- Type: -
-
- { + setCurrentFilter(e.target.value); + }} + > {filterOptions}
-
- {modelList} -
+
{modelList}
-
- The merged model is stored in the final slot. If you assign this slot, it will be overwritten. -
+
The merged model is stored in the final slot. If you assign this slot, it will be overwritten.
merge
- ) + ); return (
MergeLab
@@ -166,5 +190,4 @@ export const MergeLabDialog = () => { ); }, [newSlotChangeKey, currentFilter, mergeElements, models]); return dialog; - }; diff --git a/client/demo/src/components/demo/components2/100_ModelSlotArea.tsx b/client/demo/src/components/demo/components2/100_ModelSlotArea.tsx index e142c8bf..8832ea89 100644 --- a/client/demo/src/components/demo/components2/100_ModelSlotArea.tsx +++ b/client/demo/src/components/demo/components2/100_ModelSlotArea.tsx @@ -38,7 +38,7 @@ export const ModelSlotArea = (_props: ModelSlotAreaProps) => { if (!x.modelFile || x.modelFile.length == 0) { return null; } - const tileContainerClass = x.id == serverSetting.serverSetting.modelSlotIndex ? "model-slot-tile-container-selected" : "model-slot-tile-container"; + const tileContainerClass = x.slotIndex == serverSetting.serverSetting.modelSlotIndex ? "model-slot-tile-container-selected" : "model-slot-tile-container"; const name = x.name.length > 8 ? x.name.substring(0, 7) + "..." : x.name; const iconElem = x.iconFile.length > 0 ? ( @@ -54,7 +54,7 @@ export const ModelSlotArea = (_props: ModelSlotAreaProps) => { ); const clickAction = async () => { - const dummyModelSlotIndex = Math.floor(Date.now() / 1000) * 1000 + x.id; + const dummyModelSlotIndex = Math.floor(Date.now() / 1000) * 1000 + x.slotIndex; await serverSetting.updateServerSettings({ ...serverSetting.serverSetting, modelSlotIndex: dummyModelSlotIndex }); setTimeout(() => { // quick hack diff --git a/client/lib/src/const.ts b/client/lib/src/const.ts index 2d73da3b..1e727462 100644 --- a/client/lib/src/const.ts +++ b/client/lib/src/const.ts @@ -193,7 +193,7 @@ export type VoiceChangerServerSetting = { } type ModelSlot = { - id: number + slotIndex: number voiceChangerType: VoiceChangerType name: string, description: string, @@ -539,7 +539,8 @@ export type OnnxExporterInfo = { // Merge export type MergeElement = { - filename: string + slotIndex: number + filename: string // 一意性は保障されない場合がある(フォルダコピーされたときとか) strength: number } export type MergeModelRequest = { diff --git a/server/MMVCServerSIO.py b/server/MMVCServerSIO.py index ac1752e8..b5b0f773 100755 --- a/server/MMVCServerSIO.py +++ b/server/MMVCServerSIO.py @@ -124,7 +124,7 @@ if __name__ == "MMVCServerSIO": if __name__ == "__mp_main__": -# printMessage("サーバプロセスを起動しています。", level=2) + # printMessage("サーバプロセスを起動しています。", level=2) printMessage("The server process is starting up.", level=2) if __name__ == "__main__": diff --git a/server/data/ModelSlot.py b/server/data/ModelSlot.py index 558623db..48f4fff5 100644 --- a/server/data/ModelSlot.py +++ b/server/data/ModelSlot.py @@ -9,7 +9,7 @@ import json @dataclass class ModelSlot: - id: int = -1 + slotIndex: int = -1 voiceChangerType: VoiceChangerType | None = None name: str = "" description: str = "" @@ -133,19 +133,26 @@ def loadSlotInfo(model_dir: str, slotIndex: int) -> ModelSlots: if not os.path.exists(jsonFile): return ModelSlot() jsonDict = json.load(open(os.path.join(slotDir, "params.json"))) - slotInfo = ModelSlot(**{k: v for k, v in jsonDict.items() if k in ModelSlot.__annotations__}) + slotInfoKey = list(ModelSlot.__annotations__.keys()) + slotInfo = ModelSlot(**{k: v for k, v in jsonDict.items() if k in slotInfoKey}) if slotInfo.voiceChangerType == "RVC": - return RVCModelSlot(**jsonDict) + slotInfoKey.extend(list(RVCModelSlot.__annotations__.keys())) + return RVCModelSlot(**{k: v for k, v in jsonDict.items() if k in slotInfoKey}) elif slotInfo.voiceChangerType == "MMVCv13": - return MMVCv13ModelSlot(**jsonDict) + slotInfoKey.extend(list(MMVCv13ModelSlot.__annotations__.keys())) + return MMVCv13ModelSlot(**{k: v for k, v in jsonDict.items() if k in slotInfoKey}) elif slotInfo.voiceChangerType == "MMVCv15": - return MMVCv15ModelSlot(**jsonDict) + slotInfoKey.extend(list(MMVCv15ModelSlot.__annotations__.keys())) + return MMVCv15ModelSlot(**{k: v for k, v in jsonDict.items() if k in slotInfoKey}) elif slotInfo.voiceChangerType == "so-vits-svc-40": - return SoVitsSvc40ModelSlot(**jsonDict) + slotInfoKey.extend(list(SoVitsSvc40ModelSlot.__annotations__.keys())) + return SoVitsSvc40ModelSlot(**{k: v for k, v in jsonDict.items() if k in slotInfoKey}) elif slotInfo.voiceChangerType == "DDSP-SVC": - return DDSPSVCModelSlot(**jsonDict) + slotInfoKey.extend(list(DDSPSVCModelSlot.__annotations__.keys())) + return DDSPSVCModelSlot(**{k: v for k, v in jsonDict.items() if k in slotInfoKey}) elif slotInfo.voiceChangerType == "Diffusion-SVC": - return DiffusionSVCModelSlot(**jsonDict) + slotInfoKey.extend(list(DiffusionSVCModelSlot.__annotations__.keys())) + return DiffusionSVCModelSlot(**{k: v for k, v in jsonDict.items() if k in slotInfoKey}) else: return ModelSlot() @@ -154,11 +161,13 @@ def loadAllSlotInfo(model_dir: str): slotInfos: list[ModelSlots] = [] for slotIndex in range(MAX_SLOT_NUM): slotInfo = loadSlotInfo(model_dir, slotIndex) - slotInfo.id = slotIndex + slotInfo.slotIndex = slotIndex # スロットインデックスは動的に注入 slotInfos.append(slotInfo) return slotInfos def saveSlotInfo(model_dir: str, slotIndex: int, slotInfo: ModelSlots): slotDir = os.path.join(model_dir, str(slotIndex)) - json.dump(asdict(slotInfo), open(os.path.join(slotDir, "params.json"), "w")) + slotInfoDict = asdict(slotInfo) + slotInfo.slotIndex = -1 # スロットインデックスは動的に注入 + json.dump(slotInfoDict, open(os.path.join(slotDir, "params.json"), "w")) diff --git a/server/restapi/MMVC_Rest_Fileuploader.py b/server/restapi/MMVC_Rest_Fileuploader.py index 7d2d8055..8318e971 100644 --- a/server/restapi/MMVC_Rest_Fileuploader.py +++ b/server/restapi/MMVC_Rest_Fileuploader.py @@ -113,6 +113,8 @@ class MMVC_Rest_Fileuploader: return JSONResponse(content=json_compatible_item_data) except Exception as e: print("[Voice Changer] post_merge_models ex:", e) + import traceback + traceback.print_exc() def post_update_model_default(self): try: diff --git a/server/voice_changer/RVC/RVCModelMerger.py b/server/voice_changer/RVC/RVCModelMerger.py index 760a74dc..8fe3d402 100644 --- a/server/voice_changer/RVC/RVCModelMerger.py +++ b/server/voice_changer/RVC/RVCModelMerger.py @@ -4,17 +4,17 @@ import torch from const import UPLOAD_DIR from voice_changer.RVC.modelMerger.MergeModel import merge_model from voice_changer.utils.ModelMerger import ModelMerger, ModelMergerRequest +from voice_changer.utils.VoiceChangerParams import VoiceChangerParams class RVCModelMerger(ModelMerger): @classmethod - def merge_models(cls, request: ModelMergerRequest, storeSlot: int): - print("[Voice Changer] MergeRequest:", request) - merged = merge_model(request) + def merge_models(cls, params: VoiceChangerParams, request: ModelMergerRequest, storeSlot: int): + merged = merge_model(params, request) # いったんは、アップロードフォルダに格納する。(歴史的経緯) # 後続のloadmodelを呼び出すことで永続化モデルフォルダに移動させられる。 - storeDir = os.path.join(UPLOAD_DIR, f"{storeSlot}") + storeDir = os.path.join(UPLOAD_DIR) print("[Voice Changer] store merged model to:", storeDir) os.makedirs(storeDir, exist_ok=True) storeFile = os.path.join(storeDir, "merged.pth") diff --git a/server/voice_changer/RVC/modelMerger/MergeModel.py b/server/voice_changer/RVC/modelMerger/MergeModel.py index 72233500..57282a6c 100644 --- a/server/voice_changer/RVC/modelMerger/MergeModel.py +++ b/server/voice_changer/RVC/modelMerger/MergeModel.py @@ -1,12 +1,14 @@ from typing import Dict, Any - +import os from collections import OrderedDict import torch +from voice_changer.ModelSlotManager import ModelSlotManager from voice_changer.utils.ModelMerger import ModelMergerRequest +from voice_changer.utils.VoiceChangerParams import VoiceChangerParams -def merge_model(request: ModelMergerRequest): +def merge_model(params: VoiceChangerParams, request: ModelMergerRequest): def extract(ckpt: Dict[str, Any]): a = ckpt["model"] opt: Dict[str, Any] = OrderedDict() @@ -34,11 +36,16 @@ def merge_model(request: ModelMergerRequest): weights = [] alphas = [] + slotManager = ModelSlotManager.get_instance(params.model_dir) for f in files: strength = f.strength if strength == 0: continue - weight, state_dict = load_weight(f.filename) + slotInfo = slotManager.get_slot_info(f.slotIndex) + + filename = os.path.join(params.model_dir, str(f.slotIndex), os.path.basename(slotInfo.modelFile)) # slotInfo.modelFileはv.1.5.3.11以前はmodel_dirから含まれている。 + + weight, state_dict = load_weight(filename) weights.append(weight) alphas.append(f.strength) diff --git a/server/voice_changer/VoiceChangerManager.py b/server/voice_changer/VoiceChangerManager.py index 5aa25d3c..c98936ad 100644 --- a/server/voice_changer/VoiceChangerManager.py +++ b/server/voice_changer/VoiceChangerManager.py @@ -306,8 +306,8 @@ class VoiceChangerManager(ServerDeviceCallbacks): req.files = [MergeElement(**f) for f in req.files] slot = len(self.modelSlotManager.getAllSlotInfo()) - 1 if req.voiceChangerType == "RVC": - merged = RVCModelMerger.merge_models(req, slot) - loadParam = LoadModelParams(voiceChangerType="RVC", slot=slot, isSampleMode=False, sampleId="", files=[LoadModelParamFile(name=os.path.basename(merged), kind="rvcModel", dir=f"{slot}")], params={}) + merged = RVCModelMerger.merge_models(self.params, req, slot) + loadParam = LoadModelParams(voiceChangerType="RVC", slot=slot, isSampleMode=False, sampleId="", files=[LoadModelParamFile(name=os.path.basename(merged), kind="rvcModel", dir="")], params={}) self.loadModel(loadParam) return self.get_info() diff --git a/server/voice_changer/utils/ModelMerger.py b/server/voice_changer/utils/ModelMerger.py index d22e0a03..9bec7726 100644 --- a/server/voice_changer/utils/ModelMerger.py +++ b/server/voice_changer/utils/ModelMerger.py @@ -5,6 +5,7 @@ from dataclasses import dataclass @dataclass class MergeElement: + slotIndex: int filename: str strength: int