MultiModel for RVC

This commit is contained in:
wataru 2023-04-21 15:48:12 +09:00
parent 3de900fbdf
commit 257e5f99a4
41 changed files with 869 additions and 2093 deletions

View File

@ -28,12 +28,17 @@
{ {
"name": "serverInfo", "name": "serverInfo",
"options": {} "options": {}
},
{
"name": "modelSwitch",
"options": {}
} }
], ],
"modelSetting": [ "modelSetting": [
{ {
"name": "modelUploader", "name": "modelUploader",
"options": { "options": {
"showModelSlot": true,
"showConfig": false, "showConfig": false,
"showOnnx": true, "showOnnx": true,
"showPyTorch": true, "showPyTorch": true,
@ -45,7 +50,8 @@
"showHalfPrecision": true, "showHalfPrecision": true,
"defaultEnablePyTorch": true, "defaultEnablePyTorch": true,
"showOnnxExportButton": true "showOnnxExportButton": true,
"showDescription": true
} }
}, },
{ {
@ -103,7 +109,9 @@
}, },
{ {
"name": "tune", "name": "tune",
"options": {} "options": {
"showSetDefault": true
}
}, },
{ {
"name": "indexRatio", "name": "indexRatio",

View File

@ -92,7 +92,9 @@
}, },
{ {
"name": "tune", "name": "tune",
"options": {} "options": {
"showPredictF0": true
}
}, },
{ {
"name": "clusterInferRatio", "name": "clusterInferRatio",

View File

@ -92,7 +92,9 @@
}, },
{ {
"name": "tune", "name": "tune",
"options": {} "options": {
"showPredictF0": true
}
}, },
{ {
"name": "clusterInferRatio", "name": "clusterInferRatio",

View File

@ -1,10 +1 @@
<!DOCTYPE html> <!doctype html><html style="width:100%;height:100%;overflow:hidden"><head><meta charset="utf-8"/><title>Voice Changer Client Demo</title><script defer="defer" src="index.js"></script></head><body style="width:100%;height:100%;margin:0"><div id="app" style="width:100%;height:100%"></div></body></html>
<html style="width: 100%; height: 100%; overflow: hidden">
<head>
<meta charset="utf-8" />
<title>Voice Changer Client Demo</title>
<script defer src="index.js"></script></head>
<body style="width: 100%; height: 100%; margin: 0px">
<div id="app" style="width: 100%; height: 100%"></div>
</body>
</html>

File diff suppressed because one or more lines are too long

31
client/demo/dist/index.js.LICENSE.txt vendored Normal file
View File

@ -0,0 +1,31 @@
/*! 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.
*/

View File

@ -9,7 +9,7 @@
"version": "1.0.0", "version": "1.0.0",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.110", "@dannadori/voice-changer-client-js": "^1.0.112",
"@fortawesome/fontawesome-svg-core": "^6.4.0", "@fortawesome/fontawesome-svg-core": "^6.4.0",
"@fortawesome/free-brands-svg-icons": "^6.4.0", "@fortawesome/free-brands-svg-icons": "^6.4.0",
"@fortawesome/free-regular-svg-icons": "^6.4.0", "@fortawesome/free-regular-svg-icons": "^6.4.0",
@ -23,7 +23,7 @@
"@babel/preset-env": "^7.21.4", "@babel/preset-env": "^7.21.4",
"@babel/preset-react": "^7.18.6", "@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.4", "@babel/preset-typescript": "^7.21.4",
"@types/node": "^18.15.11", "@types/node": "^18.15.13",
"@types/react": "^18.0.37", "@types/react": "^18.0.37",
"@types/react-dom": "^18.0.11", "@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14", "autoprefixer": "^10.4.14",
@ -46,7 +46,7 @@
"ts-loader": "^9.4.2", "ts-loader": "^9.4.2",
"tsconfig-paths": "^4.2.0", "tsconfig-paths": "^4.2.0",
"typescript": "^5.0.4", "typescript": "^5.0.4",
"webpack": "^5.79.0", "webpack": "^5.80.0",
"webpack-cli": "^5.0.1", "webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.13.3" "webpack-dev-server": "^4.13.3"
} }
@ -3097,9 +3097,9 @@
} }
}, },
"node_modules/@dannadori/voice-changer-client-js": { "node_modules/@dannadori/voice-changer-client-js": {
"version": "1.0.110", "version": "1.0.112",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.110.tgz", "resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.112.tgz",
"integrity": "sha512-P0owHTaIRKZfZe198D0iEEQ075AjTS57TSxWitIYU8pOL3X80oznWITllDzkgK3bbwgmMlzVPAQQPrCa6AM6jw==", "integrity": "sha512-ydEur3juxY2dNJe7xsqhref61J2JrB/l0oZVV4VLyh4Gu3OR/uhoBAWBtG5qNO0MVIBznbH/xyZ6jHA4JuwaAg==",
"dependencies": { "dependencies": {
"@types/readable-stream": "^2.3.15", "@types/readable-stream": "^2.3.15",
"amazon-chime-sdk-js": "^3.13.0", "amazon-chime-sdk-js": "^3.13.0",
@ -3691,8 +3691,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "18.15.11", "version": "18.15.13",
"license": "MIT" "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz",
"integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q=="
}, },
"node_modules/@types/prop-types": { "node_modules/@types/prop-types": {
"version": "15.7.5", "version": "15.7.5",
@ -3798,133 +3799,148 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@webassemblyjs/ast": { "node_modules/@webassemblyjs/ast": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz",
"integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@webassemblyjs/helper-numbers": "1.11.1", "@webassemblyjs/helper-numbers": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1" "@webassemblyjs/helper-wasm-bytecode": "1.11.5"
} }
}, },
"node_modules/@webassemblyjs/floating-point-hex-parser": { "node_modules/@webassemblyjs/floating-point-hex-parser": {
"version": "1.11.1", "version": "1.11.5",
"dev": true, "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz",
"license": "MIT" "integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==",
"dev": true
}, },
"node_modules/@webassemblyjs/helper-api-error": { "node_modules/@webassemblyjs/helper-api-error": {
"version": "1.11.1", "version": "1.11.5",
"dev": true, "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz",
"license": "MIT" "integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==",
"dev": true
}, },
"node_modules/@webassemblyjs/helper-buffer": { "node_modules/@webassemblyjs/helper-buffer": {
"version": "1.11.1", "version": "1.11.5",
"dev": true, "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz",
"license": "MIT" "integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==",
"dev": true
}, },
"node_modules/@webassemblyjs/helper-numbers": { "node_modules/@webassemblyjs/helper-numbers": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz",
"integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@webassemblyjs/floating-point-hex-parser": "1.11.1", "@webassemblyjs/floating-point-hex-parser": "1.11.5",
"@webassemblyjs/helper-api-error": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.5",
"@xtuc/long": "4.2.2" "@xtuc/long": "4.2.2"
} }
}, },
"node_modules/@webassemblyjs/helper-wasm-bytecode": { "node_modules/@webassemblyjs/helper-wasm-bytecode": {
"version": "1.11.1", "version": "1.11.5",
"dev": true, "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz",
"license": "MIT" "integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==",
"dev": true
}, },
"node_modules/@webassemblyjs/helper-wasm-section": { "node_modules/@webassemblyjs/helper-wasm-section": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz",
"integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
"@webassemblyjs/wasm-gen": "1.11.1" "@webassemblyjs/wasm-gen": "1.11.5"
} }
}, },
"node_modules/@webassemblyjs/ieee754": { "node_modules/@webassemblyjs/ieee754": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz",
"integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@xtuc/ieee754": "^1.2.0" "@xtuc/ieee754": "^1.2.0"
} }
}, },
"node_modules/@webassemblyjs/leb128": { "node_modules/@webassemblyjs/leb128": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz",
"integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==",
"dev": true, "dev": true,
"license": "Apache-2.0",
"dependencies": { "dependencies": {
"@xtuc/long": "4.2.2" "@xtuc/long": "4.2.2"
} }
}, },
"node_modules/@webassemblyjs/utf8": { "node_modules/@webassemblyjs/utf8": {
"version": "1.11.1", "version": "1.11.5",
"dev": true, "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz",
"license": "MIT" "integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==",
"dev": true
}, },
"node_modules/@webassemblyjs/wasm-edit": { "node_modules/@webassemblyjs/wasm-edit": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz",
"integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
"@webassemblyjs/helper-wasm-section": "1.11.1", "@webassemblyjs/helper-wasm-section": "1.11.5",
"@webassemblyjs/wasm-gen": "1.11.1", "@webassemblyjs/wasm-gen": "1.11.5",
"@webassemblyjs/wasm-opt": "1.11.1", "@webassemblyjs/wasm-opt": "1.11.5",
"@webassemblyjs/wasm-parser": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.5",
"@webassemblyjs/wast-printer": "1.11.1" "@webassemblyjs/wast-printer": "1.11.5"
} }
}, },
"node_modules/@webassemblyjs/wasm-gen": { "node_modules/@webassemblyjs/wasm-gen": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz",
"integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
"@webassemblyjs/ieee754": "1.11.1", "@webassemblyjs/ieee754": "1.11.5",
"@webassemblyjs/leb128": "1.11.1", "@webassemblyjs/leb128": "1.11.5",
"@webassemblyjs/utf8": "1.11.1" "@webassemblyjs/utf8": "1.11.5"
} }
}, },
"node_modules/@webassemblyjs/wasm-opt": { "node_modules/@webassemblyjs/wasm-opt": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz",
"integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.5",
"@webassemblyjs/wasm-gen": "1.11.1", "@webassemblyjs/wasm-gen": "1.11.5",
"@webassemblyjs/wasm-parser": "1.11.1" "@webassemblyjs/wasm-parser": "1.11.5"
} }
}, },
"node_modules/@webassemblyjs/wasm-parser": { "node_modules/@webassemblyjs/wasm-parser": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz",
"integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-api-error": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
"@webassemblyjs/ieee754": "1.11.1", "@webassemblyjs/ieee754": "1.11.5",
"@webassemblyjs/leb128": "1.11.1", "@webassemblyjs/leb128": "1.11.5",
"@webassemblyjs/utf8": "1.11.1" "@webassemblyjs/utf8": "1.11.5"
} }
}, },
"node_modules/@webassemblyjs/wast-printer": { "node_modules/@webassemblyjs/wast-printer": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz",
"integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@xtuc/long": "4.2.2" "@xtuc/long": "4.2.2"
} }
}, },
@ -3971,13 +3987,15 @@
}, },
"node_modules/@xtuc/ieee754": { "node_modules/@xtuc/ieee754": {
"version": "1.2.0", "version": "1.2.0",
"dev": true, "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
"license": "BSD-3-Clause" "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
"dev": true
}, },
"node_modules/@xtuc/long": { "node_modules/@xtuc/long": {
"version": "4.2.2", "version": "4.2.2",
"dev": true, "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
"license": "Apache-2.0" "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
"dev": true
}, },
"node_modules/accepts": { "node_modules/accepts": {
"version": "1.3.8", "version": "1.3.8",
@ -5230,9 +5248,10 @@
} }
}, },
"node_modules/enhanced-resolve": { "node_modules/enhanced-resolve": {
"version": "5.12.0", "version": "5.13.0",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz",
"integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"graceful-fs": "^4.2.4", "graceful-fs": "^4.2.4",
"tapable": "^2.2.0" "tapable": "^2.2.0"
@ -10104,21 +10123,21 @@
} }
}, },
"node_modules/webpack": { "node_modules/webpack": {
"version": "5.79.0", "version": "5.80.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.79.0.tgz", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz",
"integrity": "sha512-3mN4rR2Xq+INd6NnYuL9RC9GAmc1ROPKJoHhrZ4pAjdMFEkJJWrsPw8o2JjCIyQyTu7rTXYn4VG6OpyB3CobZg==", "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/eslint-scope": "^3.7.3", "@types/eslint-scope": "^3.7.3",
"@types/estree": "^1.0.0", "@types/estree": "^1.0.0",
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "^1.11.5",
"@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-edit": "^1.11.5",
"@webassemblyjs/wasm-parser": "1.11.1", "@webassemblyjs/wasm-parser": "^1.11.5",
"acorn": "^8.7.1", "acorn": "^8.7.1",
"acorn-import-assertions": "^1.7.6", "acorn-import-assertions": "^1.7.6",
"browserslist": "^4.14.5", "browserslist": "^4.14.5",
"chrome-trace-event": "^1.0.2", "chrome-trace-event": "^1.0.2",
"enhanced-resolve": "^5.10.0", "enhanced-resolve": "^5.13.0",
"es-module-lexer": "^1.2.1", "es-module-lexer": "^1.2.1",
"eslint-scope": "5.1.1", "eslint-scope": "5.1.1",
"events": "^3.2.0", "events": "^3.2.0",
@ -10128,7 +10147,7 @@
"loader-runner": "^4.2.0", "loader-runner": "^4.2.0",
"mime-types": "^2.1.27", "mime-types": "^2.1.27",
"neo-async": "^2.6.2", "neo-async": "^2.6.2",
"schema-utils": "^3.1.0", "schema-utils": "^3.1.2",
"tapable": "^2.1.1", "tapable": "^2.1.1",
"terser-webpack-plugin": "^5.3.7", "terser-webpack-plugin": "^5.3.7",
"watchpack": "^2.4.0", "watchpack": "^2.4.0",
@ -10372,9 +10391,10 @@
} }
}, },
"node_modules/webpack/node_modules/schema-utils": { "node_modules/webpack/node_modules/schema-utils": {
"version": "3.1.1", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz",
"integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@types/json-schema": "^7.0.8", "@types/json-schema": "^7.0.8",
"ajv": "^6.12.5", "ajv": "^6.12.5",
@ -12882,9 +12902,9 @@
} }
}, },
"@dannadori/voice-changer-client-js": { "@dannadori/voice-changer-client-js": {
"version": "1.0.110", "version": "1.0.112",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.110.tgz", "resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.112.tgz",
"integrity": "sha512-P0owHTaIRKZfZe198D0iEEQ075AjTS57TSxWitIYU8pOL3X80oznWITllDzkgK3bbwgmMlzVPAQQPrCa6AM6jw==", "integrity": "sha512-ydEur3juxY2dNJe7xsqhref61J2JrB/l0oZVV4VLyh4Gu3OR/uhoBAWBtG5qNO0MVIBznbH/xyZ6jHA4JuwaAg==",
"requires": { "requires": {
"@types/readable-stream": "^2.3.15", "@types/readable-stream": "^2.3.15",
"amazon-chime-sdk-js": "^3.13.0", "amazon-chime-sdk-js": "^3.13.0",
@ -13323,7 +13343,9 @@
"dev": true "dev": true
}, },
"@types/node": { "@types/node": {
"version": "18.15.11" "version": "18.15.13",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz",
"integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q=="
}, },
"@types/prop-types": { "@types/prop-types": {
"version": "15.7.5", "version": "15.7.5",
@ -13416,118 +13438,148 @@
"dev": true "dev": true
}, },
"@webassemblyjs/ast": { "@webassemblyjs/ast": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz",
"integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@webassemblyjs/helper-numbers": "1.11.1", "@webassemblyjs/helper-numbers": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1" "@webassemblyjs/helper-wasm-bytecode": "1.11.5"
} }
}, },
"@webassemblyjs/floating-point-hex-parser": { "@webassemblyjs/floating-point-hex-parser": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz",
"integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==",
"dev": true "dev": true
}, },
"@webassemblyjs/helper-api-error": { "@webassemblyjs/helper-api-error": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz",
"integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==",
"dev": true "dev": true
}, },
"@webassemblyjs/helper-buffer": { "@webassemblyjs/helper-buffer": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz",
"integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==",
"dev": true "dev": true
}, },
"@webassemblyjs/helper-numbers": { "@webassemblyjs/helper-numbers": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz",
"integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@webassemblyjs/floating-point-hex-parser": "1.11.1", "@webassemblyjs/floating-point-hex-parser": "1.11.5",
"@webassemblyjs/helper-api-error": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.5",
"@xtuc/long": "4.2.2" "@xtuc/long": "4.2.2"
} }
}, },
"@webassemblyjs/helper-wasm-bytecode": { "@webassemblyjs/helper-wasm-bytecode": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz",
"integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==",
"dev": true "dev": true
}, },
"@webassemblyjs/helper-wasm-section": { "@webassemblyjs/helper-wasm-section": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz",
"integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
"@webassemblyjs/wasm-gen": "1.11.1" "@webassemblyjs/wasm-gen": "1.11.5"
} }
}, },
"@webassemblyjs/ieee754": { "@webassemblyjs/ieee754": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz",
"integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@xtuc/ieee754": "^1.2.0" "@xtuc/ieee754": "^1.2.0"
} }
}, },
"@webassemblyjs/leb128": { "@webassemblyjs/leb128": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz",
"integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@xtuc/long": "4.2.2" "@xtuc/long": "4.2.2"
} }
}, },
"@webassemblyjs/utf8": { "@webassemblyjs/utf8": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz",
"integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==",
"dev": true "dev": true
}, },
"@webassemblyjs/wasm-edit": { "@webassemblyjs/wasm-edit": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz",
"integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
"@webassemblyjs/helper-wasm-section": "1.11.1", "@webassemblyjs/helper-wasm-section": "1.11.5",
"@webassemblyjs/wasm-gen": "1.11.1", "@webassemblyjs/wasm-gen": "1.11.5",
"@webassemblyjs/wasm-opt": "1.11.1", "@webassemblyjs/wasm-opt": "1.11.5",
"@webassemblyjs/wasm-parser": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.5",
"@webassemblyjs/wast-printer": "1.11.1" "@webassemblyjs/wast-printer": "1.11.5"
} }
}, },
"@webassemblyjs/wasm-gen": { "@webassemblyjs/wasm-gen": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz",
"integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
"@webassemblyjs/ieee754": "1.11.1", "@webassemblyjs/ieee754": "1.11.5",
"@webassemblyjs/leb128": "1.11.1", "@webassemblyjs/leb128": "1.11.5",
"@webassemblyjs/utf8": "1.11.1" "@webassemblyjs/utf8": "1.11.5"
} }
}, },
"@webassemblyjs/wasm-opt": { "@webassemblyjs/wasm-opt": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz",
"integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.5",
"@webassemblyjs/wasm-gen": "1.11.1", "@webassemblyjs/wasm-gen": "1.11.5",
"@webassemblyjs/wasm-parser": "1.11.1" "@webassemblyjs/wasm-parser": "1.11.5"
} }
}, },
"@webassemblyjs/wasm-parser": { "@webassemblyjs/wasm-parser": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz",
"integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==",
"dev": true, "dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-api-error": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
"@webassemblyjs/ieee754": "1.11.1", "@webassemblyjs/ieee754": "1.11.5",
"@webassemblyjs/leb128": "1.11.1", "@webassemblyjs/leb128": "1.11.5",
"@webassemblyjs/utf8": "1.11.1" "@webassemblyjs/utf8": "1.11.5"
} }
}, },
"@webassemblyjs/wast-printer": { "@webassemblyjs/wast-printer": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz",
"integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@xtuc/long": "4.2.2" "@xtuc/long": "4.2.2"
} }
}, },
@ -13548,10 +13600,14 @@
}, },
"@xtuc/ieee754": { "@xtuc/ieee754": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
"integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
"dev": true "dev": true
}, },
"@xtuc/long": { "@xtuc/long": {
"version": "4.2.2", "version": "4.2.2",
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
"dev": true "dev": true
}, },
"accepts": { "accepts": {
@ -14326,7 +14382,9 @@
"version": "5.0.6" "version": "5.0.6"
}, },
"enhanced-resolve": { "enhanced-resolve": {
"version": "5.12.0", "version": "5.13.0",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz",
"integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==",
"dev": true, "dev": true,
"requires": { "requires": {
"graceful-fs": "^4.2.4", "graceful-fs": "^4.2.4",
@ -17367,21 +17425,21 @@
} }
}, },
"webpack": { "webpack": {
"version": "5.79.0", "version": "5.80.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.79.0.tgz", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz",
"integrity": "sha512-3mN4rR2Xq+INd6NnYuL9RC9GAmc1ROPKJoHhrZ4pAjdMFEkJJWrsPw8o2JjCIyQyTu7rTXYn4VG6OpyB3CobZg==", "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/eslint-scope": "^3.7.3", "@types/eslint-scope": "^3.7.3",
"@types/estree": "^1.0.0", "@types/estree": "^1.0.0",
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "^1.11.5",
"@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-edit": "^1.11.5",
"@webassemblyjs/wasm-parser": "1.11.1", "@webassemblyjs/wasm-parser": "^1.11.5",
"acorn": "^8.7.1", "acorn": "^8.7.1",
"acorn-import-assertions": "^1.7.6", "acorn-import-assertions": "^1.7.6",
"browserslist": "^4.14.5", "browserslist": "^4.14.5",
"chrome-trace-event": "^1.0.2", "chrome-trace-event": "^1.0.2",
"enhanced-resolve": "^5.10.0", "enhanced-resolve": "^5.13.0",
"es-module-lexer": "^1.2.1", "es-module-lexer": "^1.2.1",
"eslint-scope": "5.1.1", "eslint-scope": "5.1.1",
"events": "^3.2.0", "events": "^3.2.0",
@ -17391,7 +17449,7 @@
"loader-runner": "^4.2.0", "loader-runner": "^4.2.0",
"mime-types": "^2.1.27", "mime-types": "^2.1.27",
"neo-async": "^2.6.2", "neo-async": "^2.6.2",
"schema-utils": "^3.1.0", "schema-utils": "^3.1.2",
"tapable": "^2.1.1", "tapable": "^2.1.1",
"terser-webpack-plugin": "^5.3.7", "terser-webpack-plugin": "^5.3.7",
"watchpack": "^2.4.0", "watchpack": "^2.4.0",
@ -17411,7 +17469,9 @@
"dev": true "dev": true
}, },
"schema-utils": { "schema-utils": {
"version": "3.1.1", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz",
"integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/json-schema": "^7.0.8", "@types/json-schema": "^7.0.8",

View File

@ -23,7 +23,7 @@
"@babel/preset-env": "^7.21.4", "@babel/preset-env": "^7.21.4",
"@babel/preset-react": "^7.18.6", "@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.4", "@babel/preset-typescript": "^7.21.4",
"@types/node": "^18.15.11", "@types/node": "^18.15.13",
"@types/react": "^18.0.37", "@types/react": "^18.0.37",
"@types/react-dom": "^18.0.11", "@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14", "autoprefixer": "^10.4.14",
@ -46,12 +46,12 @@
"ts-loader": "^9.4.2", "ts-loader": "^9.4.2",
"tsconfig-paths": "^4.2.0", "tsconfig-paths": "^4.2.0",
"typescript": "^5.0.4", "typescript": "^5.0.4",
"webpack": "^5.79.0", "webpack": "^5.80.0",
"webpack-cli": "^5.0.1", "webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.13.3" "webpack-dev-server": "^4.13.3"
}, },
"dependencies": { "dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.110", "@dannadori/voice-changer-client-js": "^1.0.112",
"@fortawesome/fontawesome-svg-core": "^6.4.0", "@fortawesome/fontawesome-svg-core": "^6.4.0",
"@fortawesome/free-brands-svg-icons": "^6.4.0", "@fortawesome/free-brands-svg-icons": "^6.4.0",
"@fortawesome/free-regular-svg-icons": "^6.4.0", "@fortawesome/free-regular-svg-icons": "^6.4.0",

View File

@ -28,12 +28,17 @@
{ {
"name": "serverInfo", "name": "serverInfo",
"options": {} "options": {}
},
{
"name": "modelSwitch",
"options": {}
} }
], ],
"modelSetting": [ "modelSetting": [
{ {
"name": "modelUploader", "name": "modelUploader",
"options": { "options": {
"showModelSlot": true,
"showConfig": false, "showConfig": false,
"showOnnx": true, "showOnnx": true,
"showPyTorch": true, "showPyTorch": true,
@ -45,7 +50,8 @@
"showHalfPrecision": true, "showHalfPrecision": true,
"defaultEnablePyTorch": true, "defaultEnablePyTorch": true,
"showOnnxExportButton": true "showOnnxExportButton": true,
"showDescription": true
} }
}, },
{ {
@ -103,7 +109,9 @@
}, },
{ {
"name": "tune", "name": "tune",
"options": {} "options": {
"showSetDefault": true
}
}, },
{ {
"name": "indexRatio", "name": "indexRatio",

View File

@ -92,7 +92,9 @@
}, },
{ {
"name": "tune", "name": "tune",
"options": {} "options": {
"showPredictF0": true
}
}, },
{ {
"name": "clusterInferRatio", "name": "clusterInferRatio",

View File

@ -92,7 +92,9 @@
}, },
{ {
"name": "tune", "name": "tune",
"options": {} "options": {
"showPredictF0": true
}
}, },
{ {
"name": "clusterInferRatio", "name": "clusterInferRatio",

View File

@ -10,7 +10,7 @@ import { far } from "@fortawesome/free-regular-svg-icons";
import { fab } from "@fortawesome/free-brands-svg-icons"; import { fab } from "@fortawesome/free-brands-svg-icons";
import { AppRootProvider, useAppRoot } from "./001_provider/001_AppRootProvider"; import { AppRootProvider, useAppRoot } from "./001_provider/001_AppRootProvider";
import ErrorBoundary from "./001_provider/900_ErrorBoundary"; import ErrorBoundary from "./001_provider/900_ErrorBoundary";
import { ClientType, INDEXEDDB_KEY_CLIENT, INDEXEDDB_KEY_MODEL_DATA, INDEXEDDB_KEY_SERVER, INDEXEDDB_KEY_WORKLET, INDEXEDDB_KEY_WORKLETNODE, useIndexedDB } from "@dannadori/voice-changer-client-js"; import { ClientType, INDEXEDDB_KEY_CLIENT, INDEXEDDB_KEY_MODEL_DATA, INDEXEDDB_KEY_SERVER, INDEXEDDB_KEY_WORKLET, INDEXEDDB_KEY_WORKLETNODE, MAX_MODEL_SLOT_NUM, useIndexedDB } from "@dannadori/voice-changer-client-js";
import { INDEXEDDB_KEY_AUDIO_OUTPUT, INDEXEDDB_KEY_DEFAULT_MODEL_TYPE } from "./const"; import { INDEXEDDB_KEY_AUDIO_OUTPUT, INDEXEDDB_KEY_DEFAULT_MODEL_TYPE } from "./const";
import { Demo } from "./components/demo/010_Demo"; import { Demo } from "./components/demo/010_Demo";
import { ClientSelector } from "./001_ClientSelector"; import { ClientSelector } from "./001_ClientSelector";
@ -55,13 +55,18 @@ const AppStateWrapper = () => {
INDEXEDDB_KEY_CLIENT, INDEXEDDB_KEY_CLIENT,
INDEXEDDB_KEY_SERVER, INDEXEDDB_KEY_SERVER,
INDEXEDDB_KEY_WORKLETNODE, INDEXEDDB_KEY_WORKLETNODE,
INDEXEDDB_KEY_MODEL_DATA,
INDEXEDDB_KEY_WORKLET, INDEXEDDB_KEY_WORKLET,
INDEXEDDB_KEY_AUDIO_OUTPUT INDEXEDDB_KEY_AUDIO_OUTPUT
] ]
for (const k of indexedDBKeys) { for (const k of indexedDBKeys) {
await removeItem(k) await removeItem(k)
} }
for (let i = 0; i < MAX_MODEL_SLOT_NUM; i++) {
const modleKey = `${INDEXEDDB_KEY_MODEL_DATA}_${i}`
await removeItem(modleKey)
}
location.reload(); location.reload();
} }
return ( return (

View File

@ -16,6 +16,7 @@ export const useVCClient = (props: UseVCClientProps): VCClientState => {
}) })
// const setClientType = (clientType: ClientType) => { // const setClientType = (clientType: ClientType) => {
// console.log("SET CLIENT TYPE", clientType) // console.log("SET CLIENT TYPE", clientType)
// clientState.setClientType(clientType) // clientState.setClientType(clientType)

