Ascii Video
ASCII 藝術視頻製作流水線 — 支持任意格式。將視頻/音頻/圖像/生成式輸入轉換為彩色 ASCII 字符視頻輸出(MP4、GIF、圖像序列)。涵蓋:視頻轉 ASCII、音頻響應式音樂可視化、生成式 ASCII 藝術動畫、混合視頻+音頻響應、文本/歌詞疊加、實時終端渲染。當用戶請求以下內容時使用:ASCII 視頻、文本藝術視頻、終端風格視頻、字符藝術動畫、復古文本可視化、ASCII 音頻可視化器、將視頻轉換為 ASCII 藝術、矩陣風格效果,或任何動態 ASCII 輸出。
技能元數據
| 來源 | 捆綁(默認安裝) |
| 路徑 | skills/creative/ascii-video |
參考:完整 SKILL.md
以下是 Hermes 在觸發此技能時加載的完整技能定義。這是技能激活時代理看到的指令。
ASCII 視頻製作流水線
創意標準
這是視覺藝術。ASCII 字符是媒介;電影是標準。
在編寫第一行代碼之前,闡明創意概念。情緒是什麼?它講述了怎樣的視覺故事?是什麼讓這個項目不同於其他所有 ASCII 視頻?用戶的提示只是一個起點 — 要以創意雄心去詮釋它,而不是字面轉錄。
首次渲染必須卓越。 輸出必須在視覺上引人注目,無需經過多輪修改。如果某些內容看起來平庸、平淡或像“AI 生成的 ASCII 藝術”,那就是錯誤的 — 在交付之前重新思考創意概念。
超越參考詞彙。 參考中的效果目錄、著色器預設和調色板庫只是起始詞彙。對於每個項目,都要組合、修改併發明新的模式。目錄是顏料盤 — 你才是作畫者。
主動發揮創意。 當項目需要時,擴展技能的詞彙表。如果參考資料中沒有滿足願景所需的內容,那就構建它。至少包含一個用戶未要求但會欣賞的視覺時刻 — 一個過渡、一種效果、一種提升整體作品的色彩選擇。
** cohesive 美學優於技術正確性。** 視頻中的所有場景必須通過統一的視覺語言相互連接 — 共享的色溫、相關的字符調色板、一致的運動詞彙。一個技術上正確但每個場景使用隨機不同效果的視頻是美學上的失敗。
密集、分層、深思熟慮。 每一幀都應值得觀看。絕不使用純黑背景。始終採用多網格構圖。始終進行每場景變化。始終使用有意為之的色彩。
模式
| 模式 | 輸入 | 輸出 | 參考 |
|---|---|---|---|
| 視頻轉 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 | 數學、數組運算、向量化效果 |
| 信號 | SciPy | FFT、峰值檢測(音頻模式) |
| 成像 | Pillow (PIL) | 字體光柵化、幀解碼、圖像 I/O |
| 視頻 I/O | ffmpeg (CLI) | 解碼輸入、編碼輸出、混流音頻 |
| 並行 | concurrent.futures | 用於批量/片段渲染的 N 個工作線程 |
| TTS | ElevenLabs API(可選) | 生成旁白片段 |
| 可選 | OpenCV | 視頻幀採樣、邊緣檢測 |
流水線架構
每種模式都遵循相同的 6 階段流水線:
INPUT → ANALYZE → SCENE_FN → TONEMAP → SHADE → ENCODE
- INPUT — 加載/解碼源材料(視頻幀、音頻樣本、圖像或無)
- ANALYZE — 提取每幀特徵(音頻頻段、視頻亮度/邊緣、運動矢量)
- SCENE_FN — 場景函數渲染到像素畫布(
uint8 H,W,3)。通過_render_vf()+ 像素混合模式組合多個字符網格。參見references/composition.md - TONEMAP — 基於百分位數的自適應亮度歸一化。參見
references/composition.md§ 自適應色調映射 - SHADE — 通過
ShaderChain+FeedbackBuffer進行後處理。參見references/shaders.md - ENCODE — 將原始 RGB 幀管道傳輸至 ffmpeg 以進行 H.264/GIF 編碼
創意指導
美學維度
| 維度 | 選項 | 參考 |
|---|---|---|
| 字符調色板 | 密度漸變、塊元素、符號、腳本(片假名、希臘字母、盧恩文字、盲文)、項目特定 | architecture.md § Palettes |
| 色彩策略 | HSV、OKLAB/OKLCH、離散 RGB 調色板、自動生成和諧色、單色、色溫 | architecture.md § Color System |
| 背景紋理 | 正弦場、fBM 噪聲、域扭曲、Voronoi、反應擴散、細胞自動機、視頻 | effects.md |
| 主要特效 | 圓環、螺旋、隧道、漩渦、波浪、干涉、極光、火焰、SDF、奇異吸引子 | effects.md |
| 粒子 | 火花、雪花、雨滴、氣泡、盧恩文字、軌道、群集鳥群(boids)、流場跟隨者、拖尾 | effects.md § Particles |
| 著色器氛圍 | 復古 CRT、潔淨現代、故障藝術、電影感、夢幻、工業、迷幻 | shaders.md |
| 網格密度 | xs(8px) 至 xxl(40px),每層混合使用 | architecture.md § Grid System |
| 座標空間 | 笛卡爾、極座標、平鋪、旋轉、魚眼、莫比烏斯、域扭曲 | effects.md § Transforms |
| 反饋 | 縮放隧道、彩虹拖尾、幽靈回聲、旋轉曼荼羅、色彩演變 | composition.md § Feedback |
| 遮罩 | 圓形、環形、漸變、文本模板、動態光圈/擦除/溶解 | composition.md § Masking |
| 過渡 | 交叉淡入淡出、擦除、溶解、故障切割、光圈、基於遮罩的揭示 | shaders.md § Transitions |
各部分變化
切勿在整個視頻中沿用相同的配置。對於每個部分/場景:
- 不同的背景特效(或組合 2-3 種)
- 不同的字符調色板(匹配氛圍)
- 不同的色彩策略(或至少使用不同的色調)
- 變化著色器強度(高峰時增加輝光,安靜時增加顆粒感)
- 如果啟用了粒子,則使用不同的粒子類型
項目特定創新
為每個項目至少發明以下一項:
- 匹配主題的自定義字符調色板
- 自定義背景特效(組合/修改現有構建模塊)
- 自定義色彩調色板(匹配品牌/氛圍的離散 RGB 集合)
- 自定義粒子字符集
- 新穎的場景過渡或視覺時刻
不要僅僅從目錄中挑選。目錄是詞彙——你要創作的是詩歌。
工作流
步驟 1:創意願景
在編寫任何代碼之前,闡明創意概念:
- 情緒/氛圍:觀眾應該感受到什麼?充滿活力、冥想、混亂、優雅、不祥?
- 視覺故事:在持續時間內發生了什麼?建立張力?轉變?溶解?
- 色彩世界:暖色/冷色?單色?霓虹?大地色系?主導色調是什麼?
- 字符紋理:密集數據?稀疏星星?有機點狀?幾何塊狀?
- 本項目的獨特之處:使這個項目獨一無二的那一點是什麼?
- 情感弧線:場景如何推進?以活力開場,逐步推向高潮,最後解決?
將用戶的提示映射到美學選擇上。“輕鬆的 lo-fi 可視化器”與“故障賽博朋克數據流”需要完全不同的處理方式。
步驟 2:技術設計
- 模式 — 上述 6 種模式中的哪一種
- 分辨率 — 橫向 1920x1080(默認),縱向 1080x1920,正方形 1080x1080 @ 24fps
- 硬件檢測 — 自動檢測核心數/RAM,設置質量配置文件。參見
references/optimization.md - 部分 — 將時間戳映射到場景功能,每個場景擁有自己的特效/調色板/色彩/著色器配置
- 輸出格式 — MP4(默認)、GIF(640x360 @ 15fps)、PNG 序列
步驟 3:構建腳本
單個 Python 文件。組件(含參考):
- 硬件檢測 + 質量配置文件 —
references/optimization.md - 輸入加載器 — 依賴於模式;
references/inputs.md - 特徵分析器 — 音頻 FFT、視頻亮度或合成數據
- 網格 + 渲染器 — 具有位圖緩存的多密度網格;
references/architecture.md - 字符調色板 — 每個項目多個;
references/architecture.md§ Palettes - 色彩系統 — HSV + 離散 RGB + 和諧色生成;
references/architecture.md§ Color - 場景函數 — 每個返回
canvas (uint8 H,W,3);references/scenes.md - 色調映射 — 自適應亮度歸一化;
references/composition.md - 著色器管道 —
ShaderChain+FeedbackBuffer;references/shaders.md - 場景表 + 調度器 — 時間 → 場景函數 + 配置;
references/scenes.md - 並行編碼器 — N 個工作線程剪輯渲染,使用 ffmpeg 管道
- 主程序 — 協調完整管道
步驟 4:質量驗證
- 先測試幀:在完整渲染之前,渲染關鍵時間戳處的單幀
- 亮度檢查:所有 ASCII 內容的
canvas.mean() > 8。如果過暗,降低伽馬值 - 視覺連貫性:所有場景是否感覺屬於同一個視頻?
- 創意願景檢查:輸出是否與步驟 1 中的概念匹配?如果看起來千篇一律,請返回修改
關鍵實現說明
亮度 — 使用 tonemap(),而非線性乘法器
這是頭號視覺問題。黑色背景上的 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
每場景伽馬值:默認 0.75,曝光過度(solarize)0.55,色調分離(posterize)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/域扭曲、沃羅諾伊圖、反應擴散、細胞自動機、SDF(有符號距離場)、奇異吸引子、粒子系統、座標變換、時間連貫性 |
references/shaders.md | ShaderChain、_apply_shader_step() 分發、38 種著色器目錄、音頻響應縮放、過渡、色調預設、輸出格式編碼、終端渲染 |
references/scenes.md | 場景協議、Renderer 類、SCENES 表、render_clip()、節拍同步剪輯、並行渲染、設計模式(圖層層級、方向弧、視覺隱喻、構圖技巧)、各種複雜度級別的完整場景示例、場景設計檢查清單 |
references/inputs.md | 音頻分析(FFT、頻段、節拍)、視頻採樣、圖像轉換、文本/歌詞、TTS 集成(ElevenLabs、聲音分配、音頻混合) |
references/optimization.md | 硬件檢測、質量配置文件、向量化模式、並行渲染、內存管理、性能預算 |
references/troubleshooting.md | NumPy 廣播陷阱、混合模式缺陷、多進程/pickling、亮度診斷、ffmpeg 問題、字體問題、常見錯誤 |
創意發散(僅在用戶請求實驗性/創意/獨特輸出時使用)
如果用戶要求創意、實驗性、令人驚訝或非傳統的輸出,請選擇最合適的策略,並在生成代碼之前逐步推理。
- 強制關聯 — 當用戶需要跨領域靈感時(“讓它看起來有機”、“工業美學”)
- 概念融合 — 當用戶指名要組合兩件事物時(“海洋遇見音樂”、“空間 + 書法”)
- 斜向策略 — 當用戶完全開放時(“給我驚喜”、“一些我從未見過的東西”)
強制關聯
- 選擇一個與視覺目標無關的領域(天氣系統、微生物學、建築學、流體動力學、紡織編織)
- 列出其核心視覺/結構元素(侵蝕 → 逐漸顯露;有絲分裂 → 分裂複製;編織 → 互鎖圖案)
- 將這些元素映射到 ASCII 字符和動畫模式上
- 綜合 — “侵蝕”或“結晶”在字符網格中看起來是什麼樣的?
概念融合
- 命名兩個不同的視覺/概念空間(例如,海浪 + 樂譜)
- 映射對應關係(波峰 = 高音,波谷 = 休止符,泡沫 = 斷奏)
- 選擇性融合 — 保留最有趣的映射,丟棄牽強的映射
- 開發僅存在於融合中的湧現屬性
斜向策略
- 抽取一條:“將錯誤視為隱藏的意圖予以尊重” / “使用一箇舊想法” / “你最好的朋友會怎麼做?” / “強調缺陷” / “將其顛倒” / “只取部分,而非整體” / “反轉”
- 針對當前的 ASCII 動畫挑戰解釋該指令
- 在編寫代碼之前,將這種橫向洞察應用於視覺設計