## ▶成品範例

這支影片就是用 AUTOMOVIE 產生的：原始素材是一段第一人稱行車紀錄影片加上 FIT 檔， 影片裡的旁白配音、動態字幕、節奏背景音全部由程式自動生成， 內容根據截圖畫面與騎乘數據撰寫，再經人工逐句校對修改。

🎙 旁白：edge-tts 語音合成 💬 字幕：依畫面與數據生成 🥁 背景音：心率＋功率驅動 ✍ 人工校對後輸出

在 YouTube 上觀看：https://youtu.be/SApBGdFJeu8

## i這是什麼／不是什麼

✔ 是這樣的

- 單機工具，影片、FIT 檔留在你電腦上原本的位置，程式只記路徑、不複製
- 旁白內容根據真實截圖畫面與 FIT 數據寫成，不是憑空生成
- AI 部分是「帶你自己的」——你自己裝好 Claude Code / Antigravity CLI 等 指令列工具，程式呼叫它，額度算你自己的
- 不需要 AI 也能用：退回數據規則生成（只播數字，沒有畫面劇情）
- 支援同一趟騎乘的多段影片自動接成一支（相機分段錄影也沒問題）
- 可疊加儀表盤（速度／功率／心率／迴轉數／高度／坡度／時間）， 位置大小顏色都可自訂並存成配置，跟旁白字幕一次轉檔完成
- 可設定多個 AI 工具依序備援，一個額度用完自動換下一個

✘ 不是這樣的

- 不是雲端服務，沒有帳號、沒有訂閱
- 不會把你的影片上傳到任何地方（TTS 配音例外，需連微軟的語音服務）
- 不保證 AI 寫的每一句都 100% 正確——程式有自動查核機制會標出可疑句子， 但最終還是要你人工確認

## 1系統需求

項目 | 需求
--- | ---
作業系統 | Windows 11（Windows 10 未測試）
Python | 已內建可攜式版本，免另外安裝
ffmpeg | 已內建（含 GPU 編碼版本），免另外安裝
網路 | 語音合成（edge-tts）需要連線；若有設定 AI CLI，AI 那部分也需要網路
GPU（選用） | NVIDIA 顯卡若驅動支援 NVENC 會自動使用，加速轉檔；沒有就自動退回 CPU
AI CLI（選用） | Claude Code 或 Antigravity CLI 擇一，用來做「截圖場景辨識」與「旁白撰寫」；不裝也能用，但旁白會比較平淡

關於 GPU / CPU 生成影片畫面的「解析度」下拉選單旁邊會顯示目前偵測到的編碼方式（自動／GPU／CPU）。 NVENC 需要驅動版本配合，程式啟動時會實際測試一次是否可用，不是單看版本號猜測。

## 2快速開始

整體流程只有五步，畫面上由上到下依序編號：

介面總覽：由上而下依序是「專案」「設定」「提示詞範本」， 接著才是編號 1～5 的主要工作流程。

1. 選擇素材 — 貼上影片路徑與 FIT 路徑（或用「選擇…」跳出檔案總管挑選）， 同一趟騎乘有多段影片可以「＋ 新增影片片段」逐段加入，按「建立專案」
2. 對時 — 讓程式知道「影片的第幾秒」對應「FIT 檔裡的哪個真實時間」， 原始相機檔可以一鍵用檔案本身的錄影時間對時，不用看畫面
3. 分析截圖 — 抽取畫面、用 AI 描述每張截圖的騎乘情境； 可以手動設定間隔，也可以交給 FIT 數據自動找出高光時段
4. 旁白 / 字幕 — 按「重新產生旁白」讓 AI 根據截圖說明＋數據寫腳本， 逐句檢查修改
5. 生成影片 — 選解析度、要不要節奏背景音與儀表盤配置， 按「生成影片」，完成後直接在頁面上播放

## 3Step 1：選擇素材

頁面最上方是「專案」下拉選單，之後每次要接續之前做過的專案， 從這裡選就好，不用重新選路徑。

