feat: add POST /tts/preview endpoint for synchronous TTS preview (#1496)
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1m10s
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 1m4s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m45s
CI/CD Pipeline / Validate - Type Check (mypy) (push) Successful in 2m52s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m1s
CI/CD Pipeline / Validate - Migration (alembic) (push) Successful in 3m1s
CI/CD Pipeline / Build Staging Web Image (push) Successful in 3m57s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 36s
AI Code Review / AI Code Review (pull_request) Failing after 4m2s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m58s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m2s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m17s
CI/CD Pipeline / Build Staging API Image (push) Successful in 6m49s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 56s
CI/CD Pipeline / Frontend Unit Tests (push) Successful in 6m35s
CI/CD Pipeline / Staging E2E Tests (push) Successful in 47s
CI/CD Pipeline / ACR Image Cleanup (push) Successful in 1m7s
CI/CD Pipeline / Staging API Integration Tests (push) Successful in 2m59s
CI/CD Pipeline / Validate - Code Quality (push) Successful in 11m7s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 11m17s
CI/CD Pipeline / Unit Tests (push) Successful in 14m35s
CI/CD Pipeline / Integration Tests (push) Successful in 5m11s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 13m32s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 5m10s
CI/CD Pipeline / CI Gate (pull_request) Successful in 6s
CI/CD Pipeline / Production Browser E2E (pull_request) Failing after 527h48m31s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 527h48m33s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 527h48m33s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 527h48m33s
CI/CD Pipeline / CI Gate (push) Failing after 527h48m35s
CI/CD Pipeline / Build Production Worker Image (push) Failing after 527h50m17s
CI/CD Pipeline / Production Browser E2E (push) Failing after 527h50m15s
CI/CD Pipeline / Build Production Web Image (push) Failing after 527h50m17s
CI/CD Pipeline / Canary Release to Production (push) Failing after 527h50m15s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 528h0m14s
CI/CD Pipeline / Build Production API Image (push) Failing after 527h50m19s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 528h0m16s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 528h0m20s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 528h0m58s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 528h1m53s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 528h1m54s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Failing after 528h2m9s
CI/CD Pipeline / PR Build Worker Image (push) Failing after 528h3m37s
CI/CD Pipeline / PR Build API Image (push) Failing after 528h3m41s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 528h3m43s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 528h3m45s
CI/CD Pipeline / Frontend Lint (push) Failing after 528h3m45s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 528h3m47s
CI/CD Pipeline / Check if frontend-only change (push) Failing after 528h4m56s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 528h22m26s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 528h22m28s
CI/CD Pipeline / Deploy Production (push) Failing after 528h24m10s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 528h34m13s
CI/CD Pipeline / PR Build Web Image (push) Failing after 528h37m34s

Co-authored-by: xiaoxia <dev@xiaoxiajianji.com>
Co-committed-by: xiaoxia <dev@xiaoxiajianji.com>
This commit was merged in pull request #1496.
This commit is contained in:
2026-08-25 15:21:01 +08:00
committed by auto-approve-bot
parent b7d96f1b2e
commit a1ddcb6ff6
3 changed files with 300 additions and 1 deletions
+37 -1
View File
@@ -20,6 +20,8 @@ from app.schemas.tts import (
SaveToLibraryRequest,
SaveToLibraryResponse,
TTSJobResponse,
TTSPreviewRequest,
TTSPreviewResponse,
TTSStatusResponse,
TTSSynthesizeRequest,
TTSSynthesizeResponse,
@@ -31,7 +33,7 @@ from packages.adapters.sqlalchemy_impl.tts_job_repository import (
SQLAlchemyTTSJobRepository,
)
from packages.adapters.sqlalchemy_impl.voice_library_repository import SQLAlchemyVoiceLibraryRepository
from packages.application.cosyvoice_service import CosyVoiceService
from packages.application.cosyvoice_service import CosyVoiceError, CosyVoiceService
from packages.application.tts_job.streaming_service import TTSStreamingService
from packages.application.tts_job.use_cases import (
CreateTTSJobUseCase,
@@ -373,6 +375,40 @@ def save_tts_job_to_library(
)
@router.post("/preview", response_model=TTSPreviewResponse)
def preview_tts(
request: TTSPreviewRequest,
authenticated_user: AuthenticatedUser = Depends(get_current_user),
cosyvoice_service: CosyVoiceService = Depends(get_cosyvoice_service),
) -> TTSPreviewResponse:
"""TTS 预览(试听)——同步合成,立即返回音频 URL。
用于前端预览配音效果,限制文本长度 200 字以内。
"""
try:
result = cosyvoice_service.synthesize_speech(
text=request.text,
voice_id=request.voice_id,
speed=request.speed,
)
except CosyVoiceError as e:
raise HTTPException(
status_code=status.HTTP_502_BAD_GATEWAY,
detail=f"TTS 合成失败: {e}",
) from e
except ValueError as e:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=str(e),
) from e
return TTSPreviewResponse(
audio_url=result.audio_url,
duration=result.duration if result.duration and result.duration > 0 else None,
)
@router.websocket("/ws/tts/stream")
async def tts_websocket_stream(
websocket: WebSocket,