import { DefaultVoiceChangerOptions, OnnxExecutionProvider, Protocol, Framework, fileSelector, ServerSettingKey } from "@dannadori/voice-changer-client-js" import React from "react" import { useMemo, useState } from "react" import { ClientState } from "./hooks/useClient" export type UseServerSettingProps = { clientState: ClientState loadModelFunc: (() => Promise) | undefined uploadProgress: number, isUploading: boolean } export type ServerSettingState = { serverSetting: JSX.Element; mmvcServerUrl: string; pyTorchModel: File | null; configFile: File | null; onnxModel: File | null; framework: string; onnxExecutionProvider: OnnxExecutionProvider; protocol: Protocol; } export const useServerSetting = (props: UseServerSettingProps): ServerSettingState => { const [mmvcServerUrl, setMmvcServerUrl] = useState(DefaultVoiceChangerOptions.mmvcServerUrl) const [pyTorchModel, setPyTorchModel] = useState(null) const [configFile, setConfigFile] = useState(null) const [onnxModel, setOnnxModel] = useState(null) const [protocol, setProtocol] = useState("sio") const [onnxExecutionProvider, setOnnxExecutionProvider] = useState("CPUExecutionProvider") const [framework, setFramework] = useState("PyTorch") const mmvcServerUrlRow = useMemo(() => { const onSetServerClicked = async () => { const input = document.getElementById("mmvc-server-url") as HTMLInputElement setMmvcServerUrl(input.value) } return (
MMVC Server
set
) }, []) const uploadeModelRow = useMemo(() => { const onPyTorchFileLoadClicked = async () => { const file = await fileSelector("") if (file.name.endsWith(".pth") == false) { alert("モデルファイルの拡張子はpthである必要があります。") return } setPyTorchModel(file) } const onPyTorchFileClearClicked = () => { setPyTorchModel(null) } const onConfigFileLoadClicked = async () => { const file = await fileSelector("") if (file.name.endsWith(".json") == false) { alert("モデルファイルの拡張子はjsonである必要があります。") return } setConfigFile(file) } const onConfigFileClearClicked = () => { setConfigFile(null) } const onOnnxFileLoadClicked = async () => { const file = await fileSelector("") if (file.name.endsWith(".onnx") == false) { alert("モデルファイルの拡張子はonnxである必要があります。") return } setOnnxModel(file) } const onOnnxFileClearClicked = () => { setOnnxModel(null) } const onModelUploadClicked = async () => { if (!props.loadModelFunc) { return } props.loadModelFunc() } return ( <>
Model Uploader
PyTorch(.pth)
{pyTorchModel?.name}
select
clear
Config(.json)
{configFile?.name}
select
clear
Onnx(.onnx)
{onnxModel?.name}
select
clear
{props.isUploading ? `uploading.... ${props.uploadProgress}%` : ""}
upload
) }, [pyTorchModel, configFile, onnxModel, props.loadModelFunc, props.isUploading, props.uploadProgress]) const protocolRow = useMemo(() => { const onProtocolChanged = async (val: Protocol) => { setProtocol(val) } return (
Protocol
) }, [protocol]) const frameworkRow = useMemo(() => { const onFrameworkChanged = async (val: Framework) => { setFramework(val) } return (
Framework
) }, [framework]) const onnxExecutionProviderRow = useMemo(() => { if (framework != "ONNX") { return } const onOnnxExecutionProviderChanged = async (val: OnnxExecutionProvider) => { setOnnxExecutionProvider(val) } return (
OnnxExecutionProvider
) }, [onnxExecutionProvider, framework, mmvcServerUrl]) const serverSetting = useMemo(() => { return ( <>
Server Setting
{mmvcServerUrlRow} {uploadeModelRow} {frameworkRow} {onnxExecutionProviderRow} {protocolRow} ) }, [mmvcServerUrlRow, uploadeModelRow, frameworkRow, onnxExecutionProviderRow, protocolRow]) return { serverSetting, mmvcServerUrl, pyTorchModel, configFile, onnxModel, framework, onnxExecutionProvider, protocol, } }