WIP:improve model selector (RVC)
This commit is contained in:
parent
069ebc22da
commit
751234e65b
54
client/demo/dist/assets/gui_settings/RVC.json
vendored
54
client/demo/dist/assets/gui_settings/RVC.json
vendored
@ -40,26 +40,44 @@
|
||||
],
|
||||
"modelSetting": [
|
||||
{
|
||||
"name": "modelUploader",
|
||||
"name": "modelUploaderv2",
|
||||
"options": {}
|
||||
},
|
||||
{
|
||||
"name": "modelSlotRow2",
|
||||
"options": {}
|
||||
},
|
||||
{
|
||||
"name": "commonFileSelect",
|
||||
"options": {
|
||||
"showModelSlot": true,
|
||||
"showFrameworkSelector": false,
|
||||
"showConfig": false,
|
||||
"oneModelFileType": true,
|
||||
"showOnnx": false,
|
||||
"showPyTorch": false,
|
||||
"showCorrespondence": false,
|
||||
"showPyTorchCluster": false,
|
||||
|
||||
"showFeature": true,
|
||||
"showIndex": true,
|
||||
"showHalfPrecision": false,
|
||||
"showPyTorchEnableCheckBox": false,
|
||||
"defaultEnablePyTorch": true,
|
||||
"onlySelectedFramework": true,
|
||||
|
||||
"showDefaultTune": true
|
||||
"title": "Model(.onnx, .pt, pth)",
|
||||
"acceptExtentions": ["onnx", "pth", "pt"],
|
||||
"fileKind": "rvcModel"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "commonFileSelect",
|
||||
"options": {
|
||||
"title": "feature(.npy)",
|
||||
"acceptExtentions": ["npy"],
|
||||
"fileKind": "rvcFeature"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "commonFileSelect",
|
||||
"options": {
|
||||
"title": "index(.index)",
|
||||
"acceptExtentions": ["index"],
|
||||
"fileKind": "rvcIndex"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "defaultTuneRow2",
|
||||
"options": {}
|
||||
},
|
||||
{
|
||||
"name": "modelUploadButtonRow2",
|
||||
"options": {}
|
||||
}
|
||||
],
|
||||
"lab": [
|
||||
|
32
client/demo/dist/index.js
vendored
32
client/demo/dist/index.js
vendored
File diff suppressed because one or more lines are too long
@ -40,26 +40,44 @@
|
||||
],
|
||||
"modelSetting": [
|
||||
{
|
||||
"name": "modelUploader",
|
||||
"name": "modelUploaderv2",
|
||||
"options": {}
|
||||
},
|
||||
{
|
||||
"name": "modelSlotRow2",
|
||||
"options": {}
|
||||
},
|
||||
{
|
||||
"name": "commonFileSelect",
|
||||
"options": {
|
||||
"showModelSlot": true,
|
||||
"showFrameworkSelector": false,
|
||||
"showConfig": false,
|
||||
"oneModelFileType": true,
|
||||
"showOnnx": false,
|
||||
"showPyTorch": false,
|
||||
"showCorrespondence": false,
|
||||
"showPyTorchCluster": false,
|
||||
|
||||
"showFeature": true,
|
||||
"showIndex": true,
|
||||
"showHalfPrecision": false,
|
||||
"showPyTorchEnableCheckBox": false,
|
||||
"defaultEnablePyTorch": true,
|
||||
"onlySelectedFramework": true,
|
||||
|
||||
"showDefaultTune": true
|
||||
"title": "Model(.onnx, .pt, pth)",
|
||||
"acceptExtentions": ["onnx", "pth", "pt"],
|
||||
"fileKind": "rvcModel"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "commonFileSelect",
|
||||
"options": {
|
||||
"title": "feature(.npy)",
|
||||
"acceptExtentions": ["npy"],
|
||||
"fileKind": "rvcFeature"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "commonFileSelect",
|
||||
"options": {
|
||||
"title": "index(.index)",
|
||||
"acceptExtentions": ["index"],
|
||||
"fileKind": "rvcIndex"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "defaultTuneRow2",
|
||||
"options": {}
|
||||
},
|
||||
{
|
||||
"name": "modelUploadButtonRow2",
|
||||
"options": {}
|
||||
}
|
||||
],
|
||||
"lab": [
|
||||
|
@ -52,6 +52,8 @@ import { CommonFileSelectRow, CommonFileSelectRowProps } from "./components/301-
|
||||
import { ModelUploadButtonRow2, ModelUploadButtonRow2Props } from "./components/301-f_ModelUploadButtonRow"
|
||||
import { ModelUploaderRowv2, ModelUploaderRowv2Props } from "./components/301_ModelUploaderRowv2"
|
||||
import { CorrespondenceSelectRow2, CorrespondenceSelectRow2Props } from "./components/301-g_CorrespondenceSelectRow2"
|
||||
import { ModelSlotRow2, ModelSlotRow2Props } from "./components/301-h_ModelSlotRowv2"
|
||||
import { DefaultTuneRow2, DefaultTuneRow2Props } from "./components/301-i_DefaultTuneRowv2"
|
||||
|
||||
export const catalog: { [key: string]: (props: any) => JSX.Element } = {}
|
||||
|
||||
@ -89,6 +91,8 @@ const initialize = () => {
|
||||
addToCatalog("commonFileSelect", (props: CommonFileSelectRowProps) => { return <CommonFileSelectRow {...props} /> })
|
||||
addToCatalog("modelUploadButtonRow2", (props: ModelUploadButtonRow2Props) => { return <ModelUploadButtonRow2 {...props} /> })
|
||||
addToCatalog("correspondenceSelectRow2", (props: CorrespondenceSelectRow2Props) => { return <CorrespondenceSelectRow2 {...props} /> })
|
||||
addToCatalog("modelSlotRow2", (props: ModelSlotRow2Props) => { return <ModelSlotRow2 {...props} /> })
|
||||
addToCatalog("defaultTuneRow2", (props: DefaultTuneRow2Props) => { return <DefaultTuneRow2 {...props} /> })
|
||||
|
||||
|
||||
|
||||
|
@ -1,67 +0,0 @@
|
||||
import { Framework } from "@dannadori/voice-changer-client-js"
|
||||
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 slot = appState.serverSetting.serverSetting.modelSlotIndex
|
||||
|
||||
const onSwitchModelClicked = async (index: number, filename: string) => {
|
||||
const framework: Framework = filename.endsWith(".onnx") ? "ONNX" : "PyTorch"
|
||||
|
||||
// Quick hack for same slot is selected. 下3桁が実際のSlotID
|
||||
const dummyModelSlotIndex = (Math.floor(Date.now() / 1000)) * 1000 + index
|
||||
await appState.serverSetting.updateServerSettings({ ...appState.serverSetting.serverSetting, modelSlotIndex: dummyModelSlotIndex, framework: framework })
|
||||
setTimeout(() => { // quick hack
|
||||
appState.getInfo()
|
||||
}, 1000 * 2)
|
||||
}
|
||||
const modelOptions = appState.serverSetting.serverSetting.modelSlots.map((x, index) => {
|
||||
const className = index == slot ? "body-button-active left-margin-1" : "body-button left-margin-1"
|
||||
let filename = ""
|
||||
if (x.pyTorchModelFile && x.pyTorchModelFile.length > 0) {
|
||||
filename = x.pyTorchModelFile.replace(/^.*[\\\/]/, '')
|
||||
} else if (x.onnxModelFile && x.onnxModelFile.length > 0) {
|
||||
filename = x.onnxModelFile.replace(/^.*[\\\/]/, '')
|
||||
} else {
|
||||
return <div key={index} ></div>
|
||||
}
|
||||
const f0str = x.f0 == true ? "f0" : "nof0"
|
||||
const srstr = Math.floor(x.samplingRate / 1000) + "K"
|
||||
const embedstr = x.embChannels
|
||||
const typestr = x.modelType == 0 ? "org" : "webui"
|
||||
const metadata = x.deprecated ? "[deprecated version]" : `[${f0str},${srstr},${embedstr},${typestr}]`
|
||||
|
||||
|
||||
return (
|
||||
<div key={index} className={className} onClick={() => { onSwitchModelClicked(index, filename) }}>
|
||||
<div>
|
||||
{filename}
|
||||
</div>
|
||||
<div>{metadata}</div>
|
||||
</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
|
||||
}
|
||||
|
@ -13,18 +13,9 @@ export const ModelSwitchRow = (_props: ModelSwitchRowProps) => {
|
||||
const slot = appState.serverSetting.serverSetting.modelSlotIndex
|
||||
|
||||
const onSwitchModelClicked = async (slot: number) => {
|
||||
const modelSlot = appState.serverSetting.serverSetting.modelSlots[slot]
|
||||
let filename = ""
|
||||
if (modelSlot.pyTorchModelFile && modelSlot.pyTorchModelFile.length > 0) {
|
||||
filename = modelSlot.pyTorchModelFile.replace(/^.*[\\\/]/, '')
|
||||
} else {
|
||||
filename = modelSlot.onnxModelFile.replace(/^.*[\\\/]/, '')
|
||||
}
|
||||
const framework: Framework = filename.endsWith(".onnx") ? "ONNX" : "PyTorch"
|
||||
|
||||
// Quick hack for same slot is selected. 下3桁が実際のSlotID
|
||||
const dummyModelSlotIndex = (Math.floor(Date.now() / 1000)) * 1000 + slot
|
||||
await appState.serverSetting.updateServerSettings({ ...appState.serverSetting.serverSetting, modelSlotIndex: dummyModelSlotIndex, framework: framework })
|
||||
await appState.serverSetting.updateServerSettings({ ...appState.serverSetting.serverSetting, modelSlotIndex: dummyModelSlotIndex })
|
||||
setTimeout(() => { // quick hack
|
||||
appState.getInfo()
|
||||
}, 1000 * 2)
|
||||
@ -33,10 +24,8 @@ export const ModelSwitchRow = (_props: ModelSwitchRowProps) => {
|
||||
|
||||
const options = appState.serverSetting.serverSetting.modelSlots.map((x, index) => {
|
||||
let filename = ""
|
||||
if (x.pyTorchModelFile && x.pyTorchModelFile.length > 0) {
|
||||
filename = x.pyTorchModelFile.replace(/^.*[\\\/]/, '')
|
||||
} else if (x.onnxModelFile && x.onnxModelFile.length > 0) {
|
||||
filename = x.onnxModelFile.replace(/^.*[\\\/]/, '')
|
||||
if (x.modelFile && x.modelFile.length > 0) {
|
||||
filename = x.modelFile.replace(/^.*[\\\/]/, '')
|
||||
} else {
|
||||
return null
|
||||
}
|
||||
|
@ -21,6 +21,9 @@ export const Filekinds = {
|
||||
"soVitsSvc40v2Config": "soVitsSvc40v2Config",
|
||||
"soVitsSvc40v2Model": "soVitsSvc40v2Model",
|
||||
"soVitsSvc40v2Cluster": "soVitsSvc40v2Cluster",
|
||||
"rvcModel": "rvcModel",
|
||||
"rvcFeature": "rvcFeature",
|
||||
"rvcIndex": "rvcIndex",
|
||||
|
||||
"ddspSvcModel": "ddspSvcModel",
|
||||
"ddspSvcModelConfig": "ddspSvcModelConfig",
|
||||
|
@ -0,0 +1,29 @@
|
||||
import { MAX_MODEL_SLOT_NUM } from "@dannadori/voice-changer-client-js"
|
||||
import React, { useMemo } from "react"
|
||||
import { useGuiState } from "../001_GuiStateProvider"
|
||||
|
||||
export type ModelSlotRow2Props = {}
|
||||
export const ModelSlotRow2 = (_prop: ModelSlotRow2Props) => {
|
||||
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
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
import React, { useMemo } from "react"
|
||||
import { useAppState } from "../../../001_provider/001_AppStateProvider"
|
||||
import { useGuiState } from "../001_GuiStateProvider"
|
||||
|
||||
export type DefaultTuneRow2Props = {}
|
||||
export const DefaultTuneRow2 = (_props: DefaultTuneRow2Props) => {
|
||||
const appState = useAppState()
|
||||
const guiState = useGuiState()
|
||||
const defaultTuneRow = useMemo(() => {
|
||||
const slot = guiState.modelSlotNum
|
||||
const fileUploadSetting = appState.serverSetting.fileUploadSettings[slot]
|
||||
if (!fileUploadSetting) {
|
||||
return <></>
|
||||
}
|
||||
const currentValue = fileUploadSetting.defaultTune
|
||||
|
||||
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={currentValue} onChange={(e) => {
|
||||
onDefaultTuneChanged(Number(e.target.value))
|
||||
}}></input>
|
||||
<span className="body-item-input-slider-val">{currentValue}</span>
|
||||
</div>
|
||||
<div>
|
||||
</div>
|
||||
<div className="body-button-container">
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
|
||||
}, [appState.serverSetting.fileUploadSettings, guiState.modelSlotNum])
|
||||
|
||||
return defaultTuneRow
|
||||
}
|
@ -16,13 +16,13 @@ export const MergeLabRow = (_props: MergeLabRowProps) => {
|
||||
const newSlotChangeKey = useMemo(() => {
|
||||
console.log("appState.serverSetting.serverSetting.modelSlots", appState.serverSetting.serverSetting.modelSlots)
|
||||
return appState.serverSetting.serverSetting.modelSlots.reduce((prev, cur) => {
|
||||
return prev + "_" + cur.pyTorchModelFile
|
||||
return prev + "_" + cur.modelFile
|
||||
}, "")
|
||||
}, [appState.serverSetting.serverSetting.modelSlots])
|
||||
|
||||
useEffect(() => {
|
||||
// PyTorchモデルだけフィルタリング
|
||||
const models = appState.serverSetting.serverSetting.modelSlots.filter(x => { return x.pyTorchModelFile && x.pyTorchModelFile.length > 0 })
|
||||
const models = appState.serverSetting.serverSetting.modelSlots.filter(x => { return x.modelFile && x.modelFile.endsWith("onnx") == false })
|
||||
if (models.length == 0) {
|
||||
setMergeElements([])
|
||||
return
|
||||
@ -37,7 +37,7 @@ export const MergeLabRow = (_props: MergeLabRowProps) => {
|
||||
) {
|
||||
|
||||
const newMergeElements = models.map((x) => {
|
||||
const elem: MergeElement = { filename: x.pyTorchModelFile, strength: 100 }
|
||||
const elem: MergeElement = { filename: x.modelFile, strength: 100 }
|
||||
return elem
|
||||
})
|
||||
setMergeElements(newMergeElements)
|
||||
|
@ -163,8 +163,7 @@ export type VoiceChangerServerSetting = {
|
||||
}
|
||||
|
||||
type ModelSlot = {
|
||||
onnxModelFile: string,
|
||||
pyTorchModelFile: string
|
||||
modelFile: string
|
||||
featureFile: string,
|
||||
indexFile: string,
|
||||
|
||||
|
@ -35,7 +35,9 @@ export type FileUploadSetting = {
|
||||
soVitsSvc40v2Config: ModelData | null
|
||||
soVitsSvc40v2Model: ModelData | null
|
||||
soVitsSvc40v2Cluster: ModelData | null
|
||||
|
||||
rvcModel: ModelData | null
|
||||
rvcFeature: ModelData | null
|
||||
rvcIndex: ModelData | null
|
||||
|
||||
ddspSvcModel: ModelData | null
|
||||
ddspSvcModelConfig: ModelData | null
|
||||
@ -69,6 +71,9 @@ const InitialFileUploadSetting: FileUploadSetting = {
|
||||
soVitsSvc40v2Config: null,
|
||||
soVitsSvc40v2Model: null,
|
||||
soVitsSvc40v2Cluster: null,
|
||||
rvcModel: null,
|
||||
rvcFeature: null,
|
||||
rvcIndex: null,
|
||||
|
||||
ddspSvcModel: null,
|
||||
ddspSvcModelConfig: null,
|
||||
@ -273,6 +278,11 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
|
||||
alert("モデルファイルを指定する必要があります。")
|
||||
return
|
||||
}
|
||||
} else if (props.clientType == "RVC") {
|
||||
if (!fileUploadSettings[slot].rvcModel) {
|
||||
alert("モデルファイルを指定する必要があります。")
|
||||
return
|
||||
}
|
||||
} else if (props.clientType == "DDSP-SVC") {
|
||||
if (!fileUploadSettings[slot].ddspSvcModel) {
|
||||
alert("DDSPモデルを指定する必要があります。")
|
||||
@ -291,14 +301,6 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
|
||||
return
|
||||
}
|
||||
} else {
|
||||
if (!fileUploadSettings[slot].pyTorchModel && !fileUploadSettings[slot].onnxModel) {
|
||||
alert("PyTorchモデルとONNXモデルのどちらか一つ以上指定する必要があります。")
|
||||
return
|
||||
}
|
||||
if (!fileUploadSettings[slot].configFile && props.clientType != "RVC") {
|
||||
alert("Configファイルを指定する必要があります。")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if (!props.voiceChangerClient) return
|
||||
@ -375,7 +377,11 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
|
||||
fileUploadSetting.soVitsSvc40Cluster,
|
||||
fileUploadSetting.soVitsSvc40v2Config,
|
||||
fileUploadSetting.soVitsSvc40v2Model,
|
||||
fileUploadSetting.soVitsSvc40v2Cluster
|
||||
fileUploadSetting.soVitsSvc40v2Cluster,
|
||||
fileUploadSetting.rvcModel,
|
||||
fileUploadSetting.rvcIndex,
|
||||
fileUploadSetting.rvcFeature,
|
||||
|
||||
].filter(x => { return x != null }) as ModelData[]
|
||||
for (let i = 0; i < normalModels.length; i++) {
|
||||
if (!normalModels[i].data) {
|
||||
@ -422,6 +428,10 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
|
||||
soVitsSvc40v2Config: fileUploadSetting.soVitsSvc40v2Config?.filename || "",
|
||||
soVitsSvc40v2Model: fileUploadSetting.soVitsSvc40v2Model?.filename || "",
|
||||
soVitsSvc40v2Cluster: fileUploadSetting.soVitsSvc40v2Cluster?.filename || "",
|
||||
rvcModel: fileUploadSetting.rvcModel?.filename || "",
|
||||
rvcIndex: fileUploadSetting.rvcIndex?.filename || "",
|
||||
rvcFeature: fileUploadSetting.rvcFeature?.filename || "",
|
||||
|
||||
|
||||
ddspSvcModel: fileUploadSetting.ddspSvcModel?.filename ? "ddsp_mod/" + fileUploadSetting.ddspSvcModel?.filename : "",
|
||||
ddspSvcModelConfig: fileUploadSetting.ddspSvcModelConfig?.filename ? "ddsp_mod/" + fileUploadSetting.ddspSvcModelConfig?.filename : "",
|
||||
@ -505,6 +515,9 @@ export const useServerSetting = (props: UseServerSettingProps): ServerSettingSta
|
||||
soVitsSvc40v2Config: fileUploadSetting.soVitsSvc40v2Config ? { data: fileUploadSetting.soVitsSvc40v2Config.data, filename: fileUploadSetting.soVitsSvc40v2Config.filename } : null,
|
||||
soVitsSvc40v2Model: fileUploadSetting.soVitsSvc40v2Model ? { data: fileUploadSetting.soVitsSvc40v2Model.data, filename: fileUploadSetting.soVitsSvc40v2Model.filename } : null,
|
||||
soVitsSvc40v2Cluster: fileUploadSetting.soVitsSvc40v2Cluster ? { data: fileUploadSetting.soVitsSvc40v2Cluster.data, filename: fileUploadSetting.soVitsSvc40v2Cluster.filename } : null,
|
||||
rvcModel: fileUploadSetting.rvcModel ? { data: fileUploadSetting.rvcModel.data, filename: fileUploadSetting.rvcModel.filename } : null,
|
||||
rvcIndex: fileUploadSetting.rvcIndex ? { data: fileUploadSetting.rvcIndex.data, filename: fileUploadSetting.rvcIndex.filename } : null,
|
||||
rvcFeature: fileUploadSetting.rvcFeature ? { data: fileUploadSetting.rvcFeature.data, filename: fileUploadSetting.rvcFeature.filename } : null,
|
||||
|
||||
ddspSvcModel: fileUploadSetting.ddspSvcModel ? { data: fileUploadSetting.ddspSvcModel.data, filename: fileUploadSetting.ddspSvcModel.filename } : null,
|
||||
ddspSvcModelConfig: fileUploadSetting.ddspSvcModelConfig ? { data: fileUploadSetting.ddspSvcModelConfig.data, filename: fileUploadSetting.ddspSvcModelConfig.filename } : null,
|
||||
|
@ -5,8 +5,9 @@ from dataclasses import dataclass
|
||||
|
||||
@dataclass
|
||||
class ModelSlot:
|
||||
pyTorchModelFile: str = ""
|
||||
onnxModelFile: str = ""
|
||||
# pyTorchModelFile: str = ""
|
||||
# onnxModelFile: str = ""
|
||||
modelFile: str = ""
|
||||
featureFile: str = ""
|
||||
indexFile: str = ""
|
||||
defaultTrans: int = 0
|
||||
|
@ -1,31 +1,35 @@
|
||||
from const import EnumEmbedderTypes, EnumInferenceTypes
|
||||
from voice_changer.RVC.ModelSlot import ModelSlot
|
||||
|
||||
from voice_changer.utils.LoadModelParams import FilePaths
|
||||
import torch
|
||||
import onnxruntime
|
||||
import json
|
||||
|
||||
|
||||
def generateModelSlot(files: FilePaths, params):
|
||||
def generateModelSlot(params):
|
||||
modelSlot = ModelSlot()
|
||||
modelSlot.pyTorchModelFile = files.pyTorchModelFilename
|
||||
modelSlot.onnxModelFile = files.onnxModelFilename
|
||||
modelSlot.featureFile = files.featureFilename
|
||||
modelSlot.indexFile = files.indexFilename
|
||||
|
||||
modelSlot.modelFile = params["files"]["rvcModel"]
|
||||
modelSlot.featureFile = (
|
||||
params["files"]["rvcFeature"] if "rvcFeature" in params["files"] else None
|
||||
)
|
||||
modelSlot.indexFile = (
|
||||
params["files"]["rvcIndex"] if "rvcIndex" in params["files"] else None
|
||||
)
|
||||
|
||||
modelSlot.defaultTrans = params["trans"] if "trans" in params else 0
|
||||
|
||||
modelSlot.isONNX = True if modelSlot.onnxModelFile is not None else False
|
||||
modelSlot.isONNX = modelSlot.modelFile.endswith(".onnx")
|
||||
|
||||
if modelSlot.isONNX:
|
||||
_setInfoByONNX(modelSlot, modelSlot.onnxModelFile)
|
||||
_setInfoByONNX(modelSlot)
|
||||
else:
|
||||
_setInfoByPytorch(modelSlot, modelSlot.pyTorchModelFile)
|
||||
_setInfoByPytorch(modelSlot)
|
||||
return modelSlot
|
||||
|
||||
|
||||
def _setInfoByPytorch(slot: ModelSlot, file: str):
|
||||
cpt = torch.load(file, map_location="cpu")
|
||||
def _setInfoByPytorch(slot: ModelSlot):
|
||||
cpt = torch.load(slot.modelFile, map_location="cpu")
|
||||
config_len = len(cpt["config"])
|
||||
if config_len == 18:
|
||||
slot.f0 = True if cpt["f0"] == 1 else False
|
||||
@ -62,9 +66,9 @@ def _setInfoByPytorch(slot: ModelSlot, file: str):
|
||||
del cpt
|
||||
|
||||
|
||||
def _setInfoByONNX(slot: ModelSlot, file: str):
|
||||
def _setInfoByONNX(slot: ModelSlot):
|
||||
tmp_onnx_session = onnxruntime.InferenceSession(
|
||||
file, providers=["CPUExecutionProvider"]
|
||||
slot.modelFile, providers=["CPUExecutionProvider"]
|
||||
)
|
||||
modelmeta = tmp_onnx_session.get_modelmeta()
|
||||
try:
|
||||
|
@ -1,6 +1,5 @@
|
||||
import sys
|
||||
import os
|
||||
import json
|
||||
import resampy
|
||||
from dataclasses import asdict
|
||||
from typing import cast
|
||||
@ -72,8 +71,8 @@ class RVC:
|
||||
def loadModel(self, props: LoadModelParams):
|
||||
target_slot_idx = props.slot
|
||||
params = props.params
|
||||
|
||||
modelSlot = generateModelSlot(props.files, params)
|
||||
|
||||
modelSlot = generateModelSlot(params)
|
||||
self.settings.modelSlots[target_slot_idx] = modelSlot
|
||||
print(
|
||||
f"[Voice Changer] RVC new model is uploaded,{target_slot_idx}",
|
||||
@ -141,11 +140,6 @@ class RVC:
|
||||
if slot < 0:
|
||||
return self.get_info()
|
||||
modelSlot = self.settings.modelSlots[slot]
|
||||
inferencerFilename = (
|
||||
modelSlot.onnxModelFile if modelSlot.isONNX else modelSlot.pyTorchModelFile
|
||||
)
|
||||
if inferencerFilename == "":
|
||||
return self.get_info()
|
||||
|
||||
print("[Voice Changer] Prepare Model of slot:", slot)
|
||||
|
||||
@ -287,10 +281,8 @@ class RVC:
|
||||
|
||||
def export2onnx(self):
|
||||
modelSlot = self.settings.modelSlots[self.settings.modelSlotIndex]
|
||||
pyTorchModelFile = modelSlot.pyTorchModelFile
|
||||
|
||||
# PyTorchのファイルが存在しない場合はエラーを返す
|
||||
if pyTorchModelFile is None or pyTorchModelFile == "":
|
||||
if modelSlot.isONNX:
|
||||
print("[Voice Changer] export2onnx, No pyTorch filepath.")
|
||||
return {"status": "ng", "path": ""}
|
||||
|
||||
@ -318,19 +310,18 @@ class RVC:
|
||||
torch.save(merged, storeFile)
|
||||
|
||||
filePaths: FilePaths = FilePaths(
|
||||
pyTorchModelFilename=storeFile,
|
||||
pyTorchModelFilename=None,
|
||||
configFilename=None,
|
||||
onnxModelFilename=None,
|
||||
featureFilename=None,
|
||||
indexFilename=None,
|
||||
clusterTorchModelFilename=None,
|
||||
)
|
||||
params = {"trans": req.defaultTrans}
|
||||
params = {"trans": req.defaultTrans, "files": {"rvcModel": storeFile}}
|
||||
props: LoadModelParams = LoadModelParams(
|
||||
slot=targetSlot, isHalf=True, files=filePaths, params=json.dumps(params)
|
||||
slot=targetSlot, isHalf=True, files=filePaths, params=params
|
||||
)
|
||||
self.loadModel(props)
|
||||
self.prepareModel(targetSlot)
|
||||
self.settings.modelSlotIndex = targetSlot
|
||||
self.currentSlot = self.settings.modelSlotIndex
|
||||
# self.settings.tran = req.defaultTrans
|
||||
|
@ -20,26 +20,12 @@ from voice_changer.RVC.onnxExporter.SynthesizerTrnMsNSFsid_webui_ONNX import (
|
||||
)
|
||||
|
||||
|
||||
# from voice_changer.RVC.onnx.SynthesizerTrnMs256NSFsid_ONNX import (
|
||||
# SynthesizerTrnMs256NSFsid_ONNX,
|
||||
# )
|
||||
# from voice_changer.RVC.onnx.SynthesizerTrnMs256NSFsid_nono_ONNX import (
|
||||
# SynthesizerTrnMs256NSFsid_nono_ONNX,
|
||||
# )
|
||||
# from voice_changer.RVC.onnx.SynthesizerTrnMsNSFsidNono_webui_ONNX import (
|
||||
# SynthesizerTrnMsNSFsidNono_webui_ONNX,
|
||||
# )
|
||||
# from voice_changer.RVC.onnx.SynthesizerTrnMsNSFsid_webui_ONNX import (
|
||||
# SynthesizerTrnMsNSFsid_webui_ONNX,
|
||||
# )
|
||||
|
||||
|
||||
def export2onnx(gpu: int, modelSlot: ModelSlot):
|
||||
pyTorchModelFile = modelSlot.pyTorchModelFile
|
||||
modelFile = modelSlot.modelFile
|
||||
|
||||
output_file = os.path.splitext(os.path.basename(pyTorchModelFile))[0] + ".onnx"
|
||||
output_file = os.path.splitext(os.path.basename(modelFile))[0] + ".onnx"
|
||||
output_file_simple = (
|
||||
os.path.splitext(os.path.basename(pyTorchModelFile))[0] + "_simple.onnx"
|
||||
os.path.splitext(os.path.basename(modelFile))[0] + "_simple.onnx"
|
||||
)
|
||||
output_path = os.path.join(TMP_DIR, output_file)
|
||||
output_path_simple = os.path.join(TMP_DIR, output_file_simple)
|
||||
@ -58,12 +44,12 @@ def export2onnx(gpu: int, modelSlot: ModelSlot):
|
||||
print(f"[Voice Changer] exporting onnx... gpu_id:{gpu} gpu_mem:{gpuMomory}")
|
||||
|
||||
if gpuMomory > 0:
|
||||
_export2onnx(pyTorchModelFile, output_path, output_path_simple, True, metadata)
|
||||
_export2onnx(modelFile, output_path, output_path_simple, True, metadata)
|
||||
else:
|
||||
print(
|
||||
"[Voice Changer] Warning!!! onnx export with float32. maybe size is doubled."
|
||||
)
|
||||
_export2onnx(pyTorchModelFile, output_path, output_path_simple, False, metadata)
|
||||
_export2onnx(modelFile, output_path, output_path_simple, False, metadata)
|
||||
return output_file_simple
|
||||
|
||||
|
||||
|
@ -14,16 +14,16 @@ from voice_changer.RVC.pitchExtractor.PitchExtractorManager import PitchExtracto
|
||||
def createPipeline(modelSlot: ModelSlot, gpu: int, f0Detector: str):
|
||||
dev = DeviceManager.get_instance().getDevice(gpu)
|
||||
half = DeviceManager.get_instance().halfPrecisionAvailable(gpu)
|
||||
# ファイル名特定(Inferencer)
|
||||
inferencerFilename = (
|
||||
modelSlot.onnxModelFile if modelSlot.isONNX else modelSlot.pyTorchModelFile
|
||||
)
|
||||
# # ファイル名特定(Inferencer)
|
||||
# inferencerFilename = (
|
||||
# modelSlot.onnxModelFile if modelSlot.isONNX else modelSlot.pyTorchModelFile
|
||||
# )
|
||||
|
||||
# Inferencer 生成
|
||||
try:
|
||||
inferencer = InferencerManager.getInferencer(
|
||||
modelSlot.modelType,
|
||||
inferencerFilename,
|
||||
modelSlot.modelFile,
|
||||
half,
|
||||
dev,
|
||||
)
|
||||
|
Loading…
x
Reference in New Issue
Block a user