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