Communitygithub.com

ascii-video

將影片/音訊轉換為帶有色彩的 ASCII MP4/GIF 動畫。

ascii-video 是什麼?

這是一個用於製作 ASCII 藝術影片的完整生產管線,可將任何影片、音訊、圖片或生成式輸入轉換為帶有色彩的 ASCII 字元影片輸出(MP4、GIF 或影像序列)。它支援多種模式:影片轉 ASCII、音訊反應式音樂視覺化、生成式 ASCII 動畫、混合影片與音訊反應、歌詞/文字疊加,以及 TTS 旁白影片。每個項目皆為單一獨立 Python 腳本,不需 GPU,依賴 NumPy、SciPy、Pillow 和 ffmpeg 等工具。管線包含六個階段:輸入、分析、場景函式渲染、色調映射、後處理著色與編碼。其創作標準強調視覺藝術性與每幀的精心設計,而非僅是技術準確性。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/David2024patton/custom-skills-public/tree/main/skills/creative/ascii-video

在你喜歡的 AI 中提問

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

說明文件

ASCII 影片製作管線

使用時機

當使用者要求:ASCII 影片、文字藝術影片、終端機風格影片、字元藝術動畫、復古文字視覺化、ASCII 音訊視覺化器、將影片轉換為 ASCII 藝術、矩陣風格效果,或任何動畫 ASCII 輸出時使用。

內容說明

ASCII 藝術影片的生產管線 — 任何格式皆可。將影片/音訊/圖片/生成式輸入轉換為帶有色彩的 ASCII 字元影片輸出(MP4、GIF、影像序列)。涵蓋:影片轉 ASCII 轉換、音訊反應式音樂視覺化、生成式 ASCII 藝術動畫、混合影片+音訊反應、文字/歌詞疊加、即時終端機渲染。

創作標準

這是視覺藝術。ASCII 字元是媒介;電影是標準。

在撰寫任何程式碼之前,先闡明創作概念。氛圍是什麼?它訴說了什麼視覺故事?是什麼讓這個項目與其他所有 ASCII 影片不同?使用者的提示是起點 — 以創意野心來詮釋,而非字面翻譯。

首次渲染即達到卓越,這是不容妥協的。 輸出必須在視覺上引人注目,無需修訂輪次。如果某些東西看起來平淡無奇、缺乏深度,或像「AI 生成的 ASCII 藝術」,那就是錯的 — 在交付前重新思考創作概念。

超越參考詞彙。 參考資料中的效果目錄、著色器預設與調色盤庫只是起點詞彙。對於每個項目,都要組合、修改並發明新模式。目錄是油漆的調色盤 — 你來繪製畫作。

主動發揮創意。 當項目需要時,擴展技能的詞彙量。如果參考資料沒有你願景所需的東西,就自行建立。至少要包含一個使用者未要求但會欣賞的視覺時刻 — 一個轉場、一個效果、一個能提升整體作品的色彩選擇。

連貫美學優於技術正確性。 影片中的所有場景必須透過統一的視覺語言相互連結 — 共享的色溫、相關的字元調色盤、一致的動詞詞彙。一個技術上正確但每個場景都使用隨機不同效果的影片,是美學上的失敗。

密集、分層、深思熟慮。 每一幀都應值得觀看。絕不使用純黑背景。始終採用多網格構圖。始終為每個場景變化。始終使用有意圖的色彩。

模式

模式輸入輸出參考資料
影片轉 ASCII影片檔原始素材的 ASCII 重製版references/inputs.md § 影片取樣
音訊反應式音訊檔由音訊特徵驅動的生成式視覺效果references/inputs.md § 音訊分析
生成式無(或種子參數)程序化 ASCII 動畫references/effects.md
混合式影片 + 音訊帶有音訊反應式疊加的 ASCII 影片兩個輸入參考資料
歌詞/文字音訊 + 文字/SRT帶有視覺效果的定時文字references/inputs.md § 文字/歌詞
TTS 旁白文字引述 + TTS API帶有打字文字效果的旁白推薦/引述影片references/inputs.md § TTS 整合

技術棧

每個項目使用單一自包含的 Python 腳本。無需 GPU。