View File

@ -31,7 +31,6 @@ export const AppStateProvider = ({ children }: Props) => {
useEffect(() => { useEffect(() => {
if (clientState.clientState.initialized) { if (clientState.clientState.initialized) {
initializedRef.current = true initializedRef.current = true
console.log("Updating Client Setting.................................", clientState.clientState.clientSetting.clientSetting)
clientState.clientState.clientSetting.updateClientSetting({ clientState.clientState.clientSetting.updateClientSetting({
...clientState.clientState.clientSetting.clientSetting, speakers: [ ...clientState.clientState.clientSetting.clientSetting, speakers: [
{ {

View File

@ -1,5 +1,6 @@
import React, { useContext, useEffect, useState } from "react"; import React, { useContext, useEffect, useState } from "react";
import { ReactNode } from "react"; import { ReactNode } from "react";
import { useAppRoot } from "../../001_provider/001_AppRootProvider";
import { StateControlCheckbox, useStateControlCheckbox } from "../../hooks/useStateControlCheckbox"; import { StateControlCheckbox, useStateControlCheckbox } from "../../hooks/useStateControlCheckbox";
export const OpenServerControlCheckbox = "open-server-control-checkbox" export const OpenServerControlCheckbox = "open-server-control-checkbox"
@ -51,6 +52,9 @@ type GuiStateAndMethod = {
setAudioOutputForGUI: (val: string) => void setAudioOutputForGUI: (val: string) => void
setFileInputEchoback: (val: boolean) => void setFileInputEchoback: (val: boolean) => void
setAudioOutputForAnalyzer: (val: string) => void setAudioOutputForAnalyzer: (val: string) => void
modelSlotNum: number
setModelSlotNum: (val: number) => void
} }
const GuiStateContext = React.createContext<GuiStateAndMethod | null>(null); const GuiStateContext = React.createContext<GuiStateAndMethod | null>(null);
@ -63,8 +67,10 @@ export const useGuiState = (): GuiStateAndMethod => {
}; };
export const GuiStateProvider = ({ children }: Props) => { export const GuiStateProvider = ({ children }: Props) => {
const { clientType } = useAppRoot()
const [isConverting, setIsConverting] = useState<boolean>(false) const [isConverting, setIsConverting] = useState<boolean>(false)
const [isAnalyzing, setIsAnalyzing] = useState<boolean>(false) const [isAnalyzing, setIsAnalyzing] = useState<boolean>(false)
const [modelSlotNum, setModelSlotNum] = useState<number>(0)
const [showPyTorchModelUpload, setShowPyTorchModelUpload] = useState<boolean>(false) const [showPyTorchModelUpload, setShowPyTorchModelUpload] = useState<boolean>(false)
@ -153,6 +159,11 @@ export const GuiStateProvider = ({ children }: Props) => {
}, []) }, [])
useEffect(() => {
setModelSlotNum(0)
}, [clientType])
const providerValue = { const providerValue = {
stateControls: { stateControls: {
openServerControlCheckbox, openServerControlCheckbox,
@ -187,6 +198,9 @@ export const GuiStateProvider = ({ children }: Props) => {
setAudioOutputForGUI, setAudioOutputForGUI,
setFileInputEchoback, setFileInputEchoback,
setAudioOutputForAnalyzer, setAudioOutputForAnalyzer,
modelSlotNum,
setModelSlotNum
}; };
return <GuiStateContext.Provider value={providerValue}>{children}</GuiStateContext.Provider>; return <GuiStateContext.Provider value={providerValue}>{children}</GuiStateContext.Provider>;
}; };

View File

@ -40,6 +40,7 @@ import { ModelSamplingRateRow, ModelSamplingRateRowProps } from "./components/30
import { EnableEnhancerRow, EnableEnhancerRowProps } from "./components/610_EnableEnhancerRow" import { EnableEnhancerRow, EnableEnhancerRowProps } from "./components/610_EnableEnhancerRow"
import { DstIdRow2, DstIdRow2Props } from "./components/602v2_DstIdRow2" import { DstIdRow2, DstIdRow2Props } from "./components/602v2_DstIdRow2"
import { SilenceFrontRow, SilenceFrontRowProps } from "./components/812_SilenceFrontRow" import { SilenceFrontRow, SilenceFrontRowProps } from "./components/812_SilenceFrontRow"
import { ModelSwitchRow, ModelSwitchRowProps } from "./components/204_ModelSwitchRow"
export const catalog: { [key: string]: (props: any) => JSX.Element } = {} export const catalog: { [key: string]: (props: any) => JSX.Element } = {}
@ -64,6 +65,9 @@ const initialize = () => {
addToCatalog("startButton", (props: StartButtonRowProps) => { return <StartButtonRow {...props} /> }) addToCatalog("startButton", (props: StartButtonRowProps) => { return <StartButtonRow {...props} /> })
addToCatalog("performance", (props: PerformanceRowProps) => { return <PerformanceRow {...props} /> }) addToCatalog("performance", (props: PerformanceRowProps) => { return <PerformanceRow {...props} /> })
addToCatalog("serverInfo", (props: ServerInfoRowProps) => { return <ServerInfoRow {...props} /> }) addToCatalog("serverInfo", (props: ServerInfoRowProps) => { return <ServerInfoRow {...props} /> })
addToCatalog("modelSwitch", (props: ModelSwitchRowProps) => { return <ModelSwitchRow {...props} /> })
addToCatalog("modelUploader", (props: ModelUploaderRowProps) => { return <ModelUploaderRow {...props} /> }) addToCatalog("modelUploader", (props: ModelUploaderRowProps) => { return <ModelUploaderRow {...props} /> })
addToCatalog("framework", (props: FrameworkRowProps) => { return <FrameworkRow {...props} /> }) addToCatalog("framework", (props: FrameworkRowProps) => { return <FrameworkRow {...props} /> })

View File

@ -11,8 +11,6 @@ export type TitleProps = {
export const Title = (props: TitleProps) => { export const Title = (props: TitleProps) => {
const guiState = useGuiState() const guiState = useGuiState()
const githubLink = useMemo(() => { const githubLink = useMemo(() => {
return isDesktopApp() ? return isDesktopApp() ?
( (

View File

@ -0,0 +1,47 @@
import React, { useMemo } from "react"
import { useAppState } from "../../../001_provider/001_AppStateProvider"
export type ModelSwitchRowProps = {
}
export const ModelSwitchRow = (_props: ModelSwitchRowProps) => {
const appState = useAppState()
const modelSwitchRow = useMemo(() => {
const onSwitchModelClicked = (index: number) => {
const fileUploadSetting = appState.serverSetting.fileUploadSettings[index]
appState.serverSetting.updateServerSettings({ ...appState.serverSetting.serverSetting, modelSlotIndex: index, tran: fileUploadSetting.defaultTune })
}
let filename = ""
const modelOptions = appState.serverSetting.serverSetting.modelSlots.map((x, index) => {
if (x.pyTorchModelFile && x.pyTorchModelFile.length > 0) {
filename = x.pyTorchModelFile.replace(/^.*[\\\/]/, '')
return <div key={index} className="body-button left-margin-1" onClick={() => { onSwitchModelClicked(index) }}>{filename}</div>
} else if (x.onnxModelFile && x.onnxModelFile.length > 0) {
filename = x.onnxModelFile.replace(/^.*[\\\/]/, '')
return <div key={index} className="body-button left-margin-1" onClick={() => { onSwitchModelClicked(index) }}>{filename}</div>
} else {
return <div key={index} ></div>
}
})
return (
<>
<div className="body-row split-3-7 left-padding-1 guided">
<div className="body-item-title left-padding-1">Swicth Model</div>
<div className="body-button-container">
{modelOptions}
</div>
</div>
</>
)
}, [appState.getInfo, appState.serverSetting.serverSetting])
return modelSwitchRow
}

View File

@ -1,28 +1,31 @@
import React, { useMemo } from "react" import React, { useMemo } from "react"
import { fileSelector } from "@dannadori/voice-changer-client-js" import { fileSelector } from "@dannadori/voice-changer-client-js"
import { useAppState } from "../../../001_provider/001_AppStateProvider" import { useAppState } from "../../../001_provider/001_AppStateProvider"
import { useGuiState } from "../001_GuiStateProvider"
export const ConfigSelectRow = () => { export const ConfigSelectRow = () => {
const appState = useAppState() const appState = useAppState()
const guiState = useGuiState()
const configSelectRow = useMemo(() => { const configSelectRow = useMemo(() => {
const configFilenameText = appState.serverSetting.fileUploadSetting.configFile?.filename || appState.serverSetting.fileUploadSetting.configFile?.file?.name || "" const slot = guiState.modelSlotNum
const configFilenameText = appState.serverSetting.fileUploadSettings[slot]?.configFile?.filename || appState.serverSetting.fileUploadSettings[slot]?.configFile?.file?.name || ""
const onConfigFileLoadClicked = async () => { const onConfigFileLoadClicked = async () => {
const file = await fileSelector("") const file = await fileSelector("")
if (file.name.endsWith(".json") == false && file.name.endsWith(".yaml") == false) { if (file.name.endsWith(".json") == false && file.name.endsWith(".yaml") == false) {
alert("モデルファイルの拡張子はjsonである必要があります。") alert("モデルファイルの拡張子はjsonである必要があります。")
return return
} }
appState.serverSetting.setFileUploadSetting({ appState.serverSetting.setFileUploadSetting(slot, {
...appState.serverSetting.fileUploadSetting, ...appState.serverSetting.fileUploadSettings[slot],
configFile: { configFile: {
file: file file: file
} }
}) })
} }
const onConfigFileClearClicked = () => { const onConfigFileClearClicked = () => {
appState.serverSetting.setFileUploadSetting({ appState.serverSetting.setFileUploadSetting(slot, {
...appState.serverSetting.fileUploadSetting, ...appState.serverSetting.fileUploadSettings[slot],
configFile: null configFile: null
}) })
} }
@ -39,7 +42,7 @@ export const ConfigSelectRow = () => {
</div> </div>
</div> </div>
) )
}, [appState.serverSetting.fileUploadSetting, appState.serverSetting.setFileUploadSetting]) }, [appState.serverSetting.fileUploadSettings, appState.serverSetting.setFileUploadSetting, guiState.modelSlotNum])
return configSelectRow return configSelectRow
} }

View File

@ -1,28 +1,32 @@
import React, { useMemo } from "react" import React, { useMemo } from "react"
import { fileSelector } from "@dannadori/voice-changer-client-js" import { fileSelector } from "@dannadori/voice-changer-client-js"
import { useAppState } from "../../../001_provider/001_AppStateProvider" import { useAppState } from "../../../001_provider/001_AppStateProvider"
import { useGuiState } from "../001_GuiStateProvider"
export const ONNXSelectRow = () => { export const ONNXSelectRow = () => {
const appState = useAppState() const appState = useAppState()
const guiState = useGuiState()
const onnxSelectRow = useMemo(() => { const onnxSelectRow = useMemo(() => {
const onnxModelFilenameText = appState.serverSetting.fileUploadSetting.onnxModel?.filename || appState.serverSetting.fileUploadSetting.onnxModel?.file?.name || "" const slot = guiState.modelSlotNum
const onnxModelFilenameText = appState.serverSetting.fileUploadSettings[slot]?.onnxModel?.filename || appState.serverSetting.fileUploadSettings[slot]?.onnxModel?.file?.name || ""
const onOnnxFileLoadClicked = async () => { const onOnnxFileLoadClicked = async () => {
const file = await fileSelector("") const file = await fileSelector("")
if (file.name.endsWith(".onnx") == false) { if (file.name.endsWith(".onnx") == false) {
alert("モデルファイルの拡張子はonnxである必要があります。") alert("モデルファイルの拡張子はonnxである必要があります。")
return return
} }
appState.serverSetting.setFileUploadSetting({ appState.serverSetting.setFileUploadSetting(slot, {
...appState.serverSetting.fileUploadSetting, ...appState.serverSetting.fileUploadSettings[slot],
onnxModel: { onnxModel: {
file: file file: file
} }
}) })
} }
const onOnnxFileClearClicked = () => { const onOnnxFileClearClicked = () => {
appState.serverSetting.setFileUploadSetting({ appState.serverSetting.setFileUploadSetting(slot, {
...appState.serverSetting.fileUploadSetting, ...appState.serverSetting.fileUploadSettings[slot],
onnxModel: null onnxModel: null
}) })
} }
@ -39,7 +43,7 @@ export const ONNXSelectRow = () => {
</div> </div>
</div> </div>
) )
}, [appState.serverSetting.fileUploadSetting, appState.serverSetting.setFileUploadSetting]) }, [appState.serverSetting.fileUploadSettings, appState.serverSetting.setFileUploadSetting, guiState.modelSlotNum])
return onnxSelectRow return onnxSelectRow
} }

View File

@ -12,23 +12,24 @@ export const PyTorchSelectRow = (props: PyTorchSelectRow) => {
const guiState = useGuiState() const guiState = useGuiState()
const pyTorchSelectRow = useMemo(() => { const pyTorchSelectRow = useMemo(() => {
const pyTorchFilenameText = appState.serverSetting.fileUploadSetting.pyTorchModel?.filename || appState.serverSetting.fileUploadSetting.pyTorchModel?.file?.name || "" const slot = guiState.modelSlotNum
const pyTorchFilenameText = appState.serverSetting.fileUploadSettings[slot]?.pyTorchModel?.filename || appState.serverSetting.fileUploadSettings[slot]?.pyTorchModel?.file?.name || ""
const onPyTorchFileLoadClicked = async () => { const onPyTorchFileLoadClicked = async () => {
const file = await fileSelector("") const file = await fileSelector("")
if (file.name.endsWith(".pth") == false) { if (file.name.endsWith(".pth") == false) {
alert("モデルファイルの拡張子はpthである必要があります。") alert("モデルファイルの拡張子はpthである必要があります。")
return return
} }
appState.serverSetting.setFileUploadSetting({ appState.serverSetting.setFileUploadSetting(slot, {
...appState.serverSetting.fileUploadSetting, ...appState.serverSetting.fileUploadSettings[slot],
pyTorchModel: { pyTorchModel: {
file: file file: file
} }
}) })
} }
const onPyTorchFileClearClicked = () => { const onPyTorchFileClearClicked = () => {
appState.serverSetting.setFileUploadSetting({ appState.serverSetting.setFileUploadSetting(slot, {
...appState.serverSetting.fileUploadSetting, ...appState.serverSetting.fileUploadSettings[slot],
pyTorchModel: null pyTorchModel: null
}) })
} }
@ -67,7 +68,7 @@ export const PyTorchSelectRow = (props: PyTorchSelectRow) => {
</div> </div>
</div> </div>
) )
}, [guiState.showPyTorchModelUpload, appState.serverSetting.fileUploadSetting, appState.serverSetting.setFileUploadSetting, appState.serverSetting.serverSetting, appState.serverSetting.updateServerSettings, guiState.isConverting]) }, [guiState.showPyTorchModelUpload, appState.serverSetting.fileUploadSettings, appState.serverSetting.setFileUploadSetting, appState.serverSetting.serverSetting, appState.serverSetting.updateServerSettings, guiState.isConverting, guiState.modelSlotNum])
return pyTorchSelectRow return pyTorchSelectRow
} }

View File

@ -1,21 +1,25 @@
import React, { useMemo } from "react" import React, { useMemo } from "react"
import { fileSelector } from "@dannadori/voice-changer-client-js" import { fileSelector } from "@dannadori/voice-changer-client-js"
import { useAppState } from "../../../001_provider/001_AppStateProvider" import { useAppState } from "../../../001_provider/001_AppStateProvider"
import { useGuiState } from "../001_GuiStateProvider"
export const PyTorchClusterSelectRow = () => { export const PyTorchClusterSelectRow = () => {
const appState = useAppState() const appState = useAppState()
const guiState = useGuiState()
const pyTorchSelectRow = useMemo(() => { const pyTorchSelectRow = useMemo(() => {
const clusterModelFilenameText = appState.serverSetting.fileUploadSetting.clusterTorchModel?.filename || appState.serverSetting.fileUploadSetting.clusterTorchModel?.file?.name || "" const slot = guiState.modelSlotNum
const clusterModelFilenameText = appState.serverSetting.fileUploadSettings[slot]?.clusterTorchModel?.filename || appState.serverSetting.fileUploadSettings[slot]?.clusterTorchModel?.file?.name || ""
const onClusterFileLoadClicked = async () => { const onClusterFileLoadClicked = async () => {
const file = await fileSelector("") const file = await fileSelector("")
if (file.name.endsWith(".pt") == false) { if (file.name.endsWith(".pt") == false) {
alert("モデルファイルの拡張子はptである必要があります。") alert("モデルファイルの拡張子はptである必要があります。")
return return
} }
appState.serverSetting.setFileUploadSetting({ appState.serverSetting.setFileUploadSetting(slot, {
...appState.serverSetting.fileUploadSetting, ...appState.serverSetting.fileUploadSettings[slot],
clusterTorchModel: { clusterTorchModel: {
file: file file: file
} }
@ -23,8 +27,8 @@ export const PyTorchClusterSelectRow = () => {
} }
const onClusterFileClearClicked = () => { const onClusterFileClearClicked = () => {
appState.serverSetting.setFileUploadSetting({ appState.serverSetting.setFileUploadSetting(slot, {
...appState.serverSetting.fileUploadSetting, ...appState.serverSetting.fileUploadSettings[slot],
clusterTorchModel: null clusterTorchModel: null
}) })
} }
@ -41,7 +45,7 @@ export const PyTorchClusterSelectRow = () => {
</div> </div>
</div> </div>
) )
}, [appState.serverSetting.fileUploadSetting, appState.serverSetting.setFileUploadSetting]) }, [appState.serverSetting.fileUploadSettings, appState.serverSetting.setFileUploadSetting, guiState.modelSlotNum])
return pyTorchSelectRow return pyTorchSelectRow
} }

View File

@ -1,21 +1,25 @@
import React, { useMemo } from "react" import React, { useMemo } from "react"
import { fileSelector } from "@dannadori/voice-changer-client-js" import { fileSelector } from "@dannadori/voice-changer-client-js"
import { useAppState } from "../../../001_provider/001_AppStateProvider" import { useAppState } from "../../../001_provider/001_AppStateProvider"
import { useGuiState } from "../001_GuiStateProvider"
export const FeatureSelectRow = () => { export const FeatureSelectRow = () => {
const appState = useAppState() const appState = useAppState()
const guiState = useGuiState()
const featureSelectRow = useMemo(() => { const featureSelectRow = useMemo(() => {
const featureFilenameText = appState.serverSetting.fileUploadSetting.feature?.filename || appState.serverSetting.fileUploadSetting.feature?.file?.name || "" const slot = guiState.modelSlotNum
const featureFilenameText = appState.serverSetting.fileUploadSettings[slot]?.feature?.filename || appState.serverSetting.fileUploadSettings[slot]?.feature?.file?.name || ""
const onFeatureFileLoadClicked = async () => { const onFeatureFileLoadClicked = async () => {
const file = await fileSelector("") const file = await fileSelector("")
if (file.name.endsWith(".npy") == false) { if (file.name.endsWith(".npy") == false) {
alert("Feature file's extension should be npy") alert("Feature file's extension should be npy")
return return
} }
appState.serverSetting.setFileUploadSetting({ appState.serverSetting.setFileUploadSetting(slot, {
...appState.serverSetting.fileUploadSetting, ...appState.serverSetting.fileUploadSettings[slot],
feature: { feature: {
file: file file: file
} }
@ -23,8 +27,8 @@ export const FeatureSelectRow = () => {
} }
const onFeatureFileClearClicked = () => { const onFeatureFileClearClicked = () => {
appState.serverSetting.setFileUploadSetting({ appState.serverSetting.setFileUploadSetting(slot, {
...appState.serverSetting.fileUploadSetting, ...appState.serverSetting.fileUploadSettings[slot],
feature: null feature: null
}) })
} }
@ -41,7 +45,7 @@ export const FeatureSelectRow = () => {
</div> </div>
</div> </div>
) )
}, [appState.serverSetting.fileUploadSetting, appState.serverSetting.setFileUploadSetting]) }, [appState.serverSetting.fileUploadSettings, appState.serverSetting.setFileUploadSetting, guiState.modelSlotNum])
return featureSelectRow return featureSelectRow
} }

View File

@ -1,21 +1,25 @@
import React, { useMemo } from "react" import React, { useMemo } from "react"
import { fileSelector } from "@dannadori/voice-changer-client-js" import { fileSelector } from "@dannadori/voice-changer-client-js"
import { useAppState } from "../../../001_provider/001_AppStateProvider" import { useAppState } from "../../../001_provider/001_AppStateProvider"
import { useGuiState } from "../001_GuiStateProvider"
export const IndexSelectRow = () => { export const IndexSelectRow = () => {
const appState = useAppState() const appState = useAppState()
const guiState = useGuiState()
const indexSelectRow = useMemo(() => { const indexSelectRow = useMemo(() => {
const indexFilenameText = appState.serverSetting.fileUploadSetting.index?.filename || appState.serverSetting.fileUploadSetting.index?.file?.name || "" const slot = guiState.modelSlotNum
const indexFilenameText = appState.serverSetting.fileUploadSettings[slot]?.index?.filename || appState.serverSetting.fileUploadSettings[slot]?.index?.file?.name || ""
const onIndexFileLoadClicked = async () => { const onIndexFileLoadClicked = async () => {
const file = await fileSelector("") const file = await fileSelector("")
if (file.name.endsWith(".index") == false) { if (file.name.endsWith(".index") == false) {
alert("Index file's extension should be .index") alert("Index file's extension should be .index")
return return
} }
appState.serverSetting.setFileUploadSetting({ appState.serverSetting.setFileUploadSetting(slot, {
...appState.serverSetting.fileUploadSetting, ...appState.serverSetting.fileUploadSettings[slot],
index: { index: {
file: file file: file
} }
@ -23,8 +27,8 @@ export const IndexSelectRow = () => {
} }
const onIndexFileClearClicked = () => { const onIndexFileClearClicked = () => {
appState.serverSetting.setFileUploadSetting({ appState.serverSetting.setFileUploadSetting(slot, {
...appState.serverSetting.fileUploadSetting, ...appState.serverSetting.fileUploadSettings[slot],
index: null index: null
}) })
} }
@ -41,7 +45,7 @@ export const IndexSelectRow = () => {
</div> </div>
</div> </div>
) )
}, [appState.serverSetting.fileUploadSetting, appState.serverSetting.setFileUploadSetting]) }, [appState.serverSetting.fileUploadSettings, appState.serverSetting.setFileUploadSetting, guiState.modelSlotNum])
return indexSelectRow return indexSelectRow
} }

View File

@ -1,19 +1,23 @@
import React, { useMemo } from "react" import React, { useMemo } from "react"
import { fileSelector } from "@dannadori/voice-changer-client-js"
import { useAppState } from "../../../001_provider/001_AppStateProvider" import { useAppState } from "../../../001_provider/001_AppStateProvider"
import { useGuiState } from "../001_GuiStateProvider"
export const HalfPrecisionRow = () => { export const HalfPrecisionRow = () => {
const appState = useAppState() const appState = useAppState()
const guiState = useGuiState()
const halfPrecisionSelectRow = useMemo(() => { const halfPrecisionSelectRow = useMemo(() => {
const slot = guiState.modelSlotNum
const onHalfPrecisionChanged = () => { const onHalfPrecisionChanged = () => {
appState.serverSetting.setFileUploadSetting({ appState.serverSetting.setFileUploadSetting(slot, {
...appState.serverSetting.fileUploadSetting, ...appState.serverSetting.fileUploadSettings[slot],
isHalf: !appState.serverSetting.fileUploadSetting.isHalf isHalf: !appState.serverSetting.fileUploadSettings[slot].isHalf
}) })
} }
const currentVal = appState.serverSetting.fileUploadSettings[slot] ? appState.serverSetting.fileUploadSettings[slot].isHalf : true
return ( return (
<div className="body-row split-3-3-4 left-padding-1 guided"> <div className="body-row split-3-3-4 left-padding-1 guided">
<div className="body-item-title left-padding-2">-</div> <div className="body-item-title left-padding-2">-</div>
@ -21,11 +25,11 @@ export const HalfPrecisionRow = () => {
<div></div> <div></div>
</div> </div>
<div className="body-button-container"> <div className="body-button-container">
<input type="checkbox" checked={appState.serverSetting.fileUploadSetting.isHalf} onChange={() => onHalfPrecisionChanged()} /> half-precision <input type="checkbox" checked={currentVal} onChange={() => onHalfPrecisionChanged()} /> half-precision
</div> </div>
</div> </div>
) )
}, [appState.serverSetting.fileUploadSetting, appState.serverSetting.setFileUploadSetting]) }, [appState.serverSetting.fileUploadSettings, appState.serverSetting.setFileUploadSetting, guiState.modelSlotNum])
return halfPrecisionSelectRow return halfPrecisionSelectRow
} }

View File

@ -1,12 +1,14 @@
import React, { useMemo } from "react" import React, { useMemo } from "react"
import { useAppState } from "../../../001_provider/001_AppStateProvider" import { useAppState } from "../../../001_provider/001_AppStateProvider"
import { useGuiState } from "../001_GuiStateProvider"
export const ModelUploadButtonRow = () => { export const ModelUploadButtonRow = () => {
const appState = useAppState() const appState = useAppState()
const guiState = useGuiState()
const modelUploadButtonRow = useMemo(() => { const modelUploadButtonRow = useMemo(() => {
const slot = guiState.modelSlotNum
const onModelUploadClicked = async () => { const onModelUploadClicked = async () => {
appState.serverSetting.loadModel() appState.serverSetting.loadModel(slot)
} }
const uploadButtonClassName = appState.serverSetting.isUploading ? "body-button-disabled" : "body-button" const uploadButtonClassName = appState.serverSetting.isUploading ? "body-button-disabled" : "body-button"
@ -16,6 +18,7 @@ export const ModelUploadButtonRow = () => {
appState.serverSetting.uploadProgress == 0 ? `loading model...(wait about 20sec)` : `uploading.... ${appState.serverSetting.uploadProgress.toFixed(1)}%` : "" appState.serverSetting.uploadProgress == 0 ? `loading model...(wait about 20sec)` : `uploading.... ${appState.serverSetting.uploadProgress.toFixed(1)}%` : ""
const uploadedText = appState.serverSetting.fileUploadSettings[slot] == undefined ? "" : appState.serverSetting.fileUploadSettings[slot].uploaded ? "" : "not uploaded"
return ( return (
<div className="body-row split-3-3-4 left-padding-1 guided"> <div className="body-row split-3-3-4 left-padding-1 guided">
<div className="body-item-title left-padding-2"></div> <div className="body-item-title left-padding-2"></div>
@ -24,11 +27,12 @@ export const ModelUploadButtonRow = () => {
</div> </div>
<div className="body-button-container"> <div className="body-button-container">
<div className={uploadButtonClassName} onClick={uploadButtonAction}>{uploadButtonLabel}</div> <div className={uploadButtonClassName} onClick={uploadButtonAction}>{uploadButtonLabel}</div>
<div>{uploadedText}</div>
</div> </div>
</div> </div>
) )
}, [appState.serverSetting.isUploading, appState.serverSetting.uploadProgress, appState.serverSetting.loadModel]) }, [appState.serverSetting.isUploading, appState.serverSetting.uploadProgress, appState.serverSetting.loadModel, guiState.modelSlotNum, appState.serverSetting.fileUploadSettings])
return modelUploadButtonRow return modelUploadButtonRow
} }

View File

@ -0,0 +1,28 @@
import { MAX_MODEL_SLOT_NUM } from "@dannadori/voice-changer-client-js"
import React, { useMemo } from "react"
import { useGuiState } from "../001_GuiStateProvider"
export const ModelSlotRow = () => {
const guiState = useGuiState()
const modelSlotRow = useMemo(() => {
const slot = guiState.modelSlotNum
const onModelSlotChanged = (val: number) => {
guiState.setModelSlotNum(val)
}
return (
<div className="body-row split-3-7 left-padding-1 guided">
<div className="body-item-title left-padding-2">Model Slot</div>
<div className="body-input-container">
<select value={slot} onChange={(e) => { onModelSlotChanged(Number(e.target.value)) }}>
{Array(MAX_MODEL_SLOT_NUM).fill(0).map((_x, index) => {
return <option key={index} value={index} >{index}</option>
})}
</select>
</div>
</div>
)
}, [guiState.modelSlotNum])
return modelSlotRow
}

View File

@ -0,0 +1,22 @@
import React, { useMemo } from "react"
import { useAppState } from "../../../001_provider/001_AppStateProvider"
import { useGuiState } from "../001_GuiStateProvider"
export const DescriptionRow = () => {
const appState = useAppState()
const guiState = useGuiState()
const descriptionRow = useMemo(() => {
const slot = guiState.modelSlotNum
const fileUploadSetting = appState.serverSetting.fileUploadSettings[slot]
return (
<div className="body-row split-3-7 left-padding-1 guided">
<div className="body-item-title left-padding-2">Model Desc.</div>
<div className="body-input-container">
Tuning: {fileUploadSetting?.defaultTune || 0}
</div>
</div>
)
}, [appState.serverSetting.fileUploadSettings, guiState.modelSlotNum])
return descriptionRow
}

View File

@ -9,8 +9,11 @@ import { FeatureSelectRow } from "./301-6_FeatureSelectRow"
import { IndexSelectRow } from "./301-7_IndexSelectRow" import { IndexSelectRow } from "./301-7_IndexSelectRow"
import { HalfPrecisionRow } from "./301-8_HalfPrescisionRow" import { HalfPrecisionRow } from "./301-8_HalfPrescisionRow"
import { ModelUploadButtonRow } from "./301-9_ModelUploadButtonRow" import { ModelUploadButtonRow } from "./301-9_ModelUploadButtonRow"
import { ModelSlotRow } from "./301-a_ModelSlotRow"
import { DescriptionRow } from "./301-b_DescriptionRow"
export type ModelUploaderRowProps = { export type ModelUploaderRowProps = {
showModelSlot: boolean
showConfig: boolean showConfig: boolean
showOnnx: boolean showOnnx: boolean
showPyTorch: boolean showPyTorch: boolean
@ -20,6 +23,7 @@ export type ModelUploaderRowProps = {
showFeature: boolean showFeature: boolean
showIndex: boolean showIndex: boolean
showHalfPrecision: boolean showHalfPrecision: boolean
showDescription: boolean
defaultEnablePyTorch: boolean defaultEnablePyTorch: boolean
@ -48,18 +52,21 @@ export const ModelUploaderRow = (props: ModelUploaderRowProps) => {
</div> </div>
</div> </div>
</div> </div>
<ModelSlotRow />
{props.showConfig ? <ConfigSelectRow /> : <></>} {props.showConfig ? <ConfigSelectRow /> : <></>}
{props.showOnnx ? <ONNXSelectRow /> : <></>} {props.showOnnx ? <ONNXSelectRow /> : <></>}
{props.showPyTorch && guiState.showPyTorchModelUpload ? <PyTorchSelectRow showOnnxExportButton={props.showOnnxExportButton || false} /> : <></>} {props.showPyTorch && guiState.showPyTorchModelUpload ? <PyTorchSelectRow showOnnxExportButton={props.showOnnxExportButton || false} /> : <></>}
{props.showHalfPrecision ? <HalfPrecisionRow /> : <></>}
{props.showCorrespondence ? <CorrespondenceSelectRow /> : <></>} {props.showCorrespondence ? <CorrespondenceSelectRow /> : <></>}
{props.showPyTorchCluster ? <PyTorchClusterSelectRow /> : <></>} {props.showPyTorchCluster ? <PyTorchClusterSelectRow /> : <></>}
{props.showFeature ? <FeatureSelectRow /> : <></>} {props.showFeature ? <FeatureSelectRow /> : <></>}
{props.showIndex ? <IndexSelectRow /> : <></>} {props.showIndex ? <IndexSelectRow /> : <></>}
{props.showHalfPrecision ? <HalfPrecisionRow /> : <></>}
{props.showDescription ? <DescriptionRow /> : <></>}
<ModelUploadButtonRow /> <ModelUploadButtonRow />
</> </>
) )
}, [guiState.showPyTorchModelUpload]) }, [guiState.showPyTorchModelUpload])
return modelUploaderRow return modelUploaderRow
} }

View File

@ -1,14 +1,34 @@
import React, { useMemo } from "react" import React, { useMemo } from "react"
import { useAppState } from "../../../001_provider/001_AppStateProvider" import { useAppState } from "../../../001_provider/001_AppStateProvider"
import { useGuiState } from "../001_GuiStateProvider"
export type TuneRowProps = { export type TuneRowProps = {
showPredictF0: boolean
showSetDefault: boolean
} }
export const TuneRow = (_props: TuneRowProps) => { export const TuneRow = (props: TuneRowProps) => {
const appState = useAppState() const appState = useAppState()
const guiState = useGuiState()
const tuneRow = useMemo(() => { const tuneRow = useMemo(() => {
const slot = guiState.modelSlotNum
const predictF0 = props.showPredictF0 ?
<>
<input type="checkbox" checked={appState.serverSetting.serverSetting.predictF0 == 1} onChange={(e) => {
appState.serverSetting.updateServerSettings({ ...appState.serverSetting.serverSetting, predictF0: e.target.checked ? 1 : 0 })
}} /> predict f0
</> :
<></>
const showSetDefault = props.showSetDefault ?
<>
<div className="body-button" onClick={() => {
appState.serverSetting.updateDefaultTune(slot, appState.serverSetting.serverSetting.tran)
}}>set model default</div>
</> :
<></>
return ( return (
<div className="body-row split-3-2-2-3 left-padding-1 guided"> <div className="body-row split-3-2-1-4 left-padding-1 guided">
<div className="body-item-title left-padding-1 ">Tuning</div> <div className="body-item-title left-padding-1 ">Tuning</div>
<div> <div>
<input type="range" className="body-item-input-slider" min="-50" max="50" step="1" value={appState.serverSetting.serverSetting.tran || 0} onChange={(e) => { <input type="range" className="body-item-input-slider" min="-50" max="50" step="1" value={appState.serverSetting.serverSetting.tran || 0} onChange={(e) => {
@ -17,17 +37,18 @@ export const TuneRow = (_props: TuneRowProps) => {
<span className="body-item-input-slider-val">{appState.serverSetting.serverSetting.tran}</span> <span className="body-item-input-slider-val">{appState.serverSetting.serverSetting.tran}</span>
</div> </div>
<div> <div>
<input type="checkbox" checked={appState.serverSetting.serverSetting.predictF0 == 1} onChange={(e) => { {predictF0}
appState.serverSetting.updateServerSettings({ ...appState.serverSetting.serverSetting, predictF0: e.target.checked ? 1 : 0 })
}} /> predict f0
</div> </div>
<div className="body-button-container"> <div className="body-button-container">
{showSetDefault}
</div> </div>
</div> </div>
) )
}, [ }, [
appState.serverSetting.serverSetting, appState.serverSetting.serverSetting,
appState.serverSetting.updateServerSettings appState.serverSetting.updateServerSettings,
guiState.modelSlotNum
]) ])
return tuneRow return tuneRow

View File

@ -8,7 +8,7 @@ export const AUDIO_ELEMENT_FOR_SAMPLING_INPUT = "body-wav-container-wav-input"
export const AUDIO_ELEMENT_FOR_SAMPLING_OUTPUT = "body-wav-container-wav-output" export const AUDIO_ELEMENT_FOR_SAMPLING_OUTPUT = "body-wav-container-wav-output"
export const INDEXEDDB_KEY_AUDIO_OUTPUT = "INDEXEDDB_KEY_AUDIO_OUTPUT" export const INDEXEDDB_KEY_AUDIO_OUTPUT = "INDEXEDDB_KEY_AUDIO_OUTPUT"
export const INDEXEDDB_KEY_DEFAULT_MODEL_TYPE = "INDEXEDDB_KEY_AUDIO_OUTPUT" export const INDEXEDDB_KEY_DEFAULT_MODEL_TYPE = "INDEXEDDB_KEY_DEFALT_MODEL_TYPE"
export const isDesktopApp = () => { export const isDesktopApp = () => {
@ -20,3 +20,5 @@ export const isDesktopApp = () => {
}; };

View File

@ -1,12 +1,12 @@
{ {
"name": "@dannadori/voice-changer-client-js", "name": "@dannadori/voice-changer-client-js",
"version": "1.0.110", "version": "1.0.112",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@dannadori/voice-changer-client-js", "name": "@dannadori/voice-changer-client-js",
"version": "1.0.110", "version": "1.0.112",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@types/readable-stream": "^2.3.15", "@types/readable-stream": "^2.3.15",
@ -19,7 +19,7 @@
}, },
"devDependencies": { "devDependencies": {
"@types/audioworklet": "^0.0.41", "@types/audioworklet": "^0.0.41",
"@types/node": "^18.15.11", "@types/node": "^18.15.13",
"@types/react": "18.0.37", "@types/react": "18.0.37",
"@types/react-dom": "18.0.11", "@types/react-dom": "18.0.11",
"eslint": "^8.38.0", "eslint": "^8.38.0",
@ -33,7 +33,7 @@
"rimraf": "^5.0.0", "rimraf": "^5.0.0",
"ts-loader": "^9.4.2", "ts-loader": "^9.4.2",
"typescript": "^5.0.4", "typescript": "^5.0.4",
"webpack": "^5.79.0", "webpack": "^5.80.0",
"webpack-cli": "^5.0.1", "webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.13.3" "webpack-dev-server": "^4.13.3"
} }
@ -1829,9 +1829,9 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "18.15.11", "version": "18.15.13",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz",
"integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q=="
}, },
"node_modules/@types/prop-types": { "node_modules/@types/prop-types": {
"version": "15.7.5", "version": "15.7.5",
@ -1950,148 +1950,148 @@
"dev": true "dev": true
}, },
"node_modules/@webassemblyjs/ast": { "node_modules/@webassemblyjs/ast": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz",
"integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@webassemblyjs/helper-numbers": "1.11.1", "@webassemblyjs/helper-numbers": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1" "@webassemblyjs/helper-wasm-bytecode": "1.11.5"
} }
}, },
"node_modules/@webassemblyjs/floating-point-hex-parser": { "node_modules/@webassemblyjs/floating-point-hex-parser": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz",
"integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==",
"dev": true "dev": true
}, },
"node_modules/@webassemblyjs/helper-api-error": { "node_modules/@webassemblyjs/helper-api-error": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz",
"integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==",
"dev": true "dev": true
}, },
"node_modules/@webassemblyjs/helper-buffer": { "node_modules/@webassemblyjs/helper-buffer": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz",
"integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==",
"dev": true "dev": true
}, },
"node_modules/@webassemblyjs/helper-numbers": { "node_modules/@webassemblyjs/helper-numbers": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz",
"integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@webassemblyjs/floating-point-hex-parser": "1.11.1", "@webassemblyjs/floating-point-hex-parser": "1.11.5",
"@webassemblyjs/helper-api-error": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.5",
"@xtuc/long": "4.2.2" "@xtuc/long": "4.2.2"
} }
}, },
"node_modules/@webassemblyjs/helper-wasm-bytecode": { "node_modules/@webassemblyjs/helper-wasm-bytecode": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz",
"integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==",
"dev": true "dev": true
}, },
"node_modules/@webassemblyjs/helper-wasm-section": { "node_modules/@webassemblyjs/helper-wasm-section": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz",
"integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
"@webassemblyjs/wasm-gen": "1.11.1" "@webassemblyjs/wasm-gen": "1.11.5"
} }
}, },
"node_modules/@webassemblyjs/ieee754": { "node_modules/@webassemblyjs/ieee754": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz",
"integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@xtuc/ieee754": "^1.2.0" "@xtuc/ieee754": "^1.2.0"
} }
}, },
"node_modules/@webassemblyjs/leb128": { "node_modules/@webassemblyjs/leb128": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz",
"integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@xtuc/long": "4.2.2" "@xtuc/long": "4.2.2"
} }
}, },
"node_modules/@webassemblyjs/utf8": { "node_modules/@webassemblyjs/utf8": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz",
"integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==",
"dev": true "dev": true
}, },
"node_modules/@webassemblyjs/wasm-edit": { "node_modules/@webassemblyjs/wasm-edit": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz",
"integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
"@webassemblyjs/helper-wasm-section": "1.11.1", "@webassemblyjs/helper-wasm-section": "1.11.5",
"@webassemblyjs/wasm-gen": "1.11.1", "@webassemblyjs/wasm-gen": "1.11.5",
"@webassemblyjs/wasm-opt": "1.11.1", "@webassemblyjs/wasm-opt": "1.11.5",
"@webassemblyjs/wasm-parser": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.5",
"@webassemblyjs/wast-printer": "1.11.1" "@webassemblyjs/wast-printer": "1.11.5"
} }
}, },
"node_modules/@webassemblyjs/wasm-gen": { "node_modules/@webassemblyjs/wasm-gen": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz",
"integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
"@webassemblyjs/ieee754": "1.11.1", "@webassemblyjs/ieee754": "1.11.5",
"@webassemblyjs/leb128": "1.11.1", "@webassemblyjs/leb128": "1.11.5",
"@webassemblyjs/utf8": "1.11.1" "@webassemblyjs/utf8": "1.11.5"
} }
}, },
"node_modules/@webassemblyjs/wasm-opt": { "node_modules/@webassemblyjs/wasm-opt": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz",
"integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.5",
"@webassemblyjs/wasm-gen": "1.11.1", "@webassemblyjs/wasm-gen": "1.11.5",
"@webassemblyjs/wasm-parser": "1.11.1" "@webassemblyjs/wasm-parser": "1.11.5"
} }
}, },
"node_modules/@webassemblyjs/wasm-parser": { "node_modules/@webassemblyjs/wasm-parser": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz",
"integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-api-error": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
"@webassemblyjs/ieee754": "1.11.1", "@webassemblyjs/ieee754": "1.11.5",
"@webassemblyjs/leb128": "1.11.1", "@webassemblyjs/leb128": "1.11.5",
"@webassemblyjs/utf8": "1.11.1" "@webassemblyjs/utf8": "1.11.5"
} }
}, },
"node_modules/@webassemblyjs/wast-printer": { "node_modules/@webassemblyjs/wast-printer": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz",
"integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@xtuc/long": "4.2.2" "@xtuc/long": "4.2.2"
} }
}, },
@ -3076,9 +3076,9 @@
} }
}, },
"node_modules/enhanced-resolve": { "node_modules/enhanced-resolve": {
"version": "5.12.0", "version": "5.13.0",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz",
"integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"graceful-fs": "^4.2.4", "graceful-fs": "^4.2.4",
@ -7346,21 +7346,21 @@
} }
}, },
"node_modules/webpack": { "node_modules/webpack": {
"version": "5.79.0", "version": "5.80.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.79.0.tgz", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz",
"integrity": "sha512-3mN4rR2Xq+INd6NnYuL9RC9GAmc1ROPKJoHhrZ4pAjdMFEkJJWrsPw8o2JjCIyQyTu7rTXYn4VG6OpyB3CobZg==", "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/eslint-scope": "^3.7.3", "@types/eslint-scope": "^3.7.3",
"@types/estree": "^1.0.0", "@types/estree": "^1.0.0",
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "^1.11.5",
"@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-edit": "^1.11.5",
"@webassemblyjs/wasm-parser": "1.11.1", "@webassemblyjs/wasm-parser": "^1.11.5",
"acorn": "^8.7.1", "acorn": "^8.7.1",
"acorn-import-assertions": "^1.7.6", "acorn-import-assertions": "^1.7.6",
"browserslist": "^4.14.5", "browserslist": "^4.14.5",
"chrome-trace-event": "^1.0.2", "chrome-trace-event": "^1.0.2",
"enhanced-resolve": "^5.10.0", "enhanced-resolve": "^5.13.0",
"es-module-lexer": "^1.2.1", "es-module-lexer": "^1.2.1",
"eslint-scope": "5.1.1", "eslint-scope": "5.1.1",
"events": "^3.2.0", "events": "^3.2.0",
@ -7370,7 +7370,7 @@
"loader-runner": "^4.2.0", "loader-runner": "^4.2.0",
"mime-types": "^2.1.27", "mime-types": "^2.1.27",
"neo-async": "^2.6.2", "neo-async": "^2.6.2",
"schema-utils": "^3.1.0", "schema-utils": "^3.1.2",
"tapable": "^2.1.1", "tapable": "^2.1.1",
"terser-webpack-plugin": "^5.3.7", "terser-webpack-plugin": "^5.3.7",
"watchpack": "^2.4.0", "watchpack": "^2.4.0",
@ -7609,9 +7609,9 @@
} }
}, },
"node_modules/webpack/node_modules/schema-utils": { "node_modules/webpack/node_modules/schema-utils": {
"version": "3.1.1", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz",
"integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/json-schema": "^7.0.8", "@types/json-schema": "^7.0.8",
@ -9473,9 +9473,9 @@
"dev": true "dev": true
}, },
"@types/node": { "@types/node": {
"version": "18.15.11", "version": "18.15.13",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz",
"integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q=="
}, },
"@types/prop-types": { "@types/prop-types": {
"version": "15.7.5", "version": "15.7.5",
@ -9594,148 +9594,148 @@
"dev": true "dev": true
}, },
"@webassemblyjs/ast": { "@webassemblyjs/ast": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz",
"integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@webassemblyjs/helper-numbers": "1.11.1", "@webassemblyjs/helper-numbers": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1" "@webassemblyjs/helper-wasm-bytecode": "1.11.5"
} }
}, },
"@webassemblyjs/floating-point-hex-parser": { "@webassemblyjs/floating-point-hex-parser": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz",
"integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==",
"dev": true "dev": true
}, },
"@webassemblyjs/helper-api-error": { "@webassemblyjs/helper-api-error": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz",
"integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==",
"dev": true "dev": true
}, },
"@webassemblyjs/helper-buffer": { "@webassemblyjs/helper-buffer": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz",
"integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==",
"dev": true "dev": true
}, },
"@webassemblyjs/helper-numbers": { "@webassemblyjs/helper-numbers": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz",
"integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@webassemblyjs/floating-point-hex-parser": "1.11.1", "@webassemblyjs/floating-point-hex-parser": "1.11.5",
"@webassemblyjs/helper-api-error": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.5",
"@xtuc/long": "4.2.2" "@xtuc/long": "4.2.2"
} }
}, },
"@webassemblyjs/helper-wasm-bytecode": { "@webassemblyjs/helper-wasm-bytecode": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz",
"integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==",
"dev": true "dev": true
}, },
"@webassemblyjs/helper-wasm-section": { "@webassemblyjs/helper-wasm-section": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz",
"integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
"@webassemblyjs/wasm-gen": "1.11.1" "@webassemblyjs/wasm-gen": "1.11.5"
} }
}, },
"@webassemblyjs/ieee754": { "@webassemblyjs/ieee754": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz",
"integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@xtuc/ieee754": "^1.2.0" "@xtuc/ieee754": "^1.2.0"
} }
}, },
"@webassemblyjs/leb128": { "@webassemblyjs/leb128": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz",
"integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@xtuc/long": "4.2.2" "@xtuc/long": "4.2.2"
} }
}, },
"@webassemblyjs/utf8": { "@webassemblyjs/utf8": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz",
"integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==",
"dev": true "dev": true
}, },
"@webassemblyjs/wasm-edit": { "@webassemblyjs/wasm-edit": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz",
"integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
"@webassemblyjs/helper-wasm-section": "1.11.1", "@webassemblyjs/helper-wasm-section": "1.11.5",
"@webassemblyjs/wasm-gen": "1.11.1", "@webassemblyjs/wasm-gen": "1.11.5",
"@webassemblyjs/wasm-opt": "1.11.1", "@webassemblyjs/wasm-opt": "1.11.5",
"@webassemblyjs/wasm-parser": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.5",
"@webassemblyjs/wast-printer": "1.11.1" "@webassemblyjs/wast-printer": "1.11.5"
} }
}, },
"@webassemblyjs/wasm-gen": { "@webassemblyjs/wasm-gen": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz",
"integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
"@webassemblyjs/ieee754": "1.11.1", "@webassemblyjs/ieee754": "1.11.5",
"@webassemblyjs/leb128": "1.11.1", "@webassemblyjs/leb128": "1.11.5",
"@webassemblyjs/utf8": "1.11.1" "@webassemblyjs/utf8": "1.11.5"
} }
}, },
"@webassemblyjs/wasm-opt": { "@webassemblyjs/wasm-opt": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz",
"integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.5",
"@webassemblyjs/wasm-gen": "1.11.1", "@webassemblyjs/wasm-gen": "1.11.5",
"@webassemblyjs/wasm-parser": "1.11.1" "@webassemblyjs/wasm-parser": "1.11.5"
} }
}, },
"@webassemblyjs/wasm-parser": { "@webassemblyjs/wasm-parser": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz",
"integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==",
"dev": true, "dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@webassemblyjs/helper-api-error": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.5",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
"@webassemblyjs/ieee754": "1.11.1", "@webassemblyjs/ieee754": "1.11.5",
"@webassemblyjs/leb128": "1.11.1", "@webassemblyjs/leb128": "1.11.5",
"@webassemblyjs/utf8": "1.11.1" "@webassemblyjs/utf8": "1.11.5"
} }
}, },
"@webassemblyjs/wast-printer": { "@webassemblyjs/wast-printer": {
"version": "1.11.1", "version": "1.11.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz",
"integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.5",
"@xtuc/long": "4.2.2" "@xtuc/long": "4.2.2"
} }
}, },
@ -10442,9 +10442,9 @@
"integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==" "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw=="
}, },
"enhanced-resolve": { "enhanced-resolve": {
"version": "5.12.0", "version": "5.13.0",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz",
"integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==",
"dev": true, "dev": true,
"requires": { "requires": {
"graceful-fs": "^4.2.4", "graceful-fs": "^4.2.4",
@ -13586,21 +13586,21 @@
} }
}, },
"webpack": { "webpack": {
"version": "5.79.0", "version": "5.80.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.79.0.tgz", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz",
"integrity": "sha512-3mN4rR2Xq+INd6NnYuL9RC9GAmc1ROPKJoHhrZ4pAjdMFEkJJWrsPw8o2JjCIyQyTu7rTXYn4VG6OpyB3CobZg==", "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/eslint-scope": "^3.7.3", "@types/eslint-scope": "^3.7.3",
"@types/estree": "^1.0.0", "@types/estree": "^1.0.0",
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "^1.11.5",
"@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-edit": "^1.11.5",
"@webassemblyjs/wasm-parser": "1.11.1", "@webassemblyjs/wasm-parser": "^1.11.5",
"acorn": "^8.7.1", "acorn": "^8.7.1",
"acorn-import-assertions": "^1.7.6", "acorn-import-assertions": "^1.7.6",
"browserslist": "^4.14.5", "browserslist": "^4.14.5",
"chrome-trace-event": "^1.0.2", "chrome-trace-event": "^1.0.2",
"enhanced-resolve": "^5.10.0", "enhanced-resolve": "^5.13.0",
"es-module-lexer": "^1.2.1", "es-module-lexer": "^1.2.1",
"eslint-scope": "5.1.1", "eslint-scope": "5.1.1",
"events": "^3.2.0", "events": "^3.2.0",
@ -13610,7 +13610,7 @@
"loader-runner": "^4.2.0", "loader-runner": "^4.2.0",
"mime-types": "^2.1.27", "mime-types": "^2.1.27",
"neo-async": "^2.6.2", "neo-async": "^2.6.2",
"schema-utils": "^3.1.0", "schema-utils": "^3.1.2",
"tapable": "^2.1.1", "tapable": "^2.1.1",
"terser-webpack-plugin": "^5.3.7", "terser-webpack-plugin": "^5.3.7",
"watchpack": "^2.4.0", "watchpack": "^2.4.0",
@ -13634,9 +13634,9 @@
"dev": true "dev": true
}, },
"schema-utils": { "schema-utils": {
"version": "3.1.1", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz",
"integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/json-schema": "^7.0.8", "@types/json-schema": "^7.0.8",

View File

@ -1,6 +1,6 @@
{ {
"name": "@dannadori/voice-changer-client-js", "name": "@dannadori/voice-changer-client-js",
"version": "1.0.110", "version": "1.0.112",
"description": "", "description": "",
"main": "dist/index.js", "main": "dist/index.js",
"directories": { "directories": {
@ -27,7 +27,7 @@
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"@types/audioworklet": "^0.0.41", "@types/audioworklet": "^0.0.41",
"@types/node": "^18.15.11", "@types/node": "^18.15.13",
"@types/react": "18.0.37", "@types/react": "18.0.37",
"@types/react-dom": "18.0.11", "@types/react-dom": "18.0.11",
"eslint": "^8.38.0", "eslint": "^8.38.0",
@ -41,7 +41,7 @@
"rimraf": "^5.0.0", "rimraf": "^5.0.0",
"ts-loader": "^9.4.2", "ts-loader": "^9.4.2",
"typescript": "^5.0.4", "typescript": "^5.0.4",
"webpack": "^5.79.0", "webpack": "^5.80.0",
"webpack-cli": "^5.0.1", "webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.13.3" "webpack-dev-server": "^4.13.3"
}, },

View File

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

View File

@ -285,7 +285,7 @@ export class VoiceChangerClient {
return this.configurator.concatUploadedFile(filename, chunkNum) return this.configurator.concatUploadedFile(filename, chunkNum)
} }
loadModel = ( loadModel = (
slot: number | null, slot: number,
configFilename: string, configFilename: string,
pyTorchModelFilename: string | null, pyTorchModelFilename: string | null,
onnxModelFilename: string | null, onnxModelFilename: string | null,

View File

@ -93,6 +93,7 @@ export const ServerSettingKey = {
"rvcQuality": "rvcQuality", "rvcQuality": "rvcQuality",
"modelSamplingRate": "modelSamplingRate", "modelSamplingRate": "modelSamplingRate",
"silenceFront": "silenceFront", "silenceFront": "silenceFront",
"modelSlotIndex": "modelSlotIndex",
"enableEnhancer": "enableEnhancer", "enableEnhancer": "enableEnhancer",
"enhancerTune": "enhancerTune", "enhancerTune": "enhancerTune",
@ -129,6 +130,7 @@ export type VoiceChangerServerSetting = {
rvcQuality: number // 0:low, 1:high rvcQuality: number // 0:low, 1:high
silenceFront: number // 0:off, 1:on silenceFront: number // 0:off, 1:on
modelSamplingRate: ModelSamplingRate // 32000,40000,48000 modelSamplingRate: ModelSamplingRate // 32000,40000,48000
modelSlotIndex: number,
enableEnhancer: number // DDSP-SVC enableEnhancer: number // DDSP-SVC
enhancerTune: number // DDSP-SVC enhancerTune: number // DDSP-SVC
@ -142,6 +144,7 @@ export type ServerInfo = VoiceChangerServerSetting & {
pyTorchModelFile: string, pyTorchModelFile: string,
onnxModelFile: string, onnxModelFile: string,
onnxExecutionProviders: OnnxExecutionProvider[] onnxExecutionProviders: OnnxExecutionProvider[]
modelSlots: any[]
} }
export type ServerInfoSoVitsSVC = ServerInfo & { export type ServerInfoSoVitsSVC = ServerInfo & {
@ -181,6 +184,7 @@ export const DefaultServerSetting: ServerInfo = {
rvcQuality: 0, rvcQuality: 0,
modelSamplingRate: 48000, modelSamplingRate: 48000,
silenceFront: 1, silenceFront: 1,
modelSlotIndex: 0,
enableEnhancer: 0, enableEnhancer: 0,
enhancerTune: 0, enhancerTune: 0,
@ -191,7 +195,8 @@ export const DefaultServerSetting: ServerInfo = {
configFile: "", configFile: "",
pyTorchModelFile: "", pyTorchModelFile: "",
onnxModelFile: "", onnxModelFile: "",
onnxExecutionProviders: [] onnxExecutionProviders: [],
modelSlots: []
} }
export const DefaultServerSetting_MMVCv15: ServerInfo = { export const DefaultServerSetting_MMVCv15: ServerInfo = {
...DefaultServerSetting, dstId: 101, ...DefaultServerSetting, dstId: 101,
@ -217,7 +222,7 @@ export const DefaultServerSetting_DDSP_SVC: ServerInfo = {
export const DefaultServerSetting_RVC: ServerInfo = { export const DefaultServerSetting_RVC: ServerInfo = {
...DefaultServerSetting, tran: 10, extraConvertSize: 1024 * 32, ...DefaultServerSetting, tran: 10, extraConvertSize: 1024 * 32, f0Detector: F0Detector.harvest
} }
/////////////////////// ///////////////////////
@ -382,4 +387,7 @@ export type OnnxExporterInfo = {
"status": string "status": string
"path": string "path": string
"filename": string "filename": string
} }
export const MAX_MODEL_SLOT_NUM = 3

View File

@ -78,6 +78,7 @@ export const useClient = (props: UseClientProps): ClientState => {
const [performance, setPerformance] = useState<PerformanceData>(InitialPerformanceData) const [performance, setPerformance] = useState<PerformanceData>(InitialPerformanceData)
const [volume, setVolume] = useState<number>(0) const [volume, setVolume] = useState<number>(0)
// (1-4) エラーステータス // (1-4) エラーステータス
const errorCountRef = useRef<number>(0) const errorCountRef = useRef<number>(0)

View File

@ -43,6 +43,7 @@ export const useIndexedDB = (props: UseIndexedDBProps): IndexedDBStateAndMethod
const removeItem = useMemo(() => { const removeItem = useMemo(() => {
return async (key: string) => { return async (key: string) => {
const clientKey = `${clientType}_${key}` const clientKey = `${clientType}_${key}`
// console.log("remove key:", clientKey)
return await localForage.removeItem(clientKey) return await localForage.removeItem(clientKey)
} }
}, [props.clientType]) }, [props.clientType])

View File

@ -1,5 +1,5 @@
import { useState, useMemo, useEffect } from "react" import { useState, useMemo, useEffect } from "react"
import { VoiceChangerServerSetting, ServerInfo, ServerSettingKey, INDEXEDDB_KEY_SERVER, INDEXEDDB_KEY_MODEL_DATA, ClientType, DefaultServerSetting_MMVCv13, DefaultServerSetting_MMVCv15, DefaultServerSetting_so_vits_svc_40v2, DefaultServerSetting_so_vits_svc_40, DefaultServerSetting_so_vits_svc_40_c, DefaultServerSetting_RVC, OnnxExporterInfo, DefaultServerSetting_DDSP_SVC } from "../const" import { VoiceChangerServerSetting, ServerInfo, ServerSettingKey, INDEXEDDB_KEY_SERVER, INDEXEDDB_KEY_MODEL_DATA, ClientType, DefaultServerSetting_MMVCv13, DefaultServerSetting_MMVCv15, DefaultServerSetting_so_vits_svc_40v2, DefaultServerSetting_so_vits_svc_40, DefaultServerSetting_so_vits_svc_40_c, DefaultServerSetting_RVC, OnnxExporterInfo, DefaultServerSetting_DDSP_SVC, MAX_MODEL_SLOT_NUM } from "../const"
import { VoiceChangerClient } from "../VoiceChangerClient" import { VoiceChangerClient } from "../VoiceChangerClient"
import { useIndexedDB } from "./useIndexedDB" import { useIndexedDB } from "./useIndexedDB"
@ -20,6 +20,8 @@ export type FileUploadSetting = {
index: ModelData | null //RVC index: ModelData | null //RVC
isHalf: boolean isHalf: boolean
uploaded: boolean
defaultTune: number
} }
@ -32,7 +34,9 @@ const InitialFileUploadSetting: FileUploadSetting = {
feature: null, feature: null,
index: null, index: null,
isHalf: true isHalf: true,
uploaded: false,
defaultTune: 0
} }
export type UseServerSettingProps = { export type UseServerSettingProps = {
@ -46,13 +50,14 @@ export type ServerSettingState = {
clearSetting: () => Promise<void> clearSetting: () => Promise<void>
reloadServerInfo: () => Promise<void>; reloadServerInfo: () => Promise<void>;
fileUploadSetting: FileUploadSetting fileUploadSettings: FileUploadSetting[]
setFileUploadSetting: (val: FileUploadSetting) => void setFileUploadSetting: (slot: number, val: FileUploadSetting) => void
loadModel: () => Promise<void> loadModel: (slot: number) => Promise<void>
uploadProgress: number uploadProgress: number
isUploading: boolean isUploading: boolean
getOnnx: () => Promise<OnnxExporterInfo> getOnnx: () => Promise<OnnxExporterInfo>
updateDefaultTune: (slot: number, tune: number) => void
} }
@ -80,7 +85,7 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
} }
const [serverSetting, setServerSetting] = useState<ServerInfo>(getDefaultServerSetting()) const [serverSetting, setServerSetting] = useState<ServerInfo>(getDefaultServerSetting())
const [fileUploadSetting, setFileUploadSetting] = useState<FileUploadSetting>(InitialFileUploadSetting) const [fileUploadSettings, setFileUploadSettings] = useState<FileUploadSetting[]>([])
const { setItem, getItem, removeItem } = useIndexedDB({ clientType: props.clientType }) const { setItem, getItem, removeItem } = useIndexedDB({ clientType: props.clientType })
@ -88,7 +93,6 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
useEffect(() => { useEffect(() => {
if (!props.voiceChangerClient) return if (!props.voiceChangerClient) return
if (!props.clientType) return if (!props.clientType) return
const setInitialSetting = async () => { const setInitialSetting = async () => {
// Set Model Type // Set Model Type
await props.voiceChangerClient!.switchModelType(props.clientType!) await props.voiceChangerClient!.switchModelType(props.clientType!)
@ -99,10 +103,8 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
let initialSetting: ServerInfo let initialSetting: ServerInfo
if (cachedServerSetting) { if (cachedServerSetting) {
initialSetting = { ...defaultServerSetting, ...cachedServerSetting as ServerInfo, inputSampleRate: 48000 }// sample rateは時限措置 initialSetting = { ...defaultServerSetting, ...cachedServerSetting as ServerInfo, inputSampleRate: 48000 }// sample rateは時限措置
console.log("Initial Setting1:", initialSetting)
} else { } else {
initialSetting = { ...defaultServerSetting } initialSetting = { ...defaultServerSetting }
console.log("Initial Setting2:", initialSetting)
} }
setServerSetting(initialSetting) setServerSetting(initialSetting)
@ -115,12 +117,19 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
} }
} }
// Load file upload cache // Load file upload cache
const fileuploadSetting = await getItem(INDEXEDDB_KEY_MODEL_DATA) const loadedFileUploadSettings: FileUploadSetting[] = []
if (!fileuploadSetting) { for (let i = 0; i < MAX_MODEL_SLOT_NUM; i++) {
} else { const modleKey = `${INDEXEDDB_KEY_MODEL_DATA}_${i}`
setFileUploadSetting(fileuploadSetting as FileUploadSetting) const fileuploadSetting = await getItem(modleKey)
if (!fileuploadSetting) {
loadedFileUploadSettings.push(InitialFileUploadSetting)
} else {
loadedFileUploadSettings.push(fileuploadSetting as FileUploadSetting)
}
} }
setFileUploadSettings(loadedFileUploadSettings)
reloadServerInfo() reloadServerInfo()
} }
@ -156,6 +165,14 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
} }
}, [props.voiceChangerClient, serverSetting]) }, [props.voiceChangerClient, serverSetting])
const setFileUploadSetting = useMemo(() => {
return async (slot: number, fileUploadSetting: FileUploadSetting) => {
fileUploadSetting.uploaded = false
fileUploadSettings[slot] = fileUploadSetting
setFileUploadSettings([...fileUploadSettings])
}
}, [fileUploadSettings])
////////////// //////////////
// 操作 // 操作
@ -173,12 +190,12 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
} }
}, [props.voiceChangerClient]) }, [props.voiceChangerClient])
const loadModel = useMemo(() => { const loadModel = useMemo(() => {
return async () => { return async (slot: number) => {
if (!fileUploadSetting.pyTorchModel && !fileUploadSetting.onnxModel) { if (!fileUploadSettings[slot].pyTorchModel && !fileUploadSettings[slot].onnxModel) {
alert("PyTorchモデルとONNXモデルのどちらか一つ以上指定する必要があります。") alert("PyTorchモデルとONNXモデルのどちらか一つ以上指定する必要があります。")
return return
} }
if (!fileUploadSetting.configFile && props.clientType != "RVC") { if (!fileUploadSettings[slot].configFile && props.clientType != "RVC") {
alert("Configファイルを指定する必要があります。") alert("Configファイルを指定する必要があります。")
return return
} }
@ -189,6 +206,7 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
setIsUploading(true) setIsUploading(true)
// ファイルをメモリにロード(dataがある場合は、キャッシュから読まれていると想定しスキップ) // ファイルをメモリにロード(dataがある場合は、キャッシュから読まれていると想定しスキップ)
const fileUploadSetting = fileUploadSettings[slot]
if (fileUploadSetting.onnxModel && !fileUploadSetting.onnxModel.data) { if (fileUploadSetting.onnxModel && !fileUploadSetting.onnxModel.data) {
fileUploadSetting.onnxModel.data = await fileUploadSetting.onnxModel.file!.arrayBuffer() fileUploadSetting.onnxModel.data = await fileUploadSetting.onnxModel.file!.arrayBuffer()
fileUploadSetting.onnxModel.filename = await fileUploadSetting.onnxModel.file!.name fileUploadSetting.onnxModel.filename = await fileUploadSetting.onnxModel.file!.name
@ -246,9 +264,8 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
} }
const configFileName = fileUploadSetting.configFile ? fileUploadSetting.configFile.filename || "-" : "-" const configFileName = fileUploadSetting.configFile ? fileUploadSetting.configFile.filename || "-" : "-"
console.log("IS HALF", fileUploadSetting.isHalf)
const loadPromise = props.voiceChangerClient.loadModel( const loadPromise = props.voiceChangerClient.loadModel(
0, slot,
configFileName, configFileName,
fileUploadSetting.pyTorchModel?.filename || null, fileUploadSetting.pyTorchModel?.filename || null,
fileUploadSetting.onnxModel?.filename || null, fileUploadSetting.onnxModel?.filename || null,
@ -260,34 +277,53 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
) )
// サーバでロード中にキャッシュにセーブ // サーバでロード中にキャッシュにセーブ
try { storeToCache(slot, fileUploadSetting)
const saveData: FileUploadSetting = {
pyTorchModel: fileUploadSetting.pyTorchModel ? { data: fileUploadSetting.pyTorchModel.data, filename: fileUploadSetting.pyTorchModel.filename } : null,
onnxModel: fileUploadSetting.onnxModel ? { data: fileUploadSetting.onnxModel.data, filename: fileUploadSetting.onnxModel.filename } : null,
configFile: fileUploadSetting.configFile ? { data: fileUploadSetting.configFile.data, filename: fileUploadSetting.configFile.filename } : null,
clusterTorchModel: fileUploadSetting.clusterTorchModel ? {
data: fileUploadSetting.clusterTorchModel.data, filename: fileUploadSetting.clusterTorchModel.filename
} : null,
feature: fileUploadSetting.feature ? {
data: fileUploadSetting.feature.data, filename: fileUploadSetting.feature.filename
} : null,
index: fileUploadSetting.index ? {
data: fileUploadSetting.index.data, filename: fileUploadSetting.index.filename
} : null,
isHalf: fileUploadSetting.isHalf
}
setItem(INDEXEDDB_KEY_MODEL_DATA, saveData)
} catch (e) {
console.log("Excpetion:::::::::", e)
}
await loadPromise await loadPromise
fileUploadSetting.uploaded = true
fileUploadSettings[slot] = fileUploadSetting
setFileUploadSettings([...fileUploadSettings])
setUploadProgress(0) setUploadProgress(0)
setIsUploading(false) setIsUploading(false)
reloadServerInfo() reloadServerInfo()
} }
}, [fileUploadSetting, props.voiceChangerClient, props.clientType]) }, [fileUploadSettings, props.voiceChangerClient, props.clientType])
const updateDefaultTune = (slot: number, tune: number) => {
fileUploadSettings[slot].defaultTune = tune
storeToCache(slot, fileUploadSettings[slot])
setFileUploadSettings([...fileUploadSettings])
}
const storeToCache = (slot: number, fileUploadSetting: FileUploadSetting) => {
try {
const saveData: FileUploadSetting = {
pyTorchModel: fileUploadSetting.pyTorchModel ? { data: fileUploadSetting.pyTorchModel.data, filename: fileUploadSetting.pyTorchModel.filename } : null,
onnxModel: fileUploadSetting.onnxModel ? { data: fileUploadSetting.onnxModel.data, filename: fileUploadSetting.onnxModel.filename } : null,
configFile: fileUploadSetting.configFile ? { data: fileUploadSetting.configFile.data, filename: fileUploadSetting.configFile.filename } : null,
clusterTorchModel: fileUploadSetting.clusterTorchModel ? {
data: fileUploadSetting.clusterTorchModel.data, filename: fileUploadSetting.clusterTorchModel.filename
} : null,
feature: fileUploadSetting.feature ? {
data: fileUploadSetting.feature.data, filename: fileUploadSetting.feature.filename
} : null,
index: fileUploadSetting.index ? {
data: fileUploadSetting.index.data, filename: fileUploadSetting.index.filename
} : null,
isHalf: fileUploadSetting.isHalf, // キャッシュとしては不使用。guiで上書きされる。
uploaded: false, // キャッシュから読み込まれるときには、まだuploadされていないから。
defaultTune: fileUploadSetting.defaultTune
}
setItem(`${INDEXEDDB_KEY_MODEL_DATA}_${slot}`, saveData)
} catch (e) {
console.log("Excpetion:::::::::", e)
}
}
const reloadServerInfo = useMemo(() => { const reloadServerInfo = useMemo(() => {
return async () => { return async () => {
@ -305,6 +341,10 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
const clearSetting = async () => { const clearSetting = async () => {
await removeItem(INDEXEDDB_KEY_SERVER) await removeItem(INDEXEDDB_KEY_SERVER)
await removeItem(INDEXEDDB_KEY_MODEL_DATA) await removeItem(INDEXEDDB_KEY_MODEL_DATA)
for (let i = 0; i < MAX_MODEL_SLOT_NUM; i++) {
const modleKey = `${INDEXEDDB_KEY_MODEL_DATA}_${i}`
await removeItem(modleKey)
}
} }
@ -318,11 +358,12 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
clearSetting, clearSetting,
reloadServerInfo, reloadServerInfo,
fileUploadSetting, fileUploadSettings,
setFileUploadSetting, setFileUploadSetting,
loadModel, loadModel,
uploadProgress, uploadProgress,
isUploading, isUploading,
getOnnx, getOnnx,
updateDefaultTune,
} }
} }

View File

@ -34,6 +34,14 @@ from fairseq import checkpoint_utils
providers = ['OpenVINOExecutionProvider', "CUDAExecutionProvider", "DmlExecutionProvider", "CPUExecutionProvider"] providers = ['OpenVINOExecutionProvider', "CUDAExecutionProvider", "DmlExecutionProvider", "CPUExecutionProvider"]
@dataclass
class ModelSlot():
pyTorchModelFile: str = ""
onnxModelFile: str = ""
featureFile: str = ""
indexFile: str = ""
@dataclass @dataclass
class RVCSettings(): class RVCSettings():
gpu: int = 0 gpu: int = 0
@ -41,7 +49,6 @@ class RVCSettings():
f0Detector: str = "pm" # pm or harvest f0Detector: str = "pm" # pm or harvest
tran: int = 20 tran: int = 20
predictF0: int = 0 # 0:False, 1:True
silentThreshold: float = 0.00001 silentThreshold: float = 0.00001
extraConvertSize: int = 1024 * 32 extraConvertSize: int = 1024 * 32
clusterInferRatio: float = 0.1 clusterInferRatio: float = 0.1
@ -50,18 +57,23 @@ class RVCSettings():
pyTorchModelFile: str = "" pyTorchModelFile: str = ""
onnxModelFile: str = "" onnxModelFile: str = ""
configFile: str = "" configFile: str = ""
modelSlots: list[ModelSlot] = field(
default_factory=lambda: [
ModelSlot(), ModelSlot(), ModelSlot()
]
)
indexRatio: float = 0 indexRatio: float = 0
rvcQuality: int = 0 rvcQuality: int = 0
silenceFront: int = 1 # 0:off, 1:on silenceFront: int = 1 # 0:off, 1:on
modelSamplingRate: int = 48000 modelSamplingRate: int = 48000
modelSlotIndex: int = 0
speakers: dict[str, int] = field( speakers: dict[str, int] = field(
default_factory=lambda: {} default_factory=lambda: {}
) )
# ↓mutableな物だけ列挙 # ↓mutableな物だけ列挙
intData = ["gpu", "dstId", "tran", "predictF0", "extraConvertSize", "rvcQuality", "modelSamplingRate", "silenceFront"] intData = ["gpu", "dstId", "tran", "extraConvertSize", "rvcQuality", "modelSamplingRate", "silenceFront", "modelSlotIndex"]
floatData = ["silentThreshold", "indexRatio"] floatData = ["silentThreshold", "indexRatio"]
strData = ["framework", "f0Detector"] strData = ["framework", "f0Detector"]
@ -80,17 +92,23 @@ class RVC:
print("mps: ", self.mps_enabled) print("mps: ", self.mps_enabled)
def loadModel(self, props): def loadModel(self, props):
self.settings.configFile = props["files"]["configFilename"]
self.settings.pyTorchModelFile = props["files"]["pyTorchModelFilename"] # self.settings.pyTorchModelFile = props["files"]["pyTorchModelFilename"]
self.settings.onnxModelFile = props["files"]["onnxModelFilename"] # self.settings.onnxModelFile = props["files"]["onnxModelFilename"]
self.feature_file = props["files"]["featureFilename"] # self.feature_file = props["files"]["featureFilename"]
self.index_file = props["files"]["indexFilename"] # self.index_file = props["files"]["indexFilename"]
self.is_half = props["isHalf"] self.is_half = props["isHalf"]
self.slot = props["slot"] self.slot = props["slot"]
self.settings.modelSlots[self.slot] = ModelSlot(
pyTorchModelFile=props["files"]["pyTorchModelFilename"],
onnxModelFile=props["files"]["onnxModelFilename"],
featureFile=props["files"]["featureFilename"],
indexFile=props["files"]["indexFilename"]
)
print("[Voice Changer] RVC loading... slot:", self.slot) print("[Voice Changer] RVC loading... slot:", self.slot)
try: try:
@ -105,9 +123,18 @@ class RVC:
except Exception as e: except Exception as e:
print("EXCEPTION during loading hubert/contentvec model", e) print("EXCEPTION during loading hubert/contentvec model", e)
self.switchModel(self.slot)
return self.get_info()
def switchModel(self, slot: int):
print("[Voice Changer] Switch Model to:", slot)
self.slot = slot
pyTorchModelFile = self.settings.modelSlots[slot].pyTorchModelFile
onnxModelFile = self.settings.modelSlots[slot].onnxModelFile
# PyTorchモデル生成 # PyTorchモデル生成
if self.settings.pyTorchModelFile != None: if pyTorchModelFile != None:
cpt = torch.load(self.settings.pyTorchModelFile, map_location="cpu") cpt = torch.load(pyTorchModelFile, map_location="cpu")
self.settings.modelSamplingRate = cpt["config"][-1] self.settings.modelSamplingRate = cpt["config"][-1]
net_g = SynthesizerTrnMs256NSFsid(*cpt["config"], is_half=self.is_half) net_g = SynthesizerTrnMs256NSFsid(*cpt["config"], is_half=self.is_half)
net_g.eval() net_g.eval()
@ -115,10 +142,18 @@ class RVC:
if self.is_half: if self.is_half:
net_g = net_g.half() net_g = net_g.half()
self.net_g = net_g self.net_g = net_g
else:
self.net_g = None
# ONNXモデル生成 # ONNXモデル生成
if self.settings.onnxModelFile != None: if onnxModelFile != None:
self.onnx_session = ModelWrapper(self.settings.onnxModelFile) self.onnx_session = ModelWrapper(onnxModelFile)
else:
self.onnx_session = None
self.feature_file = self.settings.modelSlots[slot].featureFile
self.index_file = self.settings.modelSlots[slot].indexFile
return self.get_info() return self.get_info()
def update_settings(self, key: str, val: any): def update_settings(self, key: str, val: any):
@ -145,6 +180,8 @@ class RVC:
if "CUDAExecutionProvider" in providers: if "CUDAExecutionProvider" in providers:
provider_options = [{'device_id': self.settings.gpu}] provider_options = [{'device_id': self.settings.gpu}]
self.onnx_session.set_providers(providers=["CUDAExecutionProvider"], provider_options=provider_options) self.onnx_session.set_providers(providers=["CUDAExecutionProvider"], provider_options=provider_options)
if key == "modelSlotIndex":
self.switchModel(int(val))
elif key in self.settings.floatData: elif key in self.settings.floatData:
setattr(self.settings, key, float(val)) setattr(self.settings, key, float(val))
elif key in self.settings.strData: elif key in self.settings.strData:

View File

@ -56,6 +56,14 @@ class VC(object):
f0 = signal.medfilt(f0, 3) f0 = signal.medfilt(f0, 3)
f0 = np.pad(f0.astype('float'), (start_frame, n_frames - len(f0) - start_frame)) f0 = np.pad(f0.astype('float'), (start_frame, n_frames - len(f0) - start_frame))
else:
print("[Voice Changer] invalid f0 detector, use pm.", f0_method)
f0 = parselmouth.Sound(audio, self.sr).to_pitch_ac(
time_step=time_step / 1000, voicing_threshold=0.6,
pitch_floor=f0_min, pitch_ceiling=f0_max).selected_array['frequency']
pad_size = (p_len - len(f0) + 1) // 2
if (pad_size > 0 or p_len - len(f0) - pad_size > 0):
f0 = np.pad(f0, [[pad_size, p_len - len(f0) - pad_size]], mode='constant')
f0 *= pow(2, f0_up_key / 12) f0 *= pow(2, f0_up_key / 12)
# with open("test.txt","w")as f:f.write("\n".join([str(i)for i in f0.tolist()])) # with open("test.txt","w")as f:f.write("\n".join([str(i)for i in f0.tolist()]))