bugfix: clearsetting can not all data

This commit is contained in:
wataru 2023-04-30 16:53:15 +09:00
parent 37eba531e9
commit 093e01dd4e
27 changed files with 2931 additions and 28 deletions

View File

@ -60,6 +60,8 @@
"options": {} "options": {}
} }
], ],
"lab": [],
"deviceSetting": [ "deviceSetting": [
{ {
"name": "audioInput", "name": "audioInput",

View File

@ -51,6 +51,8 @@
} }
} }
], ],
"lab": [],
"deviceSetting": [ "deviceSetting": [
{ {
"name": "audioInput", "name": "audioInput",

View File

@ -50,6 +50,8 @@
} }
} }
], ],
"lab": [],
"deviceSetting": [ "deviceSetting": [
{ {
"name": "audioInput", "name": "audioInput",

View File

@ -70,6 +70,12 @@
} }
} }
], ],
"lab": [
{
"name": "mergeLab",
"options": {}
}
],
"deviceSetting": [ "deviceSetting": [
{ {
"name": "audioInput", "name": "audioInput",

View File

@ -50,6 +50,8 @@
} }
} }
], ],
"lab": [],
"deviceSetting": [ "deviceSetting": [
{ {
"name": "audioInput", "name": "audioInput",

View File

@ -50,6 +50,8 @@
} }
} }
], ],
"lab": [],
"deviceSetting": [ "deviceSetting": [
{ {
"name": "audioInput", "name": "audioInput",

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -23,7 +23,7 @@
"@babel/preset-env": "^7.21.5", "@babel/preset-env": "^7.21.5",
"@babel/preset-react": "^7.18.6", "@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.5", "@babel/preset-typescript": "^7.21.5",
"@types/node": "^18.16.2", "@types/node": "^18.16.3",
"@types/react": "^18.2.0", "@types/react": "^18.2.0",
"@types/react-dom": "^18.2.1", "@types/react-dom": "^18.2.1",
"autoprefixer": "^10.4.14", "autoprefixer": "^10.4.14",
@ -38,7 +38,7 @@
"html-loader": "^4.2.0", "html-loader": "^4.2.0",
"html-webpack-plugin": "^5.5.1", "html-webpack-plugin": "^5.5.1",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"postcss-loader": "^7.2.4", "postcss-loader": "^7.3.0",
"postcss-nested": "^6.0.1", "postcss-nested": "^6.0.1",
"prettier": "^2.8.8", "prettier": "^2.8.8",
"rimraf": "^5.0.0", "rimraf": "^5.0.0",
@ -51,7 +51,7 @@
"webpack-dev-server": "^4.13.3" "webpack-dev-server": "^4.13.3"
}, },
"dependencies": { "dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.117", "@dannadori/voice-changer-client-js": "^1.0.118",
"@fortawesome/fontawesome-svg-core": "^6.4.0", "@fortawesome/fontawesome-svg-core": "^6.4.0",
"@fortawesome/free-brands-svg-icons": "^6.4.0", "@fortawesome/free-brands-svg-icons": "^6.4.0",
"@fortawesome/free-regular-svg-icons": "^6.4.0", "@fortawesome/free-regular-svg-icons": "^6.4.0",

View File

@ -60,6 +60,8 @@
"options": {} "options": {}
} }
], ],
"lab": [],
"deviceSetting": [ "deviceSetting": [
{ {
"name": "audioInput", "name": "audioInput",

View File

@ -51,6 +51,8 @@
} }
} }
], ],
"lab": [],
"deviceSetting": [ "deviceSetting": [
{ {
"name": "audioInput", "name": "audioInput",

View File

@ -50,6 +50,8 @@
} }
} }
], ],
"lab": [],
"deviceSetting": [ "deviceSetting": [
{ {
"name": "audioInput", "name": "audioInput",

View File

@ -70,6 +70,12 @@
} }
} }
], ],
"lab": [
{
"name": "mergeLab",
"options": {}
}
],
"deviceSetting": [ "deviceSetting": [
{ {
"name": "audioInput", "name": "audioInput",

View File

@ -50,6 +50,8 @@
} }
} }
], ],
"lab": [],
"deviceSetting": [ "deviceSetting": [
{ {
"name": "audioInput", "name": "audioInput",

View File

@ -50,6 +50,8 @@
} }
} }
], ],
"lab": [],
"deviceSetting": [ "deviceSetting": [
{ {
"name": "audioInput", "name": "audioInput",

View File

@ -43,31 +43,33 @@ const AppStateWrapper = () => {
// エラーバウンダリー設定 // エラーバウンダリー設定
const [error, setError] = useState<{ error: Error, errorInfo: ErrorInfo }>() const [error, setError] = useState<{ error: Error, errorInfo: ErrorInfo }>()
const { removeItem } = useIndexedDB({ clientType: clientType }) const { removeItem } = useIndexedDB({ clientType: clientType })
const { getItem } = useIndexedDB({ clientType: null }) const { getItem, removeDB } = useIndexedDB({ clientType: null })
const errorComponent = useMemo(() => { const errorComponent = useMemo(() => {
const errorName = error?.error.name || "no error name" const errorName = error?.error.name || "no error name"
const errorMessage = error?.error.message || "no error message" const errorMessage = error?.error.message || "no error message"
const errorInfos = (error?.errorInfo.componentStack || "no error stack").split("\n") const errorInfos = (error?.errorInfo.componentStack || "no error stack").split("\n")
const onClearCacheClicked = async () => { const onClearCacheClicked = async () => {
await removeDB()
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)
}
location.reload(); 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)
// }
} }
return ( return (
<div className="error-container"> <div className="error-container">

View File

@ -15,6 +15,7 @@ export type AppGuiDemoSetting = {
"speakerSetting": GuiComponentSetting[], "speakerSetting": GuiComponentSetting[],
"converterSetting": GuiComponentSetting[], "converterSetting": GuiComponentSetting[],
"advancedSetting": GuiComponentSetting[], "advancedSetting": GuiComponentSetting[],
"lab": GuiComponentSetting[],
}, },
dialogs: { dialogs: {
"license": { title: string, auther: string, contact: string, url: string, license: string }[] "license": { title: string, auther: string, contact: string, url: string, license: string }[]
@ -37,7 +38,8 @@ const InitialAppGuiDemoSetting: AppGuiDemoSetting = {
"qualityControl": [], "qualityControl": [],
"speakerSetting": [], "speakerSetting": [],
"converterSetting": [], "converterSetting": [],
"advancedSetting": [] "advancedSetting": [],
"lab": []
}, },
dialogs: { dialogs: {
"license": [{ title: "", auther: "", contact: "", url: "", license: "MIT" }] "license": [{ title: "", auther: "", contact: "", url: "", license: "MIT" }]

View File

@ -10,6 +10,7 @@ export const OpenQualityControlCheckbox = "open-quality-control-checkbox"
export const OpenSpeakerSettingCheckbox = "open-speaker-setting-checkbox" export const OpenSpeakerSettingCheckbox = "open-speaker-setting-checkbox"
export const OpenConverterSettingCheckbox = "open-converter-setting-checkbox" export const OpenConverterSettingCheckbox = "open-converter-setting-checkbox"
export const OpenAdvancedSettingCheckbox = "open-advanced-setting-checkbox" export const OpenAdvancedSettingCheckbox = "open-advanced-setting-checkbox"
export const OpenLabCheckbox = "open-lab-checkbox"
export const OpenLicenseDialogCheckbox = "open-license-dialog-checkbox" export const OpenLicenseDialogCheckbox = "open-license-dialog-checkbox"
export const OpenWaitingDialogCheckbox = "open-waiting-dialog-checkbox" export const OpenWaitingDialogCheckbox = "open-waiting-dialog-checkbox"
@ -26,9 +27,11 @@ export type StateControls = {
openSpeakerSettingCheckbox: StateControlCheckbox openSpeakerSettingCheckbox: StateControlCheckbox
openConverterSettingCheckbox: StateControlCheckbox openConverterSettingCheckbox: StateControlCheckbox
openAdvancedSettingCheckbox: StateControlCheckbox openAdvancedSettingCheckbox: StateControlCheckbox
openLabCheckbox: StateControlCheckbox
showLicenseCheckbox: StateControlCheckbox showLicenseCheckbox: StateControlCheckbox
showWaitingCheckbox: StateControlCheckbox showWaitingCheckbox: StateControlCheckbox
} }
type GuiStateAndMethod = { type GuiStateAndMethod = {
@ -141,6 +144,7 @@ export const GuiStateProvider = ({ children }: Props) => {
const openSpeakerSettingCheckbox = useStateControlCheckbox(OpenSpeakerSettingCheckbox); const openSpeakerSettingCheckbox = useStateControlCheckbox(OpenSpeakerSettingCheckbox);
const openConverterSettingCheckbox = useStateControlCheckbox(OpenConverterSettingCheckbox); const openConverterSettingCheckbox = useStateControlCheckbox(OpenConverterSettingCheckbox);
const openAdvancedSettingCheckbox = useStateControlCheckbox(OpenAdvancedSettingCheckbox); const openAdvancedSettingCheckbox = useStateControlCheckbox(OpenAdvancedSettingCheckbox);
const openLabCheckbox = useStateControlCheckbox(OpenLabCheckbox);
const showLicenseCheckbox = useStateControlCheckbox(OpenLicenseDialogCheckbox); const showLicenseCheckbox = useStateControlCheckbox(OpenLicenseDialogCheckbox);
const showWaitingCheckbox = useStateControlCheckbox(OpenWaitingDialogCheckbox); const showWaitingCheckbox = useStateControlCheckbox(OpenWaitingDialogCheckbox);
@ -152,6 +156,7 @@ export const GuiStateProvider = ({ children }: Props) => {
openSpeakerSettingCheckbox.updateState(true) openSpeakerSettingCheckbox.updateState(true)
openConverterSettingCheckbox.updateState(true) openConverterSettingCheckbox.updateState(true)
openQualityControlCheckbox.updateState(true) openQualityControlCheckbox.updateState(true)
openLabCheckbox.updateState(true)
showLicenseCheckbox.updateState(false) showLicenseCheckbox.updateState(false)
showWaitingCheckbox.updateState(false) showWaitingCheckbox.updateState(false)
@ -173,6 +178,7 @@ export const GuiStateProvider = ({ children }: Props) => {
openSpeakerSettingCheckbox, openSpeakerSettingCheckbox,
openConverterSettingCheckbox, openConverterSettingCheckbox,
openAdvancedSettingCheckbox, openAdvancedSettingCheckbox,
openLabCheckbox,
showLicenseCheckbox, showLicenseCheckbox,
showWaitingCheckbox showWaitingCheckbox

View File

@ -43,6 +43,7 @@ import { SilenceFrontRow, SilenceFrontRowProps } from "./components/812_SilenceF
import { ModelSwitchRow, ModelSwitchRowProps } from "./components/204_ModelSwitchRow" import { ModelSwitchRow, ModelSwitchRowProps } from "./components/204_ModelSwitchRow"
import { ONNXExportRow, ONNXExportRowProps } from "./components/205_ONNXExportRow" import { ONNXExportRow, ONNXExportRowProps } from "./components/205_ONNXExportRow"
import { ONNXExecutorRow, ONNXExecutorRowProps } from "./components/206_ONNXExecutorRow" import { ONNXExecutorRow, ONNXExecutorRowProps } from "./components/206_ONNXExecutorRow"
import { MergeLabRow, MergeLabRowProps } from "./components/a01_MergeLab.Row"
export const catalog: { [key: string]: (props: any) => JSX.Element } = {} export const catalog: { [key: string]: (props: any) => JSX.Element } = {}
@ -116,7 +117,7 @@ const initialize = () => {
addToCatalog("rvcQuality", (props: RVCQualityRowProps) => { return <RVCQualityRow {...props} /> }) addToCatalog("rvcQuality", (props: RVCQualityRowProps) => { return <RVCQualityRow {...props} /> })
addToCatalog("silenceFront", (props: SilenceFrontRowProps) => { return <SilenceFrontRow {...props} /> }) addToCatalog("silenceFront", (props: SilenceFrontRowProps) => { return <SilenceFrontRow {...props} /> })
addToCatalog("mergeLab", (props: MergeLabRowProps) => { return <MergeLabRow {...props} /> })
} }

View File

@ -9,6 +9,7 @@ import { QualityControl } from "./500_QualityControl";
import { SpeakerSetting } from "./600_SpeakerSetting"; import { SpeakerSetting } from "./600_SpeakerSetting";
import { ConverterSetting } from "./700_ConverterSetting"; import { ConverterSetting } from "./700_ConverterSetting";
import { AdvancedSetting } from "./800_AdvancedSetting"; import { AdvancedSetting } from "./800_AdvancedSetting";
import { Lab } from "./a00_Lab";
export const Demo = () => { export const Demo = () => {
return ( return (
@ -19,6 +20,7 @@ export const Demo = () => {
<TitleArea /> <TitleArea />
<ServerControl /> <ServerControl />
<ModelSetting /> <ModelSetting />
<Lab></Lab>
<DeviceSetting /> <DeviceSetting />
<QualityControl /> <QualityControl />
<SpeakerSetting /> <SpeakerSetting />

View File

@ -0,0 +1,51 @@
import React, { useMemo } from "react"
import { useAppRoot } from "../../001_provider/001_AppRootProvider"
import { AnimationTypes, HeaderButton, HeaderButtonProps } from "../101_HeaderButton"
import { useGuiState } from "./001_GuiStateProvider"
import { generateComponent } from "./002_ComponentGenerator"
export const Lab = () => {
const guiState = useGuiState()
const { appGuiSettingState } = useAppRoot()
const componentSettings = appGuiSettingState.appGuiSetting.front.lab
const accodionButton = useMemo(() => {
const accodionButtonProps: HeaderButtonProps = {
stateControlCheckbox: guiState.stateControls.openLabCheckbox,
tooltip: "Open/Close",
onIcon: ["fas", "caret-up"],
offIcon: ["fas", "caret-up"],
animation: AnimationTypes.spinner,
tooltipClass: "tooltip-right",
};
return <HeaderButton {...accodionButtonProps}></HeaderButton>;
}, []);
const deviceSetting = useMemo(() => {
const components = componentSettings.map((x, index) => {
const c = generateComponent(x.name, x.options)
return <div key={`${x.name}_${index}`}>{c}</div>
})
return (
<>
{guiState.stateControls.openLabCheckbox.trigger}
<div className="partition">
<div className="partition-header">
<span className="caret">
{accodionButton}
</span>
<span className="title" onClick={() => { guiState.stateControls.openLabCheckbox.updateState(!guiState.stateControls.openLabCheckbox.checked()) }}>
Labs(N/A)
</span>
<span></span>
</div>
<div className="partition-content">
{/* {components} */}
</div>
</div>
</>
)
}, [])
return deviceSetting
}

View File

@ -0,0 +1,104 @@
import { Framework } from "@dannadori/voice-changer-client-js"
import React, { useEffect, useMemo, useState } from "react"
import { useAppState } from "../../../001_provider/001_AppStateProvider"
export type MergeLabRowProps = {
}
type MergeElement = {
filename: string
strength: number
}
export const MergeLabRow = (_props: MergeLabRowProps) => {
const [mergeElements, setMergeElements] = useState<MergeElement[]>([])
const appState = useAppState()
// スロットが変更されたときの初期化処理
const newSlotChangeKey = useMemo(() => {
return appState.serverSetting.serverSetting.modelSlots.reduce((prev, cur) => {
return prev + "_" + cur.pyTorchModelFile
}, "")
}, [appState.serverSetting.serverSetting.modelSlots])
useEffect(() => {
// PyTorchモデルだけフィルタリング
const models = appState.serverSetting.serverSetting.modelSlots.filter(x => { return x.pyTorchModelFile && x.pyTorchModelFile.length > 0 })
if (models.length == 0) {
return
}
// サンプリングレート、埋め込み次元数、モデルタイプが同一の場合のみ処理可能
if (
models.map(x => { return x.samplingRate }).every((x, _i, arr) => x == arr[0]) &&
models.map(x => { return x.embChannels }).every((x, _i, arr) => x == arr[0]) &&
models.map(x => { return x.modelType }).every((x, _i, arr) => x == arr[0])
) {
const newMergeElements = models.map((x) => {
const elem: MergeElement = { filename: x.pyTorchModelFile, strength: 100 }
return elem
})
setMergeElements(newMergeElements)
} else {
console.log("not all model is same properties.")
setMergeElements([])
}
}, [newSlotChangeKey])
const modelSwitchRow = useMemo(() => {
const onMergeClicked = async () => {
}
const onMergeElementsChanged = (filename: string, strength: number) => {
const newMergeElements = mergeElements.map(x => {
if (x.filename != filename) return x
x.strength = strength
return x
})
setMergeElements(newMergeElements)
}
const modelOptions = mergeElements.map((x, index) => {
let filename = ""
if (x.filename.length > 0) {
filename = x.filename.replace(/^.*[\\\/]/, '')
} else {
return (
<div key={index} >
</div>
)
}
return (
<div key={index} className="merge-field">
<div className="merge-field-elem">{filename}</div>
<div className="merge-field-elem">
<input type="range" className="body-item-input-slider" min="0" max="100" step="1" value={x.strength} onChange={(e) => {
onMergeElementsChanged(x.filename, Number(e.target.value))
}}></input>
<span className="body-item-input-slider-val">{x.strength}</span>
</div>
</div >
)
})
return (
<div className="body-row split-3-3-4 left-padding-1 guided">
<div className="body-item-title left-padding-1">Model Merger</div>
<div className="merge-field-container">
{modelOptions.length == 0 ? <>no torch model or not same type</> : modelOptions}
</div>
<div className="body-button-container">
<div className="body-button" onClick={onMergeClicked}>merge</div>
</div>
</div>
)
}, [mergeElements, appState.serverSetting.serverSetting])
return modelSwitchRow
}

View File

@ -769,3 +769,17 @@ body {
cursor: pointer; cursor: pointer;
display: inline-block; display: inline-block;
} }
/* ################## */
.merge-field-container {
display: flex;
flex-direction: column;
.merge-field {
display: flex;
flex-direction: row;
.merge-field-elem {
padding-left: 5px;
width: 100%;
}
}
}

View File

@ -1,12 +1,12 @@
{ {
"name": "@dannadori/voice-changer-client-js", "name": "@dannadori/voice-changer-client-js",
"version": "1.0.117", "version": "1.0.118",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@dannadori/voice-changer-client-js", "name": "@dannadori/voice-changer-client-js",
"version": "1.0.117", "version": "1.0.118",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@types/readable-stream": "^2.3.15", "@types/readable-stream": "^2.3.15",

View File

@ -1,6 +1,6 @@
{ {
"name": "@dannadori/voice-changer-client-js", "name": "@dannadori/voice-changer-client-js",
"version": "1.0.117", "version": "1.0.118",
"description": "", "description": "",
"main": "dist/index.js", "main": "dist/index.js",
"directories": { "directories": {

View File

@ -13,6 +13,7 @@ export type IndexedDBStateAndMethod = IndexedDBState & {
getItem: (key: string) => Promise<unknown> getItem: (key: string) => Promise<unknown>
removeItem: (key: string) => Promise<void> removeItem: (key: string) => Promise<void>
// clearAll: () => Promise<void> // clearAll: () => Promise<void>
removeDB: () => Promise<void>
} }
export const useIndexedDB = (props: UseIndexedDBProps): IndexedDBStateAndMethod => { export const useIndexedDB = (props: UseIndexedDBProps): IndexedDBStateAndMethod => {
@ -43,16 +44,27 @@ export const useIndexedDB = (props: UseIndexedDBProps): IndexedDBStateAndMethod
const removeItem = useMemo(() => { const removeItem = useMemo(() => {
return async (key: string) => { return async (key: string) => {
const clientKey = `${clientType}_${key}` const clientKey = `${clientType}_${key}`
// console.log("remove key:", clientKey) console.log("remove key:", clientKey)
return await localForage.removeItem(clientKey) return await localForage.removeItem(clientKey)
} }
}, [props.clientType]) }, [props.clientType])
const removeDB = useMemo(() => {
return async () => {
const keys = await localForage.keys()
for (const key of keys) {
console.log("remove key:", key)
await localForage.removeItem(key)
}
}
}, [props.clientType])
return { return {
dummy: "", dummy: "",
setItem, setItem,
getItem, getItem,
removeItem, removeItem,
removeDB
} }
} }

View File

@ -129,6 +129,7 @@ class RVC:
except Exception as e: except Exception as e:
print("EXCEPTION during loading hubert/contentvec model", e) print("EXCEPTION during loading hubert/contentvec model", e)
print(" hubert_path:", hubert_path)
# 初回のみロード # 初回のみロード
if self.initialLoad or tmp_slot == self.currentSlot: if self.initialLoad or tmp_slot == self.currentSlot: