mirror of
https://github.com/w-okada/voice-changer.git
synced 2025-03-12 19:07:49 +03:00
separate fastapi
This commit is contained in:
parent
fa00613dbe
commit
de1043aa8a
@ -1,11 +1,11 @@
|
|||||||
import sys, os, struct, argparse, shutil, base64, traceback
|
import sys, os, struct, argparse, shutil, traceback, base64, struct
|
||||||
|
import numpy as np
|
||||||
import misc.log_control
|
import misc.log_control
|
||||||
|
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from distutils.util import strtobool
|
from distutils.util import strtobool
|
||||||
|
|
||||||
import numpy as np
|
|
||||||
from scipy.io.wavfile import write, read
|
from scipy.io.wavfile import write, read
|
||||||
|
|
||||||
sys.path.append("MMVC_Trainer")
|
sys.path.append("MMVC_Trainer")
|
||||||
@ -41,13 +41,10 @@ from mods.ssl import create_self_signed_cert
|
|||||||
|
|
||||||
from voice_changer.VoiceChangerManager import VoiceChangerManager
|
from voice_changer.VoiceChangerManager import VoiceChangerManager
|
||||||
from sio.MMVC_SocketIOServer import MMVC_SocketIOServer
|
from sio.MMVC_SocketIOServer import MMVC_SocketIOServer
|
||||||
@dataclass
|
from restapi.MMVC_Rest_VoiceChanger import MMVC_Rest_VoiceChanger
|
||||||
class ExApplicationInfo():
|
from restapi.MMVC_Rest_Hello import MMVC_Rest_Hello
|
||||||
external_tensorboard_port: int
|
|
||||||
|
|
||||||
|
|
||||||
exApplitionInfo = ExApplicationInfo(external_tensorboard_port=0)
|
|
||||||
|
|
||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
class VoiceModel(BaseModel):
|
class VoiceModel(BaseModel):
|
||||||
gpu: int
|
gpu: int
|
||||||
@ -57,6 +54,16 @@ class VoiceModel(BaseModel):
|
|||||||
prefixChunkSize: int
|
prefixChunkSize: int
|
||||||
buffer: str
|
buffer: str
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class ExApplicationInfo():
|
||||||
|
external_tensorboard_port: int
|
||||||
|
|
||||||
|
|
||||||
|
exApplitionInfo = ExApplicationInfo(external_tensorboard_port=0)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def setupArgParser():
|
def setupArgParser():
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument("-t", type=str, default="MMVC",
|
parser.add_argument("-t", type=str, default="MMVC",
|
||||||
@ -146,17 +153,16 @@ if __name__ == thisFilename or args.colab == True:
|
|||||||
app_fastapi.mount(
|
app_fastapi.mount(
|
||||||
"/recorder", StaticFiles(directory="../frontend/dist", html=True), name="static")
|
"/recorder", StaticFiles(directory="../frontend/dist", html=True), name="static")
|
||||||
|
|
||||||
# sio = socketio.AsyncServer(
|
|
||||||
# async_mode='asgi',
|
|
||||||
# cors_allowed_origins='*'
|
|
||||||
# )
|
|
||||||
voiceChangerManager = VoiceChangerManager.get_instance()
|
voiceChangerManager = VoiceChangerManager.get_instance()
|
||||||
# namespace = MMVC_Namespace.get_instance(voiceChangerManager)
|
|
||||||
# sio.register_namespace(namespace)
|
|
||||||
sio = MMVC_SocketIOServer.get_instance(voiceChangerManager)
|
|
||||||
if CONFIG and MODEL:
|
if CONFIG and MODEL:
|
||||||
voiceChangerManager.loadModel(CONFIG, MODEL)
|
voiceChangerManager.loadModel(CONFIG, MODEL)
|
||||||
# namespace.loadWhisperModel("base")
|
sio = MMVC_SocketIOServer.get_instance(voiceChangerManager)
|
||||||
|
|
||||||
|
restHello = MMVC_Rest_Hello()
|
||||||
|
app_fastapi.include_router(restHello.router)
|
||||||
|
restVoiceChanger = MMVC_Rest_VoiceChanger(voiceChangerManager)
|
||||||
|
app_fastapi.include_router(restVoiceChanger.router)
|
||||||
|
|
||||||
|
|
||||||
app_socketio = socketio.ASGIApp(
|
app_socketio = socketio.ASGIApp(
|
||||||
sio,
|
sio,
|
||||||
@ -171,10 +177,6 @@ if __name__ == thisFilename or args.colab == True:
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@app_fastapi.get("/api/hello")
|
|
||||||
async def index():
|
|
||||||
return {"result": "Index"}
|
|
||||||
|
|
||||||
############
|
############
|
||||||
# File Uploder
|
# File Uploder
|
||||||
# ##########
|
# ##########
|
||||||
@ -233,8 +235,8 @@ if __name__ == thisFilename or args.colab == True:
|
|||||||
# Voice Changer
|
# Voice Changer
|
||||||
# ##########
|
# ##########
|
||||||
|
|
||||||
@app_fastapi.post("/test")
|
@app_fastapi.post("/test2")
|
||||||
async def post_test(voice: VoiceModel):
|
async def post_test2(voice: VoiceModel):
|
||||||
try:
|
try:
|
||||||
# print("POST REQUEST PROCESSING....")
|
# print("POST REQUEST PROCESSING....")
|
||||||
gpu = voice.gpu
|
gpu = voice.gpu
|
||||||
@ -342,7 +344,7 @@ if __name__ == thisFilename or args.colab == True:
|
|||||||
return JSONResponse(content=json_compatible_item_data)
|
return JSONResponse(content=json_compatible_item_data)
|
||||||
|
|
||||||
if __name__ == '__mp_main__':
|
if __name__ == '__mp_main__':
|
||||||
printMessage(f"PHASE2adasdfadfasd:{__name__}", level=2)
|
printMessage(f"PHASE2:{__name__}", level=2)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
printMessage(f"PHASE1:{__name__}", level=2)
|
printMessage(f"PHASE1:{__name__}", level=2)
|
||||||
|
13
server/restapi/MMVC_Rest_Hello.py
Normal file
13
server/restapi/MMVC_Rest_Hello.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
from fastapi import APIRouter
|
||||||
|
from fastapi.encoders import jsonable_encoder
|
||||||
|
from fastapi.responses import JSONResponse
|
||||||
|
class MMVC_Rest_Hello:
|
||||||
|
def __init__(self):
|
||||||
|
self.router = APIRouter()
|
||||||
|
self.router.add_api_route("/api/hello", self.hello, methods=["GET"])
|
||||||
|
|
||||||
|
def hello(self):
|
||||||
|
return {"result": "Index"}
|
||||||
|
|
||||||
|
|
||||||
|
|
71
server/restapi/MMVC_Rest_VoiceChanger.py
Normal file
71
server/restapi/MMVC_Rest_VoiceChanger.py
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
import base64, struct
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
from fastapi import APIRouter
|
||||||
|
from fastapi.encoders import jsonable_encoder
|
||||||
|
from fastapi.responses import JSONResponse
|
||||||
|
|
||||||
|
from voice_changer.VoiceChangerManager import VoiceChangerManager
|
||||||
|
from pydantic import BaseModel
|
||||||
|
import threading
|
||||||
|
|
||||||
|
class VoiceModel(BaseModel):
|
||||||
|
gpu: int
|
||||||
|
srcId: int
|
||||||
|
dstId: int
|
||||||
|
timestamp: int
|
||||||
|
prefixChunkSize: int
|
||||||
|
buffer: str
|
||||||
|
|
||||||
|
class MMVC_Rest_VoiceChanger:
|
||||||
|
def __init__(self, voiceChangerManager:VoiceChangerManager):
|
||||||
|
self.voiceChangerManager = voiceChangerManager
|
||||||
|
self.router = APIRouter()
|
||||||
|
self.router.add_api_route("/test", self.test, methods=["POST"])
|
||||||
|
self.tlock = threading.Lock()
|
||||||
|
|
||||||
|
|
||||||
|
def test(self, voice: VoiceModel):
|
||||||
|
try:
|
||||||
|
gpu = voice.gpu
|
||||||
|
srcId = voice.srcId
|
||||||
|
dstId = voice.dstId
|
||||||
|
timestamp = voice.timestamp
|
||||||
|
prefixChunkSize = voice.prefixChunkSize
|
||||||
|
buffer = voice.buffer
|
||||||
|
wav = base64.b64decode(buffer)
|
||||||
|
|
||||||
|
if wav == 0:
|
||||||
|
samplerate, data = read("dummy.wav")
|
||||||
|
unpackedData = data
|
||||||
|
else:
|
||||||
|
unpackedData = np.array(struct.unpack(
|
||||||
|
'<%sh' % (len(wav) // struct.calcsize('<h')), wav))
|
||||||
|
# write("logs/received_data.wav", 24000,
|
||||||
|
# unpackedData.astype(np.int16))
|
||||||
|
|
||||||
|
self.tlock.acquire()
|
||||||
|
changedVoice = self.voiceChangerManager.changeVoice(
|
||||||
|
gpu, srcId, dstId, timestamp, prefixChunkSize, unpackedData)
|
||||||
|
self.tlock.release()
|
||||||
|
|
||||||
|
changedVoiceBase64 = base64.b64encode(changedVoice).decode('utf-8')
|
||||||
|
data = {
|
||||||
|
"gpu": gpu,
|
||||||
|
"srcId": srcId,
|
||||||
|
"dstId": dstId,
|
||||||
|
"timestamp": timestamp,
|
||||||
|
"prefixChunkSize": prefixChunkSize,
|
||||||
|
"changedVoiceBase64": changedVoiceBase64
|
||||||
|
}
|
||||||
|
|
||||||
|
json_compatible_item_data = jsonable_encoder(data)
|
||||||
|
return JSONResponse(content=json_compatible_item_data)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print("REQUEST PROCESSING!!!! EXCEPTION!!!", e)
|
||||||
|
print(traceback.format_exc())
|
||||||
|
return str(e)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -4,7 +4,6 @@ import numpy as np
|
|||||||
import socketio
|
import socketio
|
||||||
from voice_changer.VoiceChangerManager import VoiceChangerManager
|
from voice_changer.VoiceChangerManager import VoiceChangerManager
|
||||||
|
|
||||||
|
|
||||||
class MMVC_Namespace(socketio.AsyncNamespace):
|
class MMVC_Namespace(socketio.AsyncNamespace):
|
||||||
def __init__(self, namespace:str, voiceChangerManager:VoiceChangerManager):
|
def __init__(self, namespace:str, voiceChangerManager:VoiceChangerManager):
|
||||||
super().__init__(namespace)
|
super().__init__(namespace)
|
||||||
|
@ -46,7 +46,6 @@ class VoiceChanger():
|
|||||||
def on_request(self, gpu, srcId, dstId, timestamp, prefixChunkSize, wav):
|
def on_request(self, gpu, srcId, dstId, timestamp, prefixChunkSize, wav):
|
||||||
unpackedData = wav
|
unpackedData = wav
|
||||||
convertSize = unpackedData.shape[0] + (prefixChunkSize * 512)
|
convertSize = unpackedData.shape[0] + (prefixChunkSize * 512)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
||||||
audio = torch.FloatTensor(unpackedData.astype(np.float32))
|
audio = torch.FloatTensor(unpackedData.astype(np.float32))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user