WIP: multi model

This commit is contained in:
wataru 2023-04-22 05:42:24 +09:00
parent 695152e138
commit f8b589cc1d
17 changed files with 198 additions and 124 deletions

View File

@ -51,7 +51,7 @@
"defaultEnablePyTorch": true,
"showOnnxExportButton": true,
"showDescription": true
"showDefaultTune": true
}
},
{
@ -109,9 +109,7 @@
},
{
"name": "tune",
"options": {
"showSetDefault": true
}
"options": {}
},
{
"name": "indexRatio",

File diff suppressed because one or more lines are too long

View File

@ -9,7 +9,7 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.112",
"@dannadori/voice-changer-client-js": "^1.0.113",
"@fortawesome/fontawesome-svg-core": "^6.4.0",
"@fortawesome/free-brands-svg-icons": "^6.4.0",
"@fortawesome/free-regular-svg-icons": "^6.4.0",
@ -24,7 +24,7 @@
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.4",
"@types/node": "^18.15.13",
"@types/react": "^18.0.37",
"@types/react": "^18.0.38",
"@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
@ -47,7 +47,7 @@
"tsconfig-paths": "^4.2.0",
"typescript": "^5.0.4",
"webpack": "^5.80.0",
"webpack-cli": "^5.0.1",
"webpack-cli": "^5.0.2",
"webpack-dev-server": "^4.13.3"
}
},
@ -3097,9 +3097,9 @@
}
},
"node_modules/@dannadori/voice-changer-client-js": {
"version": "1.0.112",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.112.tgz",
"integrity": "sha512-ydEur3juxY2dNJe7xsqhref61J2JrB/l0oZVV4VLyh4Gu3OR/uhoBAWBtG5qNO0MVIBznbH/xyZ6jHA4JuwaAg==",
"version": "1.0.113",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.113.tgz",
"integrity": "sha512-UGm1KrgEiPlh/7x+/1I9SRAjUbbVA9XgXDayNQyWRVtFLmcfzpkGwJjIcoTH0t8TLzw17D1HWYtGWLES7+tc+w==",
"dependencies": {
"@types/readable-stream": "^2.3.15",
"amazon-chime-sdk-js": "^3.13.0",
@ -3711,9 +3711,9 @@
"license": "MIT"
},
"node_modules/@types/react": {
"version": "18.0.37",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.37.tgz",
"integrity": "sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw==",
"version": "18.0.38",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.38.tgz",
"integrity": "sha512-ExsidLLSzYj4cvaQjGnQCk4HFfVT9+EZ9XZsQ8Hsrcn8QNgXtpZ3m9vSIC2MWtx7jHictK6wYhQgGh6ic58oOw==",
"dev": true,
"dependencies": {
"@types/prop-types": "*",
@ -3969,9 +3969,10 @@
}
},
"node_modules/@webpack-cli/serve": {
"version": "2.0.1",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.2.tgz",
"integrity": "sha512-S9h3GmOmzUseyeFW3tYNnWS7gNUuwxZ3mmMq0JyW78Vx1SGKPSkt5bT4pB0rUnVfHjP0EL9gW2bOzmtiTfQt0A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=14.15.0"
},
@ -10170,16 +10171,17 @@
}
},
"node_modules/webpack-cli": {
"version": "5.0.1",
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.2.tgz",
"integrity": "sha512-4y3W5Dawri5+8dXm3+diW6Mn1Ya+Dei6eEVAdIduAmYNLzv1koKVAqsfgrrc9P2mhrYHQphx5htnGkcNwtubyQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@discoveryjs/json-ext": "^0.5.0",
"@webpack-cli/configtest": "^2.0.1",
"@webpack-cli/info": "^2.0.1",
"@webpack-cli/serve": "^2.0.1",
"@webpack-cli/serve": "^2.0.2",
"colorette": "^2.0.14",
"commander": "^9.4.1",
"commander": "^10.0.1",
"cross-spawn": "^7.0.3",
"envinfo": "^7.7.3",
"fastest-levenshtein": "^1.0.12",
@ -10213,6 +10215,15 @@
}
}
},
"node_modules/webpack-cli/node_modules/commander": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
"integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
"dev": true,
"engines": {
"node": ">=14"
}
},
"node_modules/webpack-dev-middleware": {
"version": "5.3.3",
"dev": true,
@ -12902,9 +12913,9 @@
}
},
"@dannadori/voice-changer-client-js": {
"version": "1.0.112",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.112.tgz",
"integrity": "sha512-ydEur3juxY2dNJe7xsqhref61J2JrB/l0oZVV4VLyh4Gu3OR/uhoBAWBtG5qNO0MVIBznbH/xyZ6jHA4JuwaAg==",
"version": "1.0.113",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.113.tgz",
"integrity": "sha512-UGm1KrgEiPlh/7x+/1I9SRAjUbbVA9XgXDayNQyWRVtFLmcfzpkGwJjIcoTH0t8TLzw17D1HWYtGWLES7+tc+w==",
"requires": {
"@types/readable-stream": "^2.3.15",
"amazon-chime-sdk-js": "^3.13.0",
@ -13360,9 +13371,9 @@
"dev": true
},
"@types/react": {
"version": "18.0.37",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.37.tgz",
"integrity": "sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw==",
"version": "18.0.38",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.38.tgz",
"integrity": "sha512-ExsidLLSzYj4cvaQjGnQCk4HFfVT9+EZ9XZsQ8Hsrcn8QNgXtpZ3m9vSIC2MWtx7jHictK6wYhQgGh6ic58oOw==",
"dev": true,
"requires": {
"@types/prop-types": "*",
@ -13594,7 +13605,9 @@
"requires": {}
},
"@webpack-cli/serve": {
"version": "2.0.1",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.2.tgz",
"integrity": "sha512-S9h3GmOmzUseyeFW3tYNnWS7gNUuwxZ3mmMq0JyW78Vx1SGKPSkt5bT4pB0rUnVfHjP0EL9gW2bOzmtiTfQt0A==",
"dev": true,
"requires": {}
},
@ -17482,15 +17495,17 @@
}
},
"webpack-cli": {
"version": "5.0.1",
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.2.tgz",
"integrity": "sha512-4y3W5Dawri5+8dXm3+diW6Mn1Ya+Dei6eEVAdIduAmYNLzv1koKVAqsfgrrc9P2mhrYHQphx5htnGkcNwtubyQ==",
"dev": true,
"requires": {
"@discoveryjs/json-ext": "^0.5.0",
"@webpack-cli/configtest": "^2.0.1",
"@webpack-cli/info": "^2.0.1",
"@webpack-cli/serve": "^2.0.1",
"@webpack-cli/serve": "^2.0.2",
"colorette": "^2.0.14",
"commander": "^9.4.1",
"commander": "^10.0.1",
"cross-spawn": "^7.0.3",
"envinfo": "^7.7.3",
"fastest-levenshtein": "^1.0.12",
@ -17498,6 +17513,14 @@
"interpret": "^3.1.1",
"rechoir": "^0.8.0",
"webpack-merge": "^5.7.3"
},
"dependencies": {
"commander": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
"integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
"dev": true
}
}
},
"webpack-dev-middleware": {

View File

@ -24,7 +24,7 @@
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.4",
"@types/node": "^18.15.13",
"@types/react": "^18.0.37",
"@types/react": "^18.0.38",
"@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
@ -47,11 +47,11 @@
"tsconfig-paths": "^4.2.0",
"typescript": "^5.0.4",
"webpack": "^5.80.0",
"webpack-cli": "^5.0.1",
"webpack-cli": "^5.0.2",
"webpack-dev-server": "^4.13.3"
},
"dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.112",
"@dannadori/voice-changer-client-js": "^1.0.113",
"@fortawesome/fontawesome-svg-core": "^6.4.0",
"@fortawesome/free-brands-svg-icons": "^6.4.0",
"@fortawesome/free-regular-svg-icons": "^6.4.0",

