From 3d9b4b6d93e021d20752a8b8d5630f8fd98ce32f Mon Sep 17 00:00:00 2001 From: linyq Date: Wed, 7 May 2025 13:17:53 +0800 Subject: [PATCH] =?UTF-8?q?refactor(app):=20=E9=87=8D=E6=9E=84=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E7=94=9F=E6=88=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新导入路径:从 moviepy.editor 改为 moviepy - 优化合并字幕、BGM、配音、视频的逻辑 - 移除硬编码路径,使用参数化配置 -简化字幕样式和音量配置 - 调整 generate_video 函数的参数结构 --- app/services/llm.py | 2 +- app/services/subtitle.py | 2 +- app/services/task.py | 58 +++++++++++++++------------------------- app/services/video.py | 4 +-- requirements.txt | 2 +- 5 files changed, 27 insertions(+), 41 deletions(-) diff --git a/app/services/llm.py b/app/services/llm.py index d054eb1..0db7920 100644 --- a/app/services/llm.py +++ b/app/services/llm.py @@ -7,7 +7,7 @@ from typing import List from loguru import logger from openai import OpenAI from openai import AzureOpenAI -from moviepy.editor import VideoFileClip +from moviepy import VideoFileClip from openai.types.chat import ChatCompletion import google.generativeai as gemini from googleapiclient.errors import ResumableUploadError diff --git a/app/services/subtitle.py b/app/services/subtitle.py index b5d9a29..34aa2cb 100644 --- a/app/services/subtitle.py +++ b/app/services/subtitle.py @@ -8,7 +8,7 @@ from faster_whisper import WhisperModel from timeit import default_timer as timer from loguru import logger import google.generativeai as genai -from moviepy.editor import VideoFileClip +from moviepy import VideoFileClip import os from app.config import config diff --git a/app/services/task.py b/app/services/task.py index f2bf284..5ac0c13 100644 --- a/app/services/task.py +++ b/app/services/task.py @@ -10,7 +10,7 @@ from app.config import config from app.models import const from app.models.schema import VideoConcatMode, VideoParams, VideoClipParams from app.services import (llm, material, subtitle, video, voice, audio_merger, - subtitle_merger, clip_video, merger_video, update_script) + subtitle_merger, clip_video, merger_video, update_script, generate_video) from app.services import state as sm from app.utils import utils @@ -301,49 +301,35 @@ def start_subclip(task_id: str, params: VideoClipParams, subclip_path_videos: di """ 6. 合并字幕/BGM/配音/视频 """ - final_video_path = path.join(utils.task_dir(task_id), f"combined.mp4") - logger.info(f"\n\n## 6. 最后一步: 合并字幕/BGM/配音/视频 -> {final_video_path}") + output_video_path = path.join(utils.task_dir(task_id), f"combined.mp4") + logger.info(f"\n\n## 6. 最后一步: 合并字幕/BGM/配音/视频 -> {output_video_path}") - # 获取背景音乐 - bgm_path = None - if params.bgm_type or params.bgm_file: - try: - bgm_path = utils.get_bgm_file(bgm_type=params.bgm_type, bgm_file=params.bgm_file) - if bgm_path: - logger.info(f"使用背景音乐: {bgm_path}") - except Exception as e: - logger.error(f"获取背景音乐失败: {str(e)}") + bgm_path = '/Users/apple/Desktop/home/NarratoAI/resource/songs/bgm.mp3' + # bgm_path = params.bgm_file - # 示例:自定义字幕样式 - subtitle_style = { - 'fontsize': params.font_size, # 字体大小 - 'color': params.text_fore_color, # 字体颜色 - 'stroke_color': params.stroke_color, # 描边颜色 - 'stroke_width': params.stroke_width, # 描边宽度, 范围0-10 - 'bg_color': params.text_back_color, # 半透明黑色背景 - 'position': (params.subtitle_position, 0.2), # 距离顶部60%的位置 - 'method': 'caption' # 渲染方法 + # 调用示例 + options = { + 'voice_volume': params.tts_volume, # 配音音量 + 'bgm_volume': params.bgm_volume, # 背景音乐音量 + 'original_audio_volume': params.original_volume, # 视频原声音量,0表示不保留 + 'keep_original_audio': True, # 是否保留原声 + 'subtitle_font': 'MicrosoftYaHeiNormal.ttc', # 这里使用相对字体路径,会自动在 font_dir() 目录下查找 + 'subtitle_font_size': params.font_size, + 'subtitle_color': '#FFFFFF', + 'subtitle_bg_color': None, # 直接使用None表示透明背景 + 'subtitle_position': params.subtitle_position, + 'threads': params.n_threads } - - # 示例:自定义音量配置 - volume_config = { - 'original': params.original_volume, # 原声音量80% - 'bgm': params.bgm_volume, # BGM音量20% - 'narration': params.tts_volume or params.voice_volume, # 解说音量100% - } - font_path = utils.font_dir(params.font_name) - video.generate_video_v3( + generate_video.merge_materials( video_path=combined_video_path, + audio_path=merged_audio_path, subtitle_path=merged_subtitle_path, bgm_path=bgm_path, - narration_path=merged_audio_path, - output_path=final_video_path, - volume_config=volume_config, # 添加音量配置 - subtitle_style=subtitle_style, - font_path=font_path + output_path=output_video_path, + options=options ) - final_video_paths.append(final_video_path) + final_video_paths.append(output_video_path) combined_video_paths.append(combined_video_path) logger.success(f"任务 {task_id} 已完成, 生成 {len(final_video_paths)} 个视频.") diff --git a/app/services/video.py b/app/services/video.py index e588a8b..83214f9 100644 --- a/app/services/video.py +++ b/app/services/video.py @@ -4,10 +4,10 @@ import pysrt from typing import Optional from typing import List from loguru import logger -from moviepy.editor import * +from moviepy import * from PIL import ImageFont from contextlib import contextmanager -from moviepy.editor import ( +from moviepy import ( VideoFileClip, AudioFileClip, TextClip, diff --git a/requirements.txt b/requirements.txt index 55c7972..9d26499 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ requests~=2.31.0 -moviepy==2.0.0.dev2 +moviepy==2.1.1 faster-whisper~=1.0.1 uvicorn~=0.27.1 fastapi~=0.115.4