diff --git a/app/services/generate_video.py b/app/services/generate_video.py index 8395aef..9b77a2c 100644 --- a/app/services/generate_video.py +++ b/app/services/generate_video.py @@ -137,8 +137,12 @@ def merge_materials( try: original_audio = video_clip.audio if original_audio: - original_audio = original_audio.with_effects([afx.MultiplyVolume(original_audio_volume)]) - logger.info(f"已提取视频原声,音量设置为: {original_audio_volume}") + # 关键修复:只有当音量不为1.0时才进行音量调整,保持原声音量不变 + if abs(original_audio_volume - 1.0) > 0.001: # 使用小的容差值比较浮点数 + original_audio = original_audio.with_effects([afx.MultiplyVolume(original_audio_volume)]) + logger.info(f"已提取视频原声,音量调整为: {original_audio_volume}") + else: + logger.info("已提取视频原声,保持原始音量不变") else: logger.warning("视频没有音轨,无法提取原声") except Exception as e: diff --git a/app/services/merger_video.py b/app/services/merger_video.py index c00cbc9..c6ef84d 100644 --- a/app/services/merger_video.py +++ b/app/services/merger_video.py @@ -566,9 +566,14 @@ def combine_clip_videos( with open(filter_script, 'w') as f: f.write(f"[0:a]volume=0.0[silence];\n") # 首先静音背景轨道 - # 添加每个音频文件 + # 添加每个音频文件,并补偿amix的音量稀释 + # amix会将n个输入的音量平均分配,所以我们需要将每个输入的音量提高n倍来保持原始音量 + num_inputs = len(audio_timings) + 1 # +1 for silence track + volume_compensation = num_inputs # 补偿系数 + for i, timing in enumerate(audio_timings): - f.write(f"[{i+1}:a]adelay={int(timing['start']*1000)}|{int(timing['start']*1000)}[a{i}];\n") + # 为每个音频添加音量补偿,确保原声保持原始音量 + f.write(f"[{i+1}:a]volume={volume_compensation},adelay={int(timing['start']*1000)}|{int(timing['start']*1000)}[a{i}];\n") # 混合所有音频 mix_str = "[silence]" diff --git a/app/services/task.py b/app/services/task.py index 6150247..bec38be 100644 --- a/app/services/task.py +++ b/app/services/task.py @@ -197,10 +197,20 @@ def start_subclip(task_id: str, params: VideoClipParams, subclip_path_videos: di # 获取优化的音量配置 optimized_volumes = get_recommended_volumes_for_content('mixed') + # 检查是否有OST=1的原声片段,如果有,则保持原声音量为1.0不变 + has_original_audio_segments = any(segment['OST'] == 1 for segment in list_script) + # 应用用户设置和优化建议的组合 # 如果用户设置了非默认值,优先使用用户设置 final_tts_volume = params.tts_volume if hasattr(params, 'tts_volume') and params.tts_volume != 1.0 else optimized_volumes['tts_volume'] - final_original_volume = params.original_volume if hasattr(params, 'original_volume') and params.original_volume != 0.7 else optimized_volumes['original_volume'] + + # 关键修复:如果有原声片段,保持原声音量为1.0,确保与原视频音量一致 + if has_original_audio_segments: + final_original_volume = 1.0 # 保持原声音量不变 + logger.info("检测到原声片段,原声音量设置为1.0以保持与原视频一致") + else: + final_original_volume = params.original_volume if hasattr(params, 'original_volume') and params.original_volume != 0.7 else optimized_volumes['original_volume'] + final_bgm_volume = params.bgm_volume if hasattr(params, 'bgm_volume') and params.bgm_volume != 0.3 else optimized_volumes['bgm_volume'] logger.info(f"音量配置 - TTS: {final_tts_volume}, 原声: {final_original_volume}, BGM: {final_bgm_volume}") @@ -391,9 +401,19 @@ def start_subclip_unified(task_id: str, params: VideoClipParams): # 获取优化的音量配置 optimized_volumes = get_recommended_volumes_for_content('mixed') + # 检查是否有OST=1的原声片段,如果有,则保持原声音量为1.0不变 + has_original_audio_segments = any(segment['OST'] == 1 for segment in list_script) + # 应用用户设置和优化建议的组合 final_tts_volume = params.tts_volume if hasattr(params, 'tts_volume') and params.tts_volume != 1.0 else optimized_volumes['tts_volume'] - final_original_volume = params.original_volume if hasattr(params, 'original_volume') and params.original_volume != 0.7 else optimized_volumes['original_volume'] + + # 关键修复:如果有原声片段,保持原声音量为1.0,确保与原视频音量一致 + if has_original_audio_segments: + final_original_volume = 1.0 # 保持原声音量不变 + logger.info("检测到原声片段,原声音量设置为1.0以保持与原视频一致") + else: + final_original_volume = params.original_volume if hasattr(params, 'original_volume') and params.original_volume != 0.7 else optimized_volumes['original_volume'] + final_bgm_volume = params.bgm_volume if hasattr(params, 'bgm_volume') and params.bgm_volume != 0.3 else optimized_volumes['bgm_volume'] logger.info(f"音量配置 - TTS: {final_tts_volume}, 原声: {final_original_volume}, BGM: {final_bgm_volume}")