層級工具目的
核心Python 3.10+, NumPy數學、陣列運算、向量化效果
訊號SciPyFFT、峰值檢測(音訊模式)
成像Pillow (PIL)字型光柵化、幀解碼、影像 I/O
影片 I/Offmpeg (CLI)解碼輸入、編碼輸出、混合音訊
平行concurrent.futures用於批次/片段渲染的 N 個 worker
TTSElevenLabs API(可選)生成旁白片段
可選OpenCV影片幀取樣、邊緣檢測

管線架構

所有模式都遵循相同的 6 階段管線:

輸入 → 分析 → 場景函式 → 色調映射 → 著色 → 編碼
  1. 輸入 — 載入/解碼原始素材(影片幀、音訊樣本、圖片或無)
  2. 分析 — 提取每幀特徵(音訊頻帶、影片亮度/邊緣、運動向量)
  3. 場景函式 — 場景函式渲染到像素畫布 (uint8 H,W,3)。透過 _render_vf() + 像素混合模式組合多個字元網格。請參閱 references/composition.md
  4. 色調映射 — 基於百分位數的自適應亮度標準化。請參閱 references/composition.md § 自適應色調映射
  5. 著色 — 透過 ShaderChain + FeedbackBuffer 進行後處理。請參閱 references/shaders.md
  6. 編碼 — 將原始 RGB 幀透過管道傳送給 ffmpeg 進行 H.264/GIF 編碼

創作方向

美學維度

維度選項參考資料
字元調色盤密度漸層、區塊元素、符號、文字(片假名、希臘文、符文、盲文)、項目特定architecture.md § 調色盤
色彩策略HSV、OKLAB/OKLCH、離散 RGB 調色盤、自動生成和諧色、單色、色溫architecture.md § 色彩系統
背景紋理正弦場、fBM 雜訊、域扭曲、Voronoi、反應擴散、細胞自動機、影片effects.md
主要效果環、螺旋、隧道、渦旋、波、干涉、極光、火焰、SDF、奇異吸引子effects.md
粒子火花、雪、雨、氣泡、符文、軌道、群聚模擬、流場跟隨者、拖尾effects.md § 粒子
著色器風格復古 CRT、簡潔現代、故障藝術、電影感、夢幻、工業風、迷幻shaders.md
網格密度xs(8px) 到 xxl(40px),每層混合architecture.md § 網格系統
座標空間笛卡爾、極座標、平鋪、旋轉、魚眼、Möbius、域扭曲effects.md § 變換
反饋縮放隧道、彩虹拖尾、幽靈回聲、旋轉曼陀羅、色彩演化composition.md § 反饋
遮罩圓形、環形、漸層、文字模板、動畫虹膜/擦拭/溶解composition.md § 遮罩
轉場交叉淡入淡出、擦拭、溶解、故障切換、虹膜、基於遮罩的揭示shaders.md § 轉場

每區段變化

永遠不要對整部影片使用相同的設定。對於每個區段/場景:

  • 不同的背景效果(或組合 2-3 種)
  • 不同的字元調色盤(符合氛圍)
  • 不同的色彩策略(或至少不同的色調)
  • 改變著色器強度(高峰時更多光暈,安靜時更多顆粒感)
  • 如果粒子活躍,使用不同的粒子類型

項目特定發明

對於每個項目,至少發明以下其中一項:

  • 符合主題的自訂字元調色盤
  • 自訂背景效果(組合/修改現有構建模組)
  • 自訂色彩調色盤(符合品牌/氛圍的離散 RGB 組合)
  • 自訂粒子字元集
  • 新穎的場景轉場或視覺時刻

不要只從目錄中挑選。目錄是詞彙 — 你來寫詩。

工作流程

步驟 1:創作願景

在任何程式碼之前,先闡明創作概念:

  • 氛圍/氣氛:觀眾應該感受到什麼?充滿活力、冥想、混亂、優雅、不祥?
  • 視覺故事:在持續時間內發生什麼事?累積緊張感?轉變?溶解?
  • 色彩世界:暖色/冷色?單色?霓虹色?大地色?主色調是什麼?
  • 字元紋理:密集數據?稀疏星星?有機點?幾何區塊?
  • 是什麼讓這個與眾不同:讓這個項目獨一無二的一件事是什麼?
  • 情感弧線:場景如何發展?以能量開場,推向高潮,解決?

