Communitygithub.com

demo-video

使用 Playwright 和 Edge TTS 錄製真實網頁應用程式流程(註冊、建立訂單、提交工單等)的旁白、字幕示範影片,解析度為真正的 1920x1080,並包含可見游標與紅色高亮框。

demo-video 是什麼?

此技能可自動為真實網頁應用程式建立高品質示範影片。它會在全新的無頭瀏覽器中執行實際流程(絕不使用模擬或舊影片),利用 Edge TTS 生成旁白,將字幕嵌入影片,最終輸出 MP4 檔案。該技能適用於 Claude Code、Cursor 和 Codex 等支援技能的 AI 代理平台。用戶只需描述要示範的流程(如「建立示範影片」或「為流程建立導覽影片」),技能就會自動建立 `narration.json`(旁白設定)和 `flow.cjs`(操作腳本)。錄製引擎確保影片為 1920x1080、30fps,並包含平滑移動的游標與紅色高亮框來指示操作目標。若流程畫面變更或需要調整旁白(如語音、語速),技能能夠智慧地僅重建受影響部分,避免從頭開始。此外,它還內建驗證機制(如檢查最長無旁白間隔是否超過 7 秒),確保輸出品質。

相容平台✓Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/Thaksen-Karote/demo-video-kit/tree/HEAD

在你喜歡的 AI 中提問

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

說明文件

示範影片 (Demo Video)

在全新的無頭瀏覽器中錄製真實的應用程式(絕不使用模擬或舊影片),使用 Edge TTS 進行旁白解說、嵌入字幕,並渲染為 MP4 檔案。一個示範包含兩個針對其流程編寫的檔案:narration.json 和 flow.cjs;所有其他功能都由本資料夾中的 demo-video-kit 命令提供。可參考的範例位於 examples/todomvc/。

以下 <kit> 代表 node <本資料夾>/bin/demo-video-kit.js(本資料夾例如是 ~/.claude/skills/demo-video);當用戶的專案已安裝此工具時,使用 npx demo-video-kit 效果相同。執行 <kit> help 可列出所有命令。

請求決定任務

請求執行內容
"為 <流程> 建立示範"執行下方完整流程,產出放在用戶專案的 demos/<流程>/ 資料夾
"<流程> 的畫面變了,重新製作示範"預演新畫面(步驟 2),修正 flow.cjs,若文字不再合適則修正 narration.json;然後執行步驟 4 到 8
"在現有 <流程> 影片中加入高亮框"(不重新錄製)在執行中的應用程式內測量框的位置,寫入 annotations.json,執行 <kit> annotate <示範資料夾>(參見高亮框小節)
"... 不要高亮"省略所有 highlight 選項;其餘不變
"更換語音 / 語速 / 用詞"編輯 narration.json(voice、rate、片段 text),然後執行步驟 4 到 8:因為片段長度決定了螢幕上的時間點,所以影片必須重新錄製

規則(永遠遵守)

  1. 真實且全新。 一個新的瀏覽器工作階段;真實的應用程式;真實的資料。絕不偽造結果、數字或狀態;只有在應用程式顯示成功後才能宣告成功。
  2. 安全。 僅限於本機或測試環境:每次執行都會真實建立該流程所建立的任何內容。絕不列印或儲存憑證:憑證必須來自環境變數(例如 DEMO_EMAIL、DEMO_PASSWORD);密碼僅顯示為點。如果不知道測試帳號,請詢問一個。
  3. 畫面。 1920x1080,16:9,30 fps,H.264 + AAC MP4,以無頭模式錄製以確保無畫面裁切。游標可見,會滑動到每個目標並帶有輕微的點擊環;無縮放、無鏡頭移動、無華麗轉場。在對任何元素採取動作之前,先將其完全捲動至畫面內;從上到下緩慢閱讀長頁面,速度要足夠慢以便閱讀。
  4. 音效。 Edge TTS,預設語音為 en-IN-NeerjaNeural(使用 <kit> voices en- 或其他過濾條件列出其他語音)。每個旁白片段對應一個音訊片段;音訊片段絕不重疊;旁白僅描述該場景中螢幕上顯示的內容或即將發生的事情。
  5. 無間隔超過 7 秒。 沒有旁白的時間段不得達到 7 秒。當錄製器發出警告,或 verify.py 失敗時,請加長或分割該片段的旁白,或加快其操作速度,然後重新錄製。
  6. 節奏。 不匆忙:輸入的每個值都必須在可見後才能繼續進行。
  7. 遵循應用程式。 從執行中的應用程式(預演模式)推導出路徑、標籤和按鈕,絕不依賴記憶。按應用程式顯示的名稱來命名按鈕。
  8. 輸出檔案不加入 Git。 除非被要求,否則產生的音訊、建構檔案和 MP4 都不提交。
  9. 高亮。 每個示範都應標記旁白所指的元素,使用紅色框,除非請求明確說「不要高亮」。

