get pipeline info
This commit is contained in:
parent
c2efe5cba1
commit
9818f6ec42
1
client/demo/dist/assets/gui_settings/edition.txt
vendored
Normal file
1
client/demo/dist/assets/gui_settings/edition.txt
vendored
Normal file
@ -0,0 +1 @@
|
||||
+
|
11
client/demo/dist/index.html
vendored
11
client/demo/dist/index.html
vendored
@ -1 +1,10 @@
|
||||
<!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>
|
||||
<!DOCTYPE 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>
|
||||
|
1706
client/demo/dist/index.js
vendored
1706
client/demo/dist/index.js
vendored
File diff suppressed because one or more lines are too long
31
client/demo/dist/index.js.LICENSE.txt
vendored
31
client/demo/dist/index.js.LICENSE.txt
vendored
@ -1,31 +0,0 @@
|
||||
/*! 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.
|
||||
*/
|
1
client/demo/public/assets/gui_settings/edition.txt
Normal file
1
client/demo/public/assets/gui_settings/edition.txt
Normal file
@ -0,0 +1 @@
|
||||
+
|
@ -10,8 +10,8 @@ import { far } from "@fortawesome/free-regular-svg-icons";
|
||||
import { fab } from "@fortawesome/free-brands-svg-icons";
|
||||
import { AppRootProvider, useAppRoot } from "./001_provider/001_AppRootProvider";
|
||||
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, MAX_MODEL_SLOT_NUM, useIndexedDB } from "@dannadori/voice-changer-client-js";
|
||||
import { INDEXEDDB_KEY_AUDIO_OUTPUT, INDEXEDDB_KEY_DEFAULT_MODEL_TYPE } from "./const";
|
||||
import { ClientType, useIndexedDB } from "@dannadori/voice-changer-client-js";
|
||||
import { INDEXEDDB_KEY_DEFAULT_MODEL_TYPE } from "./const";
|
||||
import { Demo } from "./components/demo/010_Demo";
|
||||
import { ClientSelector } from "./001_ClientSelector";
|
||||
|
||||
@ -42,7 +42,6 @@ const AppStateWrapper = () => {
|
||||
const { appGuiSettingState, clientType, setClientType } = useAppRoot()
|
||||
// エラーバウンダリー設定
|
||||
const [error, setError] = useState<{ error: Error, errorInfo: ErrorInfo }>()
|
||||
const { removeItem } = useIndexedDB({ clientType: clientType })
|
||||
const { getItem, removeDB } = useIndexedDB({ clientType: null })
|
||||
const errorComponent = useMemo(() => {
|
||||
const errorName = error?.error.name || "no error name"
|
||||
@ -52,22 +51,6 @@ const AppStateWrapper = () => {
|
||||
const onClearCacheClicked = async () => {
|
||||
await removeDB()
|
||||
location.reload();
|
||||
|
||||
// const indexedDBKeys = [
|
||||
// INDEXEDDB_KEY_CLIENT,
|
||||
// INDEXEDDB_KEY_SERVER,
|
||||
// INDEXEDDB_KEY_WORKLETNODE,
|
||||
// INDEXEDDB_KEY_WORKLET,
|
||||
// INDEXEDDB_KEY_AUDIO_OUTPUT
|
||||
// ]
|
||||
// for (const k of indexedDBKeys) {
|
||||
// await removeItem(k)
|
||||
// }
|
||||
|
||||
// for (let i = 0; i < MAX_MODEL_SLOT_NUM; i++) {
|
||||
// const modleKey = `${INDEXEDDB_KEY_MODEL_DATA}_${i}`
|
||||
// await removeItem(modleKey)
|
||||
// }
|
||||
}
|
||||
const onReloadClicked = () => {
|
||||
location.reload();
|
||||
|
@ -19,7 +19,7 @@ export const ClientSelector = () => {
|
||||
if (ua.indexOf("mac os x") !== -1) {
|
||||
return ["MMVCv13", "MMVCv15", "so-vits-svc-40", "RVC"] as ClientType[]
|
||||
} else {
|
||||
return ["MMVCv13", "MMVCv15", "so-vits-svc-40", "so-vits-svc-40v2", "RVC", "DDSP-SVC"] as ClientType[]
|
||||
return ["MMVCv13", "MMVCv15", "so-vits-svc-40", "DDSP-SVC", "RVC"] as ClientType[]
|
||||
}
|
||||
}, [])
|
||||
|
||||
|
@ -66,6 +66,7 @@ export type AppGuiSettingState = {
|
||||
appGuiSetting: AppGuiSetting
|
||||
guiSettingLoaded: boolean
|
||||
version: string
|
||||
edition: string
|
||||
}
|
||||
|
||||
export type AppGuiSettingStateAndMethod = AppGuiSettingState & {
|
||||
@ -77,6 +78,7 @@ export const useAppGuiSetting = (): AppGuiSettingStateAndMethod => {
|
||||
const [guiSettingLoaded, setGuiSettingLoaded] = useState<boolean>(false)
|
||||
const [appGuiSetting, setAppGuiSetting] = useState<AppGuiSetting>(InitialAppGuiDemoSetting)
|
||||
const [version, setVersion] = useState<string>("")
|
||||
const [edition, setEdition] = useState<string>("")
|
||||
const getAppGuiSetting = async (url: string) => {
|
||||
const res = await fetch(`${url}`, {
|
||||
method: "GET",
|
||||
@ -101,10 +103,22 @@ export const useAppGuiSetting = (): AppGuiSettingStateAndMethod => {
|
||||
getVersionInfo()
|
||||
}, [])
|
||||
|
||||
useEffect(() => {
|
||||
const getVersionInfo = async () => {
|
||||
const res = await fetch(`/assets/gui_settings/edition.txt`, {
|
||||
method: "GET",
|
||||
})
|
||||
const edition = await res.text()
|
||||
setEdition(edition)
|
||||
}
|
||||
getVersionInfo()
|
||||
}, [])
|
||||
|
||||
return {
|
||||
appGuiSetting,
|
||||
guiSettingLoaded,
|
||||
version,
|
||||
edition,
|
||||
getAppGuiSetting,
|
||||
clearAppGuiSetting,
|
||||
}
|
||||
|
@ -140,6 +140,7 @@ export const Title = (props: TitleProps) => {
|
||||
<span className="title">{props.mainTitle}</span>
|
||||
<span className="top-title-version">{props.subTitle}</span>
|
||||
<span className="top-title-version-number">{appRootState.appGuiSettingState.version}</span>
|
||||
<span className="top-title-version-number">{appRootState.appGuiSettingState.edition}</span>
|
||||
<span className="belongings">
|
||||
{githubLink}
|
||||
{manualLink}
|
||||
@ -152,7 +153,7 @@ export const Title = (props: TitleProps) => {
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}, [props.subTitle, props.mainTitle, props.lineNum, appRootState.appGuiSettingState.version])
|
||||
}, [props.subTitle, props.mainTitle, props.lineNum, appRootState.appGuiSettingState.version, appRootState.appGuiSettingState.edition])
|
||||
|
||||
return titleRow
|
||||
};
|
||||
|
@ -328,23 +328,23 @@ export const DefaultServerSetting_MMVCv13: ServerInfo = {
|
||||
}
|
||||
|
||||
export const DefaultServerSetting_so_vits_svc_40: ServerInfo = {
|
||||
...DefaultServerSetting, tran: 10, noiseScale: 0.3, extraConvertSize: 1024 * 32, clusterInferRatio: 0.1,
|
||||
...DefaultServerSetting, tran: 10, noiseScale: 0.3, extraConvertSize: 1024 * 8, clusterInferRatio: 0.1,
|
||||
}
|
||||
|
||||
export const DefaultServerSetting_so_vits_svc_40_c: ServerInfo = {
|
||||
...DefaultServerSetting, tran: 10, noiseScale: 0.3, extraConvertSize: 1024 * 32, clusterInferRatio: 0.1,
|
||||
...DefaultServerSetting, tran: 10, noiseScale: 0.3, extraConvertSize: 1024 * 8, clusterInferRatio: 0.1,
|
||||
}
|
||||
export const DefaultServerSetting_so_vits_svc_40v2: ServerInfo = {
|
||||
...DefaultServerSetting, tran: 10, noiseScale: 0.3, extraConvertSize: 1024 * 32, clusterInferRatio: 0.1,
|
||||
...DefaultServerSetting, tran: 10, noiseScale: 0.3, extraConvertSize: 1024 * 8, clusterInferRatio: 0.1,
|
||||
}
|
||||
|
||||
export const DefaultServerSetting_DDSP_SVC: ServerInfo = {
|
||||
...DefaultServerSetting, dstId: 1, tran: 10, extraConvertSize: 1024 * 32
|
||||
...DefaultServerSetting, dstId: 1, tran: 10, extraConvertSize: 1024 * 8
|
||||
}
|
||||
|
||||
|
||||
export const DefaultServerSetting_RVC: ServerInfo = {
|
||||
...DefaultServerSetting, tran: 10, extraConvertSize: 1024 * 32, f0Detector: F0Detector.harvest
|
||||
...DefaultServerSetting, tran: 10, extraConvertSize: 1024 * 8, f0Detector: F0Detector.harvest
|
||||
}
|
||||
|
||||
///////////////////////
|
||||
|
@ -35,6 +35,12 @@ setup_loggers()
|
||||
|
||||
def setupArgParser():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument(
|
||||
"--logLevel",
|
||||
type=str,
|
||||
default="critical",
|
||||
help="Log level info|critical. (default: critical)",
|
||||
)
|
||||
parser.add_argument("-p", type=int, default=18888, help="port")
|
||||
parser.add_argument("--https", type=strtobool, default=False, help="use https")
|
||||
parser.add_argument(
|
||||
@ -178,13 +184,13 @@ printMessage(f"Booting PHASE :{__name__}", level=2)
|
||||
PORT = args.p
|
||||
|
||||
|
||||
def localServer():
|
||||
def localServer(logLevel: str = "critical"):
|
||||
uvicorn.run(
|
||||
f"{os.path.basename(__file__)[:-3]}:app_socketio",
|
||||
host="0.0.0.0",
|
||||
port=int(PORT),
|
||||
reload=False if hasattr(sys, "_MEIPASS") else True,
|
||||
log_level="warning",
|
||||
log_level=logLevel,
|
||||
)
|
||||
|
||||
|
||||
@ -318,10 +324,10 @@ if __name__ == "__main__":
|
||||
reload=False if hasattr(sys, "_MEIPASS") else True,
|
||||
ssl_keyfile=key_path,
|
||||
ssl_certfile=cert_path,
|
||||
# log_level="warning"
|
||||
log_level=args.logLevel,
|
||||
)
|
||||
else:
|
||||
p = mp.Process(name="p", target=localServer)
|
||||
p = mp.Process(name="p", target=localServer, args=(args.logLevel,))
|
||||
p.start()
|
||||
try:
|
||||
if sys.platform.startswith("win"):
|
||||
|
@ -104,9 +104,41 @@ SAMPLES_JSONS = [
|
||||
# "https://huggingface.co/wok000/vcclient_model/raw/main/samples_0001.json",
|
||||
# "https://huggingface.co/wok000/vcclient_model/raw/main/samples_0002.json",
|
||||
# "https://huggingface.co/wok000/vcclient_model/raw/main/samples_0003_t.json",
|
||||
# "https://huggingface.co/wok000/vcclient_model/raw/main/samples_0003_o.json",
|
||||
"https://huggingface.co/wok000/vcclient_model/raw/main/test/test_official_v1_v2.jsona",
|
||||
"https://huggingface.co/wok000/vcclient_model/raw/main/test/test_ddpn_v1_v2.jsona",
|
||||
"https://huggingface.co/wok000/vcclient_model/raw/main/samples_0003_o.json",
|
||||
# "https://huggingface.co/wok000/vcclient_model/raw/main/test/test_official_v1_v2.json",
|
||||
# "https://huggingface.co/wok000/vcclient_model/raw/main/test/test_ddpn_v1_v2.json",
|
||||
]
|
||||
|
||||
SAMPLE_MODEL_IDS = [
|
||||
("TokinaShigure_o", True),
|
||||
("KikotoMahiro_o", False),
|
||||
("Amitaro_o", False),
|
||||
("Tsukuyomi-chan_o", False),
|
||||
# オフィシャルモデルテスト
|
||||
# ("test-official-v1-f0-48k-l9-hubert_t", True),
|
||||
# ("test-official-v1-nof0-48k-l9-hubert_t", False),
|
||||
# ("test-official-v2-f0-40k-l12-hubert_t", False),
|
||||
# ("test-official-v2-nof0-40k-l12-hubert_t", False),
|
||||
# ("test-official-v1-f0-48k-l9-hubert_o", True),
|
||||
# ("test-official-v1-nof0-48k-l9-hubert_o", False),
|
||||
# ("test-official-v2-f0-40k-l12-hubert_o", False),
|
||||
# ("test-official-v2-nof0-40k-l12-hubert_o", False),
|
||||
# DDPNモデルテスト(torch)
|
||||
# ("test-ddpn-v1-f0-48k-l9-hubert_t", False),
|
||||
# ("test-ddpn-v1-nof0-48k-l9-hubert_t", False),
|
||||
# ("test-ddpn-v2-f0-40k-l12-hubert_t", False),
|
||||
# ("test-ddpn-v2-nof0-40k-l12-hubert_t", False),
|
||||
# ("test-ddpn-v2-f0-40k-l12-hubert_jp_t", False),
|
||||
# ("test-ddpn-v2-nof0-40k-l12-hubert_jp_t", False),
|
||||
# DDPNモデルテスト(onnx)
|
||||
# ("test-ddpn-v1-f0-48k-l9-hubert_o", False),
|
||||
# ("test-ddpn-v1-nof0-48k-l9-hubert_o", False),
|
||||
# ("test-ddpn-v2-f0-40k-l12-hubert_o", False),
|
||||
# ("test-ddpn-v2-nof0-40k-l12-hubert_o", False),
|
||||
# ("test-ddpn-v2-f0-40k-l12-hubert_jp_o", False),
|
||||
# ("test-ddpn-v2-nof0-40k-l12-hubert_jp_o", False),
|
||||
]
|
||||
|
||||
|
||||
RVC_MODEL_DIRNAME = "rvc"
|
||||
RVC_MAX_SLOT_NUM = 10
|
||||
|
@ -69,7 +69,7 @@ class MMVC_Rest_Fileuploader:
|
||||
def post_update_settings(
|
||||
self, key: str = Form(...), val: Union[int, str, float] = Form(...)
|
||||
):
|
||||
print("[Voice Changer] update configuration:", key, val)
|
||||
# print("[Voice Changer] update configuration:", key, val)
|
||||
info = self.voiceChangerManager.update_settings(key, val)
|
||||
json_compatible_item_data = jsonable_encoder(info)
|
||||
return JSONResponse(content=json_compatible_item_data)
|
||||
|
74
server/samples_0003_o.json
Normal file
74
server/samples_0003_o.json
Normal file
@ -0,0 +1,74 @@
|
||||
{
|
||||
"RVC": [
|
||||
{
|
||||
"id": "KikotoKurage_o",
|
||||
"lang": "ja-JP",
|
||||
"tag": ["v2", "onnx"],
|
||||
"name": "黄琴海月",
|
||||
"modelUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/kikoto_kurage/kikoto_kurage_v2_40k_e100_simple.onnx",
|
||||
"indexUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/kikoto_kurage/added_IVF5181_Flat_nprobe_1_v2.index.bin",
|
||||
"termsOfUseUrl": "https://huggingface.co/wok000/vcclient_model/raw/main/rvc_v2_alpha/kikoto_kurage/terms_of_use.txt",
|
||||
"credit": "黄琴海月",
|
||||
"description": "",
|
||||
"sampleRate": 40000,
|
||||
"modelType": "rvc_v2",
|
||||
"f0": true
|
||||
},
|
||||
{
|
||||
"id": "KikotoMahiro_o",
|
||||
"lang": "ja-JP",
|
||||
"tag": ["v2", "onnx"],
|
||||
"name": "黄琴まひろ",
|
||||
"modelUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/kikoto_mahiro/kikoto_mahiro_v2_40k_simple.onnx",
|
||||
"indexUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/kikoto_mahiro/added_IVF6881_Flat_nprobe_1_v2.index.bin",
|
||||
"termsOfUseUrl": "https://huggingface.co/wok000/vcclient_model/raw/main/rvc_v2_alpha/kikoto_mahiro/terms_of_use.txt",
|
||||
"credit": "黄琴まひろ",
|
||||
"description": "",
|
||||
"sampleRate": 40000,
|
||||
"modelType": "rvc_v2",
|
||||
"f0": true
|
||||
},
|
||||
{
|
||||
"id": "TokinaShigure_o",
|
||||
"lang": "ja-JP",
|
||||
"tag": ["v2", "onnx"],
|
||||
"name": "刻鳴時雨",
|
||||
"modelUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/tokina_shigure/tokina_shigure_v2_40k_e100_simple.onnx",
|
||||
"indexUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/tokina_shigure/added_IVF2736_Flat_nprobe_1_v2.index.bin",
|
||||
"termsOfUseUrl": "https://huggingface.co/wok000/vcclient_model/raw/main/rvc_v2_alpha/tokina_shigure/terms_of_use.txt",
|
||||
"credit": "刻鳴時雨",
|
||||
"description": "",
|
||||
"sampleRate": 40000,
|
||||
"modelType": "rvc_v2",
|
||||
"f0": true
|
||||
},
|
||||
{
|
||||
"id": "Amitaro_o",
|
||||
"lang": "ja-JP",
|
||||
"tag": ["v2", "onnx"],
|
||||
"name": "あみたろ",
|
||||
"modelUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/amitaro/amitaro_v2_40k_e100_simple.onnx",
|
||||
"indexUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/amitaro/added_IVF3139_Flat_nprobe_1_v2.index.bin",
|
||||
"termsOfUseUrl": "https://huggingface.co/wok000/vcclient_model/raw/main/rvc_v2_alpha/amitaro/terms_of_use.txt",
|
||||
"credit": "あみたろ",
|
||||
"description": "",
|
||||
"sampleRate": 40000,
|
||||
"modelType": "rvc_v2",
|
||||
"f0": true
|
||||
},
|
||||
{
|
||||
"id": "Tsukuyomi-chan_o",
|
||||
"lang": "ja-JP",
|
||||
"tag": ["v2", "onnx"],
|
||||
"name": "つくよみちゃん",
|
||||
"modelUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/tsukuyomi-chan/tsukuyomi_v2_40k_e100_simple.onnx",
|
||||
"indexUrl": "https://huggingface.co/wok000/vcclient_model/resolve/main/rvc_v2_alpha/tsukuyomi-chan/added_IVF7852_Flat_nprobe_1_v2.index.bin",
|
||||
"termsOfUseUrl": "https://huggingface.co/wok000/vcclient_model/blob/main/rvc_v2_alpha/tsukuyomi-chan/terms_of_use.txt",
|
||||
"credit": "つくよみちゃん",
|
||||
"description": "",
|
||||
"sampleRate": 40000,
|
||||
"modelType": "rvc_v2",
|
||||
"f0": true
|
||||
}
|
||||
]
|
||||
}
|
@ -70,7 +70,7 @@ class DDSP_SVC:
|
||||
self.params = params
|
||||
self.svc_model.setVCParams(params)
|
||||
EmbedderManager.initialize(params)
|
||||
print("DDSP-SVC initialization:", params)
|
||||
print("[Voice Changer] DDSP-SVC initialization:", params)
|
||||
|
||||
def loadModel(self, props: LoadModelParams):
|
||||
target_slot_idx = props.slot
|
||||
|
@ -67,7 +67,7 @@ class RVC:
|
||||
self.params = params
|
||||
EmbedderManager.initialize(params)
|
||||
self.loadSlots()
|
||||
print("RVC initialization: ", params)
|
||||
print("[Voice Changer] RVC initialization: ", params)
|
||||
|
||||
# サンプルカタログ作成
|
||||
sampleJsons: list[str] = []
|
||||
@ -210,12 +210,6 @@ class RVC:
|
||||
if key == "gpu":
|
||||
self.prepareModel(self.settings.modelSlotIndex)
|
||||
|
||||
if key == "enableDirectML":
|
||||
if self.pipeline is not None and val == 0:
|
||||
self.pipeline.setDirectMLEnable(False)
|
||||
elif self.pipeline is not None and val == 1:
|
||||
self.pipeline.setDirectMLEnable(True)
|
||||
|
||||
elif key in self.settings.floatData:
|
||||
setattr(self.settings, key, float(val))
|
||||
elif key in self.settings.strData:
|
||||
@ -268,6 +262,9 @@ class RVC:
|
||||
|
||||
def get_info(self):
|
||||
data = asdict(self.settings)
|
||||
if self.pipeline is not None:
|
||||
pipelineInfo = self.pipeline.getPipelineInfo()
|
||||
data["pipelineInfo"] = pipelineInfo
|
||||
return data
|
||||
|
||||
def get_processing_sampling_rate(self):
|
||||
|
@ -1,7 +1,7 @@
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
from dataclasses import asdict
|
||||
import os
|
||||
from const import RVC_MODEL_DIRNAME, TMP_DIR
|
||||
from const import RVC_MODEL_DIRNAME, SAMPLE_MODEL_IDS, TMP_DIR
|
||||
from Downloader import download, download_no_tqdm
|
||||
from ModelSample import RVCModelSample, getModelSamples
|
||||
import json
|
||||
@ -18,37 +18,7 @@ def checkRvcModelExist(model_dir: str):
|
||||
|
||||
|
||||
def downloadInitialSampleModels(sampleJsons: list[str], model_dir: str):
|
||||
# sampleModelIds = [
|
||||
# ("TokinaShigure_o", True),
|
||||
# ("KikotoMahiro_o", False),
|
||||
# ("Amitaro_o", False),
|
||||
# ("Tsukuyomi-chan_o", False),
|
||||
# ]
|
||||
sampleModelIds = [
|
||||
# オフィシャルモデルテスト
|
||||
# ("test-official-v1-f0-48k-l9-hubert_t", True),
|
||||
# ("test-official-v1-nof0-48k-l9-hubert_t", False),
|
||||
# ("test-official-v2-f0-40k-l12-hubert_t", False),
|
||||
# ("test-official-v2-nof0-40k-l12-hubert_t", False),
|
||||
# ("test-official-v1-f0-48k-l9-hubert_o", True),
|
||||
# ("test-official-v1-nof0-48k-l9-hubert_o", False),
|
||||
# ("test-official-v2-f0-40k-l12-hubert_o", False),
|
||||
# ("test-official-v2-nof0-40k-l12-hubert_o", False),
|
||||
# DDPNモデルテスト(torch)
|
||||
# ("test-ddpn-v1-f0-48k-l9-hubert_t", False),
|
||||
# ("test-ddpn-v1-nof0-48k-l9-hubert_t", False),
|
||||
# ("test-ddpn-v2-f0-40k-l12-hubert_t", False),
|
||||
# ("test-ddpn-v2-nof0-40k-l12-hubert_t", False),
|
||||
# ("test-ddpn-v2-f0-40k-l12-hubert_jp_t", False),
|
||||
# ("test-ddpn-v2-nof0-40k-l12-hubert_jp_t", False),
|
||||
# DDPNモデルテスト(onnx)
|
||||
("test-ddpn-v1-f0-48k-l9-hubert_o", False),
|
||||
("test-ddpn-v1-nof0-48k-l9-hubert_o", False),
|
||||
("test-ddpn-v2-f0-40k-l12-hubert_o", False),
|
||||
("test-ddpn-v2-nof0-40k-l12-hubert_o", False),
|
||||
("test-ddpn-v2-f0-40k-l12-hubert_jp_o", False),
|
||||
("test-ddpn-v2-nof0-40k-l12-hubert_jp_o", False),
|
||||
]
|
||||
sampleModelIds = SAMPLE_MODEL_IDS
|
||||
|
||||
sampleModels = getModelSamples(sampleJsons, "RVC")
|
||||
if sampleModels is None:
|
||||
|
@ -22,6 +22,15 @@ class Embedder(Protocol):
|
||||
) -> torch.Tensor:
|
||||
...
|
||||
|
||||
def getEmbedderInfo(self):
|
||||
return {
|
||||
"embedderType": self.embedderType.value,
|
||||
"file": self.file,
|
||||
"isHalf": self.isHalf,
|
||||
"devType": self.dev.type,
|
||||
"devIndex": self.dev.index,
|
||||
}
|
||||
|
||||
def setProps(
|
||||
self,
|
||||
embedderType: EnumEmbedderTypes,
|
||||
|
@ -2,14 +2,15 @@ from typing import Any, Protocol
|
||||
import torch
|
||||
import onnxruntime
|
||||
|
||||
from const import EnumInferenceTypes
|
||||
|
||||
|
||||
class Inferencer(Protocol):
|
||||
# inferencerType: EnumInferenceTypes = EnumInferenceTypes.pyTorchRVC
|
||||
# file: str
|
||||
# isHalf: bool = True
|
||||
# dev: device | None
|
||||
# onnxProviders: list[str] | None
|
||||
# onnxProviderOptions: Any | None
|
||||
inferencerType: EnumInferenceTypes = EnumInferenceTypes.pyTorchRVC
|
||||
file: str
|
||||
isHalf: bool = True
|
||||
gpu: int = 0
|
||||
|
||||
model: onnxruntime.InferenceSession | Any | None = None
|
||||
|
||||
def loadModel(self, file: str, gpu: int):
|
||||
@ -25,18 +26,22 @@ class Inferencer(Protocol):
|
||||
) -> torch.Tensor:
|
||||
...
|
||||
|
||||
# def setProps(
|
||||
# self,
|
||||
# inferencerType: EnumInferenceTypes,
|
||||
# file: str,
|
||||
# dev: device | None,
|
||||
# onnxProviders: list[str] | None,
|
||||
# onnxProviderOptions: Any | None,
|
||||
# isHalf: bool = True,
|
||||
# ):
|
||||
# self.inferencerType = inferencerType
|
||||
# self.file = file
|
||||
# self.isHalf = isHalf
|
||||
# self.dev = dev
|
||||
# self.onnxProviders = onnxProviders
|
||||
# self.onnxProviderOptions = onnxProviderOptions
|
||||
def setProps(
|
||||
self,
|
||||
inferencerType: EnumInferenceTypes,
|
||||
file: str,
|
||||
isHalf: bool,
|
||||
gpu: int,
|
||||
):
|
||||
self.inferencerType = inferencerType
|
||||
self.file = file
|
||||
self.isHalf = isHalf
|
||||
self.gpu = gpu
|
||||
|
||||
def getInferencerInfo(self):
|
||||
return {
|
||||
"inferencerType": self.inferencerType.value,
|
||||
"file": self.file,
|
||||
"isHalf": self.isHalf,
|
||||
"gpu": self.gpu,
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
import torch
|
||||
import onnxruntime
|
||||
from const import EnumInferenceTypes
|
||||
from voice_changer.RVC.deviceManager.DeviceManager import DeviceManager
|
||||
from voice_changer.RVC.inferencer.Inferencer import Inferencer
|
||||
import numpy as np
|
||||
@ -7,6 +8,7 @@ import numpy as np
|
||||
|
||||
class OnnxRVCInferencer(Inferencer):
|
||||
def loadModel(self, file: str, gpu: int):
|
||||
self.setProps(EnumInferenceTypes.onnxRVC, file, True, gpu)
|
||||
(
|
||||
onnxProviders,
|
||||
onnxProviderOptions,
|
||||
@ -65,3 +67,8 @@ class OnnxRVCInferencer(Inferencer):
|
||||
)
|
||||
|
||||
return torch.tensor(np.array(audio1))
|
||||
|
||||
def getInferencerInfo(self):
|
||||
inferencer = super().getInferencerInfo()
|
||||
inferencer["onnxExecutionProvider"] = self.model.get_providers()
|
||||
return inferencer
|
||||
|
@ -1,10 +1,15 @@
|
||||
import torch
|
||||
import numpy as np
|
||||
from const import EnumInferenceTypes
|
||||
|
||||
from voice_changer.RVC.inferencer.OnnxRVCInferencer import OnnxRVCInferencer
|
||||
|
||||
|
||||
class OnnxRVCInferencerNono(OnnxRVCInferencer):
|
||||
def loadModel(self, file: str, gpu: int):
|
||||
super().loadModel(file, gpu)
|
||||
self.setProps(EnumInferenceTypes.onnxRVCNono, file, True, gpu)
|
||||
|
||||
def infer(
|
||||
self,
|
||||
feats: torch.Tensor,
|
||||
|
@ -1,4 +1,5 @@
|
||||
import torch
|
||||
from const import EnumInferenceTypes
|
||||
|
||||
from voice_changer.RVC.deviceManager.DeviceManager import DeviceManager
|
||||
from voice_changer.RVC.inferencer.Inferencer import Inferencer
|
||||
@ -9,6 +10,8 @@ from infer_pack.models import ( # type:ignore
|
||||
|
||||
class RVCInferencer(Inferencer):
|
||||
def loadModel(self, file: str, gpu: int):
|
||||
self.setProps(EnumInferenceTypes.pyTorchRVC, file, True, gpu)
|
||||
|
||||
dev = DeviceManager.get_instance().getDevice(gpu)
|
||||
isHalf = DeviceManager.get_instance().halfPrecisionAvailable(gpu)
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
import torch
|
||||
from const import EnumInferenceTypes
|
||||
|
||||
from voice_changer.RVC.deviceManager.DeviceManager import DeviceManager
|
||||
from voice_changer.RVC.inferencer.Inferencer import Inferencer
|
||||
@ -9,6 +10,8 @@ from infer_pack.models import ( # type:ignore
|
||||
|
||||
class RVCInferencerNono(Inferencer):
|
||||
def loadModel(self, file: str, gpu: int):
|
||||
self.setProps(EnumInferenceTypes.pyTorchRVCNono, file, True, gpu)
|
||||
|
||||
dev = DeviceManager.get_instance().getDevice(gpu)
|
||||
isHalf = DeviceManager.get_instance().halfPrecisionAvailable(gpu)
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
import torch
|
||||
from const import EnumInferenceTypes
|
||||
from voice_changer.RVC.deviceManager.DeviceManager import DeviceManager
|
||||
from voice_changer.RVC.inferencer.Inferencer import Inferencer
|
||||
from infer_pack.models import ( # type:ignore
|
||||
@ -8,6 +9,8 @@ from infer_pack.models import ( # type:ignore
|
||||
|
||||
class RVCInferencerv2(Inferencer):
|
||||
def loadModel(self, file: str, gpu: int):
|
||||
self.setProps(EnumInferenceTypes.pyTorchRVCv2, file, True, gpu)
|
||||
|
||||
dev = DeviceManager.get_instance().getDevice(gpu)
|
||||
isHalf = DeviceManager.get_instance().halfPrecisionAvailable(gpu)
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
import torch
|
||||
from const import EnumInferenceTypes
|
||||
|
||||
from voice_changer.RVC.deviceManager.DeviceManager import DeviceManager
|
||||
from voice_changer.RVC.inferencer.Inferencer import Inferencer
|
||||
@ -9,6 +10,8 @@ from infer_pack.models import ( # type:ignore
|
||||
|
||||
class RVCInferencerv2Nono(Inferencer):
|
||||
def loadModel(self, file: str, gpu: int):
|
||||
self.setProps(EnumInferenceTypes.pyTorchRVCv2Nono, file, True, gpu)
|
||||
|
||||
dev = DeviceManager.get_instance().getDevice(gpu)
|
||||
isHalf = DeviceManager.get_instance().halfPrecisionAvailable(gpu)
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
import torch
|
||||
from const import EnumInferenceTypes
|
||||
from voice_changer.RVC.deviceManager.DeviceManager import DeviceManager
|
||||
|
||||
from voice_changer.RVC.inferencer.Inferencer import Inferencer
|
||||
@ -7,6 +8,8 @@ from .models import SynthesizerTrnMsNSFsid
|
||||
|
||||
class WebUIInferencer(Inferencer):
|
||||
def loadModel(self, file: str, gpu: int):
|
||||
self.setProps(EnumInferenceTypes.pyTorchWebUI, file, True, gpu)
|
||||
|
||||
dev = DeviceManager.get_instance().getDevice(gpu)
|
||||
isHalf = DeviceManager.get_instance().halfPrecisionAvailable(gpu)
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
import torch
|
||||
from const import EnumInferenceTypes
|
||||
|
||||
from voice_changer.RVC.deviceManager.DeviceManager import DeviceManager
|
||||
from voice_changer.RVC.inferencer.Inferencer import Inferencer
|
||||
@ -7,6 +8,8 @@ from .models import SynthesizerTrnMsNSFsidNono
|
||||
|
||||
class WebUIInferencerNono(Inferencer):
|
||||
def loadModel(self, file: str, gpu: int):
|
||||
self.setProps(EnumInferenceTypes.pyTorchWebUINono, file, True, gpu)
|
||||
|
||||
dev = DeviceManager.get_instance().getDevice(gpu)
|
||||
isHalf = DeviceManager.get_instance().halfPrecisionAvailable(gpu)
|
||||
|
||||
|
@ -59,9 +59,15 @@ class Pipeline(object):
|
||||
self.sr = 16000
|
||||
self.window = 160
|
||||
|
||||
def setDirectMLEnable(self, enable: bool):
|
||||
if hasattr(self.inferencer, "setDirectMLEnable"):
|
||||
self.inferencer.setDirectMLEnable(enable)
|
||||
def getPipelineInfo(self):
|
||||
inferencerInfo = self.inferencer.getInferencerInfo() if self.inferencer else {}
|
||||
embedderInfo = self.embedder.getEmbedderInfo()
|
||||
pitchExtractorInfo = self.pitchExtractor.getPitchExtractorInfo()
|
||||
return {
|
||||
"inferencer": inferencerInfo,
|
||||
"embedder": embedderInfo,
|
||||
"pitchExtractor": pitchExtractorInfo,
|
||||
}
|
||||
|
||||
def setPitchExtractor(self, pitchExtractor: PitchExtractor):
|
||||
self.pitchExtractor = pitchExtractor
|
||||
|
@ -1,11 +1,14 @@
|
||||
import torchcrepe
|
||||
import torch
|
||||
import numpy as np
|
||||
from const import EnumPitchExtractorTypes
|
||||
|
||||
from voice_changer.RVC.pitchExtractor.PitchExtractor import PitchExtractor
|
||||
|
||||
|
||||
class CrepePitchExtractor(PitchExtractor):
|
||||
pitchExtractorType: EnumPitchExtractorTypes = EnumPitchExtractorTypes.crepe
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
if torch.cuda.is_available():
|
||||
|
@ -1,10 +1,13 @@
|
||||
import pyworld
|
||||
import numpy as np
|
||||
from const import EnumPitchExtractorTypes
|
||||
|
||||
from voice_changer.RVC.pitchExtractor.PitchExtractor import PitchExtractor
|
||||
|
||||
|
||||
class DioPitchExtractor(PitchExtractor):
|
||||
pitchExtractorType: EnumPitchExtractorTypes = EnumPitchExtractorTypes.dio
|
||||
|
||||
def extract(self, audio, f0_up_key, sr, window, silence_front=0):
|
||||
audio = audio.detach().cpu().numpy()
|
||||
n_frames = int(len(audio) // window) + 1
|
||||
|
@ -1,11 +1,14 @@
|
||||
import pyworld
|
||||
import numpy as np
|
||||
import scipy.signal as signal
|
||||
from const import EnumPitchExtractorTypes
|
||||
|
||||
from voice_changer.RVC.pitchExtractor.PitchExtractor import PitchExtractor
|
||||
|
||||
|
||||
class HarvestPitchExtractor(PitchExtractor):
|
||||
pitchExtractorType: EnumPitchExtractorTypes = EnumPitchExtractorTypes.harvest
|
||||
|
||||
def extract(self, audio, f0_up_key, sr, window, silence_front=0):
|
||||
audio = audio.detach().cpu().numpy()
|
||||
n_frames = int(len(audio) // window) + 1
|
||||
|
@ -7,3 +7,8 @@ class PitchExtractor(Protocol):
|
||||
|
||||
def extract(self, audio, f0_up_key, sr, window, silence_front=0):
|
||||
...
|
||||
|
||||
def getPitchExtractorInfo(self):
|
||||
return {
|
||||
"pitchExtractorType": self.pitchExtractorType.value,
|
||||
}
|
||||
|
@ -80,7 +80,7 @@ class SoVitsSvc40:
|
||||
self.gpu_num = torch.cuda.device_count()
|
||||
self.prevVol = 0
|
||||
self.params = params
|
||||
print("so-vits-svc40 initialization:", params)
|
||||
print("[Voice Changer] so-vits-svc40 initialization:", params)
|
||||
|
||||
# def loadModel(self, config: str, pyTorch_model_file: str = None, onnx_model_file: str = None, clusterTorchModel: str = None):
|
||||
def loadModel(self, props: LoadModelParams):
|
||||
|
@ -76,7 +76,7 @@ class SoVitsSvc40v2:
|
||||
self.gpu_num = torch.cuda.device_count()
|
||||
self.prevVol = 0
|
||||
self.params = params
|
||||
print("so-vits-svc 40v2 initialization:", params)
|
||||
print("[Voice Changer] so-vits-svc 40v2 initialization:", params)
|
||||
|
||||
def loadModel(self, props: LoadModelParams):
|
||||
params = props.params
|
||||
|
@ -372,7 +372,8 @@ class VoiceChanger:
|
||||
else:
|
||||
ret = self.voiceChanger.update_settings(key, val)
|
||||
if ret is False:
|
||||
print(f"({key} is not mutable variable or unknown variable)")
|
||||
pass
|
||||
# print(f"({key} is not mutable variable or unknown variable)")
|
||||
return self.get_info()
|
||||
|
||||
def _generate_strength(self, crossfadeSize: int):
|
||||
|
Loading…
x
Reference in New Issue
Block a user