01要解決的問題
一支職業籃球隊一季打幾十場比賽,每場有好幾台攝影機同時拍,一場就是數百支素材檔。剪精華、做社群影片時,最常見的需求是「找某一位球員的某一球」——例如某人的三分球、某一次抄截。
數十場一季的比賽,素材分散在多顆硬碟
數百支每場多機位素材,檔名只是流水號
靠記憶過去只能憑印象、一支一支拖時間軸找
更麻煩的是:攝影機錄的是 HEVC 格式,Windows 檔案總管連縮圖都出不來;每台相機的時鐘也不準,同一個瞬間在不同機位的檔案裡位置都不一樣。
02系統做了什麼
摘自系統的總覽與生產線技術文件,用一般人看得懂的話說明。
- 每顆素材碟自己帶索引自動掃出每支影片的長度、解析度、編碼、拍攝時間,用顯示卡抽縮圖和九宮格預覽;碟插到哪台電腦,索引就跟到哪台。
- 瀏覽器裡的操作台逐層瀏覽、滑過縮圖預覽、直接播放(瀏覽器播不動的格式會即時轉檔),加標籤、評分、備註,把要用的素材收進「收集籃」批次處理。
- 比分板辨識+聯盟比賽紀錄=球賽事件逐秒讀轉播畫面上的比分板(節次、比賽時鐘、比分),再對上聯盟公布的逐球紀錄(誰得分、誰助攻、誰抄截)。紀錄告訴我們「誰做了什麼」,畫面告訴我們「什麼時候」。
- 多機位對時把每一台攝影機的時間對到同一條時間軸,所以每個球賽事件都能直接指到各機位檔案的第幾秒,也能一鍵找「同一時刻的其他機位」。
- 訪談逐字稿把受訪片段的語音轉成文字並統一成繁體,講過的話也能搜尋、點一下就跳到那一句。
- 跨碟搜尋,同事和手機也能用所有硬碟的索引彙整成一個中央索引,素材上架到公司儲存伺服器後,同事用唯讀版就能查;出門在外也能用手機查。
- 直接交給剪接選好的片段可匯出剪接軟體用的時間軸檔(FCPXML)、產生代理檔、複製到收集碟,或一鍵送進 DaVinci Resolve 的媒體池。
03AI 的角色
開發面:不寫程式的人做出整套系統
- 整套系統由不寫程式的影像工作者,用 Claude Code 協作開發。
- 開發者負責定義問題、決定規則、驗收結果;AI 負責寫程式、跑測試、整理文件。
- 這個展示網站本身也是同樣方式做的:資料匯出、影片切片、機敏資訊掃描、自動測試都由 AI 執行,開發者逐輪審核。
功能面:AI 在系統裡做的事
- 比分板辨識:逐秒讀轉播畫面上的節次、時鐘與比分,作為對時的錨點。
- 語音轉錄:用 WhisperX(Whisper large-v3 模型)把訪談轉成可搜尋的逐字稿。
- MCP 素材庫查詢:透過 MCP(Model Context Protocol),讓 AI 助理直接用一句話查詢素材庫、推送候選片段到操作台。
04線上體驗
範例資料是 2026-27 例行賽第 2 場 vs 國王:1 場比賽、49 個事件、115 段片段。可以用球員、事件類型、節次搜尋,點卡片播放,多機位的事件可以切換 FX3/A7R V/ZR,切換時會停在同一個比賽瞬間。
05Demo 影片
影片連結待補
雲端無法展示的部分(比分板辨識、機位對時、送 Resolve)會在影片中實際操作。
06程式庫
07完成狀況與限制
- 正式系統已在球隊內部實際使用。
- 展示版是唯讀的,只包含 1 場比賽;片段已轉成 720p、每段約 8 秒(事件前 5 秒、後 3 秒,碰到檔頭或檔尾會截短)。
- 雲端上無法展示的部分——比分板辨識、機位對時、送 DaVinci Resolve——以 Demo 影片呈現。
- 展示版只用球團自己拍的機位畫面,不含電視轉播畫面。
08使用的開源工具與服務
依程式實際載入的套件與呼叫的外部程式整理。授權欄依本機安裝的套件資訊(套件中繼資料、隨附的授權檔、ffmpeg -L)查核;本機查不到的寫「未確認」。
| 名稱 | 用途 | 授權 |
|---|---|---|
| FFmpeg/FFprobe | 讀取影片資訊、抽縮圖與九宮格、即時轉檔播放、產生代理檔、切展示片段 | GPL v3 或更新版(本機版本) |
| SQLite | 每顆碟的索引與標註資料庫(Python 內建) | 未確認 |
| Python | 整套系統的主要語言 | PSF License Version 2 |
| Flask、Werkzeug | 操作台、中央索引、寫入服務的網頁後端 | BSD-3-Clause |
| OpenCV | 比分板畫面的影像比對與判讀 | Apache 2.0 |
| NumPy | 比分板判讀的數值運算 | BSD-3-Clause AND 0BSD AND MIT AND Zlib AND CC0-1.0 |
| WhisperX | 訪談語音轉逐字稿 | BSD-2-Clause |
| faster-whisper | WhisperX 使用的語音辨識引擎 | MIT |
| Whisper large-v3 模型(faster-whisper 格式) | 語音辨識模型 | 未確認 |
| wav2vec2 中文對齊模型 | 把逐字稿對到精確的時間點 | 未確認 |
| OpenCC | 逐字稿簡繁轉換 | Apache License 2.0 |
| MCP Python SDK | 讓 AI 助理透過 Model Context Protocol 查詢素材庫 | MIT |
| httpx | 各服務之間的連線 | BSD-3-Clause |
| Playwright | 抓取聯盟官網的逐球紀錄 | Apache-2.0 |
| gspread | 讀取舊賽季的影音資料庫試算表 | MIT |
| google-auth | 試算表讀取的身分驗證 | Apache 2.0 |
| Robocopy | 把選好的素材複製到收集碟 | Windows 內建(Microsoft,隨 Windows 授權) |
| Git | 開發用:版本管理 | GPL v2 |
| Node.js | 開發用:檢查前端程式語法、部署工具 | 未確認 |
| Wrangler(Cloudflare) | 把這個展示網站部署到 Cloudflare Pages | MIT OR Apache-2.0 |
| Cloudflare Pages | 這個展示網站的主機 | 不適用(線上服務,依其服務條款) |
| DaVinci Resolve(腳本介面) | 一鍵把片段送進剪接軟體的媒體池 | 商用軟體(Blackmagic Design 最終使用者授權合約) |
| TPBL 聯盟比賽紀錄 | 逐球紀錄(PBP)的資料來源 | 不適用(線上資料來源,依其使用條款) |
| Google 雲端硬碟、Google Apps Script | 索引快照與發佈、手機查詢頁 | 不適用(線上服務,依其服務條款) |
| Claude Code/Claude(Anthropic) | 開發協作;AI 助理透過 MCP 查詢素材庫 | 不適用(線上服務,依其服務條款) |