From e3b5fa4d0ee9b04ae8d791942edc04c600e3e62e Mon Sep 17 00:00:00 2001 From: linyq Date: Wed, 11 Dec 2024 15:19:17 +0800 Subject: [PATCH] =?UTF-8?q?feat(audio):=20=E6=9C=AC=E5=9C=B0=E6=B5=8B?= =?UTF-8?q?=E8=AF=95-1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 调整背景音乐音量默认值为 0.3- 优化任务服务中的音量配置逻辑 - 更新视频生成服务,移除默认音量配置- 在 WebUI 中添加原声音量设置并更新相关参数 --- app/services/SDP/generate_script_short.so | Bin 79496 -> 79496 bytes app/services/task.py | 2 +- app/services/video.py | 20 +++++--------------- webui/components/audio_settings.py | 2 +- webui/components/video_settings.py | 4 +++- 5 files changed, 10 insertions(+), 18 deletions(-) diff --git a/app/services/SDP/generate_script_short.so b/app/services/SDP/generate_script_short.so index f0bfeb1fda5133ad7e15f6499ec1486369f3ff2d..054dbcc48a44c772e2e5523750f527f7bcad2142 100755 GIT binary patch delta 3586 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 k(B^+tt$AaoqH!SWwmwBxg zva2%PiCNQ5>~>a@%)%K^?AU@|xrR!(%bK{Iu{tegCPpGJQ}+LO*K<0ZDJE*!Y& zt5kV{s3RywQwh)rmSFc;dUw28qnZF7P&>qf)T&J*+i8JzhVHBhJe^_Szomed59m&< zS(k`bzEJQ76o!_!X_wYSj?mAwW-_1V=*%RPhU*Ly_o7#`8vMiPWd#_tu8wjC6cH_7 zDk595B)f>8(ZZ`4$r{soB(1T8j2<c%#^h$J0@4zpJ5MyEbz z_?f(6Z_{}>u~W#U_O-LNxY1VfwX?QvlQ-|}>%po~euUZES=+XtzP(d!+behKurk)e z57DrlVL#&H<8nWL#5ul%PQ#49FX>pX-$87{84sV7+x;BcHJy_2ZqyAk+>E&Cv^)kW z-ZHeaOJga=R_~OQY(_f}+dq|ORE9=cY-Bl|vd~PP_RU?`Kv48q{><=ox#A;4eXZ(o zD8d>CO|`z*MR9~A(1#1mB%78Nm?O42MCoFt2H~q?9?6o-)SGAn>IJ%|-~!n~H}Gb% zl{WDg$TqsN&`jL))xtdyVl_@n>Ed(n62;)Hlx}7e%_%Zq+{Hy%#7VamnKiY~3w#V( z7-(yeDQ_n-BeOT5eKh`4m5c8{dC32fe~xlB%F}~fymPHEc3~x4>kD6O<1~RO?s!ah zHqiMc6`bg#EhX`p>q-RvW%Q8>0cWl#tt2m3@5-q@voQgd3Z%M~_<&12m*z9pYkIxx z0lRgL!0(r?6LvoeCovNPNO&jWY{X;T-Zn=Z`zW!b-f!gm@T85Dgc>?dm^}=HUUxF*e_ASP> zkVaKZB89$L6{8j|OiLfGd#KJ41*9k%xIhdjJL5pLI|0bW1OR0sa4$Xp%CD1vD^CH% ziz&cOmmW#y2nypUMe#Gp=Sl zDpIx&WBeJ$Coq1PaSP+Y*hDFzB*yJyd=7w(305$J2N{2vaR=i&7@xPE2)o-`Lt+Rr30>pr^b3VA=ovwPTwP53JoNo|>_3i$`2J zIMn1?@y?a{8-=|?m(0&LJ-MgL`qkR!?tYZnb*cEvuf$pXK6+ z43iCu&)oPvbML;5r*{4Oy>BLMY3&O3ri?aJABdcM%ys!nXY!`Leh?eiS0@eJ+LP*d zP`mSH*TVn28B9vMj>kn#Jk#3t*M+Cw$e7W;`pmP+@|6+mV*YYlUvSf2)7Tfd`d#Wd zTj;)HKdoQ&YWJ>gB|L@KXNWc87PKojCpnxBA9% diff --git a/app/services/task.py b/app/services/task.py index bde85cd..6704f0d 100644 --- a/app/services/task.py +++ b/app/services/task.py @@ -335,7 +335,7 @@ def start_subclip(task_id: str, params: VideoClipParams, subclip_path_videos: di volume_config = { 'original': params.original_volume, # 原声音量80% 'bgm': params.bgm_volume, # BGM音量20% - 'narration': params.tts_volume # 解说音量100% + 'narration': params.tts_volume or params.voice_volume, # 解说音量100% } font_path = utils.font_dir(params.font_name) video.generate_video_v3( diff --git a/app/services/video.py b/app/services/video.py index aab38b8..f840c66 100644 --- a/app/services/video.py +++ b/app/services/video.py @@ -280,11 +280,11 @@ def calculate_subtitle_position(position, video_height: int, text_height: int = def generate_video_v3( video_path: str, subtitle_style: dict, + volume_config: dict, subtitle_path: Optional[str] = None, bgm_path: Optional[str] = None, narration_path: Optional[str] = None, output_path: str = "output.mp4", - volume_config: dict = None, font_path: Optional[str] = None ) -> None: """ @@ -315,17 +315,6 @@ def generate_video_v3( if not os.path.exists(video_path): raise FileNotFoundError(f"视频文件不存在: {video_path}") - # 设置默认音量配置 - default_volume = { - 'original': 1.0, # 原声音量 - 'bgm': 0.3, # BGM音量 - 'narration': 1.0 # 解说音量 - } - - # 更新音量配置 - if volume_config: - default_volume.update(volume_config) - # 加载视频 video = VideoFileClip(video_path) subtitle_clips = [] @@ -405,8 +394,9 @@ def generate_video_v3( audio_clips = [] # 添加原声(设置音量) + logger.debug(f"音量配置: {volume_config}") if video.audio is not None: - original_audio = video.audio.volumex(default_volume['original']) + original_audio = video.audio.volumex(volume_config['original']) audio_clips.append(original_audio) # 添加BGM(如果提供) @@ -416,12 +406,12 @@ def generate_video_v3( bgm = loop_audio_clip(bgm, video.duration) else: bgm = bgm.subclip(0, video.duration) - bgm = bgm.volumex(default_volume['bgm']) + bgm = bgm.volumex(volume_config['bgm']) audio_clips.append(bgm) # 添加解说音频(如果提供) if narration_path: - narration = AudioFileClip(narration_path).volumex(default_volume['narration']) + narration = AudioFileClip(narration_path).volumex(volume_config['narration']) audio_clips.append(narration) # 合成最终视频(包含字幕) diff --git a/webui/components/audio_settings.py b/webui/components/audio_settings.py index 0d868c4..6e378d9 100644 --- a/webui/components/audio_settings.py +++ b/webui/components/audio_settings.py @@ -208,5 +208,5 @@ def get_audio_params(): 'voice_pitch': st.session_state.get('voice_pitch', 1.0), 'bgm_type': st.session_state.get('bgm_type', 'random'), 'bgm_file': st.session_state.get('bgm_file', ''), - 'bgm_volume': st.session_state.get('bgm_volume', 0.2), + 'bgm_volume': st.session_state.get('bgm_volume', 0.3), } diff --git a/webui/components/video_settings.py b/webui/components/video_settings.py index 695c9e7..8a9b3f4 100644 --- a/webui/components/video_settings.py +++ b/webui/components/video_settings.py @@ -50,11 +50,13 @@ def render_video_config(tr, params): step=0.01, help=tr("Adjust the volume of the original audio") ) + st.session_state['original_volume'] = params.original_volume def get_video_params(): """获取视频参数""" return { 'video_aspect': st.session_state.get('video_aspect', VideoAspect.portrait.value), - 'video_quality': st.session_state.get('video_quality', '1080p') + 'video_quality': st.session_state.get('video_quality', '1080p'), + 'original_volume': st.session_state.get('original_volume', 0.7) }