在「1 選擇素材」區塊貼上影片和 FIT 的絕對路徑，或直接按旁邊的 「選擇…」跳出 Windows 原生選檔視窗（這個視窗是在你自己電腦上開的，不會有任何檔案被傳出去）。

建立專案後會顯示影片的解析度、長度、FIT 紀錄筆數； 下方「參考附件」可以額外加圖檔／網頁連結／文件檔（見下方說明）。
為什麼是貼路徑，不是上傳檔案？ 這是單機工具，影片動輒好幾 GB，透過瀏覽器上傳再複製一份完全沒必要， 也拖慢速度。程式只記錄路徑，實際讀取都是直接對原始檔案操作。

### 多影片組合（同一趟騎乘的多段錄影）

行車紀錄器有時會自動分段錄影，或某段路你分開錄了好幾支—— 按「＋ 新增影片片段」可以依序加入多支影片，它們會依照你加入的順序 自動接在同一條 FIT 時間軸上，最後一次轉檔輸出成一支完整影片， 不需要先用其他軟體剪接、也不會二次轉檔。

每個片段各自一列，可各自「選擇…」或用 ✕ 移除； FIT 只需要一份，涵蓋所有片段的時間範圍即可。 上圖是一趟被相機自動切成四段的實際專案。
片段規格要一致 多段合併需要相同解析度與幀率（同一台相機同一次設定通常沒問題）。 規格不一致的話，建立專案時就會直接報錯告訴你哪一段不對， 不會等轉到一半才失敗。
片段之間沒錄到的空檔怎麼算？ 完全不影響——每一段各自對時之後，程式會用真實時間戳記把 FIT 數據 正確對應到每一段裡，段落之間沒拍到的時間會自動跳過， 儀表盤上的時鐘、心率、功率等數據到了下一段會正確接續，不會有錯位。

### 參考附件（選填）

按「＋ 新增附件」可以加入三種類型的參考資料，內容會被整理成文字， 在後面「產生旁白」時提供給 AI 參考（例如排行榜截圖裡的名次、對手名字）：

類型 | 用途 | 限制
--- | --- | ---
圖檔 | 排行榜截圖、路線圖等；AI 會讀圖描述內容 | 需要先設定好 AI CLI
網頁連結 | 公開的活動介紹頁、部落格文章 | 需要登入才看得到的頁面（例如 Strava 活動頁）抓不到， 會被自動偵測並擋下，請改用截圖
文件檔 | .txt / .md / .csv 直接讀；.docx 也支援 | —

每一筆附件旁邊都有「測試讀取」按鈕，加進去當下就能確認抓不抓得到內容，不用等到跑到一半才發現。

## 4設定 AI（選填，但強烈建議）

這是整個工具「有沒有靈魂」的關鍵設定。AI CLI 負責兩件事：看截圖描述畫面內容、 根據截圖說明與數據寫旁白。不設定也能用，但旁白會退回純數據播報（沒有畫面劇情）。

按「🔍 自動偵測我電腦上裝了什麼」掃描已安裝的工具，再按「全部依序帶入」 一鍵建立整條指令鏈；▲▼ 可調整先後順序。

### AI 指令鏈：一個掛了自動換下一個

可以設定多個 AI 工具，由上而下依序嘗試。第一個連不上、額度用完、 或發生任何錯誤，會自動換下一個，全部失敗才報錯（錯誤訊息會列出每個工具各自的原因）。 成功的那個會被記住，之後直接從它開始，不會每次都重試掛掉的那個—— 這點很重要，一次連拍分析可能呼叫數十次，每次都先等一個壞掉的工具逾時會多花好幾分鐘。

目前程式認得並且已經實測驗證過能正常運作的工具：

