Communitygithub.com

Qiushuii/score-sync-guide

在 Windows 上將一份管弦樂作品的 MusicXML 總譜與錄音,製作成「譜面同步滾動 + 導賞解析卡」的長影片(跟譜聽)。

score-sync-guide 是什麼?

這個技能(skill)提供了一套完整的工作流程,用於在原生 Windows 環境中,將 MusicXML 總譜和對應的錄音檔案,製作成包含同步滾動總譜與導賞解析卡的長影片。其核心是基於逐起音(note onset)的精細對齊演算法,該演算法移植自 [tofucurd/score-sync-video](https://github.com/tofucurd/score-sync-video) 專案,並針對 Windows 進行了在地化與功能擴展,支援單聲部顯示、音符變色、固定播放線以及兩段式曲式結構。整個流程不需依賴 WSL、Node.js 或 Playwright,完全依靠系統 Python 與 ffmpeg 等原生工具。此外,技能還包含了譜面體檢、校訂、交叉核對解析卡內容、以及跨區塊可續渲(resumable rendering)等輔助功能,確保最終影片的準確性與專業度。此技能適用於開發者或進階使用者,希望以程式化、可重複的方式製作高品質的「跟譜聽」或「導聆影片」。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Qiushuii/score-sync-guide/tree/HEAD/skills/score-sync-guide

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

跟譜聽(score-sync-guide)

把 MusicXML 總譜 + 一份錄音 做成一支影片:左邊是單行橫向滾動的總譜,播放線固定不動,正在發聲的音符變紅,只顯示正在演奏的聲部;右邊是導賞解析卡和本樂章的曲式結構。全流程在原生 Windows 上跑,不需要 WSL、Node 或 Playwright。

這套做法來自一部馬勒第六交響曲(四個樂章、83 分鐘)的實際製作。其中逐起音對齊演算法移植自 tofucurd/score-sync-video(MIT),播放器的若干設計(固定游標、穩定的聲部集合、兩級曲式結構、按塊可續渲)也借鑒了它;本 skill 是它在 Windows 上的在地化與擴展(導賞卡片、錄音對齊流程、交叉核對工具)。

先讀這幾條規矩

  1. 原始檔案不動。 譜面、錄音放在專案根目錄,唯讀;改譜一律寫進 scores_fixed/corrections.json,由 tools/fix_mxl.py 生成副本,並記錄依據(原譜頁碼、截圖)。
  2. 改音符先問使用者。 社群 MusicXML 與印刷總譜常是不同版本,「不一致」不一定是錯。只修明顯的導入錯誤。
  3. 商業錄音不上傳到任何第三方服務,也不進倉庫。
  4. 新裝 Python 包由使用者自己裝:列出包名和命令,不要擅自 pip install。
  5. 解析卡裡每一條事實性斷言都要有依據:譜面資料(寫明小節號)或可核查的文獻(references.json + 角標)。查不到就不寫,或標「未核實」。自動和聲分析對大編制管弦樂不可靠,只作線索。
  6. 使用者不識譜時,驗收靠耳朵:對著譜面聽(爭議片段合集)比聽「嗒」聲更可靠。
  7. 先跑逐起音細對齊,再請使用者聽、再加釘點。 反過來做(先讓使用者逐個報時刻),會把大量精力花在細對齊本來就能自動解決的小節內偏移上。
  8. 使用者的個人看法只作點綴,不替使用者編造或誇大觀點。

流程總覽

步驟做什麼主要檔案詳見
0建專案:把 template/ 複製到專案根目錄,寫 manifest.jsontemplate/、examples/mahler6/manifest.jsonworkflow
1體檢譜面:聲部、反覆、速度、排練記號、佔位字analyze.py、check_all.pyworkflow
2校訂副本、聲部中文名與合併tools/fix_mxl.py、tools/build_labels.py、labels.jsonworkflow
3逐小節 DTW → 馬上做逐起音細對齊align/align.py、align/ssv_align.pyalignment
4聽檢:爭議片段合集;只在細對齊之後仍錯的地方加釘點、局部重校,再重跑細對齊demo/make_disputes.py、align/manual_regions.json、align/refine_local.pyalignment
5曲式、動機、解析卡form/、motifs.json、cards/cards
6交叉核對卡片與譜面、審停留時間tools/cards_xcheck.py、tools/cards_review.pycards
7排譜、播放頁、試片demo/build_score.py、demo/player.html、demo/render_frames.pyrendering
8全片渲染與拼接demo/render_film.pyrendering

Windows 上踩過的坑(編碼、行程、埠、批次處理換行、ffmpeg 取樣率等)集中在 windows-notes,動手前掃一遍。

最短路徑(一個樂章)

# 系統 Python(裝了 verovio、music21、librosa、numba)
$py = "python"
& $py -X utf8 analyze.py                                   # 體檢:out/<譜名>_structure.json、report.txt
& $py -X utf8 align/align.py --movement 1                  # ① 逐小節 DTW → align/m1_measures.json(開頭錨點寫在 align/anchors.json)
& $py -X utf8 align/ssv_align.py 1                         # ② 緊接著逐起音細對齊 → align/m1_ssv_chain.json
& $py -X utf8 align/make_checklist.py                      # 聽檢清單
& $py -X utf8 demo/make_disputes.py                        # ③ 爭議片段合集:對著譜面聽
# ④ 只在仍然不對的地方往 align/manual_regions.json 加 pins/beats,必要時:
& $py -X utf8 align/refine_local.py --movement 1
& $py -X utf8 align/ssv_align.py 1                         # ⑤ 改了釘點或小節表就重跑細對齊
& $py -X utf8 demo/build_score.py --movement 1 --range 1-40 --out demo/build   # 排譜(位置從 1 起)
& $py -X utf8 demo/render_frames.py --data build/data.js --out demo/test.mp4  # 試片

整片:

& $py -X utf8 demo/render_film.py plan --res 1920x1080 --fps 60 --name 樣片 --single 4
& $py -X utf8 demo/render_film.py worker 1 --only 4        # 可同時起多個 worker(編號決定除錯埠)
& $py -X utf8 demo/render_film.py worker 2
& $py -X utf8 demo/render_film.py status
& $py -X utf8 demo/render_film.py assemble

長時間渲染要用與當前終端脫鉤的行程啟動(見 windows-notes 的 WMI 一節),否則關掉終端或工作階段就斷了。

交付前自檢

  • 時間軸嚴格遞增,沒有缺小節;展開反覆後的小節數與 play_order 一致。
  • 聲部名全部是中文,沒有「未分類」。
  • cards_xcheck.py 的可疑項逐條判斷過;cards_review.py 全部通過;改過卡片後重跑 build_refs.py。
  • 改了小節表或釘點後重跑 ssv_align.py(build_score.py 會用指紋攔下過期的細對齊)。
  • 成片逐段核對幀數;抽幀目檢。

相關技能