diff --git a/src/main/java/org/example/videoclips/editing/HighlightFfmpegRenderer.java b/src/main/java/org/example/videoclips/editing/HighlightFfmpegRenderer.java index 9c842bf..5f3cbad 100644 --- a/src/main/java/org/example/videoclips/editing/HighlightFfmpegRenderer.java +++ b/src/main/java/org/example/videoclips/editing/HighlightFfmpegRenderer.java @@ -283,8 +283,15 @@ public class HighlightFfmpegRenderer { command.addAll(List.of("-i", voiceover.path().toString())); // Narration must clearly lead. Boost ~+8 dB; combined with the lower music bed and side-chain // ducking, this keeps the voice well above the score during each line. + // Short fades soften the entry/exit so the narration doesn't hard-cut in and out. + double voiceFadeIn = Math.min(0.12, duration / 4); + double voiceFadeOut = Math.min(0.25, duration / 3); filters.append("[").append(input).append(":a]atrim=duration=").append(duration) - .append(",asetpts=PTS-STARTPTS,volume=1.0,adelay=") + .append(",asetpts=PTS-STARTPTS,volume=1.0") + .append(",afade=t=in:st=0:d=").append(voiceFadeIn) + .append(",afade=t=out:st=").append(Math.max(0.0, duration - voiceFadeOut)) + .append(":d=").append(voiceFadeOut) + .append(",adelay=") .append(delayMillis).append("|").append(delayMillis).append("[").append(label).append("];"); voiceLabels.add("[" + label + "]"); input++;