工具 | 安裝方式 | 備註
--- | --- | ---
Claude Code | `npm install -g @anthropic-ai/claude-code` | 用你目前登入的 Claude 額度，不用另外申請
Codex CLI | `npm install -g @openai/codex` | 最快：圖片用 `-i` 直接附加給模型，不是叫它自己開檔。 實測 6 張連拍 10.2 秒，Claude Code 同樣 6 張要 22.6 秒
Antigravity CLI | `winget install Google.AntigravityCLI` | Google 出的終端 AI 代理工具， 完整安裝與認證步驟看這裡 →
Gemini CLI | 自行安裝並登入 | 指令範本尚未實測驗證，填入後請按「測試」確認

這格到底要填什麼？ 「AI 指令模板」就是「怎麼呼叫你電腦上已裝好的工具」的完整指令。`{prompt}` 執行時會被換成程式要問的問題，`{image}` 會被換成一張截圖的實際路徑。 例如填 `claude -p "{prompt} 圖片路徑: {image}" --allowedTools Read`， 實際執行時就會變成 `claude -p "描述這張圖...圖片路徑: C:\...\f_001.jpg" --allowedTools Read`。 金鑰、登入額度都是你自己的 CLI 在管，本程式不會儲存任何金鑰，只存這串指令文字本身。

變數 | 作用
--- | ---
`{prompt}` | 程式要問的問題文字
`{image}` | 截圖路徑。單獨當成一個參數時會展開成多個檔案， 給 `-i a.jpg b.jpg` 這種多圖參數用； 純文字呼叫（寫旁白）時會連同前面的旗標一起移除，不會留下沒有值的 `-i`
`{out}` | 暫存檔路徑。填了就從該檔讀答案而不是讀螢幕輸出—— 適合會在畫面印出工作階段訊息、token 統計的工具（例如 Codex）

## 5Step 2：對時

對時完成後會顯示這個時間窗口涵蓋的距離、均速、心率、功率統計， 用來確認對時抓對了範圍。

程式需要知道「影片第幾秒」對應「FIT 檔裡的哪個真實時間戳記」， 才能把心率、功率、速度這些數據跟畫面對上。只需要抓一個對應點， 剩下的時間軸就會自動算出來。三種方式由簡到繁：

- ⏱ 用檔案時間對時（推薦・免 AI）：沒經過剪輯軟體轉檔的相機原始檔， 本身就帶有錄影開始的時間（容器 metadata、部分機型連檔名都有）， 按這顆按鈕一鍵讀取、自動比對 FIT 的騎乘時段，通常一秒內就對好， 連 AI CLI 都不用設定
- 🤖 AI 判讀畫面時鐘：如果影片畫面角落有燒錄時鐘浮水印 （例如已經過 DJI Studio 等軟體處理過的影片），設定好 AI CLI 後 按這顆按鈕，AI 會直接讀圖上的時間文字自動對時
- 手動輸入：前兩種都不行時的保底方案，看畫面裡的時鐘， 照「時:分:秒」格式輸入即可（例如 `08:57:11`）

常見誤會 輸入框裡的「時:分:秒 (例如 08:57:11)」是灰色的格式提示，不是已經幫你填好的值。 手動輸入時一定要照畫面上實際看到的時間填，欄位空著按確認會被擋下並提示重填。
多片段：一鍵全部對時 相機自動分段的原始檔，每一段自己都帶錄影時間，所以不必一段一段點—— 對時區的「⏱ 全部片段一鍵對時」會依序把每段都對好。 （若要逐段處理，切換「對時片段」下拉選單即可；手動或 AI 對完一段後 會自動跳到下一個還沒對時的片段。全部對完才能進下一步。）

## 6Step 3：分析截圖

這一步做兩件事：抽取畫面（純本機運算，不花 AI 額度）跟 AI 場景辨識（每張截圖真的會呼叫一次 AI，會花額度跟時間）。

「透過 FIT 自動分析場景」勾選後截圖間隔改由數據決定， 「每批連拍張數」在兩種模式下都通用。

### 兩種找截圖時機的方式

