| 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)) |
|
|