diff --git a/run.py b/run.py index ea68a160a..bcba6705a 100644 --- a/run.py +++ b/run.py @@ -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 @@ -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 @@ -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 @@ -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( @@ -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: diff --git a/voicevox_engine/app/routers/preset.py b/voicevox_engine/app/routers/preset.py new file mode 100644 index 000000000..8ba7815b6 --- /dev/null +++ b/voicevox_engine/app/routers/preset.py @@ -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