feat: Implement AI script generation for audiobook projects
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user