Skip to content

Commit

Permalink
整理: プリセット機能を API Router でモジュール化 (#1157)
Browse files Browse the repository at this point in the history
* refactor: プリセットを API router で切り出して整理

* fix: lint

* fix: `router` 名を明瞭化

* fix: グローバル変数 FIXME 追加

* fix: lint

---------

Co-authored-by: Hiroshiba Kazuyuki <kazuyuki_hiroshiba@dwango.co.jp>
  • Loading branch information
tarepan and Hiroshiba authored Apr 14, 2024
1 parent a54d579 commit 425e214
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 87 deletions.
93 changes: 6 additions & 87 deletions run.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

import soundfile
import uvicorn
from fastapi import Body, Depends, FastAPI, Form, HTTPException
from fastapi import Depends, FastAPI, Form, HTTPException
from fastapi import Path as FAPath
from fastapi import Query, Request, Response
from fastapi.middleware.cors import CORSMiddleware
Expand All @@ -34,7 +34,7 @@
check_disabled_mutable_api,
deprecated_mutable_api,
)
from voicevox_engine.app.routers import user_dict
from voicevox_engine.app.routers import preset, user_dict
from voicevox_engine.cancellable_engine import CancellableEngine
from voicevox_engine.core.core_adapter import CoreAdapter
from voicevox_engine.core.core_initializer import initialize_cores
Expand Down Expand Up @@ -72,7 +72,6 @@
from voicevox_engine.morphing import (
synthesis_morphing_parameter as _synthesis_morphing_parameter,
)
from voicevox_engine.preset.Preset import Preset
from voicevox_engine.preset.PresetError import PresetError
from voicevox_engine.preset.PresetManager import PresetManager
from voicevox_engine.setting.Setting import CorsPolicyMode, Setting
Expand Down Expand Up @@ -311,9 +310,9 @@ def audio_query_from_preset(
presets = preset_manager.load_presets()
except PresetError as err:
raise HTTPException(status_code=422, detail=str(err))
for preset in presets:
if preset.id == preset_id:
selected_preset = preset
for _preset in presets:
if _preset.id == preset_id:
selected_preset = _preset
break
else:
raise HTTPException(
Expand Down Expand Up @@ -743,87 +742,7 @@ def connect_waves(waves: list[str]) -> FileResponse:
background=BackgroundTask(delete_file, f.name),
)

@app.get(
"/presets",
response_model=list[Preset],
response_description="プリセットのリスト",
tags=["その他"],
)
def get_presets() -> list[Preset]:
"""
エンジンが保持しているプリセットの設定を返します
"""
try:
presets = preset_manager.load_presets()
except PresetError as err:
raise HTTPException(status_code=422, detail=str(err))
return presets

@app.post(
"/add_preset",
response_model=int,
response_description="追加したプリセットのプリセットID",
tags=["その他"],
dependencies=[Depends(check_disabled_mutable_api)],
)
def add_preset(
preset: Annotated[
Preset,
Body(
description="新しいプリセット。プリセットIDが既存のものと重複している場合は、新規のプリセットIDが採番されます。"
),
]
) -> int:
"""
新しいプリセットを追加します
"""
try:
id = preset_manager.add_preset(preset)
except PresetError as err:
raise HTTPException(status_code=422, detail=str(err))
return id

@app.post(
"/update_preset",
response_model=int,
response_description="更新したプリセットのプリセットID",
tags=["その他"],
dependencies=[Depends(check_disabled_mutable_api)],
)
def update_preset(
preset: Annotated[
Preset,
Body(
description="更新するプリセット。プリセットIDが更新対象と一致している必要があります。"
),
]
) -> int:
"""
既存のプリセットを更新します
"""
try:
id = preset_manager.update_preset(preset)
except PresetError as err:
raise HTTPException(status_code=422, detail=str(err))
return id

@app.post(
"/delete_preset",
status_code=204,
tags=["その他"],
dependencies=[Depends(check_disabled_mutable_api)],
)
def delete_preset(
id: Annotated[int, Query(description="削除するプリセットのプリセットID")]
) -> Response:
"""
既存のプリセットを削除します
"""
try:
preset_manager.delete_preset(id)
except PresetError as err:
raise HTTPException(status_code=422, detail=str(err))
return Response(status_code=204)
app.include_router(preset.generate_router(preset_manager))

@app.get("/version", tags=["その他"])
async def version() -> str:
Expand Down
100 changes: 100 additions & 0 deletions voicevox_engine/app/routers/preset.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
"""プリセット機能を提供する API Router"""

from typing import Annotated

from fastapi import APIRouter, Body, Depends, HTTPException, Query, Response

from voicevox_engine.preset.Preset import Preset
from voicevox_engine.preset.PresetError import PresetError
from voicevox_engine.preset.PresetManager import PresetManager

from ..dependencies import check_disabled_mutable_api


def generate_router(preset_manager: PresetManager) -> APIRouter:
"""プリセット API Router を生成する"""
router = APIRouter()

@router.get(
"/presets",
response_model=list[Preset],
response_description="プリセットのリスト",
tags=["その他"],
)
def get_presets() -> list[Preset]:
"""
エンジンが保持しているプリセットの設定を返します
"""
try:
presets = preset_manager.load_presets()
except PresetError as err:
raise HTTPException(status_code=422, detail=str(err))
return presets

@router.post(
"/add_preset",
response_model=int,
response_description="追加したプリセットのプリセットID",
tags=["その他"],
dependencies=[Depends(check_disabled_mutable_api)],
)
def add_preset(
preset: Annotated[
Preset,
Body(
description="新しいプリセット。プリセットIDが既存のものと重複している場合は、新規のプリセットIDが採番されます。"
),
]
) -> int:
"""
新しいプリセットを追加します
"""
try:
id = preset_manager.add_preset(preset)
except PresetError as err:
raise HTTPException(status_code=422, detail=str(err))
return id

@router.post(
"/update_preset",
response_model=int,
response_description="更新したプリセットのプリセットID",
tags=["その他"],
dependencies=[Depends(check_disabled_mutable_api)],
)
def update_preset(
preset: Annotated[
Preset,
Body(
description="更新するプリセット。プリセットIDが更新対象と一致している必要があります。"
),
]
) -> int:
"""
既存のプリセットを更新します
"""
try:
id = preset_manager.update_preset(preset)
except PresetError as err:
raise HTTPException(status_code=422, detail=str(err))
return id

@router.post(
"/delete_preset",
status_code=204,
tags=["その他"],
dependencies=[Depends(check_disabled_mutable_api)],
)
def delete_preset(
id: Annotated[int, Query(description="削除するプリセットのプリセットID")]
) -> Response:
"""
既存のプリセットを削除します
"""
try:
preset_manager.delete_preset(id)
except PresetError as err:
raise HTTPException(status_code=422, detail=str(err))
return Response(status_code=204)

return router

0 comments on commit 425e214

Please sign in to comment.