#!/bin/bash # 《回声地窟》BGM 后处理(批次 1):Mureka flac 候选 -> 90s 无缝循环 ogg+m4a。 # 用法: bash web/dungeon/gen/gen_bgm.sh (flac 原件在 tools/mureka_out/,不入库) # # 工艺(tools/mureka_log.md R4/R6 同款,16-dungeon.md §9.1 全部 -20 LUFS): # 首个强 onset 起点(silenceremove,-35dB 门限)→ 93s 裁剪 → 首尾 3s acrossfade(tri) # 无缝循环 → loudnorm I=-20/TP=-2/LRA=11 → aresample 44.1kHz # → ogg libvorbis q3 + m4a aac 128k,落 web/dungeon/audio/bgm/。 # Mureka 任务 id / 选用 choice / 成本见 tools/mureka_log.md「批次 1」节; # 本作无节奏关键曲目(battle/boss 不做节拍网格同步),不需要 bpm_precise。 set -euo pipefail cd /home/xsl/SoundGame TMP=tools/bgm_post_wav/dungeon # 中间 wav(不入库,可由本脚本复现) DST=web/dungeon/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 的那支(拿不准原则),详见 mureka_log.md post tools/mureka_out/dungeon-menu/158551678976001_0.flac menu -20 post tools/mureka_out/dungeon-explore/158551855333377_0.flac explore -20 post tools/mureka_out/dungeon-battle/158552010457089_0.flac battle -20 post tools/mureka_out/dungeon-boss/158552209555457_0.flac boss -20 echo "== dungeon bgm done: $(ls "$DST" | wc -l) files =="