From 51a37be532c6a199299201a777260582aae4f5c7 Mon Sep 17 00:00:00 2001 From: tarepan Date: Sat, 27 Apr 2024 06:51:37 +0000 Subject: [PATCH 1/3] =?UTF-8?q?refactor:=20=E9=9F=B3=E5=A3=B0=E3=83=A9?= =?UTF-8?q?=E3=82=A4=E3=83=96=E3=83=A9=E3=83=AA=20API=20Router=20=E3=81=B8?= =?UTF-8?q?=E3=81=AE=E3=83=A2=E3=82=B8=E3=83=A5=E3=83=BC=E3=83=AB=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 92 ++-------------------- voicevox_engine/app/routers/library.py | 103 +++++++++++++++++++++++++ 2 files changed, 109 insertions(+), 86 deletions(-) create mode 100644 voicevox_engine/app/routers/library.py diff --git a/run.py b/run.py index 182e66061..f79a22ea7 100644 --- a/run.py +++ b/run.py @@ -1,5 +1,4 @@ import argparse -import asyncio import json import multiprocessing import os @@ -8,16 +7,14 @@ from collections.abc import AsyncIterator, Awaitable, Callable from contextlib import asynccontextmanager from functools import lru_cache -from io import BytesIO, TextIOWrapper +from io import TextIOWrapper from pathlib import Path from tempfile import NamedTemporaryFile from typing import Annotated, Any, Optional import soundfile import uvicorn -from fastapi import Depends, FastAPI, HTTPException -from fastapi import Path as FAPath -from fastapi import Query, Request, Response +from fastapi import FastAPI, HTTPException, Query, Request, Response from fastapi.middleware.cors import CORSMiddleware from fastapi.openapi.utils import get_openapi from fastapi.responses import JSONResponse @@ -27,11 +24,9 @@ from starlette.responses import FileResponse from voicevox_engine import __version__ -from voicevox_engine.app.dependencies import ( - check_disabled_mutable_api, - deprecated_mutable_api, -) +from voicevox_engine.app.dependencies import deprecated_mutable_api from voicevox_engine.app.routers import ( + library, preset, setting, speaker, @@ -49,8 +44,6 @@ from voicevox_engine.model import ( AudioQuery, BaseLibraryInfo, - DownloadableLibraryInfo, - InstalledLibraryInfo, MorphableTargetInfo, StyleIdNotFoundError, SupportedDevicesInfo, @@ -371,82 +364,9 @@ async def core_versions() -> Response: app.include_router(speaker.generate_router(get_core, metas_store, root_dir)) if engine_manifest_data.supported_features.manage_library: - - @app.get( - "/downloadable_libraries", - response_model=list[DownloadableLibraryInfo], - response_description="ダウンロード可能な音声ライブラリの情報リスト", - tags=["音声ライブラリ管理"], + app.include_router( + library.generate_router(engine_manifest_data, library_manager) ) - def downloadable_libraries() -> list[DownloadableLibraryInfo]: - """ - ダウンロード可能な音声ライブラリの情報を返します。 - """ - if not engine_manifest_data.supported_features.manage_library: - raise HTTPException( - status_code=404, detail="この機能は実装されていません" - ) - return library_manager.downloadable_libraries() - - @app.get( - "/installed_libraries", - response_model=dict[str, InstalledLibraryInfo], - response_description="インストールした音声ライブラリの情報", - tags=["音声ライブラリ管理"], - ) - def installed_libraries() -> dict[str, InstalledLibraryInfo]: - """ - インストールした音声ライブラリの情報を返します。 - """ - if not engine_manifest_data.supported_features.manage_library: - raise HTTPException( - status_code=404, detail="この機能は実装されていません" - ) - return library_manager.installed_libraries() - - @app.post( - "/install_library/{library_uuid}", - status_code=204, - tags=["音声ライブラリ管理"], - dependencies=[Depends(check_disabled_mutable_api)], - ) - async def install_library( - library_uuid: Annotated[str, FAPath(description="音声ライブラリのID")], - request: Request, - ) -> Response: - """ - 音声ライブラリをインストールします。 - 音声ライブラリのZIPファイルをリクエストボディとして送信してください。 - """ - if not engine_manifest_data.supported_features.manage_library: - raise HTTPException( - status_code=404, detail="この機能は実装されていません" - ) - archive = BytesIO(await request.body()) - loop = asyncio.get_event_loop() - await loop.run_in_executor( - None, library_manager.install_library, library_uuid, archive - ) - return Response(status_code=204) - - @app.post( - "/uninstall_library/{library_uuid}", - status_code=204, - tags=["音声ライブラリ管理"], - dependencies=[Depends(check_disabled_mutable_api)], - ) - def uninstall_library( - library_uuid: Annotated[str, FAPath(description="音声ライブラリのID")] - ) -> Response: - """ - 音声ライブラリをアンインストールします。 - """ - if not engine_manifest_data.supported_features.manage_library: - raise HTTPException( - status_code=404, detail="この機能は実装されていません" - ) - library_manager.uninstall_library(library_uuid) - return Response(status_code=204) @app.post("/initialize_speaker", status_code=204, tags=["その他"]) def initialize_speaker( diff --git a/voicevox_engine/app/routers/library.py b/voicevox_engine/app/routers/library.py new file mode 100644 index 000000000..f529dd31c --- /dev/null +++ b/voicevox_engine/app/routers/library.py @@ -0,0 +1,103 @@ +"""音声ライブラリ機能を提供する API Router""" + +import asyncio +from io import BytesIO +from typing import Annotated + +from fastapi import APIRouter, Depends, HTTPException, Request, Response +from fastapi import Path as FAPath + +from voicevox_engine import __version__ +from voicevox_engine.app.dependencies import ( + check_disabled_mutable_api, +) +from voicevox_engine.engine_manifest.EngineManifest import EngineManifest +from voicevox_engine.library_manager import LibraryManager +from voicevox_engine.model import ( + DownloadableLibraryInfo, + InstalledLibraryInfo, +) +from ..dependencies import check_disabled_mutable_api + + +def generate_router(engine_manifest_data: EngineManifest, library_manager: LibraryManager) -> APIRouter: + """音声ライブラリ API Router を生成する""" + router = APIRouter() + + @router.get( + "/downloadable_libraries", + response_model=list[DownloadableLibraryInfo], + response_description="ダウンロード可能な音声ライブラリの情報リスト", + tags=["音声ライブラリ管理"], + ) + def downloadable_libraries() -> list[DownloadableLibraryInfo]: + """ + ダウンロード可能な音声ライブラリの情報を返します。 + """ + if not engine_manifest_data.supported_features.manage_library: + raise HTTPException( + status_code=404, detail="この機能は実装されていません" + ) + return library_manager.downloadable_libraries() + + @router.get( + "/installed_libraries", + response_model=dict[str, InstalledLibraryInfo], + response_description="インストールした音声ライブラリの情報", + tags=["音声ライブラリ管理"], + ) + def installed_libraries() -> dict[str, InstalledLibraryInfo]: + """ + インストールした音声ライブラリの情報を返します。 + """ + if not engine_manifest_data.supported_features.manage_library: + raise HTTPException( + status_code=404, detail="この機能は実装されていません" + ) + return library_manager.installed_libraries() + + @router.post( + "/install_library/{library_uuid}", + status_code=204, + tags=["音声ライブラリ管理"], + dependencies=[Depends(check_disabled_mutable_api)], + ) + async def install_library( + library_uuid: Annotated[str, FAPath(description="音声ライブラリのID")], + request: Request, + ) -> Response: + """ + 音声ライブラリをインストールします。 + 音声ライブラリのZIPファイルをリクエストボディとして送信してください。 + """ + if not engine_manifest_data.supported_features.manage_library: + raise HTTPException( + status_code=404, detail="この機能は実装されていません" + ) + archive = BytesIO(await request.body()) + loop = asyncio.get_event_loop() + await loop.run_in_executor( + None, library_manager.install_library, library_uuid, archive + ) + return Response(status_code=204) + + @router.post( + "/uninstall_library/{library_uuid}", + status_code=204, + tags=["音声ライブラリ管理"], + dependencies=[Depends(check_disabled_mutable_api)], + ) + def uninstall_library( + library_uuid: Annotated[str, FAPath(description="音声ライブラリのID")] + ) -> Response: + """ + 音声ライブラリをアンインストールします。 + """ + if not engine_manifest_data.supported_features.manage_library: + raise HTTPException( + status_code=404, detail="この機能は実装されていません" + ) + library_manager.uninstall_library(library_uuid) + return Response(status_code=204) + + return router From 25a7757c583bfd6d8821cd865a6f6972964ecb5e Mon Sep 17 00:00:00 2001 From: tarepan Date: Sun, 28 Apr 2024 04:37:24 +0000 Subject: [PATCH 2/3] fix: lint --- voicevox_engine/app/routers/library.py | 33 +++++++++----------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/voicevox_engine/app/routers/library.py b/voicevox_engine/app/routers/library.py index f529dd31c..3aa81364b 100644 --- a/voicevox_engine/app/routers/library.py +++ b/voicevox_engine/app/routers/library.py @@ -4,23 +4,20 @@ from io import BytesIO from typing import Annotated -from fastapi import APIRouter, Depends, HTTPException, Request, Response +from fastapi import APIRouter, Depends, HTTPException from fastapi import Path as FAPath +from fastapi import Request, Response -from voicevox_engine import __version__ -from voicevox_engine.app.dependencies import ( - check_disabled_mutable_api, -) from voicevox_engine.engine_manifest.EngineManifest import EngineManifest from voicevox_engine.library_manager import LibraryManager -from voicevox_engine.model import ( - DownloadableLibraryInfo, - InstalledLibraryInfo, -) +from voicevox_engine.model import DownloadableLibraryInfo, InstalledLibraryInfo + from ..dependencies import check_disabled_mutable_api -def generate_router(engine_manifest_data: EngineManifest, library_manager: LibraryManager) -> APIRouter: +def generate_router( + engine_manifest_data: EngineManifest, library_manager: LibraryManager +) -> APIRouter: """音声ライブラリ API Router を生成する""" router = APIRouter() @@ -35,9 +32,7 @@ def downloadable_libraries() -> list[DownloadableLibraryInfo]: ダウンロード可能な音声ライブラリの情報を返します。 """ if not engine_manifest_data.supported_features.manage_library: - raise HTTPException( - status_code=404, detail="この機能は実装されていません" - ) + raise HTTPException(status_code=404, detail="この機能は実装されていません") return library_manager.downloadable_libraries() @router.get( @@ -51,9 +46,7 @@ def installed_libraries() -> dict[str, InstalledLibraryInfo]: インストールした音声ライブラリの情報を返します。 """ if not engine_manifest_data.supported_features.manage_library: - raise HTTPException( - status_code=404, detail="この機能は実装されていません" - ) + raise HTTPException(status_code=404, detail="この機能は実装されていません") return library_manager.installed_libraries() @router.post( @@ -71,9 +64,7 @@ async def install_library( 音声ライブラリのZIPファイルをリクエストボディとして送信してください。 """ if not engine_manifest_data.supported_features.manage_library: - raise HTTPException( - status_code=404, detail="この機能は実装されていません" - ) + raise HTTPException(status_code=404, detail="この機能は実装されていません") archive = BytesIO(await request.body()) loop = asyncio.get_event_loop() await loop.run_in_executor( @@ -94,9 +85,7 @@ def uninstall_library( 音声ライブラリをアンインストールします。 """ if not engine_manifest_data.supported_features.manage_library: - raise HTTPException( - status_code=404, detail="この機能は実装されていません" - ) + raise HTTPException(status_code=404, detail="この機能は実装されていません") library_manager.uninstall_library(library_uuid) return Response(status_code=204) From 66f2766c978e544afa49b48326e39c71063268d2 Mon Sep 17 00:00:00 2001 From: Hiroshiba Kazuyuki Date: Wed, 1 May 2024 17:37:48 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=E3=81=BE=E3=81=A1=E3=81=8C=E3=81=88?= =?UTF-8?q?=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/run.py b/run.py index c8ce348f3..ddd5537d9 100644 --- a/run.py +++ b/run.py @@ -2,10 +2,11 @@ import multiprocessing import os import sys +from collections.abc import AsyncIterator from contextlib import asynccontextmanager from io import TextIOWrapper from pathlib import Path -from typing import AsyncIterator, Optional +from typing import Optional import uvicorn from fastapi import FastAPI, HTTPException