147 lines
4.3 KiB
Python
147 lines
4.3 KiB
Python
# Copyright (C) 2025 AIDC-AI
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
"""
|
|
Content generation endpoints
|
|
|
|
Endpoints for generating narrations, image prompts, and titles.
|
|
"""
|
|
|
|
from fastapi import APIRouter, HTTPException
|
|
from loguru import logger
|
|
|
|
from api.dependencies import PixelleVideoDep
|
|
from api.schemas.content import (
|
|
NarrationGenerateRequest,
|
|
NarrationGenerateResponse,
|
|
ImagePromptGenerateRequest,
|
|
ImagePromptGenerateResponse,
|
|
TitleGenerateRequest,
|
|
TitleGenerateResponse,
|
|
)
|
|
from pixelle_video.utils.content_generators import (
|
|
generate_narrations_from_topic,
|
|
generate_image_prompts,
|
|
generate_title,
|
|
)
|
|
|
|
router = APIRouter(prefix="/content", tags=["Content Generation"])
|
|
|
|
|
|
@router.post("/narration", response_model=NarrationGenerateResponse)
|
|
async def generate_narration(
|
|
request: NarrationGenerateRequest,
|
|
pixelle_video: PixelleVideoDep
|
|
):
|
|
"""
|
|
Generate narrations from text
|
|
|
|
Uses LLM to break down text into multiple narration segments.
|
|
|
|
- **text**: Source text
|
|
- **n_scenes**: Number of narrations to generate
|
|
- **min_words**: Minimum words per narration
|
|
- **max_words**: Maximum words per narration
|
|
|
|
Returns list of narration strings.
|
|
"""
|
|
try:
|
|
logger.info(f"Generating {request.n_scenes} narrations from text")
|
|
|
|
# Call narration generator utility function
|
|
narrations = await generate_narrations_from_topic(
|
|
llm_service=pixelle_video.llm,
|
|
topic=request.text,
|
|
n_scenes=request.n_scenes,
|
|
min_words=request.min_words,
|
|
max_words=request.max_words
|
|
)
|
|
|
|
return NarrationGenerateResponse(
|
|
narrations=narrations
|
|
)
|
|
|
|
except Exception as e:
|
|
logger.error(f"Narration generation error: {e}")
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|
|
|
|
@router.post("/image-prompt", response_model=ImagePromptGenerateResponse)
|
|
async def generate_image_prompt(
|
|
request: ImagePromptGenerateRequest,
|
|
pixelle_video: PixelleVideoDep
|
|
):
|
|
"""
|
|
Generate image prompts from narrations
|
|
|
|
Uses LLM to create detailed image generation prompts.
|
|
|
|
- **narrations**: List of narration texts
|
|
- **min_words**: Minimum words per prompt
|
|
- **max_words**: Maximum words per prompt
|
|
|
|
Returns list of image prompts.
|
|
"""
|
|
try:
|
|
logger.info(f"Generating image prompts for {len(request.narrations)} narrations")
|
|
|
|
# Call image prompt generator utility function
|
|
image_prompts = await generate_image_prompts(
|
|
llm_service=pixelle_video.llm,
|
|
narrations=request.narrations,
|
|
min_words=request.min_words,
|
|
max_words=request.max_words
|
|
)
|
|
|
|
return ImagePromptGenerateResponse(
|
|
image_prompts=image_prompts
|
|
)
|
|
|
|
except Exception as e:
|
|
logger.error(f"Image prompt generation error: {e}")
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|
|
|
|
@router.post("/title", response_model=TitleGenerateResponse)
|
|
async def generate_title_endpoint(
|
|
request: TitleGenerateRequest,
|
|
pixelle_video: PixelleVideoDep
|
|
):
|
|
"""
|
|
Generate video title from text
|
|
|
|
Uses LLM to create an engaging title.
|
|
|
|
- **text**: Source text
|
|
- **style**: Optional title style hint
|
|
|
|
Returns generated title.
|
|
"""
|
|
try:
|
|
logger.info("Generating title from text")
|
|
|
|
# Call title generator utility function
|
|
title = await generate_title(
|
|
llm_service=pixelle_video.llm,
|
|
content=request.text,
|
|
strategy="llm"
|
|
)
|
|
|
|
return TitleGenerateResponse(
|
|
title=title
|
|
)
|
|
|
|
except Exception as e:
|
|
logger.error(f"Title generation error: {e}")
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|