Files
SoundGame/web/radio/gen/gen_bgm.sh
T
xsl d870a75a26 feat(new8/batch1): 两款新 RPG《不眠频率》radio +《回声地窟》dungeon 全套(多agent流水线:策划→资产→开发→测试→玩家R1→修复→R2)
- 程序章程 research/new8/00-program.md(8款概念/回合协议/验收门/进度账)
- 设计:docs/design/15-radio.md+voice-ids(132句,6状态9抉择4结局,电话滤波资产侧带通)/16-dungeon.md+voice-ids(125句,脉冲回声/7层seed生成/三档战斗/元进度遗产)
- 资产:TTS 970文件(GPU flock串行)+ Mureka BGM 8首 $0.24(台账 mureka_log.md)+ 程序合成 sfx(含预pan侧墙/开口、phone_ring铃声、amb_cave呼吸层、turn_tick)+ 终检 check_all_assets 8游戏全绿
- radio:game.js+playtest 221断言(4结局矩阵/pendingChoice盲玩公平/RING两级看门狗/菜单循环/存档schema)
- dungeon:game.js+playtest 1610断言(seed全网格回声一致性/学期零死/格挡80%/死亡归因真话/元进度/菜单冻结/上滑5段状态链)
- 引擎修复:audio.js _playVoice 加载竞态补杀 token(R1真机71分钟语音风暴根因)+ 同id 3s窗口≥5次熔断保险丝 + gesture.js 长按boost事件门(+66行,9套件回归全绿)
- 大厅:新增 radio/dungeon 卡片 + GAMES 数组
- harness:sessions/radio.mjs+dungeon.mjs(主线+压力双剧本)+ transcribe 注册 + voice_text.json 刷新(8游戏704句)+ 13号文档 §20 登记
- R1 存档:4人设评审×2游戏 + 真机试玩报告×2(radio 5/5愿意玩;dungeon 0/4→确诊风暴)+ synthesis×2 + 转写8份
- R2 修复:radio F1-F5(看门狗补挂/rep_low改词重录/真铃声/ASK续玩语义/链末跳过保护)+ dungeon D0-1..D1-6(风暴根治/回声真实性/密度下限+呼吸层/导航最短路/菜单关闭反馈/金币档同账本)+ 实现核对登记
2026-09-02 18:52:37 +08:00

36 lines
1.8 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# 《不眠频率》BGM 后处理(批次 1):Mureka flac 候选 -> 90s 无缝循环 ogg+m4a。
# 用法: bash web/radio/gen/gen_bgm.sh (flac 原件在 tools/mureka_out/,不入库)
#
# 工艺(tools/mureka_log.md R4/R6 同款):
# 首个强 onset 起点(silenceremove,-35dB 门限)→ 93s 裁剪 → 首尾 3s acrossfade(tri)
# 无缝循环 → loudnorm(onair/bridge/ending I=-20;menu pad I=-24,10 号文档 §1.2)
# → aresample 44.1kHz → ogg libvorbis q3 + m4a aac 128k,落 web/radio/audio/bgm/。
# Mureka 任务 id / 选用 choice / 成本见 tools/mureka_log.md「批次 1」节;无节奏关键曲目,
# 不需要 bpm_precise。
set -euo pipefail
cd /home/xsl/SoundGame
TMP=tools/bgm_post_wav/radio # 中间 wav(不入库,可由本脚本复现)
DST=web/radio/audio/bgm
mkdir -p "$TMP" "$DST"
post() { # post <flac> <track> <LUFS>
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/radio-onair/158551062544386_0.flac onair -20
post tools/mureka_out/radio-bridge/158551207313409_0.flac bridge -20
post tools/mureka_out/radio-menu/158551383277574_0.flac menu -24
post tools/mureka_out/radio-ending/158551538401281_1.flac ending -20
echo "== radio bgm done: $(ls "$DST" | wc -l) files =="