高亮框

一個紅色框(4 像素,#E11D48,與元素間距 6 像素)會在影片錄製時即時繪製在頁面上,因此它會跟隨捲動並成為畫面的一部分。預設會加上框的項目包括:導航到該畫面途中點擊的每個選單項目、啟動流程的按鈕、檢閱頁面上的每組已輸入資料,以及最後的提交按鈕。不需要為每個正在輸入的欄位都加框:游標和輸入過程已經顯示了它。

flow.cjs 中的 API:

  • goto / click / type / pick (loc, ..., { highlight }):highlight: true 會為游標將移動到的元素加框;highlight: <定位器> 則改為為另一個元素加框(例如其整個行或區塊)。
  • 一個框會一直保留,直到游標移動到下一個目標。{ keep: true } 會同時保留目前的框;k.clearHighlights() 會移除它們;k.highlight(loc) 則會新增一個框而不移動游標。
  • 每個框都會在 build/timeline-raw.json 的 marks 中新增一個 highlight 項目。

對於已經錄製好但沒有框的影片,可以使用 <kit> annotate <示範資料夾> 從 annotations.json 事後繪製框。這是一種備用方案;重新錄製更容易且更準確。

工作流程

  1. 設定。 執行 <kit> doctor(參見設定小節)並確認應用程式在其網址上可以回應。
  2. 預演。 使用 Playwright 瀏覽器工具,在不錄製且不進行最終提交的情況下走一遍真實流程:記錄每個畫面的路徑、標籤和 getByRole 名稱、下拉選項、對話框、最終按鈕,以及按下按鈕後發生的事情。
  3. 撰寫示範:執行 <kit> init <示範資料夾> --url <應用程式網址> 會產生一個可立即執行的起始範本;或複製 examples/todomvc/。然後編輯:
    • narration.json:標題、語音、語速、pronounce(書寫文字 → 朗讀發音),以及片段 {id, scene, text}。如果一個場景中的動作耗時較長,請將其分割成數個片段,使每個片段的旁白長度大致等於其動作所需的時間。
    • flow.cjs:使用 runDemo(__dirname, async (k) => { ... }),每個旁白片段對應一個 k.segment(id, async (at, clip) => { ... })。使用 k.click / k.type / k.pick / k.goto / k.scrollBy;at(seconds) 用於等待片段中的某個時間點(例如 clip.cues[0].end)。應等待元素,絕不等待 "network idle"。回傳已驗證的內容。保留 require(process.env.DEMO_KIT || 'demo-video-kit'):命令會設定 DEMO_KIT 環境變數。
  4. 執行製作。 執行 <kit> run <示範資料夾>(需在環境中設定 DEMO_BASE_URL 及任何憑證)會依序執行音訊、錄製、渲染和驗證。來自錄製器的每行 WARNING,以及來自 verify 的每行 FAIL,都違反了規則 5:請修正後重新執行。若僅修改 flow.cjs,可使用 --from record 跳過音訊步驟;若僅修改字幕或編碼,可使用 --from render 跳過錄製步驟。
  5. 檢視結果。 build/check/contact-sheet.png:每個影格都應顯示完整畫面、游標、正確的步驟、可讀的字幕,以及旁白所指元素上的框。影片檔案為 <示範資料夾>/<資料夾名稱>.mp4。
  6. 移交。 回報 MP4 的路徑、時長、格式、最長無旁白間隔、此執行建立了什麼,以及任何因應用程式實際運作方式而與請求不符之處。

設定

需要 Node 18+ 和 Google Chrome(或 Microsoft Edge:錄製器會自動改用 Edge,或設定 DEMO_BROWSER=msedge)。在本資料夾中執行一次 npm install;語音(msedge-tts)、ffmpeg(ffmpeg-static)和 playwright-core 會一併安裝,錄製器會在首次執行時下載 Playwright 自帶的小型 ffmpeg。執行 <kit> doctor 會檢查所有項目,包括網路連線(語音功能需要)。

已知陷阱

陷阱避免方法
灰色邊條,頁面底部被裁切絕不在可見瀏覽器視窗中錄製;demo-kit.cjs 會以 1920x1080 的無頭模式錄製
waitForLoadState('networkidle') 在輪詢的應用程式上會卡住改為等待某個元素
無頭 UI 對話框回報為隱藏狀態等待對話框內部的一個欄位,而不是對話框本身
下拉選單中的 Escape 按鍵會關閉整個對話框選擇一個選項,而不是按下 Escape 鍵
輸入多個欄位時產生的無聲空白期分割該片段的旁白;type() 接受 { delay } 參數(預設 32 毫秒)
標籤因 CSS 而以全大寫顯示比對真實文字,而非顯示的大小寫
只對標籤本身加框,而不是其區塊對標籤的父層(xpath=..)或祖父層(xpath=../..)加框

相關技能