2023-02-19 10:12:25 +09:00
|
|
|
|
import { useState, useMemo, useEffect } from "react"
|
2023-02-19 10:20:58 +09:00
|
|
|
|
import { VoiceChangerServerSetting, ServerInfo, ServerSettingKey, INDEXEDDB_KEY_SERVER, INDEXEDDB_KEY_MODEL_DATA, DefaultServerSetting } from "../const"
|
2023-01-12 23:01:45 +09:00
|
|
|
|
import { VoiceChangerClient } from "../VoiceChangerClient"
|
2023-01-29 09:42:45 +09:00
|
|
|
|
import { useIndexedDB } from "./useIndexedDB"
|
2023-01-12 16:38:45 +09:00
|
|
|
|
|
|
|
|
|
|
2023-01-29 14:41:44 +09:00
|
|
|
|
type ModelData = {
|
2023-01-29 15:25:44 +09:00
|
|
|
|
file?: File
|
|
|
|
|
data?: ArrayBuffer
|
|
|
|
|
filename?: string
|
2023-01-29 14:41:44 +09:00
|
|
|
|
}
|
|
|
|
|
|
2023-01-12 16:38:45 +09:00
|
|
|
|
export type FileUploadSetting = {
|
2023-01-29 14:41:44 +09:00
|
|
|
|
pyTorchModel: ModelData | null
|
|
|
|
|
onnxModel: ModelData | null
|
|
|
|
|
configFile: ModelData | null
|
2023-01-12 16:38:45 +09:00
|
|
|
|
}
|
2023-01-29 14:41:44 +09:00
|
|
|
|
|
2023-01-12 16:38:45 +09:00
|
|
|
|
const InitialFileUploadSetting: FileUploadSetting = {
|
|
|
|
|
pyTorchModel: null,
|
|
|
|
|
configFile: null,
|
|
|
|
|
onnxModel: null,
|
|
|
|
|
}
|
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 = {
|
2023-02-19 10:12:25 +09:00
|
|
|
|
serverSetting: ServerInfo
|
|
|
|
|
updateServerSettings: (setting: ServerInfo) => Promise<void>
|
2023-01-29 09:42:45 +09:00
|
|
|
|
clearSetting: () => Promise<void>
|
2023-01-12 16:38:45 +09:00
|
|
|
|
reloadServerInfo: () => Promise<void>;
|
2023-02-19 10:12:25 +09:00
|
|
|
|
|
|
|
|
|
fileUploadSetting: FileUploadSetting
|
2023-01-12 16:38:45 +09:00
|
|
|
|
setFileUploadSetting: (val: FileUploadSetting) => void
|
|
|
|
|
loadModel: () => Promise<void>
|
|
|
|
|
uploadProgress: number
|
|
|
|
|
isUploading: boolean
|
2023-02-19 10:12:25 +09:00
|
|
|
|
|
2023-01-12 16:38:45 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const useServerSetting = (props: UseServerSettingProps): ServerSettingState => {
|
2023-02-19 10:12:25 +09:00
|
|
|
|
// const settingRef = useRef<VoiceChangerServerSetting>(DefaultVoiceChangerServerSetting)
|
|
|
|
|
const [serverSetting, setServerSetting] = useState<ServerInfo>(DefaultServerSetting)
|
2023-01-12 16:38:45 +09:00
|
|
|
|
const [fileUploadSetting, setFileUploadSetting] = useState<FileUploadSetting>(InitialFileUploadSetting)
|
2023-01-29 09:42:45 +09:00
|
|
|
|
const { setItem, getItem, removeItem } = useIndexedDB()
|
|
|
|
|
|
|
|
|
|
|
2023-02-19 06:25:22 +09:00
|
|
|
|
// DBから設定取得(キャッシュによる初期化)
|
2023-01-29 09:42:45 +09:00
|
|
|
|
useEffect(() => {
|
|
|
|
|
const loadCache = async () => {
|
|
|
|
|
const setting = await getItem(INDEXEDDB_KEY_SERVER)
|
|
|
|
|
if (!setting) {
|
|
|
|
|
} else {
|
2023-02-19 10:12:25 +09:00
|
|
|
|
setServerSetting(setting as ServerInfo)
|
2023-01-29 09:42:45 +09:00
|
|
|
|
}
|
2023-01-29 15:25:44 +09:00
|
|
|
|
|
|
|
|
|
const fileuploadSetting = await getItem(INDEXEDDB_KEY_MODEL_DATA)
|
|
|
|
|
if (!fileuploadSetting) {
|
|
|
|
|
} else {
|
|
|
|
|
setFileUploadSetting(fileuploadSetting as FileUploadSetting)
|
|
|
|
|
}
|
2023-01-29 09:42:45 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
loadCache()
|
|
|
|
|
}, [])
|
2023-02-19 06:25:22 +09:00
|
|
|
|
|
2023-02-19 10:12:25 +09:00
|
|
|
|
// クライアントへ設定反映 (キャッシュ反映)
|
2023-01-29 09:42:45 +09:00
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (!props.voiceChangerClient) return
|
2023-02-19 10:12:25 +09:00
|
|
|
|
for (let i = 0; i < Object.values(ServerSettingKey).length; i++) {
|
|
|
|
|
const k = Object.values(ServerSettingKey)[i] as keyof VoiceChangerServerSetting
|
|
|
|
|
const v = serverSetting[k]
|
|
|
|
|
if (v) {
|
|
|
|
|
props.voiceChangerClient.updateServerSettings(k, "" + v)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
reloadServerInfo()
|
|
|
|
|
}, [props.voiceChangerClient])
|
2023-01-12 16:38:45 +09:00
|
|
|
|
|
|
|
|
|
//////////////
|
|
|
|
|
// 設定
|
|
|
|
|
/////////////
|
2023-02-19 10:12:25 +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]
|
|
|
|
|
if (cur_v != new_v) {
|
|
|
|
|
const res = await props.voiceChangerClient.updateServerSettings(k, "" + new_v)
|
|
|
|
|
|
|
|
|
|
setServerSetting(res)
|
|
|
|
|
setItem(INDEXEDDB_KEY_SERVER, res)
|
|
|
|
|
}
|
2023-01-29 09:42:45 +09:00
|
|
|
|
}
|
2023-01-12 16:38:45 +09:00
|
|
|
|
}
|
2023-02-19 10:12:25 +09:00
|
|
|
|
}, [props.voiceChangerClient, serverSetting])
|
2023-02-19 06:25:22 +09:00
|
|
|
|
|
2023-01-12 16:38:45 +09:00
|
|
|
|
|
|
|
|
|
//////////////
|
|
|
|
|
// 操作
|
|
|
|
|
/////////////
|
|
|
|
|
const [uploadProgress, setUploadProgress] = useState<number>(0)
|
|
|
|
|
const [isUploading, setIsUploading] = useState<boolean>(false)
|
|
|
|
|
|
|
|
|
|
// (e) モデルアップロード
|
|
|
|
|
const _uploadFile = useMemo(() => {
|
2023-01-29 14:41:44 +09:00
|
|
|
|
return async (modelData: ModelData, onprogress: (progress: number, end: boolean) => void) => {
|
2023-01-12 16:38:45 +09:00
|
|
|
|
if (!props.voiceChangerClient) return
|
2023-01-29 15:25:44 +09:00
|
|
|
|
const num = await props.voiceChangerClient.uploadFile(modelData.data!, modelData.filename!, onprogress)
|
|
|
|
|
const res = await props.voiceChangerClient.concatUploadedFile(modelData.filename!, num)
|
2023-01-12 16:38:45 +09:00
|
|
|
|
console.log("uploaded", num, res)
|
|
|
|
|
}
|
|
|
|
|
}, [props.voiceChangerClient])
|
|
|
|
|
const loadModel = useMemo(() => {
|
|
|
|
|
return async () => {
|
|
|
|
|
if (!fileUploadSetting.pyTorchModel && !fileUploadSetting.onnxModel) {
|
|
|
|
|
alert("PyTorchモデルとONNXモデルのどちらか一つ以上指定する必要があります。")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if (!fileUploadSetting.configFile) {
|
|
|
|
|
alert("Configファイルを指定する必要があります。")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if (!props.voiceChangerClient) return
|
2023-01-29 14:41:44 +09:00
|
|
|
|
|
2023-01-12 16:38:45 +09:00
|
|
|
|
setUploadProgress(0)
|
|
|
|
|
setIsUploading(true)
|
2023-01-29 14:41:44 +09:00
|
|
|
|
|
2023-01-29 15:25:44 +09:00
|
|
|
|
// ファイルをメモリにロード
|
|
|
|
|
if (fileUploadSetting.onnxModel && !fileUploadSetting.onnxModel.data) {
|
|
|
|
|
fileUploadSetting.onnxModel.data = await fileUploadSetting.onnxModel.file!.arrayBuffer()
|
|
|
|
|
fileUploadSetting.onnxModel.filename = await fileUploadSetting.onnxModel.file!.name
|
|
|
|
|
}
|
|
|
|
|
if (fileUploadSetting.pyTorchModel && !fileUploadSetting.pyTorchModel.data) {
|
|
|
|
|
fileUploadSetting.pyTorchModel.data = await fileUploadSetting.pyTorchModel.file!.arrayBuffer()
|
|
|
|
|
fileUploadSetting.pyTorchModel.filename = await fileUploadSetting.pyTorchModel.file!.name
|
|
|
|
|
}
|
|
|
|
|
if (!fileUploadSetting.configFile.data) {
|
|
|
|
|
fileUploadSetting.configFile.data = await fileUploadSetting.configFile.file!.arrayBuffer()
|
|
|
|
|
fileUploadSetting.configFile.filename = await fileUploadSetting.configFile.file!.name
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ファイルをサーバにアップロード
|
2023-01-29 14:41:44 +09:00
|
|
|
|
const models = [fileUploadSetting.onnxModel, fileUploadSetting.pyTorchModel].filter(x => { return x != null }) as ModelData[]
|
2023-01-12 16:38:45 +09:00
|
|
|
|
for (let i = 0; i < models.length; i++) {
|
|
|
|
|
const progRate = 1 / models.length
|
|
|
|
|
const progOffset = 100 * i * progRate
|
2023-01-12 23:01:45 +09:00
|
|
|
|
await _uploadFile(models[i], (progress: number, _end: boolean) => {
|
2023-01-12 16:38:45 +09:00
|
|
|
|
// console.log(progress * progRate + progOffset, end, progRate,)
|
|
|
|
|
setUploadProgress(progress * progRate + progOffset)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await _uploadFile(fileUploadSetting.configFile, (progress: number, end: boolean) => {
|
|
|
|
|
console.log(progress, end)
|
|
|
|
|
})
|
|
|
|
|
|
2023-01-29 15:25:44 +09:00
|
|
|
|
const loadPromise = props.voiceChangerClient.loadModel(fileUploadSetting.configFile.filename!, fileUploadSetting.pyTorchModel?.filename || null, fileUploadSetting.onnxModel?.filename || null)
|
|
|
|
|
|
|
|
|
|
// サーバでロード中にキャッシュにセーブ
|
|
|
|
|
const saveData: FileUploadSetting = {
|
|
|
|
|
pyTorchModel: fileUploadSetting.pyTorchModel ? { data: fileUploadSetting.pyTorchModel.data, filename: fileUploadSetting.pyTorchModel.filename } : null,
|
|
|
|
|
onnxModel: fileUploadSetting.onnxModel ? { data: fileUploadSetting.onnxModel.data, filename: fileUploadSetting.onnxModel.filename } : null,
|
|
|
|
|
configFile: { data: fileUploadSetting.configFile.data, filename: fileUploadSetting.configFile.filename }
|
|
|
|
|
}
|
|
|
|
|
setItem(INDEXEDDB_KEY_MODEL_DATA, saveData)
|
|
|
|
|
|
|
|
|
|
await loadPromise
|
2023-01-12 16:38:45 +09:00
|
|
|
|
setUploadProgress(0)
|
|
|
|
|
setIsUploading(false)
|
2023-01-28 15:56:56 +09:00
|
|
|
|
reloadServerInfo()
|
2023-01-12 16:38:45 +09:00
|
|
|
|
}
|
|
|
|
|
}, [fileUploadSetting, props.voiceChangerClient])
|
|
|
|
|
|
|
|
|
|
const reloadServerInfo = useMemo(() => {
|
|
|
|
|
return async () => {
|
2023-02-19 10:12:25 +09:00
|
|
|
|
console.log("reload server info")
|
|
|
|
|
|
2023-01-12 16:38:45 +09:00
|
|
|
|
if (!props.voiceChangerClient) return
|
|
|
|
|
const res = await props.voiceChangerClient.getServerSettings()
|
2023-02-19 10:12:25 +09:00
|
|
|
|
setServerSetting(res)
|
|
|
|
|
setItem(INDEXEDDB_KEY_SERVER, res)
|
2023-01-12 16:38:45 +09:00
|
|
|
|
}
|
|
|
|
|
}, [props.voiceChangerClient])
|
|
|
|
|
|
2023-01-29 09:42:45 +09:00
|
|
|
|
const clearSetting = async () => {
|
|
|
|
|
await removeItem(INDEXEDDB_KEY_SERVER)
|
2023-01-29 15:25:44 +09:00
|
|
|
|
await removeItem(INDEXEDDB_KEY_MODEL_DATA)
|
2023-01-29 09:42:45 +09:00
|
|
|
|
}
|
2023-01-12 18:06:15 +09:00
|
|
|
|
|
|
|
|
|
|
2023-01-12 16:38:45 +09:00
|
|
|
|
return {
|
2023-02-19 10:12:25 +09:00
|
|
|
|
serverSetting,
|
|
|
|
|
updateServerSettings,
|
2023-01-29 09:42:45 +09:00
|
|
|
|
clearSetting,
|
2023-01-12 16:38:45 +09:00
|
|
|
|
reloadServerInfo,
|
2023-02-19 10:12:25 +09:00
|
|
|
|
|
|
|
|
|
fileUploadSetting,
|
2023-01-12 16:38:45 +09:00
|
|
|
|
setFileUploadSetting,
|
|
|
|
|
loadModel,
|
|
|
|
|
uploadProgress,
|
|
|
|
|
isUploading,
|
|
|
|
|
}
|
|
|
|
|
}
|