voice-changer/client/lib/src/hooks/useServerSetting.ts

224 lines
7.1 KiB
TypeScript
Raw Normal View History

2023-06-24 08:52:02 +09:00
import { useState, useMemo } from "react"
import { VoiceChangerServerSetting, ServerInfo, ServerSettingKey, OnnxExporterInfo, MergeModelRequest, VoiceChangerType, DefaultServerSetting } from "../const"
2023-01-12 23:01:45 +09:00
import { VoiceChangerClient } from "../VoiceChangerClient"
2023-01-29 14:41:44 +09:00
2023-06-08 03:08:59 +09:00
export const ModelAssetName = {
iconFile: "iconFile"
} as const
export type ModelAssetName = typeof ModelAssetName[keyof typeof ModelAssetName]
2023-06-19 11:40:16 +09:00
export const ModelFileKind = {
"mmvcv13Config": "mmvcv13Config",
"mmvcv13Model": "mmvcv13Model",
"mmvcv15Config": "mmvcv15Config",
"mmvcv15Model": "mmvcv15Model",
2023-06-25 18:02:43 +09:00
"mmvcv15Correspondence": "mmvcv15Correspondence",
2023-06-19 11:40:16 +09:00
"soVitsSvc40Config": "soVitsSvc40Config",
"soVitsSvc40Model": "soVitsSvc40Model",
"soVitsSvc40Cluster": "soVitsSvc40Cluster",
"rvcModel": "rvcModel",
"rvcIndex": "rvcIndex",
"ddspSvcModel": "ddspSvcModel",
"ddspSvcModelConfig": "ddspSvcModelConfig",
"ddspSvcDiffusion": "ddspSvcDiffusion",
"ddspSvcDiffusionConfig": "ddspSvcDiffusionConfig",
} as const
export type ModelFileKind = typeof ModelFileKind[keyof typeof ModelFileKind]
export type ModelFile = {
file: File,
kind: ModelFileKind
2023-06-20 06:39:39 +09:00
dir: string
2023-06-19 11:40:16 +09:00
}
export type ModelUploadSetting = {
voiceChangerType: VoiceChangerType,
slot: number
isSampleMode: boolean
sampleId: string | null
files: ModelFile[]
2023-06-21 09:18:51 +09:00
params: any
2023-06-19 11:40:16 +09:00
}
export type ModelFileForServer = Omit<ModelFile, "file"> & {
name: string,
kind: ModelFileKind
}
export type ModelUploadSettingForServer = Omit<ModelUploadSetting, "files"> & {
files: ModelFileForServer[]
}
2023-06-08 03:08:59 +09:00
type AssetUploadSetting = {
slot: number
name: ModelAssetName
file: string
2023-01-12 16:38:45 +09:00
}
2023-01-29 14:41:44 +09:00
2023-01-12 16:38:45 +09:00
export type UseServerSettingProps = {
voiceChangerClient: VoiceChangerClient | null
}
export type ServerSettingState = {
serverSetting: ServerInfo
updateServerSettings: (setting: ServerInfo) => Promise<void>
2023-01-12 16:38:45 +09:00
reloadServerInfo: () => Promise<void>;
2023-06-19 11:40:16 +09:00
uploadModel: (setting: ModelUploadSetting) => Promise<void>
2023-01-12 16:38:45 +09:00
uploadProgress: number
isUploading: boolean
2023-04-13 08:00:28 +09:00
getOnnx: () => Promise<OnnxExporterInfo>
2023-05-01 02:34:01 +09:00
mergeModel: (request: MergeModelRequest) => Promise<ServerInfo>
2023-05-21 04:21:54 +09:00
updateModelDefault: () => Promise<ServerInfo>
2023-06-08 03:08:59 +09:00
updateModelInfo: (slot: number, key: string, val: string) => Promise<ServerInfo>
uploadAssets: (slot: number, name: ModelAssetName, file: File) => Promise<void>
2023-01-12 16:38:45 +09:00
}
export const useServerSetting = (props: UseServerSettingProps): ServerSettingState => {
2023-06-24 08:52:02 +09:00
const [serverSetting, setServerSetting] = useState<ServerInfo>(DefaultServerSetting)
2023-01-12 16:38:45 +09:00
//////////////
// 設定
/////////////
const updateServerSettings = useMemo(() => {
return async (setting: ServerInfo) => {
if (!props.voiceChangerClient) return
for (let i = 0; i < Object.values(ServerSettingKey).length; i++) {
const k = Object.values(ServerSettingKey)[i] as keyof VoiceChangerServerSetting
const cur_v = serverSetting[k]
const new_v = setting[k]
2023-06-29 04:45:06 +09:00
if (cur_v != new_v) {
const res = await props.voiceChangerClient.updateServerSettings(k, "" + new_v)
setServerSetting(res)
}
2023-01-29 09:42:45 +09:00
}
2023-01-12 16:38:45 +09:00
}
}, [props.voiceChangerClient, serverSetting])
2023-04-21 15:48:12 +09:00
2023-01-12 16:38:45 +09:00
//////////////
// 操作
/////////////
const [uploadProgress, setUploadProgress] = useState<number>(0)
const [isUploading, setIsUploading] = useState<boolean>(false)
// (e) モデルアップロード
2023-06-07 07:30:09 +09:00
const _uploadFile2 = useMemo(() => {
return async (file: File, onprogress: (progress: number, end: boolean) => void, dir: string = "") => {
if (!props.voiceChangerClient) return
2023-06-20 06:39:39 +09:00
const num = await props.voiceChangerClient.uploadFile2(dir, file, onprogress)
2023-06-07 07:30:09 +09:00
const res = await props.voiceChangerClient.concatUploadedFile(dir + file.name, num)
console.log("uploaded", num, res)
}
}, [props.voiceChangerClient])
2023-06-19 11:40:16 +09:00
// 新しいアップローダ
const uploadModel = useMemo(() => {
return async (setting: ModelUploadSetting) => {
if (!props.voiceChangerClient) {
return
}
setUploadProgress(0)
setIsUploading(true)
if (setting.isSampleMode == false) {
const progRate = 1 / setting.files.length
for (let i = 0; i < setting.files.length; i++) {
const progOffset = 100 * i * progRate
await _uploadFile2(setting.files[i].file, (progress: number, _end: boolean) => {
setUploadProgress(progress * progRate + progOffset)
2023-06-20 06:39:39 +09:00
}, setting.files[i].dir)
2023-06-19 11:40:16 +09:00
}
}
const params: ModelUploadSettingForServer = {
2023-06-20 06:39:39 +09:00
...setting, files: setting.files.map((f) => { return { name: f.file.name, kind: f.kind, dir: f.dir } })
2023-06-19 11:40:16 +09:00
}
const loadPromise = props.voiceChangerClient.loadModel(
0,
false,
JSON.stringify(params),
)
await loadPromise
setUploadProgress(0)
setIsUploading(false)
reloadServerInfo()
}
}, [props.voiceChangerClient])
2023-06-08 03:08:59 +09:00
const uploadAssets = useMemo(() => {
return async (slot: number, name: ModelAssetName, file: File) => {
if (!props.voiceChangerClient) return
await _uploadFile2(file, (progress: number, _end: boolean) => {
console.log(progress, _end)
})
const assetUploadSetting: AssetUploadSetting = {
slot,
name,
file: file.name
}
await props.voiceChangerClient.uploadAssets(JSON.stringify(assetUploadSetting))
reloadServerInfo()
}
2023-06-24 08:52:02 +09:00
}, [props.voiceChangerClient])
2023-06-08 03:08:59 +09:00
2023-01-12 16:38:45 +09:00
const reloadServerInfo = useMemo(() => {
return async () => {
2023-01-12 16:38:45 +09:00
if (!props.voiceChangerClient) return
const res = await props.voiceChangerClient.getServerSettings()
setServerSetting(res)
2023-01-12 16:38:45 +09:00
}
}, [props.voiceChangerClient])
2023-04-13 08:00:28 +09:00
const getOnnx = async () => {
return props.voiceChangerClient!.getOnnx()
}
2023-05-01 02:34:01 +09:00
const mergeModel = async (request: MergeModelRequest) => {
const serverInfo = await props.voiceChangerClient!.mergeModel(request)
setServerSetting(serverInfo)
return serverInfo
}
2023-05-21 04:21:54 +09:00
const updateModelDefault = async () => {
const serverInfo = await props.voiceChangerClient!.updateModelDefault()
setServerSetting(serverInfo)
return serverInfo
}
2023-06-08 03:08:59 +09:00
const updateModelInfo = async (slot: number, key: string, val: string) => {
const serverInfo = await props.voiceChangerClient!.updateModelInfo(slot, key, val)
setServerSetting(serverInfo)
return serverInfo
}
2023-05-21 04:21:54 +09:00
2023-01-12 16:38:45 +09:00
return {
serverSetting,
updateServerSettings,
2023-01-12 16:38:45 +09:00
reloadServerInfo,
2023-06-19 11:40:16 +09:00
uploadModel,
2023-01-12 16:38:45 +09:00
uploadProgress,
isUploading,
2023-04-13 08:00:28 +09:00
getOnnx,
2023-05-01 02:34:01 +09:00
mergeModel,
2023-05-21 04:21:54 +09:00
updateModelDefault,
2023-06-08 03:08:59 +09:00
updateModelInfo,
uploadAssets
2023-01-12 16:38:45 +09:00
}
}