feat: Implement AI script generation for audiobook projects

This commit is contained in:
2026-03-13 11:29:56 +08:00
parent 444dcb8bcf
commit 35bf7a302a
14 changed files with 682 additions and 17 deletions

View File

@@ -23,6 +23,7 @@ from schemas.audiobook import (
AudiobookSegmentUpdate,
AudiobookGenerateRequest,
AudiobookAnalyzeRequest,
ScriptGenerationRequest,
)
from core.config import settings
@@ -39,6 +40,7 @@ def _project_to_response(project) -> AudiobookProjectResponse:
status=project.status,
llm_model=project.llm_model,
error_message=project.error_message,
script_config=getattr(project, 'script_config', None),
created_at=project.created_at,
updated_at=project.updated_at,
)
@@ -150,6 +152,42 @@ async def list_projects(
return [_project_to_response(p) for p in projects]
@router.post("/projects/generate-script", response_model=AudiobookProjectResponse, status_code=status.HTTP_201_CREATED)
async def create_ai_script_project(
data: ScriptGenerationRequest,
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db),
):
from db.crud import get_system_setting
if not get_system_setting(db, "llm_api_key") or not get_system_setting(db, "llm_base_url") or not get_system_setting(db, "llm_model"):
raise HTTPException(status_code=400, detail="LLM config not set. Please configure LLM API key first.")
project = crud.create_audiobook_project(
db=db,
user_id=current_user.id,
title=data.title,
source_type="ai_generated",
script_config=data.model_dump(),
)
from core.audiobook_service import generate_ai_script
from core.database import SessionLocal
project_id = project.id
user_id = current_user.id
async def run():
async_db = SessionLocal()
try:
db_user = crud.get_user_by_id(async_db, user_id)
await generate_ai_script(project_id, db_user, async_db)
finally:
async_db.close()
asyncio.create_task(run())
return _project_to_response(project)
@router.get("/projects/{project_id}", response_model=AudiobookProjectDetail)
async def get_project(
project_id: int,
@@ -207,6 +245,23 @@ async def confirm_characters(
if project.status != "characters_ready":
raise HTTPException(status_code=400, detail="Project must be in 'characters_ready' state to confirm characters")
if project.source_type == "ai_generated":
from core.audiobook_service import generate_ai_script_chapters
from core.database import SessionLocal
user_id = current_user.id
async def run():
async_db = SessionLocal()
try:
db_user = crud.get_user_by_id(async_db, user_id)
await generate_ai_script_chapters(project_id, db_user, async_db)
finally:
async_db.close()
asyncio.create_task(run())
return {"message": "Script generation started", "project_id": project_id}
from core.audiobook_service import identify_chapters
try:
identify_chapters(project_id, db, project)