將使用者的提示映射到美學選擇。一個「輕鬆的 lo-fi 視覺化器」與「故障賽博龐克數據流」所需的各方面都不同。

步驟 2:技術設計

  • 模式 — 上述 6 種模式之一
  • 解析度 — 橫向 1920x1080(預設),直向 1080x1920,正方形 1080x1080 @ 24fps
  • 硬體檢測 — 自動檢測核心數/RAM,設定品質設定檔。請參閱 references/optimization.md
  • 區段 — 將時間戳記映射到場景函式,每個函式擁有自己的效果/調色盤/色彩/著色器設定
  • 輸出格式 — MP4(預設)、GIF(640x360 @ 15fps)、PNG 序列

步驟 3:建構腳本

單一 Python 檔案。元件(附參考資料):

  1. 硬體檢測 + 品質設定檔 — references/optimization.md
  2. 輸入載入器 — 取決於模式;references/inputs.md
  3. 特徵分析器 — 音訊 FFT、影片亮度或合成
  4. 網格 + 渲染器 — 具有點陣圖快取的多密度網格;references/architecture.md
  5. 字元調色盤 — 每個項目多個;references/architecture.md § 調色盤
  6. 色彩系統 — HSV + 離散 RGB + 和諧生成;references/architecture.md § 色彩
  7. 場景函式 — 每個回傳 canvas (uint8 H,W,3);references/scenes.md
  8. 色調映射 — 自適應亮度標準化;references/composition.md
  9. 著色器管線 — ShaderChain + FeedbackBuffer;references/shaders.md
  10. 場景表 + 調度器 — 時間 → 場景函式 + 設定;references/scenes.md
  11. 平行編碼器 — 使用 ffmpeg 管道進行 N 個 worker 的片段渲染
  12. 主程式 — 編排完整管線

步驟 4:品質驗證

  • 先測試幀:在完整渲染前,於關鍵時間戳記渲染單一幀
  • 亮度檢查:所有 ASCII 內容的 canvas.mean() > 8。如果太暗,降低 gamma
  • 視覺連貫性:所有場景是否感覺屬於同一部影片?
  • 創作願景檢查:輸出是否與步驟 1 的概念相符?如果看起來很普通,請返回

關鍵實作注意事項

亮度 — 使用 tonemap(),而非線性乘數

這是 #1 的視覺問題。黑色背景上的 ASCII 本質上就暗。絕對不要使用 canvas * N 乘數 — 它們會裁切亮部。請使用自適應色調映射:

def tonemap(canvas, gamma=0.75):
    f = canvas.astype(np.float32)
    lo, hi = np.percentile(f[::4, ::4], [1, 99.5])
    if hi - lo < 10: hi = lo + 10
    f = np.clip((f - lo) / (hi - lo), 0, 1) ** gamma
    return (f * 255).astype(np.uint8)

管線:scene_fn() → tonemap() → FeedbackBuffer → ShaderChain → ffmpeg

每場景 gamma:預設 0.75,過曝 0.55,海報化 0.50,明亮場景 0.85。對於暗色圖層,使用 screen 混合模式(而非 overlay)。

字型儲存格高度

macOS Pillow:textbbox() 回傳錯誤高度。請使用 font.getmetrics():cell_height = ascent + descent。請參閱 references/troubleshooting.md。

ffmpeg 管道死結

對於長時間運行的 ffmpeg,絕對不要使用 stderr=subprocess.PIPE — 緩衝區在 64KB 時會填滿並導致死結。請重新導向到檔案。請參閱 references/troubleshooting.md。

字型相容性

並非所有 Unicode 字元都能在所有字型中渲染。請在初始化時驗證調色盤 — 渲染每個字元,檢查是否為空白輸出。請參閱 references/troubleshooting.md。

每片段架構

對於分段影片(引述、場景、章節),將每個片段渲染為單獨的片段檔案,以便進行平行渲染和選擇性重新渲染。請參閱 references/scenes.md。

效能目標

元件預算
特徵提取1-5ms
效果函式2-15ms
字元渲染80-150ms(瓶頸)
著色器管線5-25ms
總計~100-200ms/幀

參考資料