View File

@ -51,7 +51,7 @@
"defaultEnablePyTorch": true,
"showOnnxExportButton": true,
"showDescription": true
"showDefaultTune": true
}
},
{
@ -109,9 +109,7 @@
},
{
"name": "tune",
"options": {
"showSetDefault": true
}
"options": {}
},
{
"name": "indexRatio",

View File

@ -11,9 +11,8 @@ export const ModelSwitchRow = (_props: ModelSwitchRowProps) => {
const modelSwitchRow = useMemo(() => {
const onSwitchModelClicked = (index: number) => {
const fileUploadSetting = appState.serverSetting.fileUploadSettings[index]
appState.serverSetting.updateServerSettings({ ...appState.serverSetting.serverSetting, modelSlotIndex: index, tran: fileUploadSetting.defaultTune })
appState.serverSetting.updateServerSettings({ ...appState.serverSetting.serverSetting, modelSlotIndex: index })
}
let filename = ""

View File

@ -0,0 +1,38 @@
import React, { useMemo } from "react"
import { useAppState } from "../../../001_provider/001_AppStateProvider"
import { useGuiState } from "../001_GuiStateProvider"
export const DefaultTuneRow = () => {
const appState = useAppState()
const guiState = useGuiState()
const defaultTuneRow = useMemo(() => {
const slot = guiState.modelSlotNum
const fileUploadSetting = appState.serverSetting.fileUploadSettings[slot]
const onDefaultTuneChanged = (val: number) => {
appState.serverSetting.setFileUploadSetting(slot, {
...appState.serverSetting.fileUploadSettings[slot],
defaultTune: val
})
}
return (
<div className="body-row split-3-2-1-4 left-padding-1 guided">
<div className="body-item-title left-padding-2 ">Default Tune</div>
<div>
<input type="range" className="body-item-input-slider" min="-50" max="50" step="1" value={fileUploadSetting?.defaultTune || 0} onChange={(e) => {
onDefaultTuneChanged(Number(e.target.value))
}}></input>
<span className="body-item-input-slider-val">{fileUploadSetting?.defaultTune || 0}</span>
</div>
<div>
</div>
<div className="body-button-container">
</div>
</div>
)
}, [appState.serverSetting.fileUploadSettings, guiState.modelSlotNum])
return defaultTuneRow
}

View File

@ -10,7 +10,7 @@ import { IndexSelectRow } from "./301-7_IndexSelectRow"
import { HalfPrecisionRow } from "./301-8_HalfPrescisionRow"
import { ModelUploadButtonRow } from "./301-9_ModelUploadButtonRow"
import { ModelSlotRow } from "./301-a_ModelSlotRow"
import { DescriptionRow } from "./301-b_DescriptionRow"
import { DefaultTuneRow } from "./301-c_DefaultTuneRow"
export type ModelUploaderRowProps = {
showModelSlot: boolean
@ -24,6 +24,7 @@ export type ModelUploaderRowProps = {
showIndex: boolean
showHalfPrecision: boolean
showDescription: boolean
showDefaultTune: boolean
defaultEnablePyTorch: boolean
@ -61,7 +62,7 @@ export const ModelUploaderRow = (props: ModelUploaderRowProps) => {
{props.showFeature ? <FeatureSelectRow /> : <></>}
{props.showIndex ? <IndexSelectRow /> : <></>}
{props.showHalfPrecision ? <HalfPrecisionRow /> : <></>}
{props.showDescription ? <DescriptionRow /> : <></>}
{props.showDefaultTune ? <DefaultTuneRow /> : <></>}
<ModelUploadButtonRow />
</>

View File

@ -21,7 +21,7 @@ export const F0FactorRow = (_props: F0FactorRowProps) => {
<div className="body-row split-3-2-1-4 left-padding-1 guided">
<div className="body-item-title left-padding-1">F0 Factor</div>
<div className="body-input-container">
<input type="range" className="body-item-input-slider" min="0.1" max="5.0" step="0.1" value={appState.serverSetting.serverSetting.f0Factor || 0} onChange={(e) => {
<input type="range" className="body-item-input-slider" min="0.1" max="5.0" step="0.01" value={appState.serverSetting.serverSetting.f0Factor || 0} onChange={(e) => {
appState.serverSetting.updateServerSettings({ ...appState.serverSetting.serverSetting, f0Factor: Number(e.target.value) })
}}></input>
<span className="body-item-input-slider-val">{appState.serverSetting.serverSetting.f0Factor?.toFixed(1) || 0}</span>

View File

@ -4,13 +4,11 @@ import { useGuiState } from "../001_GuiStateProvider"
export type TuneRowProps = {
showPredictF0: boolean
showSetDefault: boolean
}
export const TuneRow = (props: TuneRowProps) => {
const appState = useAppState()
const guiState = useGuiState()
const tuneRow = useMemo(() => {
const slot = guiState.modelSlotNum
const predictF0 = props.showPredictF0 ?
<>
<input type="checkbox" checked={appState.serverSetting.serverSetting.predictF0 == 1} onChange={(e) => {
@ -19,13 +17,6 @@ export const TuneRow = (props: TuneRowProps) => {
</> :
<></>
const showSetDefault = props.showSetDefault ?
<>
<div className="body-button" onClick={() => {
appState.serverSetting.updateDefaultTune(slot, appState.serverSetting.serverSetting.tran)
}}>set model default</div>
</> :
<></>
return (
<div className="body-row split-3-2-1-4 left-padding-1 guided">
@ -40,7 +31,6 @@ export const TuneRow = (props: TuneRowProps) => {
{predictF0}
</div>
<div className="body-button-container">
{showSetDefault}
</div>
</div>
)

View File

@ -1,12 +1,12 @@
{
"name": "@dannadori/voice-changer-client-js",
"version": "1.0.112",
"version": "1.0.113",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@dannadori/voice-changer-client-js",
"version": "1.0.112",
"version": "1.0.113",
"license": "ISC",
"dependencies": {
"@types/readable-stream": "^2.3.15",
@ -20,7 +20,7 @@
"devDependencies": {
"@types/audioworklet": "^0.0.41",
"@types/node": "^18.15.13",
"@types/react": "18.0.37",
"@types/react": "18.0.38",
"@types/react-dom": "18.0.11",
"eslint": "^8.38.0",
"eslint-config-prettier": "^8.8.0",
@ -34,7 +34,7 @@
"ts-loader": "^9.4.2",
"typescript": "^5.0.4",
"webpack": "^5.80.0",
"webpack-cli": "^5.0.1",
"webpack-cli": "^5.0.2",
"webpack-dev-server": "^4.13.3"
}
},
@ -1852,9 +1852,9 @@
"dev": true
},
"node_modules/@types/react": {
"version": "18.0.37",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.37.tgz",
"integrity": "sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw==",
"version": "18.0.38",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.38.tgz",
"integrity": "sha512-ExsidLLSzYj4cvaQjGnQCk4HFfVT9+EZ9XZsQ8Hsrcn8QNgXtpZ3m9vSIC2MWtx7jHictK6wYhQgGh6ic58oOw==",
"dev": true,
"dependencies": {
"@types/prop-types": "*",
@ -2122,9 +2122,9 @@
}
},
"node_modules/@webpack-cli/serve": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz",
"integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.2.tgz",
"integrity": "sha512-S9h3GmOmzUseyeFW3tYNnWS7gNUuwxZ3mmMq0JyW78Vx1SGKPSkt5bT4pB0rUnVfHjP0EL9gW2bOzmtiTfQt0A==",
"dev": true,
"engines": {
"node": ">=14.15.0"
@ -7393,17 +7393,17 @@
}
},
"node_modules/webpack-cli": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz",
"integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==",
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.2.tgz",
"integrity": "sha512-4y3W5Dawri5+8dXm3+diW6Mn1Ya+Dei6eEVAdIduAmYNLzv1koKVAqsfgrrc9P2mhrYHQphx5htnGkcNwtubyQ==",
"dev": true,
"dependencies": {
"@discoveryjs/json-ext": "^0.5.0",
"@webpack-cli/configtest": "^2.0.1",
"@webpack-cli/info": "^2.0.1",
"@webpack-cli/serve": "^2.0.1",
"@webpack-cli/serve": "^2.0.2",
"colorette": "^2.0.14",
"commander": "^9.4.1",
"commander": "^10.0.1",
"cross-spawn": "^7.0.3",
"envinfo": "^7.7.3",
"fastest-levenshtein": "^1.0.12",
@ -7438,12 +7438,12 @@
}
},
"node_modules/webpack-cli/node_modules/commander": {
"version": "9.5.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
"integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
"integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
"dev": true,
"engines": {
"node": "^12.20.0 || >=14"
"node": ">=14"
}
},
"node_modules/webpack-dev-middleware": {
@ -9496,9 +9496,9 @@
"dev": true
},
"@types/react": {
"version": "18.0.37",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.37.tgz",
"integrity": "sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw==",
"version": "18.0.38",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.38.tgz",
"integrity": "sha512-ExsidLLSzYj4cvaQjGnQCk4HFfVT9+EZ9XZsQ8Hsrcn8QNgXtpZ3m9vSIC2MWtx7jHictK6wYhQgGh6ic58oOw==",
"dev": true,
"requires": {
"@types/prop-types": "*",
@ -9754,9 +9754,9 @@
"requires": {}
},
"@webpack-cli/serve": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz",
"integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.2.tgz",
"integrity": "sha512-S9h3GmOmzUseyeFW3tYNnWS7gNUuwxZ3mmMq0JyW78Vx1SGKPSkt5bT4pB0rUnVfHjP0EL9gW2bOzmtiTfQt0A==",
"dev": true,
"requires": {}
},
@ -13647,17 +13647,17 @@
}
},
"webpack-cli": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz",
"integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==",
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.2.tgz",
"integrity": "sha512-4y3W5Dawri5+8dXm3+diW6Mn1Ya+Dei6eEVAdIduAmYNLzv1koKVAqsfgrrc9P2mhrYHQphx5htnGkcNwtubyQ==",
"dev": true,
"requires": {
"@discoveryjs/json-ext": "^0.5.0",
"@webpack-cli/configtest": "^2.0.1",
"@webpack-cli/info": "^2.0.1",
"@webpack-cli/serve": "^2.0.1",
"@webpack-cli/serve": "^2.0.2",
"colorette": "^2.0.14",
"commander": "^9.4.1",
"commander": "^10.0.1",
"cross-spawn": "^7.0.3",
"envinfo": "^7.7.3",
"fastest-levenshtein": "^1.0.12",
@ -13668,9 +13668,9 @@
},
"dependencies": {
"commander": {
"version": "9.5.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
"integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
"integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
"dev": true
}
}

View File

@ -1,6 +1,6 @@
{
"name": "@dannadori/voice-changer-client-js",
"version": "1.0.112",
"version": "1.0.113",
"description": "",
"main": "dist/index.js",
"directories": {
@ -28,7 +28,7 @@
"devDependencies": {
"@types/audioworklet": "^0.0.41",
"@types/node": "^18.15.13",
"@types/react": "18.0.37",
"@types/react": "18.0.38",
"@types/react-dom": "18.0.11",
"eslint": "^8.38.0",
"eslint-config-prettier": "^8.8.0",
@ -42,7 +42,7 @@
"ts-loader": "^9.4.2",
"typescript": "^5.0.4",
"webpack": "^5.80.0",
"webpack-cli": "^5.0.1",
"webpack-cli": "^5.0.2",
"webpack-dev-server": "^4.13.3"
},
"dependencies": {

View File

@ -109,8 +109,7 @@ export class ServerConfigurator {
})
}
// !! 注意!! hubertTorchModelは固定値で上書きされるため、設定しても効果ない。
loadModel = async (slot: number, 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, params: string = "{}") => {
const url = this.serverUrl + "/load_model"
const info = new Promise<ServerInfo>(async (resolve) => {
const formData = new FormData();
@ -123,6 +122,7 @@ export class ServerConfigurator {
formData.append("featureFilename", featureFilename || "-");
formData.append("indexFilename", indexFilename || "-");
formData.append("isHalf", "" + isHalf);
formData.append("params", params);
const request = new Request(url, {
method: 'POST',

View File

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

View File

@ -22,6 +22,7 @@ export type FileUploadSetting = {
isHalf: boolean
uploaded: boolean
defaultTune: number
params: string
}
@ -36,7 +37,8 @@ const InitialFileUploadSetting: FileUploadSetting = {
isHalf: true,
uploaded: false,
defaultTune: 0
defaultTune: 0,
params: "{}"
}
export type UseServerSettingProps = {
@ -57,7 +59,7 @@ export type ServerSettingState = {
isUploading: boolean
getOnnx: () => Promise<OnnxExporterInfo>
updateDefaultTune: (slot: number, tune: number) => void
// updateDefaultTune: (slot: number, tune: number) => void
}
@ -264,6 +266,9 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
}
const configFileName = fileUploadSetting.configFile ? fileUploadSetting.configFile.filename || "-" : "-"
const params = JSON.stringify({
trans: fileUploadSetting.defaultTune
})
const loadPromise = props.voiceChangerClient.loadModel(
slot,
configFileName,
@ -272,7 +277,8 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
fileUploadSetting.clusterTorchModel?.filename || null,
fileUploadSetting.feature?.filename || null,
fileUploadSetting.index?.filename || null,
fileUploadSetting.isHalf
fileUploadSetting.isHalf,
params,
)
@ -292,11 +298,11 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
}, [fileUploadSettings, props.voiceChangerClient, props.clientType])
const updateDefaultTune = (slot: number, tune: number) => {
fileUploadSettings[slot].defaultTune = tune
storeToCache(slot, fileUploadSettings[slot])
setFileUploadSettings([...fileUploadSettings])
}
// const updateDefaultTune = (slot: number, tune: number) => {
// fileUploadSettings[slot].defaultTune = tune
// storeToCache(slot, fileUploadSettings[slot])
// setFileUploadSettings([...fileUploadSettings])
// }
const storeToCache = (slot: number, fileUploadSetting: FileUploadSetting) => {
try {
@ -315,7 +321,8 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
} : null,
isHalf: fileUploadSetting.isHalf, // キャッシュとしては不使用。guiで上書きされる。
uploaded: false, // キャッシュから読み込まれるときには、まだuploadされていないから。
defaultTune: fileUploadSetting.defaultTune
defaultTune: fileUploadSetting.defaultTune,
params: fileUploadSetting.params
}
setItem(`${INDEXEDDB_KEY_MODEL_DATA}_${slot}`, saveData)
} catch (e) {
@ -364,6 +371,6 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
uploadProgress,
isUploading,
getOnnx,
updateDefaultTune,
// updateDefaultTune,
}
}

View File

@ -61,6 +61,7 @@ class MMVC_Rest_Fileuploader:
featureFilename: str = Form(...),
indexFilename: str = Form(...),
isHalf: bool = Form(...),
params: str = Form(...),
):
props = {
@ -73,7 +74,8 @@ class MMVC_Rest_Fileuploader:
"clusterTorchModelFilename": clusterTorchModelFilename,
"featureFilename": featureFilename,
"indexFilename": indexFilename
}
},
"params": params
}
# Change Filepath
for key, val in props["files"].items():

View File

@ -1,5 +1,6 @@
import sys
import os
import json
import resampy
from voice_changer.RVC.ModelWrapper import ModelWrapper
from Exceptions import NoModeLoadedException
@ -40,6 +41,7 @@ class ModelSlot():
onnxModelFile: str = ""
featureFile: str = ""
indexFile: str = ""
defaultTrans: int = ""
@dataclass
@ -82,16 +84,13 @@ class RVC:
def __init__(self, params):
self.settings = RVCSettings()
self.inferenceing: bool = False
self.net_g = None
self.onnx_session = None
self.feature_file = None
self.index_file = None
# self.net_g1 = None
# self.onnx_session1 = None
# self.feature_file1 = None
# self.index_file1 = None
# self.net_g2 = None
# self.onnx_session2 = None
# self.feature_file2 = None
@ -108,12 +107,15 @@ class RVC:
def loadModel(self, props):
self.is_half = props["isHalf"]
self.tmp_slot = props["slot"]
params_str = props["params"]
params = json.loads(params_str)
self.settings.modelSlots[self.tmp_slot] = ModelSlot(
pyTorchModelFile=props["files"]["pyTorchModelFilename"],
onnxModelFile=props["files"]["onnxModelFilename"],
featureFile=props["files"]["featureFilename"],
indexFile=props["files"]["indexFilename"]
indexFile=props["files"]["indexFilename"],
defaultTrans=params["trans"]
)
print("[Voice Changer] RVC loading... slot:", self.tmp_slot)
@ -161,16 +163,18 @@ class RVC:
self.next_feature_file = self.settings.modelSlots[slot].featureFile
self.next_index_file = self.settings.modelSlots[slot].indexFile
self.next_trans = self.settings.modelSlots[slot].defaultTrans
return self.get_info()
def switchModel(self):
del self.net_g
del self.onnx_session
# del self.net_g
# del self.onnx_session
self.net_g = self.next_net_g
self.onnx_session = self.next_onnx_session
self.feature_file = self.next_feature_file
self.index_file = self.next_index_file
self.settings.tran = self.next_trans
self.next_net_g = None
self.next_onnx_session = None
@ -304,10 +308,9 @@ class RVC:
dev = torch.device("cuda", index=self.settings.gpu)
# print("device:", dev)
net_g = self.net_g.to(dev)
self.hubert_model = self.hubert_model.to(dev)
# self.net_g = self.net_g.to(dev)
self.net_g = self.net_g.to(dev)
audio = data[0]
convertSize = data[1]
@ -332,10 +335,10 @@ class RVC:
f0_file = None
if self.settings.silenceFront == 0:
audio_out = vc.pipeline(self.hubert_model, net_g, sid, audio, times, f0_up_key, f0_method,
audio_out = vc.pipeline(self.hubert_model, self.net_g, sid, audio, times, f0_up_key, f0_method,
file_index, file_big_npy, index_rate, if_f0, f0_file=f0_file, silence_front=0)
else:
audio_out = vc.pipeline(self.hubert_model, net_g, sid, audio, times, f0_up_key, f0_method,
audio_out = vc.pipeline(self.hubert_model, self.net_g, sid, audio, times, f0_up_key, f0_method,
file_index, file_big_npy, index_rate, if_f0, f0_file=f0_file, silence_front=self.settings.extraConvertSize / self.settings.modelSamplingRate)
result = audio_out * np.sqrt(vol)
@ -343,16 +346,31 @@ class RVC:
return result
def inference(self, data):
if self.currentSlot != self.slot:
self.currentSlot = self.slot
self.switchModel()
if self.inferenceing == True:
raise NoModeLoadedException("---------------------------------- tmp")
if self.settings.framework == "ONNX":
audio = self._onnx_inference(data)
else:
audio = self._pyTorch_inference(data)
self.inferenceing = True
return audio
try:
if self.currentSlot != self.slot:
import time
# time.sleep(1)
self.currentSlot = self.slot
# self.prepareModel(self.currentSlot)
self.switchModel()
# time.sleep(1)
if self.settings.framework == "ONNX":
audio = self._onnx_inference(data)
else:
audio = self._pyTorch_inference(data)
self.inferenceing = False
return audio
except Exception as e:
self.inferenceing = False
raise e
def __del__(self):
del self.net_g