From 6a77c8ba1df66a137312bad20259152f75eb5883 Mon Sep 17 00:00:00 2001 From: Sora Date: Wed, 8 Nov 2023 17:38:59 +0800 Subject: [PATCH] Fix: change /voice api to post (#160) * Fix: change /voice api to post * Fix: support /voice api get --- server_fastapi.py | 87 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/server_fastapi.py b/server_fastapi.py index 00debb3..1befc5d 100644 --- a/server_fastapi.py +++ b/server_fastapi.py @@ -5,6 +5,7 @@ import logging import gc import random +from pydantic import BaseModel import gradio import numpy as np import utils @@ -172,6 +173,92 @@ if __name__ == "__main__": async def index(): return FileResponse("./Web/index.html") + class Text(BaseModel): + text: str + + @app.post("/voice") + def voice( + request: Request, # fastapi自动注入 + text: Text, + model_id: int = Query(..., description="模型ID"), # 模型序号 + speaker_name: str = Query( + None, description="说话人名" + ), # speaker_name与 speaker_id二者选其一 + speaker_id: int = Query(None, description="说话人id,与speaker_name二选一"), + sdp_ratio: float = Query(0.2, description="SDP/DP混合比"), + noise: float = Query(0.2, description="感情"), + noisew: float = Query(0.9, description="音素长度"), + length: float = Query(1, description="语速"), + language: str = Query(None, description="语言"), # 若不指定使用语言则使用默认值 + auto_translate: bool = Query(False, description="自动翻译"), + auto_split: bool = Query(False, description="自动切分"), + ): + """语音接口""" + text = text.text + logger.info( + f"{request.client.host}:{request.client.port}/voice { unquote(str(request.query_params) )} text={text}" + ) + # 检查模型是否存在 + if model_id not in loaded_models.models.keys(): + return {"status": 10, "detail": f"模型model_id={model_id}未加载"} + # 检查是否提供speaker + if speaker_name is None and speaker_id is None: + return {"status": 11, "detail": "请提供speaker_name或speaker_id"} + elif speaker_name is None: + # 检查speaker_id是否存在 + if speaker_id not in loaded_models.models[model_id].id2spk.keys(): + return {"status": 12, "detail": f"角色speaker_id={speaker_id}不存在"} + speaker_name = loaded_models.models[model_id].id2spk[speaker_id] + # 检查speaker_name是否存在 + if speaker_name not in loaded_models.models[model_id].spk2id.keys(): + return {"status": 13, "detail": f"角色speaker_name={speaker_name}不存在"} + if language is None: + language = loaded_models.models[model_id].language + if auto_translate: + text = trans.translate(Sentence=text, to_Language=language.lower()) + if not auto_split: + with torch.no_grad(): + audio = infer( + text=text, + sdp_ratio=sdp_ratio, + noise_scale=noise, + noise_scale_w=noisew, + length_scale=length, + sid=speaker_name, + language=language, + hps=loaded_models.models[model_id].hps, + net_g=loaded_models.models[model_id].net_g, + device=loaded_models.models[model_id].device, + ) + else: + texts = cut_sent(text) + audios = [] + with torch.no_grad(): + for t in texts: + audios.append( + infer( + text=t, + sdp_ratio=sdp_ratio, + noise_scale=noise, + noise_scale_w=noisew, + length_scale=length, + sid=speaker_name, + language=language, + hps=loaded_models.models[model_id].hps, + net_g=loaded_models.models[model_id].net_g, + device=loaded_models.models[model_id].device, + ) + ) + audios.append(np.zeros((int)(44100 * 0.3))) + audio = np.concatenate(audios) + audio = gradio.processing_utils.convert_to_16_bit_wav(audio) + wavContent = BytesIO() + wavfile.write( + wavContent, loaded_models.models[model_id].hps.data.sampling_rate, audio + ) + response = Response(content=wavContent.getvalue(), media_type="audio/wav") + return response + @app.get("/voice") def voice( request: Request, # fastapi自动注入