From 3233377abdf6192ce737c27351178ec65e91acf9 Mon Sep 17 00:00:00 2001 From: wataru Date: Wed, 24 May 2023 20:49:24 +0900 Subject: [PATCH] sample update --- client/demo/dist/index.js | 4 +- .../demo/components/201_StartButtonRow.tsx | 2 +- .../demo/components/204_ModelSwitchRow.tsx | 2 +- .../components/207_ServerOpertationRow.tsx | 3 +- .../demo/components/a01_MergeLab.Row.tsx | 2 +- server/ModelSample.py | 1 - server/const.py | 4 +- server/samples_0003_o.json | 74 +++++++++++++++++++ server/samples_0003_t.json | 74 +++++++++++++++++++ server/voice_changer/RVC/ModelSlot.py | 2 +- .../voice_changer/RVC/ModelSlotGenerator.py | 43 ++++++++--- server/voice_changer/RVC/RVC.py | 30 ++++---- server/voice_changer/RVC/SampleDownloader.py | 39 ++-------- .../RVC/modelMerger/MergeModel.py | 5 ++ .../RVC/onnxExporter/export2onnx.py | 2 + .../RVC/pipeline/PipelineGenerator.py | 1 + 16 files changed, 219 insertions(+), 69 deletions(-) create mode 100644 server/samples_0003_o.json create mode 100644 server/samples_0003_t.json diff --git a/client/demo/dist/index.js b/client/demo/dist/index.js index 9f32dd4c..262bbfff 100644 --- a/client/demo/dist/index.js +++ b/client/demo/dist/index.js @@ -334,7 +334,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 */ StartButtonRow: () => (/* binding */ StartButtonRow)\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\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\nvar StartButtonRow = function StartButtonRow(_props) {\n var appState = (0,_001_provider_001_AppStateProvider__WEBPACK_IMPORTED_MODULE_5__.useAppState)();\n var guiState = (0,_001_GuiStateProvider__WEBPACK_IMPORTED_MODULE_6__.useGuiState)();\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_4__.useState)(false),\n _useState2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(_useState, 2),\n startWithAudioContextCreate = _useState2[0],\n setStartWithAudioContextCreate = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_4__.useEffect)(function () {\n if (!startWithAudioContextCreate) {\n return;\n }\n guiState.setIsConverting(true);\n appState.clientSetting.start();\n }, [startWithAudioContextCreate]);\n var startButtonRow = (0,react__WEBPACK_IMPORTED_MODULE_4__.useMemo)(function () {\n var onStartClicked = /*#__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 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 if (!(appState.serverSetting.serverSetting.enableServerAudio == 0)) {\n _context.next = 17;\n break;\n }\n if (appState.initializedRef.current) {\n _context.next = 12;\n break;\n }\n case 2:\n if (false) {}\n _context.next = 5;\n return new Promise(function (resolve) {\n setTimeout(resolve, 500);\n });\n case 5:\n if (!appState.initializedRef.current) {\n _context.next = 7;\n break;\n }\n return _context.abrupt(\"break\", 9);\n case 7:\n _context.next = 2;\n break;\n case 9:\n setStartWithAudioContextCreate(true);\n _context.next = 15;\n break;\n case 12:\n guiState.setIsConverting(true);\n _context.next = 15;\n return appState.clientSetting.start();\n case 15:\n _context.next = 19;\n break;\n case 17:\n appState.serverSetting.updateServerSettings(_objectSpread(_objectSpread({}, appState.serverSetting.serverSetting), {}, {\n serverAudioStated: 1\n }));\n guiState.setIsConverting(true);\n case 19:\n case \"end\":\n return _context.stop();\n }\n }, _callee);\n }));\n return function onStartClicked() {\n return _ref.apply(this, arguments);\n };\n }();\n var onStopClicked = /*#__PURE__*/function () {\n var _ref2 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_3___default().mark(function _callee2() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_3___default().wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n if (!(appState.serverSetting.serverSetting.enableServerAudio == 0)) {\n _context2.next = 6;\n break;\n }\n guiState.setIsConverting(false);\n _context2.next = 4;\n return appState.clientSetting.stop();\n case 4:\n _context2.next = 9;\n break;\n case 6:\n guiState.setIsConverting(false);\n console.log(\"Stop clicked\", appState.serverSetting.serverSetting);\n appState.serverSetting.updateServerSettings(_objectSpread(_objectSpread({}, appState.serverSetting.serverSetting), {}, {\n serverAudioStated: 0\n }));\n case 9:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2);\n }));\n return function onStopClicked() {\n return _ref2.apply(this, arguments);\n };\n }();\n var startClassName = guiState.isConverting ? \"body-button-active\" : \"body-button-stanby\";\n var stopClassName = guiState.isConverting ? \"body-button-stanby\" : \"body-button-active\";\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"body-row split-3-2-2-3 left-padding-1 guided\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"body-item-title left-padding-1\"\n }, \"Start\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"body-button-container\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n onClick: onStartClicked,\n className: startClassName\n }, \"start\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n onClick: onStopClicked,\n className: stopClassName\n }, \"stop\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"body-input-container\"\n }));\n }, [guiState.isConverting, appState.clientSetting.start, appState.clientSetting.stop, appState.serverSetting.serverSetting,, appState.serverSetting.updateServerSettings]);\n return startButtonRow;\n};\n\n//# sourceURL=webpack://demo/./src/components/demo/components/201_StartButtonRow.tsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StartButtonRow: () => (/* binding */ StartButtonRow)\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\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\nvar StartButtonRow = function StartButtonRow(_props) {\n var appState = (0,_001_provider_001_AppStateProvider__WEBPACK_IMPORTED_MODULE_5__.useAppState)();\n var guiState = (0,_001_GuiStateProvider__WEBPACK_IMPORTED_MODULE_6__.useGuiState)();\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_4__.useState)(false),\n _useState2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(_useState, 2),\n startWithAudioContextCreate = _useState2[0],\n setStartWithAudioContextCreate = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_4__.useEffect)(function () {\n if (!startWithAudioContextCreate) {\n return;\n }\n guiState.setIsConverting(true);\n appState.clientSetting.start();\n }, [startWithAudioContextCreate]);\n var startButtonRow = (0,react__WEBPACK_IMPORTED_MODULE_4__.useMemo)(function () {\n var onStartClicked = /*#__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 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 if (!(appState.serverSetting.serverSetting.enableServerAudio == 0)) {\n _context.next = 17;\n break;\n }\n if (appState.initializedRef.current) {\n _context.next = 12;\n break;\n }\n case 2:\n if (false) {}\n _context.next = 5;\n return new Promise(function (resolve) {\n setTimeout(resolve, 500);\n });\n case 5:\n if (!appState.initializedRef.current) {\n _context.next = 7;\n break;\n }\n return _context.abrupt(\"break\", 9);\n case 7:\n _context.next = 2;\n break;\n case 9:\n setStartWithAudioContextCreate(true);\n _context.next = 15;\n break;\n case 12:\n guiState.setIsConverting(true);\n _context.next = 15;\n return appState.clientSetting.start();\n case 15:\n _context.next = 19;\n break;\n case 17:\n appState.serverSetting.updateServerSettings(_objectSpread(_objectSpread({}, appState.serverSetting.serverSetting), {}, {\n serverAudioStated: 1\n }));\n guiState.setIsConverting(true);\n case 19:\n case \"end\":\n return _context.stop();\n }\n }, _callee);\n }));\n return function onStartClicked() {\n return _ref.apply(this, arguments);\n };\n }();\n var onStopClicked = /*#__PURE__*/function () {\n var _ref2 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_3___default().mark(function _callee2() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_3___default().wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n if (!(appState.serverSetting.serverSetting.enableServerAudio == 0)) {\n _context2.next = 6;\n break;\n }\n guiState.setIsConverting(false);\n _context2.next = 4;\n return appState.clientSetting.stop();\n case 4:\n _context2.next = 9;\n break;\n case 6:\n guiState.setIsConverting(false);\n console.log(\"Stop clicked\", appState.serverSetting.serverSetting);\n appState.serverSetting.updateServerSettings(_objectSpread(_objectSpread({}, appState.serverSetting.serverSetting), {}, {\n serverAudioStated: 0\n }));\n case 9:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2);\n }));\n return function onStopClicked() {\n return _ref2.apply(this, arguments);\n };\n }();\n var startClassName = guiState.isConverting ? \"body-button-active\" : \"body-button-stanby\";\n var stopClassName = guiState.isConverting ? \"body-button-stanby\" : \"body-button-active\";\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"body-row split-3-2-2-3 left-padding-1 guided\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"body-item-title left-padding-1\"\n }, \"Start\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"body-button-container\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n onClick: onStartClicked,\n className: startClassName\n }, \"start\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n onClick: onStopClicked,\n className: stopClassName\n }, \"stop\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default().createElement(\"div\", {\n className: \"body-input-container\"\n }));\n }, [guiState.isConverting, appState.clientSetting.start, appState.clientSetting.stop, appState.serverSetting.serverSetting, appState.serverSetting.updateServerSettings]);\n return startButtonRow;\n};\n\n//# sourceURL=webpack://demo/./src/components/demo/components/201_StartButtonRow.tsx?"); /***/ }), @@ -400,7 +400,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 */ ServerOpertationRow: () => (/* binding */ ServerOpertationRow)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\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 _001_GuiStateProvider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../001_GuiStateProvider */ \"./src/components/demo/001_GuiStateProvider.tsx\");\n\n\n\n\n\nvar ServerOpertationRow = function ServerOpertationRow(props) {\n var appState = (0,_001_provider_001_AppStateProvider__WEBPACK_IMPORTED_MODULE_3__.useAppState)();\n var guiState = (0,_001_GuiStateProvider__WEBPACK_IMPORTED_MODULE_4__.useGuiState)();\n var serverOpertationRow = (0,react__WEBPACK_IMPORTED_MODULE_2__.useMemo)(function () {\n var onnxExportButtonAction = /*#__PURE__*/function () {\n var _ref = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee() {\n var _document$getElementB;\n var res, a;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n if (!guiState.isConverting) {\n _context.next = 3;\n break;\n }\n alert(\"cannot export onnx when voice conversion is enabled\");\n return _context.abrupt(\"return\");\n case 3:\n (_document$getElementB = document.getElementById(\"dialog\")) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.classList.add(\"dialog-container-show\");\n guiState.stateControls.showWaitingCheckbox.updateState(true);\n _context.next = 7;\n return appState.serverSetting.getOnnx();\n case 7:\n res = _context.sent;\n a = document.createElement(\"a\");\n a.href = res.path;\n a.download = res.filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n guiState.stateControls.showWaitingCheckbox.updateState(false);\n case 15:\n case \"end\":\n return _context.stop();\n }\n }, _callee);\n }));\n return function onnxExportButtonAction() {\n return _ref.apply(this, arguments);\n };\n }();\n var onDownloadClicked = function onDownloadClicked() {\n var slot = appState.serverSetting.serverSetting.modelSlotIndex;\n var model = appState.serverSetting.serverSetting.modelSlots[slot];\n var a = document.createElement(\"a\");\n a.href = model.modelFile;\n a.download = a.href.replace(/^.*[\\\\\\/]/, '');\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n var onReloadClicked = /*#__PURE__*/function () {\n var _ref2 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee2() {\n var info;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return appState.getInfo();\n case 2:\n info = _context2.sent;\n console.log(\"info\", info);\n case 4:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2);\n }));\n return function onReloadClicked() {\n return _ref2.apply(this, arguments);\n };\n }();\n var exportOnnx = appState.serverSetting.serverSetting.framework == \"PyTorch\" && props.showExportOnnx == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(\"div\", {\n className: \"body-button left-margin-1\",\n onClick: onnxExportButtonAction\n }, \"export onnx\") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement((react__WEBPACK_IMPORTED_MODULE_2___default().Fragment), null);\n var download = props.showDownload ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(\"div\", {\n className: \"body-button left-margin-1\",\n onClick: function onClick() {\n onDownloadClicked();\n }\n }, \"download\") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement((react__WEBPACK_IMPORTED_MODULE_2___default().Fragment), null);\n var reload = props.showReload ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(\"div\", {\n className: \"body-button-container\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(\"div\", {\n className: \"body-button\",\n onClick: onReloadClicked\n }, \"reload\")) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement((react__WEBPACK_IMPORTED_MODULE_2___default().Fragment), null);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement((react__WEBPACK_IMPORTED_MODULE_2___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(\"div\", {\n className: \"body-row split-3-7 left-padding-1 guided\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(\"div\", {\n className: \"body-item-title left-padding-1\"\n }, \"Operation\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(\"div\", {\n className: \"body-button-container\"\n }, exportOnnx, download, reload)));\n }, [appState.getInfo, appState.serverSetting.serverSetting]);\n return serverOpertationRow;\n};\n\n//# sourceURL=webpack://demo/./src/components/demo/components/207_ServerOpertationRow.tsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ServerOpertationRow: () => (/* binding */ ServerOpertationRow)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\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 _001_GuiStateProvider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../001_GuiStateProvider */ \"./src/components/demo/001_GuiStateProvider.tsx\");\n\n\n\n\n\nvar ServerOpertationRow = function ServerOpertationRow(props) {\n var appState = (0,_001_provider_001_AppStateProvider__WEBPACK_IMPORTED_MODULE_3__.useAppState)();\n var guiState = (0,_001_GuiStateProvider__WEBPACK_IMPORTED_MODULE_4__.useGuiState)();\n var serverOpertationRow = (0,react__WEBPACK_IMPORTED_MODULE_2__.useMemo)(function () {\n console.log(\"UPDATE OPERATION ROW:::::::::::::::::::::::\");\n var onnxExportButtonAction = /*#__PURE__*/function () {\n var _ref = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee() {\n var _document$getElementB;\n var res, a;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n if (!guiState.isConverting) {\n _context.next = 3;\n break;\n }\n alert(\"cannot export onnx when voice conversion is enabled\");\n return _context.abrupt(\"return\");\n case 3:\n (_document$getElementB = document.getElementById(\"dialog\")) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.classList.add(\"dialog-container-show\");\n guiState.stateControls.showWaitingCheckbox.updateState(true);\n _context.next = 7;\n return appState.serverSetting.getOnnx();\n case 7:\n res = _context.sent;\n a = document.createElement(\"a\");\n a.href = res.path;\n a.download = res.filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n guiState.stateControls.showWaitingCheckbox.updateState(false);\n case 15:\n case \"end\":\n return _context.stop();\n }\n }, _callee);\n }));\n return function onnxExportButtonAction() {\n return _ref.apply(this, arguments);\n };\n }();\n var onDownloadClicked = function onDownloadClicked() {\n var slot = appState.serverSetting.serverSetting.modelSlotIndex;\n var model = appState.serverSetting.serverSetting.modelSlots[slot];\n var a = document.createElement(\"a\");\n a.href = model.modelFile;\n a.download = a.href.replace(/^.*[\\\\\\/]/, '');\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n var onReloadClicked = /*#__PURE__*/function () {\n var _ref2 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee2() {\n var info;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return appState.getInfo();\n case 2:\n info = _context2.sent;\n console.log(\"info\", info);\n case 4:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2);\n }));\n return function onReloadClicked() {\n return _ref2.apply(this, arguments);\n };\n }();\n var exportOnnx = appState.serverSetting.serverSetting.framework == \"PyTorch\" && props.showExportOnnx == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(\"div\", {\n className: \"body-button left-margin-1\",\n onClick: onnxExportButtonAction\n }, \"export onnx\") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement((react__WEBPACK_IMPORTED_MODULE_2___default().Fragment), null);\n var download = props.showDownload ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(\"div\", {\n className: \"body-button left-margin-1\",\n onClick: function onClick() {\n onDownloadClicked();\n }\n }, \"download\") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement((react__WEBPACK_IMPORTED_MODULE_2___default().Fragment), null);\n var reload = props.showReload ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(\"div\", {\n className: \"body-button-container\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(\"div\", {\n className: \"body-button\",\n onClick: onReloadClicked\n }, \"reload\")) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement((react__WEBPACK_IMPORTED_MODULE_2___default().Fragment), null);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement((react__WEBPACK_IMPORTED_MODULE_2___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(\"div\", {\n className: \"body-row split-3-7 left-padding-1 guided\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(\"div\", {\n className: \"body-item-title left-padding-1\"\n }, \"Operation\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(\"div\", {\n className: \"body-button-container\"\n }, exportOnnx, download, reload)));\n }, [appState.getInfo, appState.serverSetting.serverSetting, guiState.isConverting]);\n return serverOpertationRow;\n};\n\n//# sourceURL=webpack://demo/./src/components/demo/components/207_ServerOpertationRow.tsx?"); /***/ }), diff --git a/client/demo/src/components/demo/components/201_StartButtonRow.tsx b/client/demo/src/components/demo/components/201_StartButtonRow.tsx index 2e4791b8..19ff57f5 100644 --- a/client/demo/src/components/demo/components/201_StartButtonRow.tsx +++ b/client/demo/src/components/demo/components/201_StartButtonRow.tsx @@ -70,7 +70,7 @@ export const StartButtonRow = (_props: StartButtonRowProps) => { ) - }, [guiState.isConverting, appState.clientSetting.start, appState.clientSetting.stop, appState.serverSetting.serverSetting, , appState.serverSetting.updateServerSettings]) + }, [guiState.isConverting, appState.clientSetting.start, appState.clientSetting.stop, appState.serverSetting.serverSetting, appState.serverSetting.updateServerSettings]) return startButtonRow } \ No newline at end of file diff --git a/client/demo/src/components/demo/components/204_ModelSwitchRow.tsx b/client/demo/src/components/demo/components/204_ModelSwitchRow.tsx index abaff261..5e288e20 100644 --- a/client/demo/src/components/demo/components/204_ModelSwitchRow.tsx +++ b/client/demo/src/components/demo/components/204_ModelSwitchRow.tsx @@ -39,7 +39,7 @@ export const ModelSwitchRow = (_props: ModelSwitchRowProps) => { if (x.modelType == "pyTorchRVC" || x.modelType == "pyTorchRVCNono") { return "org" } else if (x.modelType == "pyTorchRVCv2" || x.modelType == "pyTorchRVCv2Nono") { - return "orv_v2" + return "org_v2" } else if (x.modelType == "pyTorchWebUI" || x.modelType == "pyTorchWebUINono") { return "webui" } else { diff --git a/client/demo/src/components/demo/components/207_ServerOpertationRow.tsx b/client/demo/src/components/demo/components/207_ServerOpertationRow.tsx index a4f78fbe..ed1f137b 100644 --- a/client/demo/src/components/demo/components/207_ServerOpertationRow.tsx +++ b/client/demo/src/components/demo/components/207_ServerOpertationRow.tsx @@ -15,6 +15,7 @@ export const ServerOpertationRow = (props: ServerOpertationRowProps) => { const guiState = useGuiState() const serverOpertationRow = useMemo(() => { + console.log("UPDATE OPERATION ROW:::::::::::::::::::::::") const onnxExportButtonAction = async () => { @@ -78,7 +79,7 @@ export const ServerOpertationRow = (props: ServerOpertationRowProps) => { ) - }, [appState.getInfo, appState.serverSetting.serverSetting]) + }, [appState.getInfo, appState.serverSetting.serverSetting, guiState.isConverting]) return serverOpertationRow } diff --git a/client/demo/src/components/demo/components/a01_MergeLab.Row.tsx b/client/demo/src/components/demo/components/a01_MergeLab.Row.tsx index 2a01f7e5..92108ba9 100644 --- a/client/demo/src/components/demo/components/a01_MergeLab.Row.tsx +++ b/client/demo/src/components/demo/components/a01_MergeLab.Row.tsx @@ -121,7 +121,7 @@ export const MergeLabRow = (_props: MergeLabRowProps) => { if (modelInfo.modelType == "pyTorchRVC" || modelInfo.modelType == "pyTorchRVCNono") { return "org" } else if (modelInfo.modelType == "pyTorchRVCv2" || modelInfo.modelType == "pyTorchRVCv2Nono") { - return "orv_v2" + return "g_v2" } else if (modelInfo.modelType == "pyTorchWebUI" || modelInfo.modelType == "pyTorchWebUINono") { return "webui" } else { diff --git a/server/ModelSample.py b/server/ModelSample.py index 36e92a3d..3423bcb7 100644 --- a/server/ModelSample.py +++ b/server/ModelSample.py @@ -12,7 +12,6 @@ class RVCModelSample: name: str = "" modelUrl: str = "" indexUrl: str = "" - featureUrl: str = "" termsOfUseUrl: str = "" credit: str = "" description: str = "" diff --git a/server/const.py b/server/const.py index 89338d64..7d028d56 100644 --- a/server/const.py +++ b/server/const.py @@ -101,8 +101,8 @@ class ServerAudioDeviceTypes(Enum): SAMPLES_JSONS = [ - "https://huggingface.co/wok000/vcclient_model/raw/main/samples_0001.json", - "https://huggingface.co/wok000/vcclient_model/raw/main/samples_0002.json", + "https://huggingface.co/wok000/vcclient_model/raw/main/samples_0003_t.json", + "https://huggingface.co/wok000/vcclient_model/raw/main/samples_0003_o.json", ] RVC_MODEL_DIRNAME = "rvc" RVC_MAX_SLOT_NUM = 5 diff --git a/server/samples_0003_o.json b/server/samples_0003_o.json new file mode 100644 index 00000000..aada67c1 --- /dev/null +++ b/server/samples_0003_o.json @@ -0,0 +1,74 @@ +{ + "RVC": [ + { + "id": "KikotoKurage_o", + "lang": "ja-JP", + "tag": ["v2", "onnx"], + "name": "黄琴海月", + "modelUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/kikoto_kurage/kikoto_kurage_v2_40k_e100_simple.onnx", + "indexUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/kikoto_kurage/added_IVF5181_Flat_nprobe_1_v2.index.bin", + "termsOfUseUrl": "https://huggingface.co/wok000/vcclient_model/raw/main/rvc_v2_alpha/kikoto_kurage/terms_of_use.txt", + "credit": "黄琴海月", + "description": "", + "sampleRate": 40000, + "modelType": "rvc_v2", + "f0": true + }, + { + "id": "KikotoMahiro_o", + "lang": "ja-JP", + "tag": ["v2", "onnx"], + "name": "黄琴まひろ", + "modelUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/kikoto_mahiro/kikoto_mahiro_v2_40k_simple.onnx", + "indexUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/kikoto_mahiro/added_IVF6881_Flat_nprobe_1_v2.index.bin", + "termsOfUseUrl": "", + "credit": "黄琴まひろ", + "description": "", + "sampleRate": 40000, + "modelType": "rvc_v2", + "f0": true + }, + { + "id": "TokinaShigure_o", + "lang": "ja-JP", + "tag": ["v2", "onnx"], + "name": "刻鳴時雨", + "modelUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/tokina_shigure/tokina_shigure_v2_40k_e100_simple.onnx", + "indexUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/tokina_shigure/added_IVF2736_Flat_nprobe_1_v2.index.bin", + "termsOfUseUrl": "https://huggingface.co/wok000/vcclient_model/raw/main/rvc_v2_alpha/tokina_shigure/terms_of_use.txt", + "credit": "刻鳴時雨", + "description": "", + "sampleRate": 40000, + "modelType": "rvc_v2", + "f0": true + }, + { + "id": "Amitaro_o", + "lang": "ja-JP", + "tag": ["v2", "onnx"], + "name": "あみたろ", + "modelUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/amitaro/amitaro_v2_40k_e100_simple.onnx", + "indexUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/amitaro/added_IVF3139_Flat_nprobe_1_v2.index.bin", + "termsOfUseUrl": "https://huggingface.co/wok000/vcclient_model/raw/main/rvc_v2_alpha/amitaro/terms_of_use.txt", + "credit": "あみたろ", + "description": "", + "sampleRate": 40000, + "modelType": "rvc_v2", + "f0": true + }, + { + "id": "Tsukuyomi-chan_o", + "lang": "ja-JP", + "tag": ["v2", "onnx"], + "name": "つくよみちゃん", + "modelUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/tsukuyomi-chan/tsukuyomi_v2_40k_e100_simple.onnx", + "indexUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/tsukuyomi-chan/added_IVF7852_Flat_nprobe_1_v2.index.bin", + "termsOfUseUrl": "https://huggingface.co/wok000/vcclient_model/blob/main/rvc_v2_alpha/tsukuyomi-chan/terms_of_use.txt", + "credit": "つくよみちゃん", + "description": "", + "sampleRate": 40000, + "modelType": "rvc_v2", + "f0": true + } + ] +} diff --git a/server/samples_0003_t.json b/server/samples_0003_t.json new file mode 100644 index 00000000..40116d5a --- /dev/null +++ b/server/samples_0003_t.json @@ -0,0 +1,74 @@ +{ + "RVC": [ + { + "id": "KikotoKurage_t", + "lang": "ja-JP", + "tag": ["v2", "torch"], + "name": "黄琴海月", + "modelUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/kikoto_kurage/kikoto_kurage_v2_40k_e100.pth", + "indexUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/kikoto_kurage/added_IVF5181_Flat_nprobe_1_v2.index.bin", + "termsOfUseUrl": "https://huggingface.co/wok000/vcclient_model/raw/main/rvc_v2_alpha/kikoto_kurage/terms_of_use.txt", + "credit": "黄琴海月", + "description": "", + "sampleRate": 40000, + "modelType": "rvc_v2", + "f0": true + }, + { + "id": "KikotoMahiro_t", + "lang": "ja-JP", + "tag": ["v2", "torch"], + "name": "黄琴まひろ", + "modelUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/kikoto_mahiro/kikoto_mahiro_v2_40k.pth", + "indexUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/kikoto_mahiro/added_IVF6881_Flat_nprobe_1_v2.index.bin", + "termsOfUseUrl": "", + "credit": "黄琴まひろ", + "description": "", + "sampleRate": 40000, + "modelType": "rvc_v2", + "f0": true + }, + { + "id": "TokinaShigure_t", + "lang": "ja-JP", + "tag": ["v2", "torch"], + "name": "刻鳴時雨", + "modelUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/tokina_shigure/tokina_shigure_v2_40k_e100.pth", + "indexUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/tokina_shigure/added_IVF2736_Flat_nprobe_1_v2.index.bin", + "termsOfUseUrl": "https://huggingface.co/wok000/vcclient_model/raw/main/rvc_v2_alpha/tokina_shigure/terms_of_use.txt", + "credit": "刻鳴時雨", + "description": "", + "sampleRate": 40000, + "modelType": "rvc_v2", + "f0": true + }, + { + "id": "Amitaro_t", + "lang": "ja-JP", + "tag": ["v2", "torch"], + "name": "あみたろ", + "modelUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/amitaro/amitaro_v2_40k_e100.pth", + "indexUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/amitaro/added_IVF3139_Flat_nprobe_1_v2.index.bin", + "termsOfUseUrl": "https://huggingface.co/wok000/vcclient_model/raw/main/rvc_v2_alpha/amitaro/terms_of_use.txt", + "credit": "あみたろ", + "description": "", + "sampleRate": 40000, + "modelType": "rvc_v2", + "f0": true + }, + { + "id": "Tsukuyomi-chan_t", + "lang": "ja-JP", + "tag": ["v2", "torch"], + "name": "つくよみちゃん", + "modelUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/tsukuyomi-chan/tsukuyomi_v2_40k_e100.pth", + "indexUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/tsukuyomi-chan/added_IVF7852_Flat_nprobe_1_v2.index.bin", + "termsOfUseUrl": "https://huggingface.co/wok000/vcclient_model/blob/main/rvc_v2_alpha/tsukuyomi-chan/terms_of_use.txt", + "credit": "つくよみちゃん", + "description": "", + "sampleRate": 40000, + "modelType": "rvc_v2", + "f0": true + } + ] +} diff --git a/server/voice_changer/RVC/ModelSlot.py b/server/voice_changer/RVC/ModelSlot.py index 46f8ce65..b008f943 100644 --- a/server/voice_changer/RVC/ModelSlot.py +++ b/server/voice_changer/RVC/ModelSlot.py @@ -17,7 +17,7 @@ class ModelSlot: samplingRate: int = -1 f0: bool = True embChannels: int = 256 - embOutputLayter: int = 9 + embOutputLayer: int = 9 useFinalProj: bool = True deprecated: bool = False embedder: EnumEmbedderTypes = EnumEmbedderTypes.hubert diff --git a/server/voice_changer/RVC/ModelSlotGenerator.py b/server/voice_changer/RVC/ModelSlotGenerator.py index 580b9888..f13473cd 100644 --- a/server/voice_changer/RVC/ModelSlotGenerator.py +++ b/server/voice_changer/RVC/ModelSlotGenerator.py @@ -66,7 +66,7 @@ def _setInfoByPytorch(slot: ModelSlot): else EnumInferenceTypes.pyTorchRVCNono ) slot.embChannels = 256 - slot.embOutputLayter = 9 + slot.embOutputLayer = 9 slot.useFinalProj = True slot.embedder = EnumEmbedderTypes.hubert else: @@ -76,7 +76,7 @@ def _setInfoByPytorch(slot: ModelSlot): else EnumInferenceTypes.pyTorchRVCv2Nono ) slot.embChannels = 768 - slot.embOutputLayter = 12 + slot.embOutputLayer = 12 slot.useFinalProj = False slot.embedder = EnumEmbedderTypes.hubert @@ -89,7 +89,7 @@ def _setInfoByPytorch(slot: ModelSlot): else EnumInferenceTypes.pyTorchWebUINono ) slot.embChannels = cpt["config"][17] - slot.embOutputLayter = ( + slot.embOutputLayer = ( cpt["embedder_output_layer"] if "embedder_output_layer" in cpt else 9 ) if slot.embChannels == 256: @@ -100,19 +100,19 @@ def _setInfoByPytorch(slot: ModelSlot): # DDPNモデルの情報を表示 if ( slot.embChannels == 256 - and slot.embOutputLayter == 9 + and slot.embOutputLayer == 9 and slot.useFinalProj is True ): print("[Voice Changer] DDPN Model: Original v1 like") elif ( slot.embChannels == 768 - and slot.embOutputLayter == 12 + and slot.embOutputLayer == 12 and slot.useFinalProj is False ): print("[Voice Changer] DDPN Model: Original v2 like") else: print( - f"[Voice Changer] DDPN Model: ch:{slot.embChannels}, L:{slot.embOutputLayter}, FP:{slot.useFinalProj}" + f"[Voice Changer] DDPN Model: ch:{slot.embChannels}, L:{slot.embOutputLayer}, FP:{slot.useFinalProj}" ) slot.embedder = cpt["embedder_name"] @@ -144,10 +144,15 @@ def _setInfoByONNX(slot: ModelSlot): # slot.modelType = metadata["modelType"] slot.embChannels = metadata["embChannels"] - slot.embOutputLayter = ( - metadata["embedder_output_layer"] - if "embedder_output_layer" in metadata - else 9 + slot.embOutputLayer = ( + metadata["embOutputLayer"] if "embOutputLayer" in metadata else 9 + ) + slot.useFinalProj = ( + metadata["useFinalProj"] + if "useFinalProj" in metadata + else True + if slot.embChannels == 256 + else False ) if slot.embChannels == 256: @@ -155,7 +160,23 @@ def _setInfoByONNX(slot: ModelSlot): else: slot.useFinalProj = False - print("ONNX", slot) + # ONNXモデルの情報を表示 + if ( + slot.embChannels == 256 + and slot.embOutputLayer == 9 + and slot.useFinalProj is True + ): + print("[Voice Changer] ONNX Model: Original v1 like") + elif ( + slot.embChannels == 768 + and slot.embOutputLayer == 12 + and slot.useFinalProj is False + ): + print("[Voice Changer] ONNX Model: Original v2 like") + else: + print( + f"[Voice Changer] ONNX Model: ch:{slot.embChannels}, L:{slot.embOutputLayer}, FP:{slot.useFinalProj}" + ) if "embedder" not in metadata: slot.embedder = EnumEmbedderTypes.hubert diff --git a/server/voice_changer/RVC/RVC.py b/server/voice_changer/RVC/RVC.py index b78f7b82..66208e7e 100644 --- a/server/voice_changer/RVC/RVC.py +++ b/server/voice_changer/RVC/RVC.py @@ -86,7 +86,7 @@ class RVC: if len(slot.modelFile) > 0: self.prepareModel(i) self.settings.modelSlotIndex = i - self.switchModel() + self.switchModel(self.settings.modelSlotIndex) self.initialLoad = False break @@ -115,12 +115,10 @@ class RVC: if sampleInfo is None: print("[Voice Changer] sampleInfo is None") return - modelPath, indexPath, featurePath = downloadModelFiles(sampleInfo) + modelPath, indexPath = downloadModelFiles(sampleInfo) params["files"]["rvcModel"] = modelPath if indexPath is not None: params["files"]["rvcIndex"] = indexPath - if featurePath is not None: - params["files"]["rvcFeature"] = featurePath params["credit"] = sampleInfo.credit params["description"] = sampleInfo.description params["name"] = sampleInfo.name @@ -152,7 +150,7 @@ class RVC: if self.initialLoad: self.prepareModel(target_slot_idx) self.settings.modelSlotIndex = target_slot_idx - self.switchModel() + self.switchModel(self.settings.modelSlotIndex) self.initialLoad = False elif target_slot_idx == self.currentSlot: self.prepareModel(target_slot_idx) @@ -242,11 +240,12 @@ class RVC: self.next_index_ratio = modelSlot.defaultIndexRatio self.next_samplingRate = modelSlot.samplingRate self.next_framework = "ONNX" if modelSlot.isONNX else "PyTorch" - self.needSwitch = True + # self.needSwitch = True print("[Voice Changer] Prepare done.") + self.switchModel(slot) return self.get_info() - def switchModel(self): + def switchModel(self, slot: int): print("[Voice Changer] Switching model..") self.pipeline = self.next_pipeline self.settings.tran = self.next_trans @@ -254,6 +253,8 @@ class RVC: self.settings.modelSamplingRate = self.next_samplingRate self.settings.framework = self.next_framework + # self.currentSlot = self.settings.modelSlotIndex # prepareModelから呼ばれるということはupdate_settingsの中で呼ばれるということなので、まだmodelSlotIndexは更新されていない + self.currentSlot = slot print( "[Voice Changer] Switching model..done", ) @@ -308,13 +309,12 @@ class RVC: self.currentSlot, ) raise NoModeLoadedException("model_common") - if self.needSwitch: - print( - f"[Voice Changer] Switch model {self.currentSlot} -> {self.settings.modelSlotIndex}" - ) - self.currentSlot = self.settings.modelSlotIndex - self.switchModel() - self.needSwitch = False + # if self.needSwitch: + # print( + # f"[Voice Changer] Switch model {self.currentSlot} -> {self.settings.modelSlotIndex}" + # ) + # self.switchModel() + # self.needSwitch = False half = self.deviceManager.halfPrecisionAvailable(self.settings.gpu) @@ -333,7 +333,7 @@ class RVC: f0_up_key = self.settings.tran index_rate = self.settings.indexRatio if_f0 = 1 if self.settings.modelSlots[self.currentSlot].f0 else 0 - embOutputLayer = self.settings.modelSlots[self.currentSlot].embOutputLayter + embOutputLayer = self.settings.modelSlots[self.currentSlot].embOutputLayer useFinalProj = self.settings.modelSlots[self.currentSlot].useFinalProj audio_out = self.pipeline.exec( diff --git a/server/voice_changer/RVC/SampleDownloader.py b/server/voice_changer/RVC/SampleDownloader.py index 309d89f0..038235a8 100644 --- a/server/voice_changer/RVC/SampleDownloader.py +++ b/server/voice_changer/RVC/SampleDownloader.py @@ -16,10 +16,10 @@ def checkRvcModelExist(model_dir: str): def downloadInitialSampleModels(sampleJsons: list[str], model_dir: str): sampleModelIds = [ - "KikotoMahiro", - "TokinaShigure", - "Amitaro", - "Tsukuyomi-chan", + "KikotoMahiro_o", + "TokinaShigure_o", + "Amitaro_o", + "Tsukuyomi-chan_o", ] sampleModels = getModelSamples(sampleJsons, "RVC") if sampleModels is None: @@ -60,23 +60,7 @@ def downloadInitialSampleModels(sampleJsons: list[str], model_dir: str): "position": line_num, } ) - sampleParams["files"]["rvcIndex"] = modelFilePath - line_num += 1 - - featurePath = None - if hasattr(sample, "featureUrl") or sample.featureUrl != "": - featurePath = os.path.join( - slotDir, - os.path.basename(sample.featureUrl), - ) - downloadParams.append( - { - "url": sample.featureUrl, - "saveTo": featurePath, - "position": line_num, - } - ) - sampleParams["files"]["rvcFeatur"] = modelFilePath + sampleParams["files"]["rvcIndex"] = indexPath line_num += 1 sampleParams["sampleId"] = sample.id @@ -123,19 +107,8 @@ def downloadModelFiles(sampleInfo: RVCModelSample): } ) - featurePath = None - if hasattr(sampleInfo, "featureUrl") or sampleInfo.featureUrl != "": - featurePath = os.path.join(TMP_DIR, os.path.basename(sampleInfo.featureUrl)) - downloadParams.append( - { - "url": sampleInfo.featureUrl, - "saveTo": featurePath, - "position": 2, - } - ) - print("[Voice Changer] Downloading model files...", end="") with ThreadPoolExecutor() as pool: pool.map(download_no_tqdm, downloadParams) print("") - return modelPath, indexPath, featurePath + return modelPath, indexPath diff --git a/server/voice_changer/RVC/modelMerger/MergeModel.py b/server/voice_changer/RVC/modelMerger/MergeModel.py index 5a547de8..c66c5656 100644 --- a/server/voice_changer/RVC/modelMerger/MergeModel.py +++ b/server/voice_changer/RVC/modelMerger/MergeModel.py @@ -64,5 +64,10 @@ def merge_model(request: MergeModelRequest): merged["embedder_name"] = ( state_dict["embedder_name"] if "embedder_name" in state_dict else None ) + merged["embedder_output_layer"] = ( + state_dict["embedder_output_layer"] + if "embedder_output_layer" in state_dict + else None + ) print("write metadata done.") return merged diff --git a/server/voice_changer/RVC/onnxExporter/export2onnx.py b/server/voice_changer/RVC/onnxExporter/export2onnx.py index 7892e44e..0bf8b613 100644 --- a/server/voice_changer/RVC/onnxExporter/export2onnx.py +++ b/server/voice_changer/RVC/onnxExporter/export2onnx.py @@ -45,6 +45,8 @@ def export2onnx(gpu: int, modelSlot: ModelSlot): "embChannels": modelSlot.embChannels, # ↓EnumEmbedderTypesのままだとシリアライズできないのでテキスト化 "embedder": modelSlot.embedder.value, + "embOutputLayer": modelSlot.embOutputLayer, + "useFinalProj": modelSlot.useFinalProj, } gpuMomory = DeviceManager.get_instance().getDeviceMemory(gpu) print(f"[Voice Changer] exporting onnx... gpu_id:{gpu} gpu_mem:{gpuMomory}") diff --git a/server/voice_changer/RVC/pipeline/PipelineGenerator.py b/server/voice_changer/RVC/pipeline/PipelineGenerator.py index ddb39f2a..6a8d7691 100644 --- a/server/voice_changer/RVC/pipeline/PipelineGenerator.py +++ b/server/voice_changer/RVC/pipeline/PipelineGenerator.py @@ -74,6 +74,7 @@ def _loadIndex(modelSlot: ModelSlot): return None try: + print("Try loading...", modelSlot.indexFile) index = faiss.read_index(modelSlot.indexFile) except: print("[Voice Changer] load index failed. Use no index.")