voice-changer/server/restapi/MMVC_Rest_Fileuploader.py

123 lines
4.9 KiB
Python
Raw Normal View History

2023-05-07 23:51:24 +03:00
import json
2023-03-13 15:07:35 +03:00
import os
import shutil
2023-01-08 10:18:20 +03:00
from typing import Union
2022-12-31 12:56:23 +03:00
from fastapi import APIRouter
from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse
2023-04-27 17:38:25 +03:00
from fastapi import UploadFile, File, Form
2022-12-31 12:56:23 +03:00
2022-12-31 14:25:28 +03:00
from restapi.mods.FileUploader import upload_file, concat_file_chunks
2022-12-31 12:56:23 +03:00
from voice_changer.VoiceChangerManager import VoiceChangerManager
2023-04-10 18:21:17 +03:00
from const import MODEL_DIR, UPLOAD_DIR, ModelType
2023-05-08 19:16:13 +03:00
from voice_changer.utils.LoadModelParams import LoadModelParams
2023-04-28 00:39:51 +03:00
2023-04-27 17:38:25 +03:00
2023-01-14 19:30:46 +03:00
os.makedirs(UPLOAD_DIR, exist_ok=True)
os.makedirs(MODEL_DIR, exist_ok=True)
2022-12-31 12:56:23 +03:00
2023-03-13 15:07:35 +03:00
2022-12-31 12:56:23 +03:00
class MMVC_Rest_Fileuploader:
2023-03-13 15:07:35 +03:00
def __init__(self, voiceChangerManager: VoiceChangerManager):
2022-12-31 12:56:23 +03:00
self.voiceChangerManager = voiceChangerManager
self.router = APIRouter()
2023-01-07 18:25:21 +03:00
self.router.add_api_route("/info", self.get_info, methods=["GET"])
2023-05-06 22:18:18 +03:00
self.router.add_api_route("/performance", self.get_performance, methods=["GET"])
2023-04-27 17:38:25 +03:00
self.router.add_api_route(
"/upload_file", self.post_upload_file, methods=["POST"]
)
self.router.add_api_route(
"/concat_uploaded_file", self.post_concat_uploaded_file, methods=["POST"]
)
self.router.add_api_route(
"/update_settings", self.post_update_settings, methods=["POST"]
)
2022-12-31 12:56:23 +03:00
self.router.add_api_route("/load_model", self.post_load_model, methods=["POST"])
2023-04-10 18:21:17 +03:00
self.router.add_api_route("/model_type", self.post_model_type, methods=["POST"])
self.router.add_api_route("/model_type", self.get_model_type, methods=["GET"])
2023-04-13 02:00:28 +03:00
self.router.add_api_route("/onnx", self.get_onnx, methods=["GET"])
2023-04-30 20:34:01 +03:00
self.router.add_api_route(
"/merge_model", self.post_merge_models, methods=["POST"]
)
2022-12-31 12:56:23 +03:00
def post_upload_file(self, file: UploadFile = File(...), filename: str = Form(...)):
2023-01-10 16:49:16 +03:00
res = upload_file(UPLOAD_DIR, file, filename)
json_compatible_item_data = jsonable_encoder(res)
return JSONResponse(content=json_compatible_item_data)
2022-12-31 12:56:23 +03:00
2023-04-27 17:38:25 +03:00
def post_concat_uploaded_file(
self, filename: str = Form(...), filenameChunkNum: int = Form(...)
):
2023-05-07 23:51:24 +03:00
res = concat_file_chunks(UPLOAD_DIR, filename, filenameChunkNum, UPLOAD_DIR)
2023-01-10 16:49:16 +03:00
json_compatible_item_data = jsonable_encoder(res)
return JSONResponse(content=json_compatible_item_data)
2023-03-13 15:07:35 +03:00
2023-01-07 18:25:21 +03:00
def get_info(self):
info = self.voiceChangerManager.get_info()
json_compatible_item_data = jsonable_encoder(info)
return JSONResponse(content=json_compatible_item_data)
2023-05-06 22:18:18 +03:00
def get_performance(self):
info = self.voiceChangerManager.get_performance()
json_compatible_item_data = jsonable_encoder(info)
return JSONResponse(content=json_compatible_item_data)
2023-04-27 17:38:25 +03:00
def post_update_settings(
self, key: str = Form(...), val: Union[int, str, float] = Form(...)
):
2023-05-03 11:12:40 +03:00
print("[Voice Changer] update configuration:", key, val)
info = self.voiceChangerManager.update_settings(key, val)
2023-01-08 10:18:20 +03:00
json_compatible_item_data = jsonable_encoder(info)
return JSONResponse(content=json_compatible_item_data)
2022-12-31 12:56:23 +03:00
def post_load_model(
self,
2023-04-15 18:38:48 +03:00
slot: int = Form(...),
2023-04-07 21:56:40 +03:00
isHalf: bool = Form(...),
2023-04-21 23:42:24 +03:00
params: str = Form(...),
2022-12-31 12:56:23 +03:00
):
2023-05-07 23:51:24 +03:00
paramDict = json.loads(params)
2023-05-16 04:38:23 +03:00
# print("paramDict", paramDict)
2023-04-28 00:39:51 +03:00
2023-04-16 03:56:12 +03:00
# Change Filepath
2023-05-07 23:51:24 +03:00
newFilesDict = {}
for key, val in paramDict["files"].items():
if val != "-" and val != "":
uploadPath = os.path.join(UPLOAD_DIR, val)
storePath = os.path.join(UPLOAD_DIR, f"{slot}", val)
storeDir = os.path.dirname(storePath)
os.makedirs(storeDir, exist_ok=True)
shutil.move(uploadPath, storePath)
newFilesDict[key] = storePath
paramDict["files"] = newFilesDict
props: LoadModelParams = LoadModelParams(
2023-05-08 19:16:13 +03:00
slot=slot, isHalf=isHalf, params=paramDict
2023-05-07 23:51:24 +03:00
)
2023-04-15 18:38:48 +03:00
2023-04-16 03:56:12 +03:00
info = self.voiceChangerManager.loadModel(props)
2023-01-10 16:49:16 +03:00
json_compatible_item_data = jsonable_encoder(info)
return JSONResponse(content=json_compatible_item_data)
2022-12-31 12:56:23 +03:00
2023-04-28 00:39:51 +03:00
def post_model_type(self, modelType: ModelType = Form(...)):
2023-04-10 18:21:17 +03:00
info = self.voiceChangerManager.switchModelType(modelType)
json_compatible_item_data = jsonable_encoder(info)
return JSONResponse(content=json_compatible_item_data)
2023-04-28 00:39:51 +03:00
def get_model_type(self):
2023-04-18 21:49:37 +03:00
info = self.voiceChangerManager.getModelType()
2023-04-10 18:21:17 +03:00
json_compatible_item_data = jsonable_encoder(info)
return JSONResponse(content=json_compatible_item_data)
2023-04-13 02:00:28 +03:00
def get_onnx(self):
info = self.voiceChangerManager.export2onnx()
json_compatible_item_data = jsonable_encoder(info)
return JSONResponse(content=json_compatible_item_data)
2023-04-30 20:34:01 +03:00
def post_merge_models(self, request: str = Form(...)):
print(request)
info = self.voiceChangerManager.merge_models(request)
json_compatible_item_data = jsonable_encoder(info)
return JSONResponse(content=json_compatible_item_data)