Fix: change /voice api to post (#160)
* Fix: change /voice api to post * Fix: support /voice api get
This commit is contained in:
@@ -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自动注入
|
||||
|
||||
Reference in New Issue
Block a user