mirror of
https://github.com/linyqh/NarratoAI.git
synced 2025-12-11 10:32:49 +00:00
fix(音频处理): 修复音频混合时的音量问题
修复amix导致的音量稀释问题,为每个音频添加音量补偿 保持原声片段音量为1.0不变,确保与原视频一致 仅在需要时调整原声音量,避免不必要的修改
This commit is contained in:
parent
cb02f2c897
commit
e9d0c013ef
@ -137,8 +137,12 @@ def merge_materials(
|
|||||||
try:
|
try:
|
||||||
original_audio = video_clip.audio
|
original_audio = video_clip.audio
|
||||||
if original_audio:
|
if original_audio:
|
||||||
original_audio = original_audio.with_effects([afx.MultiplyVolume(original_audio_volume)])
|
# 关键修复:只有当音量不为1.0时才进行音量调整,保持原声音量不变
|
||||||
logger.info(f"已提取视频原声,音量设置为: {original_audio_volume}")
|
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:
|
else:
|
||||||
logger.warning("视频没有音轨,无法提取原声")
|
logger.warning("视频没有音轨,无法提取原声")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|||||||
@ -566,9 +566,14 @@ def combine_clip_videos(
|
|||||||
with open(filter_script, 'w') as f:
|
with open(filter_script, 'w') as f:
|
||||||
f.write(f"[0:a]volume=0.0[silence];\n") # 首先静音背景轨道
|
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):
|
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]"
|
mix_str = "[silence]"
|
||||||
|
|||||||
@ -197,10 +197,20 @@ def start_subclip(task_id: str, params: VideoClipParams, subclip_path_videos: di
|
|||||||
# 获取优化的音量配置
|
# 获取优化的音量配置
|
||||||
optimized_volumes = get_recommended_volumes_for_content('mixed')
|
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_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']
|
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}")
|
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')
|
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_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']
|
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}")
|
logger.info(f"音量配置 - TTS: {final_tts_volume}, 原声: {final_original_volume}, BGM: {final_bgm_volume}")
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user