- 手動間隔：自己填「每 N 秒截一張」，整支影片平均取樣， 涵蓋最完整，但平淡路段也會截圖、花比較多 AI 額度
- 透過 FIT 自動分析場景：勾選後「截圖間隔」欄位反灰不用填， 改由程式分析功率／心率／迴轉數／速度的波動大小自動找出全程最精彩的 幾個時段，只在那些時段截圖分析——平淡路段完全不截圖、不花 AI 額度， 同樣的預算能把更多次數花在真正有故事的地方

### 每批連拍張數（兩種模式都能用）

設 1 是傳統的「單張看圖說故事」模式；設大於 1（例如 5）時， 連續的幾張截圖會整批一次送給 AI，改問「這幾秒發生了什麼變化」—— 誰從哪一側超車、跟前車距離拉近或拉開、隊形怎麼變化， 這種跨張比較單張截圖天生看不出來，連拍多張後描述會明顯更生動、更連貫。 自動分析場景模式下，每個高光時段就是連拍「每批連拍張數」張、每秒一張。

連拍分析產生的描述會寫在整批的每一張截圖上（清單裡看到重複是正常的）， 展開後每一列都有縮圖跟可編輯文字，AI 講錯了直接在這裡改。
換過間隔、換過批次大小，都不會浪費之前的辨識結果 截圖說明是用「時間點」存的快取。已經辨識過的時間點永遠不會重花一次 AI 額度； 「🗑 清除辨識重新分析」按鈕只清描述文字，已經抽好的截圖檔案會保留、不重抽， 省下重新解碼影片的時間。

## 7提示詞範本庫

可以編輯「截圖說明」跟「旁白生成」兩種範本， 存成多組、跨專案重複使用；內建預設鎖住不能改，按「另存新範本」複製一份修改。

如果你發現旁白的風格、用詞、規則想要調整（例如想要更活潑、想要固定的收尾格式、 想要主角用特定名字稱呼），這裡就是動手的地方。範本存在本機的 SQLite 資料庫 （`app/data.db`），每個專案可以各自選用不同範本。

範本 | 作用
--- | ---
截圖說明範本 | 決定 AI 怎麼描述每一張截圖的畫面內容
旁白生成範本 | 決定 AI 怎麼把「截圖說明＋騎乘數據＋附件＋補充背景」 寫成最終的旁白台詞，可用變數如 `{"{"}duration{"}"}` `{"{"}table{"}"}` `{"{"}scenes{"}"}` `{"{"}context{"}"}` 等

格式錯誤會直接被擋下 旁白生成範本存檔時，程式會先檢查裡面用到的變數是不是都合法（避免打錯字）， 格式有誤會在存檔當下就告訴你哪裡錯了，不會等到跑一半才爆炸。

## 8Step 4：旁白 / 字幕編輯

點選任何一句旁白，上方會顯示該時間點最接近的截圖畫面、AI 對那張圖的說明， 並把儀表盤直接畫在畫面上——數值取自該秒真實的 FIT 遙測， 可以直接核對旁白講的功率／心率／時間對不對。

- 旁白聲音：共 14 個中文聲音（台灣 3、大陸 8、香港 3）， 其中「大陸・男聲・體育賽事風格」語速快而有力，很適合熱血轉播。 每句旁白左邊有一顆 ▶，按下去約兩秒就能立刻試聽這個聲音唸出來的效果， 不必等整支轉檔
- 旁白最大空白(秒)：一句唸完之後最多隔幾秒要有下一句，避免影片出現太長的無聲空白。 設小＝密集熱鬧，設大＝留白多
- ✨ 重新產生旁白：根據目前的截圖說明（含你手動修正過的）＋數據＋附件＋ 補充背景，重寫整份旁白稿——這一步不會重跑截圖辨識，很快
- 畫面查無標示：如果某句旁白提到的細節（左右方向、機車、超車等） 在該時間點附近的截圖說明裡找不到根據，那一句會被標橘色提醒你複查—— 這是輔助檢查，不是絕對正確的判定

