WIP:improve model selector (RVC)

This commit is contained in:
wataru 2023-05-09 01:01:20 +09:00
parent 069ebc22da
commit 751234e65b
17 changed files with 244 additions and 191 deletions

View File

@ -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": [

File diff suppressed because one or more lines are too long

View File

@ -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": [

View File

@ -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} /> })

View File

@ -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. 下桁が実際の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
}

View File

@ -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. 下桁が実際の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
}

View File

@ -21,6 +21,9 @@ export const Filekinds = {
"soVitsSvc40v2Config": "soVitsSvc40v2Config",
"soVitsSvc40v2Model": "soVitsSvc40v2Model",
"soVitsSvc40v2Cluster": "soVitsSvc40v2Cluster",
"rvcModel": "rvcModel",
"rvcFeature": "rvcFeature",
"rvcIndex": "rvcIndex",
"ddspSvcModel": "ddspSvcModel",
"ddspSvcModelConfig": "ddspSvcModelConfig",

View File

@ -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
}

View File

@ -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
}

View File

@ -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)

View File

@ -163,8 +163,7 @@ export type VoiceChangerServerSetting = {
}
type ModelSlot = {
onnxModelFile: string,
pyTorchModelFile: string
modelFile: string
featureFile: string,
indexFile: string,

View File

@ -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,

View File

@ -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

View File

@ -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:

View File

@ -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

View File

@ -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

View File

@ -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,
)