mirror of
https://github.com/linyqh/NarratoAI.git
synced 2025-12-12 03:02:48 +00:00
- 修改支持的语音列表,仅保留中文语音 - 在主程序中添加代理配置环境变量 -优化剪辑视频函数,改为返回字典类型 - 更新任务服务中的剪辑视频函数,适应新的参数类型 - 修改测试用例中的视频剪辑函数,增加输出路径参数 - 更新脚本控制器中的剪辑视频函数,集成任务 ID 和子视频字典
171 lines
4.7 KiB
Python
171 lines
4.7 KiB
Python
from fastapi import APIRouter, BackgroundTasks
|
||
from loguru import logger
|
||
import os
|
||
|
||
from app.models.schema_v2 import (
|
||
GenerateScriptRequest,
|
||
GenerateScriptResponse,
|
||
CropVideoRequest,
|
||
CropVideoResponse,
|
||
DownloadVideoRequest,
|
||
DownloadVideoResponse,
|
||
StartSubclipRequest,
|
||
StartSubclipResponse
|
||
)
|
||
from app.models.schema import VideoClipParams
|
||
from app.services.script_service import ScriptGenerator
|
||
from app.services.video_service import VideoService
|
||
from app.utils import utils
|
||
from app.controllers.v2.base import v2_router
|
||
from app.models.schema import VideoClipParams
|
||
from app.services.youtube_service import YoutubeService
|
||
from app.services import task as task_service
|
||
|
||
router = v2_router()
|
||
|
||
|
||
@router.post(
|
||
"/scripts/generate",
|
||
response_model=GenerateScriptResponse,
|
||
summary="同步请求;生成视频脚本 (V2)"
|
||
)
|
||
async def generate_script(
|
||
request: GenerateScriptRequest,
|
||
background_tasks: BackgroundTasks
|
||
):
|
||
"""
|
||
生成视频脚本的V2版本API
|
||
"""
|
||
task_id = utils.get_uuid()
|
||
|
||
try:
|
||
generator = ScriptGenerator()
|
||
script = await generator.generate_script(
|
||
video_path=request.video_path,
|
||
video_theme=request.video_theme,
|
||
custom_prompt=request.custom_prompt,
|
||
skip_seconds=request.skip_seconds,
|
||
threshold=request.threshold,
|
||
vision_batch_size=request.vision_batch_size,
|
||
vision_llm_provider=request.vision_llm_provider
|
||
)
|
||
|
||
return {
|
||
"task_id": task_id,
|
||
"script": script
|
||
}
|
||
|
||
except Exception as e:
|
||
logger.exception(f"Generate script failed: {str(e)}")
|
||
raise
|
||
|
||
|
||
@router.post(
|
||
"/scripts/crop",
|
||
response_model=CropVideoResponse,
|
||
summary="同步请求;裁剪视频 (V2)"
|
||
)
|
||
async def crop_video(
|
||
request: CropVideoRequest,
|
||
background_tasks: BackgroundTasks
|
||
):
|
||
"""
|
||
根据脚本裁剪视频的V2版本API
|
||
"""
|
||
try:
|
||
# 调用视频裁剪服务
|
||
video_service = VideoService()
|
||
task_id, subclip_videos = await video_service.crop_video(
|
||
video_path=request.video_origin_path,
|
||
video_script=request.video_script
|
||
)
|
||
logger.debug(f"裁剪视频成功,视频片段路径: {subclip_videos}")
|
||
logger.debug(type(subclip_videos))
|
||
return {
|
||
"task_id": task_id,
|
||
"subclip_videos": subclip_videos
|
||
}
|
||
|
||
except Exception as e:
|
||
logger.exception(f"Crop video failed: {str(e)}")
|
||
raise
|
||
|
||
|
||
@router.post(
|
||
"/youtube/download",
|
||
response_model=DownloadVideoResponse,
|
||
summary="同步请求;下载YouTube视频 (V2)"
|
||
)
|
||
async def download_youtube_video(
|
||
request: DownloadVideoRequest,
|
||
background_tasks: BackgroundTasks
|
||
):
|
||
"""
|
||
下载指定分辨率的YouTube视频
|
||
"""
|
||
try:
|
||
youtube_service = YoutubeService()
|
||
task_id, output_path, filename = await youtube_service.download_video(
|
||
url=request.url,
|
||
resolution=request.resolution,
|
||
output_format=request.output_format,
|
||
rename=request.rename
|
||
)
|
||
|
||
return {
|
||
"task_id": task_id,
|
||
"output_path": output_path,
|
||
"resolution": request.resolution,
|
||
"format": request.output_format,
|
||
"filename": filename
|
||
}
|
||
|
||
except Exception as e:
|
||
logger.exception(f"Download YouTube video failed: {str(e)}")
|
||
raise
|
||
|
||
|
||
@router.post(
|
||
"/scripts/start-subclip",
|
||
response_model=StartSubclipResponse,
|
||
summary="异步请求;开始视频剪辑任务 (V2)"
|
||
)
|
||
async def start_subclip(
|
||
request: VideoClipParams,
|
||
task_id: str,
|
||
subclip_videos: dict,
|
||
background_tasks: BackgroundTasks
|
||
):
|
||
"""
|
||
开始视频剪辑任务的V2版本API
|
||
"""
|
||
try:
|
||
# 构建参数对象
|
||
params = VideoClipParams(
|
||
video_origin_path=request.video_origin_path,
|
||
video_clip_json_path=request.video_clip_json_path,
|
||
voice_name=request.voice_name,
|
||
voice_rate=request.voice_rate,
|
||
voice_pitch=request.voice_pitch,
|
||
subtitle_enabled=request.subtitle_enabled,
|
||
video_aspect=request.video_aspect,
|
||
n_threads=request.n_threads
|
||
)
|
||
|
||
# 在后台任务中执行视频剪辑
|
||
background_tasks.add_task(
|
||
task_service.start_subclip,
|
||
task_id=task_id,
|
||
params=params,
|
||
subclip_path_videos=subclip_videos
|
||
)
|
||
|
||
return {
|
||
"task_id": task_id,
|
||
"state": "PROCESSING" # 初始状态
|
||
}
|
||
|
||
except Exception as e:
|
||
logger.exception(f"Start subclip task failed: {str(e)}")
|
||
raise
|