校對畫面與旁白的訣竅 預覽區同時給你三件事：截圖、AI 對那張圖的描述、以及該秒的真實數據。 旁白如果說「功率兩百多瓦硬撐」，就看儀表盤上的功率對不對； 說「超越左側車手」，就看截圖與描述有沒有這件事。三者對得起來才算過關。
補充背景怎麼寫比較有效 可以直接寫：主角要怎麼稱呼、今天的天氣心情、想強調的劇情轉折、 收尾要不要固定格式（例如「Strava 路段完成，平均功率／心率／時間」）。 這欄位會被完整送進旁白生成的提示詞裡，寫得越具體，AI 產出的內容越貼近你要的。
主角名字沒生效？先看工作日誌用了哪份範本 「在範本庫裡選一份」跟「這個專案要用哪一份」是兩件事。若範本裡寫了主角名字 但旁白仍自稱「他」，多半是這個專案當下套用的其實是內建預設。 產生旁白時工作日誌會明寫 `AI 生成旁白…（旁白範本：正式版）`，看那一行就知道實際用了哪一份。

## 9Step 5：生成影片

轉檔完成後直接在頁面上播放，不用下載。 「📁 開啟檔案所在資料夾」會直接跳出檔案總管並選中該檔案。

選項 | 說明
--- | ---
解析度 | 原始（依來源）／1080p／720p
編碼 | 自動（偵測到可用 GPU 就用 GPU）／強制 GPU／強制 CPU
旁白聲音 | 14 個中文聲音（edge-tts，全部免費），與 Step 4 的選擇連動
節奏背景音 | 心率＋功率驅動的節奏底層音效，音量可調
片尾停留(秒) | 最後一個畫面多停幾秒，讓收尾的旁白唸得完
旁白提前(秒) | 整份旁白與字幕一起往前挪，預設 0.5。因為講話需要時間， 在該秒才開口的話，關鍵字唸出來時畫面往往已經過去了； 提前一點可以讓描述正好落在那個畫面上。字幕與語音永遠一起移動， 不會互相錯開

生成過程中有真實的進度條（不是假動畫，是解析 ffmpeg 實際回報的編碼進度算出來的）， 右側有「⏹ 中止」按鈕，按下去約 1 秒內就會真的停止轉檔行程並清掉半成品檔案。

### 📟 儀表盤（從 FIT 數據疊加到畫面）

勾選「儀表盤」後，主流程只需要選一個配置並填標題文字即可。 要調整每個數值的位置、大小、顏色，按「🎛 開啟編輯器」會在新分頁打開專用編輯器。

左邊是即時預覽，右邊是每個項目的開關／X／Y／大小／顏色。 調整後畫面立刻更新，不用等轉檔。

- 直接拖曳：預覽圖上的方塊可以直接拖到想要的位置，放開就寫回右邊的數值。 沒人在腦中換算百分比，所以位置這件事就在畫面上直接指
- 真的即時：預覽不是每次都重跑 ffmpeg（那要好幾秒），而是抓一張乾淨畫格當底、 用網頁元素把儀表盤疊上去，錨點與字級換算跟實際輸出用同一套規則。 實測拖曳一次約 0.15 秒
- 🎬 實際渲染確認：旁邊這顆會跑真正的 ffmpeg 出一張圖， 字體描邊之類的細節以它為準
- 存成配置：調好的版面可以命名存起來跨專案重複使用（存在 `data.db`）， 之後回主流程選它即可
- 時間可加日期：時鐘格式可選「只有時間／日期＋時間（兩行）／只有日期」

位置與大小都是畫面比例 X／Y 用百分比、大小用倍率，所以同一份配置在 720p、1080p、4K 都適用， 不必為不同解析度各存一份。坡度是 FIT 沒有的欄位，程式用高度變化反推 （25 公尺平滑窗），避免氣壓式高度計逐秒微幅跳動造成坡度數字閃爍。
不用再靠 DJI Studio 二次轉檔 儀表盤跟旁白字幕是同一份 ASS 疊加圖層，在同一次 ffmpeg 轉檔裡一起燒錄進畫面， 不會有先套用儀表盤再匯出、又匯入剪輯軟體轉一次檔的重複轉檔耗時與畫質損失。 多影片組合的專案，儀表盤時鐘也會正確對應到每一段各自的真實時間。

