#!/bin/bash # 《守塔人》BGM 后处理(批次 4):Mureka flac 候选 -> 90s 无缝循环 ogg+m4a。 # 用法: bash web/keeper/gen/gen_bgm.sh (flac 原件在 tools/mureka_out/keeper-*/,不入库) # # 工艺(tools/mureka_log.md 批次 1/2 同款): # 首个强 onset 起点(silenceremove,-35dB 门限)→ 93s 裁剪 → 首尾 3s acrossfade(tri) # 无缝循环 → loudnorm I=-20/TP=-2/LRA=11(21-keeper.md §5.1 三首主题曲同档) # → aresample 44.1kHz → ogg libvorbis q3 + m4a aac 128k,落 web/keeper/audio/bgm/。 # 任务 id / 选用 choice / 成本见 tools/mureka_log.md「2026-09-14 批次 4」节; # 无节奏关键曲目(氛围叙事曲),不需要 bpm_precise(radio/abyss/detective 先例)。 set -euo pipefail cd /home/xsl/SoundGame TMP=tools/bgm_post_wav/keeper # 中间 wav(不入库,可由本脚本复现) DST=web/keeper/audio/bgm mkdir -p "$TMP" "$DST" post() { # post local src="$1" track="$2" lufs="$3" local tmp="$TMP/$track.wav" ffmpeg -y -v error -i "$src" -af \ "silenceremove=start_periods=1:start_threshold=-35dB:start_silence=0.02,atrim=end=93,asetpts=PTS-STARTPTS,asplit[a][b];[b]atrim=start=90,asetpts=PTS-STARTPTS[t];[a][t]acrossfade=d=3:c1=tri:c2=tri,loudnorm=I=${lufs}:TP=-2:LRA=11,aresample=44100" \ "$tmp" ffmpeg -y -v error -i "$tmp" -c:a libvorbis -q:a 3 "$DST/$track.ogg" ffmpeg -y -v error -i "$tmp" -c:a aac -b:a 128k "$DST/$track.m4a" echo "$track <- $src (I=${lufs})" } # 选用候选 = 时长更接近 90s 者(拿不准原则):storm=候选0(177.4s) memory=候选0(166.5s) # dawn=候选1(185.7s vs 212.2s),详见 tools/mureka_log.md post tools/mureka_out/keeper-storm/160725024833537_0.flac storm -20 post tools/mureka_out/keeper-memory/160725167505410_0.flac memory -20 post tools/mureka_out/keeper-dawn/160725310046209_1.flac dawn -20 echo "== keeper bgm done: $(ls "$DST" | wc -l) files =="