檔案內容
references/architecture.md網格系統、解析度預設、字型選擇、字元調色盤(20+)、色彩系統(HSV + OKLAB + 離散 RGB + 和諧生成)、_render_vf() 輔助函式、GridLayer 類別
references/composition.md像素混合模式(20 種模式)、blend_canvas()、多網格構圖、自適應 tonemap()、FeedbackBuffer、PixelBlendStack、遮罩/模板系統
references/effects.md效果構建模組:數值場產生器、色調場、雜訊/fBM/域扭曲、Voronoi、反應擴散、細胞自動機、SDF、奇異吸引子、粒子系統、座標變換、時間連貫性
references/shaders.mdShaderChain、_apply_shader_step() 調度、38 種著色器目錄、音訊反應式縮放、轉場、色調預設、輸出格式編碼、終端機渲染
references/scenes.md場景協定、Renderer 類別、SCENES 表、render_clip()、節拍同步剪輯、平行渲染、設計模式(層級層次、方向弧線、視覺隱喻、構圖技巧)、各複雜度等級的完整場景範例、場景設計檢查清單
references/inputs.md音訊分析(FFT、頻帶、節拍)、影片取樣、圖片轉換、文字/歌詞、TTS 整合(ElevenLabs、語音分配、音訊混合)
references/optimization.md硬體檢測、品質設定檔、向量化模式、平行渲染、記憶體管理、效能預算
references/troubleshooting.mdNumPy 廣播陷阱、混合模式陷阱、多處理/pickling、亮度診斷、ffmpeg 問題、字型問題、常見錯誤

創作發散(僅在使用者要求實驗/創作/獨特輸出時使用)

如果使用者要求創作性、實驗性、驚喜或非傳統的輸出,請選擇最適合的策略,並在生成程式碼之前推導其步驟。

  • 強制連結 — 當使用者想要跨領域靈感時(「讓它看起來有機」、「工業美學」)
  • 概念混合 — 當使用者提到兩個事物要結合時(「海洋遇見音樂」、「太空 + 書法」)
  • 迂迴策略 — 當使用者極度開放時(「給我驚喜」、「一些我從未見過的東西」)

強制連結

  1. 選擇一個與視覺目標無關的領域(天氣系統、微生物學、建築、流體動力學、紡織編織)
  2. 列出其核心視覺/結構元素(侵蝕 → 逐漸揭示;有絲分裂 → 分裂複製;編織 → 交錯圖案)
  3. 將這些元素映射到 ASCII 字元和動畫模式
  4. 綜合 — 「侵蝕」或「結晶」在字元網格中看起來像什麼?

概念混合

  1. 命名兩個不同的視覺/結構概念(「海洋」與「電路」;「書法」與「粒子物理」)
  2. 列出每個概念的核心屬性(海洋:波浪、深度、流動、漸變;電路:節點、路徑、焊點、開關)
  3. 找到交集(如何用電路元件表現波浪?節點路徑如何像洋流?)
  4. 合成混合視覺語言(電路追蹤洋流模式;焊點作為波浪泡沫)

迂迴策略

從清單中選擇一個提示(或在精神上擲骰子),並將其作為專案的限制條件:

  • 「用你非慣用手畫出」 — 使用不完美的渲染、低解析度、受限調色盤
  • 「像侵犯邊界一樣使用它」 — 字元溢出網格、破壞框架、色調衝突
  • 「移除核心元件」 — 沒有背景效果、沒有色彩、沒有動畫。純靜態文字
  • 「將錯誤轉化為特徵」 — 將單色調色盤錯誤、網格錯位、渲染瑕疵作為核心美學
  • 「更改比例」 — 極小的網格(2px 字元)與極大的網格(80px),或兩者混合
  • 「在不相關的事物之間建立一個系統」 — 將雜訊的 FFT 頻率映射到字元類別
  • 「反轉」 — 反轉強度(黑字白底)、反轉速度(慢動作)、反轉邏輯(空字元代表最密集)
  • 「像回音一樣重複自己」 — 延遲、反饋回路、重複序列、回文式動畫

對於所有發散策略:最終輸出必須仍然感覺經過設計且令人愉悅,而非隨機。其目標是擴展而非打破技能的美學。


最後更新:技能版本 2.0

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

相關技能