## ?常見問題

影片會被複製或上傳嗎？

不會。程式只記錄你貼的路徑，讀取都是直接對原始檔案操作。 唯一會離開這台電腦的資料是：語音合成（連微軟的 edge-tts 服務）、 以及你自己設定的 AI CLI 呼叫（連你自己 CLI 對應的服務）。

沒有 AI CLI 可以用嗎？

可以。分析截圖那步把「使用 AI 辨識畫面內容」取消勾選， 旁白生成就會退回純數據規則生成（照時速/心率/功率的變化播報）， 不會有畫面劇情內容，但功能完全能跑。

轉檔跑到一半可以中止嗎？半成品會留在硬碟上嗎？

可以中止，每個工作階段（分析截圖／產生旁白／生成影片）進度條旁邊都有中止鍵。 中止轉檔時，半成品的 mp4（打不開的壞檔）會被自動刪除，不會留下垃圾檔案。

旁白內容不準確、憑空編造細節怎麼辦？

三層防護：①提示詞明定「不可編造，時間點誤差不超過 2 秒、方向細節要照抄」； ②程式會自動把單張截圖無法判斷的「超車／被超車」描述先過濾掉， 不讓這種本來就不可靠的資訊進到旁白生成的素材裡； ③旁白編輯區會把「畫面查無根據」的句子標橘色提醒你複查。 即使如此，AI 仍可能出錯，最終請以人工複查為準。

網頁連結附件抓不到內容？

常見原因是那個網址需要登入才看得到內容（例如 Strava 活動詳細頁）。 程式會偵測登入頁的特徵字樣並主動擋下，避免把「請登入」這種無意義文字 誤當成真實資料餵給 AI。遇到這種情況請改用截圖，存成圖檔附件。

換了截圖間隔要重新辨識嗎？

不用。截圖說明用時間點存快取，跟間隔脫鉤——不管你怎麼調整間隔， 已經辨識過的時間點永遠不會重花一次 AI 額度。

多段影片一定要解析度、幀率都一樣嗎？

是的，這是 ffmpeg 直接串接畫面流所必須的限制。 同一台相機同一次設定拍出來的通常沒問題；不一致的話建立專案時就會被擋下， 並告訴你哪一段的規格對不上，不會等轉檔轉到一半才失敗。

「透過 FIT 自動分析場景」會不會漏掉重要畫面？

它只看得到功率／心率／迴轉數／速度的數據波動， 抓不到「純視覺事件」——例如漂亮的風景、路牌地標、單純停等紅燈 （這些時候數據通常很平穩，不會被判定為高光）。 如果這些畫面對你很重要，建議改用手動間隔模式，或間隔調小一點。

轉檔跑到一半網頁斷線／不小心關掉了怎麼辦？

工作是在背景跑的，跟網頁分開。短暫斷線時進度條會顯示「連線中斷，自動重試中」 並持續嘗試最多五分鐘，恢復後自己接回去；重新整理或重開網頁、再載入同一個專案， 也會自動接回還在執行的工作，完成時照樣往下開下一個步驟。

旁白把「心率」唸成「心帥」？

「率」有兩個讀音，語音引擎在「心率」會挑錯。程式會在送去合成之前 把它換成同音的寫法，字幕仍然顯示正確的「心率」——看到的跟聽到的都對。 語音快取是以「實際唸出的文字」為鍵，所以修正後舊的錯誤發音不會被沿用。

GPU 沒有被使用？

程式啟動時會實際測試一次 NVENC 能不能用（不是只看驅動版本號）， 設定頁最上方會顯示目前偵測到的 ffmpeg 路徑跟 GPU 狀態。 若你的顯卡驅動版本跟 ffmpeg 要求的 NVENC API 版本不匹配， 會自動退回 CPU 編碼，仍然能正常轉檔，只是速度較慢。