| | import torch |
| | from fastapi import HTTPException |
| | from pydantic import BaseModel |
| |
|
| | from modules.api import utils as api_utils |
| | from modules.api.Api import APIManager |
| | from modules.speaker import speaker_mgr |
| |
|
| |
|
| | class CreateSpeaker(BaseModel): |
| | name: str |
| | gender: str |
| | describe: str |
| | tensor: list = None |
| | seed: int = None |
| |
|
| |
|
| | class UpdateSpeaker(BaseModel): |
| | id: str |
| | name: str |
| | gender: str |
| | describe: str |
| | tensor: list |
| |
|
| |
|
| | class SpeakerDetail(BaseModel): |
| | id: str |
| | with_emb: bool = False |
| |
|
| |
|
| | class SpeakersUpdate(BaseModel): |
| | speakers: list |
| |
|
| |
|
| | def setup(app: APIManager): |
| |
|
| | @app.get("/v1/speakers/list", response_model=api_utils.BaseResponse) |
| | async def list_speakers(): |
| | return api_utils.success_response( |
| | [spk.to_json() for spk in speaker_mgr.list_speakers()] |
| | ) |
| |
|
| | @app.post("/v1/speakers/refresh", response_model=api_utils.BaseResponse) |
| | async def refresh_speakers(): |
| | speaker_mgr.refresh_speakers() |
| | return api_utils.success_response(None) |
| |
|
| | @app.post("/v1/speakers/update", response_model=api_utils.BaseResponse) |
| | async def update_speakers(request: SpeakersUpdate): |
| | for spk in request.speakers: |
| | speaker = speaker_mgr.get_speaker_by_id(spk["id"]) |
| | if speaker is None: |
| | raise HTTPException( |
| | status_code=404, detail=f"Speaker not found: {spk['id']}" |
| | ) |
| | speaker.name = spk.get("name", speaker.name) |
| | speaker.gender = spk.get("gender", speaker.gender) |
| | speaker.describe = spk.get("describe", speaker.describe) |
| | if ( |
| | spk.get("tensor") |
| | and isinstance(spk["tensor"], list) |
| | and len(spk["tensor"]) > 0 |
| | ): |
| | |
| | speaker.emb = torch.tensor(spk["tensor"]) |
| | speaker_mgr.save_all() |
| |
|
| | return api_utils.success_response(None) |
| |
|
| | @app.post("/v1/speaker/create", response_model=api_utils.BaseResponse) |
| | async def create_speaker(request: CreateSpeaker): |
| | if ( |
| | request.tensor |
| | and isinstance(request.tensor, list) |
| | and len(request.tensor) > 0 |
| | ): |
| | |
| | tensor = torch.tensor(request.tensor) |
| | speaker = speaker_mgr.create_speaker_from_tensor( |
| | tensor=tensor, |
| | name=request.name, |
| | gender=request.gender, |
| | describe=request.describe, |
| | ) |
| | elif request.seed: |
| | |
| | speaker = speaker_mgr.create_speaker_from_seed( |
| | seed=request.seed, |
| | name=request.name, |
| | gender=request.gender, |
| | describe=request.describe, |
| | ) |
| | else: |
| | raise HTTPException( |
| | status_code=400, detail="Missing tensor or seed in request" |
| | ) |
| | return api_utils.success_response(speaker.to_json()) |
| |
|
| | @app.post("/v1/speaker/update", response_model=api_utils.BaseResponse) |
| | async def update_speaker(request: UpdateSpeaker): |
| | speaker = speaker_mgr.get_speaker_by_id(request.id) |
| | if speaker is None: |
| | raise HTTPException( |
| | status_code=404, detail=f"Speaker not found: {request.id}" |
| | ) |
| | speaker.name = request.name |
| | speaker.gender = request.gender |
| | speaker.describe = request.describe |
| | if ( |
| | request.tensor |
| | and isinstance(request.tensor, list) |
| | and len(request.tensor) > 0 |
| | ): |
| | |
| | speaker.emb = torch.tensor(request.tensor) |
| | speaker_mgr.update_speaker(speaker) |
| | return api_utils.success_response(None) |
| |
|
| | @app.post("/v1/speaker/detail", response_model=api_utils.BaseResponse) |
| | async def speaker_detail(request: SpeakerDetail): |
| | speaker = speaker_mgr.get_speaker_by_id(request.id) |
| | if speaker is None: |
| | raise HTTPException(status_code=404, detail="Speaker not found") |
| | return api_utils.success_response(speaker.to_json(with_emb=request.with_emb)) |
| |
|