Fix skip bug and style

This commit is contained in:
litagin02
2023-12-31 08:07:20 +09:00
parent ebf756db7f
commit 9a2fa2ac18
2 changed files with 55 additions and 20 deletions

25
app.py
View File

@@ -186,6 +186,7 @@ class ModelHolder:
logger.info( logger.info(
f"No model files found in {self.root_dir}/{model_name}, so skip it" f"No model files found in {self.root_dir}/{model_name}, so skip it"
) )
continue
self.model_files_dict[model_name] = model_files self.model_files_dict[model_name] = model_files
self.model_names.append(model_name) self.model_names.append(model_name)
@@ -428,16 +429,32 @@ if __name__ == "__main__":
language = gr.Dropdown(choices=languages, value="JP", label="Language") language = gr.Dropdown(choices=languages, value="JP", label="Language")
with gr.Accordion(label="詳細設定", open=False): with gr.Accordion(label="詳細設定", open=False):
sdp_ratio = gr.Slider( sdp_ratio = gr.Slider(
minimum=0, maximum=1, value=DEFAULT_SDP_RATIO, step=0.1, label="SDP Ratio" minimum=0,
maximum=1,
value=DEFAULT_SDP_RATIO,
step=0.1,
label="SDP Ratio",
) )
noise_scale = gr.Slider( noise_scale = gr.Slider(
minimum=0.1, maximum=2, value=DEFAULT_NOISE, step=0.1, label="Noise" minimum=0.1,
maximum=2,
value=DEFAULT_NOISE,
step=0.1,
label="Noise",
) )
noise_scale_w = gr.Slider( noise_scale_w = gr.Slider(
minimum=0.1, maximum=2, value=DEFAULT_NOISEW, step=0.1, label="Noise_W" minimum=0.1,
maximum=2,
value=DEFAULT_NOISEW,
step=0.1,
label="Noise_W",
) )
length_scale = gr.Slider( length_scale = gr.Slider(
minimum=0.1, maximum=2, value=DEFAULT_LENGTH, step=0.1, label="Length" minimum=0.1,
maximum=2,
value=DEFAULT_LENGTH,
step=0.1,
label="Length",
) )
use_style_text = gr.Checkbox(label="Style textを使う", value=False) use_style_text = gr.Checkbox(label="Style textを使う", value=False)
style_text = gr.Textbox( style_text = gr.Textbox(

View File

@@ -37,7 +37,7 @@ ln = config.server_config.language
def raise_validation_error(msg: str, param: str): def raise_validation_error(msg: str, param: str):
raise HTTPException( raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail=[dict(type='invalid_params', msg=msg, loc=['query', param])] detail=[dict(type="invalid_params", msg=msg, loc=["query", param])],
) )
@@ -51,7 +51,9 @@ def load_models(model_holder: ModelHolder):
model = Model( model = Model(
model_path=model_paths[0], model_path=model_paths[0],
config_path=os.path.join(model_holder.root_dir, model_name, "config.json"), config_path=os.path.join(model_holder.root_dir, model_name, "config.json"),
style_vec_path=os.path.join(model_holder.root_dir, model_name, "style_vectors.npy"), style_vec_path=os.path.join(
model_holder.root_dir, model_name, "style_vectors.npy"
),
device=model_holder.device, device=model_holder.device,
) )
model.load_net_g() model.load_net_g()
@@ -77,13 +79,15 @@ if __name__ == "__main__":
logger.error(f"Models not found in {model_dir}.") logger.error(f"Models not found in {model_dir}.")
sys.exit(1) sys.exit(1)
logger.info('Loading models...') logger.info("Loading models...")
load_models(model_holder) load_models(model_holder)
limit = config.server_config.limit limit = config.server_config.limit
app = FastAPI() app = FastAPI()
allow_origins = config.server_config.origins allow_origins = config.server_config.origins
if allow_origins: if allow_origins:
logger.warning(f"CORS allow_origins={config.server_config.origins}. If you don't want, modify config.yml") logger.warning(
f"CORS allow_origins={config.server_config.origins}. If you don't want, modify config.yml"
)
app.add_middleware( app.add_middleware(
CORSMiddleware, CORSMiddleware,
allow_origins=config.server_config.origins, allow_origins=config.server_config.origins,
@@ -105,20 +109,31 @@ if __name__ == "__main__":
speaker_id: int = Query( speaker_id: int = Query(
0, description="話者ID。model_assets>[model]>config.json内のspk2idを確認" 0, description="話者ID。model_assets>[model]>config.json内のspk2idを確認"
), ),
sdp_ratio: float = Query(DEFAULT_SDP_RATIO, description="SDP(Stochastic Duration Predictor)/DP混合比。比率が高くなるほどトーンのばらつきが大きくなる"), sdp_ratio: float = Query(
DEFAULT_SDP_RATIO,
description="SDP(Stochastic Duration Predictor)/DP混合比。比率が高くなるほどトーンのばらつきが大きくなる",
),
noise: float = Query(DEFAULT_NOISE, description="サンプルノイズの割合。大きくするほどランダム性が高まる"), noise: float = Query(DEFAULT_NOISE, description="サンプルノイズの割合。大きくするほどランダム性が高まる"),
noisew: float = Query(DEFAULT_NOISEW, description="SDPイズ。大きくするほど発音の間隔にばらつきが出やすくなる"), noisew: float = Query(
length: float = Query(DEFAULT_LENGTH, description="話速。基準は1で大きくするほど音声は長くなり読み上げが遅まる"), DEFAULT_NOISEW, description="SDPイズ。大きくするほど発音の間隔にばらつきが出やすくなる"
),
length: float = Query(
DEFAULT_LENGTH, description="話速。基準は1で大きくするほど音声は長くなり読み上げが遅まる"
),
language: Languages = Query(ln, description=f"textの言語"), language: Languages = Query(ln, description=f"textの言語"),
auto_split: bool = Query(DEFAULT_LINE_SPLIT, description="改行で分けて生成"), auto_split: bool = Query(DEFAULT_LINE_SPLIT, description="改行で分けて生成"),
split_interval: float = Query(DEFAULT_SPLIT_INTERVAL, description="分けた場合に挟む無音の長さ(秒)"), split_interval: float = Query(
DEFAULT_SPLIT_INTERVAL, description="分けた場合に挟む無音の長さ(秒)"
),
style_text: Optional[str] = Query( style_text: Optional[str] = Query(
None, description="このテキストの読み上げと似た声音・感情になりやすくなる。ただし抑揚やテンポ等が犠牲になる傾向がある" None, description="このテキストの読み上げと似た声音・感情になりやすくなる。ただし抑揚やテンポ等が犠牲になる傾向がある"
), ),
style_weight: float = Query(DEFAULT_STYLE_WEIGHT, description="style_textの強さ"), style_weight: float = Query(DEFAULT_STYLE_WEIGHT, description="style_textの強さ"),
emotion: Optional[Union[int, str]] = Query(DEFAULT_EMOTION, description="スタイル"), emotion: Optional[Union[int, str]] = Query(DEFAULT_EMOTION, description="スタイル"),
emotion_weight: float = Query(DEFAULT_EMOTION_WEIGHT, description="emotionの強さ"), emotion_weight: float = Query(DEFAULT_EMOTION_WEIGHT, description="emotionの強さ"),
reference_audio_path: Optional[str] = Query(None, description="emotionを音声ファイルで行う"), reference_audio_path: Optional[str] = Query(
None, description="emotionを音声ファイルで行う"
),
): ):
"""Infer text to speech(テキストから感情付き音声を生成する)""" """Infer text to speech(テキストから感情付き音声を生成する)"""
logger.info( logger.info(
@@ -130,10 +145,14 @@ if __name__ == "__main__":
model = model_holder.models[model_id] model = model_holder.models[model_id]
if speaker_name is None: if speaker_name is None:
if speaker_id not in model.id2spk.keys(): if speaker_id not in model.id2spk.keys():
raise_validation_error(f"speaker_id={speaker_id} not found", "speaker_id") raise_validation_error(
f"speaker_id={speaker_id} not found", "speaker_id"
)
else: else:
if speaker_name not in model.spk2id.keys(): if speaker_name not in model.spk2id.keys():
raise_validation_error(f"speaker_name={speaker_name} not found", "speaker_name") raise_validation_error(
f"speaker_name={speaker_name} not found", "speaker_name"
)
speaker_id = model.spk2id[speaker_name] speaker_id = model.spk2id[speaker_name]
if emotion not in model.style2id.keys(): if emotion not in model.style2id.keys():
raise_validation_error(f"emotion={emotion} not found", "emotion") raise_validation_error(f"emotion={emotion} not found", "emotion")
@@ -157,9 +176,7 @@ if __name__ == "__main__":
emotion_weight=emotion_weight, emotion_weight=emotion_weight,
) )
with BytesIO() as wavContent: with BytesIO() as wavContent:
wavfile.write( wavfile.write(wavContent, sr, audio)
wavContent, sr, audio
)
return Response(content=wavContent.getvalue(), media_type="audio/wav") return Response(content=wavContent.getvalue(), media_type="audio/wav")
@app.get("/models/info") @app.get("/models/info")
@@ -222,7 +239,9 @@ if __name__ == "__main__":
} }
@app.get("/tools/get_audio", response_class=AudioResponse) @app.get("/tools/get_audio", response_class=AudioResponse)
def get_audio(request: Request, path: str = Query(..., description="local wav path")): def get_audio(
request: Request, path: str = Query(..., description="local wav path")
):
"""wavデータを取得する""" """wavデータを取得する"""
logger.info( logger.info(
f"{request.client.host}:{request.client.port}/tools/get_audio { unquote(str(request.query_params) )}" f"{request.client.host}:{request.client.port}/tools/get_audio { unquote(str(request.query_params) )}"
@@ -233,7 +252,6 @@ if __name__ == "__main__":
raise_validation_error(f"wav file not found in {path}", "path") raise_validation_error(f"wav file not found in {path}", "path")
return FileResponse(path=path, media_type="audio/wav") return FileResponse(path=path, media_type="audio/wav")
logger.info(f"server listen: http://127.0.0.1:{config.server_config.port}") logger.info(f"server listen: http://127.0.0.1:{config.server_config.port}")
logger.info(f"API docs: http://127.0.0.1:{config.server_config.port}/docs") logger.info(f"API docs: http://127.0.0.1:{config.server_config.port}/docs")
uvicorn.run( uvicorn.run(