2023-01-08 10:18:20 +03:00
|
|
|
import { DefaultVoiceChangerOptions, OnnxExecutionProvider, Protocol, Framework, fileSelector, ServerSettingKey } from "@dannadori/voice-changer-client-js"
|
|
|
|
import React from "react"
|
2023-01-07 14:07:39 +03:00
|
|
|
import { useMemo, useState } from "react"
|
2023-01-08 10:18:20 +03:00
|
|
|
import { ClientState } from "./hooks/useClient"
|
2023-01-07 14:07:39 +03:00
|
|
|
|
2023-01-07 18:25:21 +03:00
|
|
|
export type UseServerSettingProps = {
|
2023-01-08 10:18:20 +03:00
|
|
|
clientState: ClientState
|
2023-01-08 14:28:57 +03:00
|
|
|
loadModelFunc: (() => Promise<void>) | undefined
|
|
|
|
uploadProgress: number,
|
|
|
|
isUploading: boolean
|
2023-01-07 18:25:21 +03:00
|
|
|
}
|
|
|
|
|
2023-01-07 14:07:39 +03:00
|
|
|
export type ServerSettingState = {
|
|
|
|
serverSetting: JSX.Element;
|
|
|
|
mmvcServerUrl: string;
|
|
|
|
pyTorchModel: File | null;
|
|
|
|
configFile: File | null;
|
|
|
|
onnxModel: File | null;
|
|
|
|
framework: string;
|
|
|
|
onnxExecutionProvider: OnnxExecutionProvider;
|
|
|
|
protocol: Protocol;
|
2023-01-08 14:28:57 +03:00
|
|
|
|
2023-01-07 14:07:39 +03:00
|
|
|
}
|
|
|
|
|
2023-01-07 18:25:21 +03:00
|
|
|
export const useServerSetting = (props: UseServerSettingProps): ServerSettingState => {
|
2023-01-07 14:07:39 +03:00
|
|
|
const [mmvcServerUrl, setMmvcServerUrl] = useState<string>(DefaultVoiceChangerOptions.mmvcServerUrl)
|
|
|
|
const [pyTorchModel, setPyTorchModel] = useState<File | null>(null)
|
|
|
|
const [configFile, setConfigFile] = useState<File | null>(null)
|
|
|
|
const [onnxModel, setOnnxModel] = useState<File | null>(null)
|
|
|
|
const [protocol, setProtocol] = useState<Protocol>("sio")
|
|
|
|
const [onnxExecutionProvider, setOnnxExecutionProvider] = useState<OnnxExecutionProvider>("CPUExecutionProvider")
|
|
|
|
const [framework, setFramework] = useState<Framework>("PyTorch")
|
|
|
|
|
|
|
|
const mmvcServerUrlRow = useMemo(() => {
|
|
|
|
const onSetServerClicked = async () => {
|
|
|
|
const input = document.getElementById("mmvc-server-url") as HTMLInputElement
|
|
|
|
setMmvcServerUrl(input.value)
|
|
|
|
}
|
|
|
|
return (
|
|
|
|
<div className="body-row split-3-3-4 left-padding-1 guided">
|
|
|
|
<div className="body-item-title left-padding-1">MMVC Server</div>
|
|
|
|
<div className="body-input-container">
|
|
|
|
<input type="text" defaultValue={mmvcServerUrl} id="mmvc-server-url" className="body-item-input" />
|
|
|
|
</div>
|
|
|
|
<div className="body-button-container">
|
|
|
|
<div className="body-button" onClick={onSetServerClicked}>set</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
)
|
|
|
|
}, [])
|
|
|
|
|
|
|
|
const uploadeModelRow = useMemo(() => {
|
|
|
|
const onPyTorchFileLoadClicked = async () => {
|
|
|
|
const file = await fileSelector("")
|
|
|
|
if (file.name.endsWith(".pth") == false) {
|
|
|
|
alert("モデルファイルの拡張子はpthである必要があります。")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
setPyTorchModel(file)
|
|
|
|
}
|
2023-01-08 14:28:57 +03:00
|
|
|
const onPyTorchFileClearClicked = () => {
|
|
|
|
setPyTorchModel(null)
|
|
|
|
}
|
2023-01-07 14:07:39 +03:00
|
|
|
const onConfigFileLoadClicked = async () => {
|
|
|
|
const file = await fileSelector("")
|
|
|
|
if (file.name.endsWith(".json") == false) {
|
|
|
|
alert("モデルファイルの拡張子はjsonである必要があります。")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
setConfigFile(file)
|
|
|
|
}
|
2023-01-08 14:28:57 +03:00
|
|
|
const onConfigFileClearClicked = () => {
|
|
|
|
setConfigFile(null)
|
|
|
|
}
|
2023-01-07 14:07:39 +03:00
|
|
|
const onOnnxFileLoadClicked = async () => {
|
|
|
|
const file = await fileSelector("")
|
|
|
|
if (file.name.endsWith(".onnx") == false) {
|
|
|
|
alert("モデルファイルの拡張子はonnxである必要があります。")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
setOnnxModel(file)
|
|
|
|
}
|
2023-01-08 14:28:57 +03:00
|
|
|
const onOnnxFileClearClicked = () => {
|
|
|
|
setOnnxModel(null)
|
|
|
|
}
|
2023-01-07 18:25:21 +03:00
|
|
|
const onModelUploadClicked = async () => {
|
2023-01-08 14:28:57 +03:00
|
|
|
if (!props.loadModelFunc) {
|
2023-01-07 18:25:21 +03:00
|
|
|
return
|
|
|
|
}
|
2023-01-08 14:28:57 +03:00
|
|
|
props.loadModelFunc()
|
2023-01-07 18:25:21 +03:00
|
|
|
}
|
|
|
|
|
2023-01-07 14:07:39 +03:00
|
|
|
return (
|
|
|
|
<>
|
|
|
|
<div className="body-row split-3-3-4 left-padding-1 guided">
|
|
|
|
<div className="body-item-title left-padding-1">Model Uploader</div>
|
|
|
|
<div className="body-item-text">
|
|
|
|
<div></div>
|
|
|
|
</div>
|
|
|
|
<div className="body-item-text">
|
|
|
|
<div></div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div className="body-row split-3-3-4 left-padding-1 guided">
|
|
|
|
<div className="body-item-title left-padding-2">PyTorch(.pth)</div>
|
|
|
|
<div className="body-item-text">
|
|
|
|
<div>{pyTorchModel?.name}</div>
|
|
|
|
</div>
|
|
|
|
<div className="body-button-container">
|
|
|
|
<div className="body-button" onClick={onPyTorchFileLoadClicked}>select</div>
|
2023-01-08 14:28:57 +03:00
|
|
|
<div className="body-button left-margin-1" onClick={onPyTorchFileClearClicked}>clear</div>
|
2023-01-07 14:07:39 +03:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div className="body-row split-3-3-4 left-padding-1 guided">
|
|
|
|
<div className="body-item-title left-padding-2">Config(.json)</div>
|
|
|
|
<div className="body-item-text">
|
|
|
|
<div>{configFile?.name}</div>
|
|
|
|
</div>
|
|
|
|
<div className="body-button-container">
|
|
|
|
<div className="body-button" onClick={onConfigFileLoadClicked}>select</div>
|
2023-01-08 14:28:57 +03:00
|
|
|
<div className="body-button left-margin-1" onClick={onConfigFileClearClicked}>clear</div>
|
2023-01-07 14:07:39 +03:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div className="body-row split-3-3-4 left-padding-1 guided">
|
|
|
|
<div className="body-item-title left-padding-2">Onnx(.onnx)</div>
|
|
|
|
<div className="body-item-text">
|
|
|
|
<div>{onnxModel?.name}</div>
|
|
|
|
</div>
|
|
|
|
<div className="body-button-container">
|
|
|
|
<div className="body-button" onClick={onOnnxFileLoadClicked}>select</div>
|
2023-01-08 14:28:57 +03:00
|
|
|
<div className="body-button left-margin-1" onClick={onOnnxFileClearClicked}>clear</div>
|
2023-01-07 14:07:39 +03:00
|
|
|
</div>
|
|
|
|
</div>
|
2023-01-07 18:25:21 +03:00
|
|
|
<div className="body-row split-3-3-4 left-padding-1 guided">
|
|
|
|
<div className="body-item-title left-padding-2"></div>
|
|
|
|
<div className="body-item-text">
|
2023-01-08 14:28:57 +03:00
|
|
|
{props.isUploading ? `uploading.... ${props.uploadProgress}%` : ""}
|
2023-01-07 18:25:21 +03:00
|
|
|
</div>
|
|
|
|
<div className="body-button-container">
|
|
|
|
<div className="body-button" onClick={onModelUploadClicked}>upload</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2023-01-07 14:07:39 +03:00
|
|
|
</>
|
|
|
|
)
|
2023-01-08 14:28:57 +03:00
|
|
|
}, [pyTorchModel, configFile, onnxModel, props.loadModelFunc, props.isUploading, props.uploadProgress])
|
2023-01-07 14:07:39 +03:00
|
|
|
|
|
|
|
const protocolRow = useMemo(() => {
|
|
|
|
const onProtocolChanged = async (val: Protocol) => {
|
|
|
|
setProtocol(val)
|
|
|
|
}
|
|
|
|
return (
|
|
|
|
<div className="body-row split-3-7 left-padding-1 guided">
|
|
|
|
<div className="body-item-title left-padding-1">Protocol</div>
|
|
|
|
<div className="body-select-container">
|
|
|
|
<select className="body-select" value={protocol} onChange={(e) => {
|
|
|
|
onProtocolChanged(e.target.value as
|
|
|
|
Protocol)
|
|
|
|
}}>
|
|
|
|
{
|
|
|
|
Object.values(Protocol).map(x => {
|
|
|
|
return <option key={x} value={x}>{x}</option>
|
|
|
|
})
|
|
|
|
}
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
)
|
|
|
|
}, [protocol])
|
|
|
|
|
|
|
|
const frameworkRow = useMemo(() => {
|
|
|
|
const onFrameworkChanged = async (val: Framework) => {
|
|
|
|
setFramework(val)
|
|
|
|
}
|
|
|
|
return (
|
|
|
|
<div className="body-row split-3-7 left-padding-1 guided">
|
|
|
|
<div className="body-item-title left-padding-1">Framework</div>
|
|
|
|
<div className="body-select-container">
|
|
|
|
<select className="body-select" value={framework} onChange={(e) => {
|
|
|
|
onFrameworkChanged(e.target.value as
|
|
|
|
Framework)
|
|
|
|
}}>
|
|
|
|
{
|
|
|
|
Object.values(Framework).map(x => {
|
|
|
|
return <option key={x} value={x}>{x}</option>
|
|
|
|
})
|
|
|
|
}
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
)
|
|
|
|
}, [framework])
|
|
|
|
|
|
|
|
const onnxExecutionProviderRow = useMemo(() => {
|
|
|
|
if (framework != "ONNX") {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
const onOnnxExecutionProviderChanged = async (val: OnnxExecutionProvider) => {
|
|
|
|
setOnnxExecutionProvider(val)
|
|
|
|
}
|
|
|
|
return (
|
|
|
|
<div className="body-row split-3-7 left-padding-1">
|
|
|
|
<div className="body-item-title left-padding-2">OnnxExecutionProvider</div>
|
|
|
|
<div className="body-select-container">
|
|
|
|
<select className="body-select" value={onnxExecutionProvider} onChange={(e) => {
|
|
|
|
onOnnxExecutionProviderChanged(e.target.value as
|
|
|
|
OnnxExecutionProvider)
|
|
|
|
}}>
|
|
|
|
{
|
|
|
|
Object.values(OnnxExecutionProvider).map(x => {
|
|
|
|
return <option key={x} value={x}>{x}</option>
|
|
|
|
})
|
|
|
|
}
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
)
|
2023-01-07 18:25:21 +03:00
|
|
|
}, [onnxExecutionProvider, framework, mmvcServerUrl])
|
2023-01-07 14:07:39 +03:00
|
|
|
|
|
|
|
const serverSetting = useMemo(() => {
|
|
|
|
return (
|
|
|
|
<>
|
|
|
|
<div className="body-row split-3-7 left-padding-1">
|
|
|
|
<div className="body-sub-section-title">Server Setting</div>
|
|
|
|
<div className="body-select-container">
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
{mmvcServerUrlRow}
|
|
|
|
{uploadeModelRow}
|
|
|
|
{frameworkRow}
|
|
|
|
{onnxExecutionProviderRow}
|
|
|
|
{protocolRow}
|
|
|
|
</>
|
|
|
|
)
|
|
|
|
}, [mmvcServerUrlRow, uploadeModelRow, frameworkRow, onnxExecutionProviderRow, protocolRow])
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
serverSetting,
|
|
|
|
mmvcServerUrl,
|
|
|
|
pyTorchModel,
|
|
|
|
configFile,
|
|
|
|
onnxModel,
|
|
|
|
framework,
|
|
|
|
onnxExecutionProvider,
|
|
|
|
protocol,
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|