⏳ This skill is pending AI review.

Scores will appear once the review pipeline completes.

version unknown

digital-human-koubo

@andyhuo520⭐ 1.6k stars

用固定的数字人形象(白背心数字人 / 用户本人数字人 / 猫狗角色)做口播视频,先按内容推荐剪辑风格让用户选(小林式解说 / 网红花字口播 / 发布解读 / 保姆级教程 / 多主播多语言),自动套上从 MrBeast、MKBHD、影视飓风、Johnny Harris、Vox、半佛、差评等头部博主拆出来的 48 个包装组件(开场钩子、数字钉子、文字在人身后的景深字、证据截图、地图路线、弹幕、投票、复盘板…),再写稿 → 按 15 秒切段 → Renoise Grok Video 1.5 分段生成(先报价、用户确认才生成)→ 分片下载校验 → 逐段回听 → 对齐 → Remotion 剪辑出片 → 默认做封面(16:9 / 9:16 / 3:4)并接成成片首帧。触发:用我的数字人讲这段、数字人口播、让白背心数字人说、用数字人 Skill、数字人带货 / 解读 / 教程 / 种草视频、做成小林说那样、加花字、加包装 / 加地图 / 加弹幕 / 开场加预告 / 文字放在人身后、做成 MrBeast 那种节奏、有哪些包装手法。不用于:换一个全新形象(先按 references/new-avatar.md 做形象)、冒充真人。

Choose how to use this skill

You do not need every option. Choose the path your AI client supports. The stable page stays the same; versioned files are immutable.

1. Native installer

This listing has no registered native installer command. Use the complete package or source fallback below, depending on what your client supports.

Do not guess an installer command or replace an existing version without reviewing the diff.

2. Complete package recommended

Download the ZIP when available. It includes SKILL.md plus the references, security notes and version metadata.

No complete ProSkills package is published for this listing yet.

3. Prompt-only

Copy the prompt above when the agent can read the stable page or when you want to adopt the workflow without installing a skill.

Need only the instruction file?

Download SKILL.md only if your client requires a single file. The complete ZIP is safer for a full installation because it preserves the references and release context.

No path installs or executes anything by itself. Your agent still needs access to the project files. Before updating, compare the installed version and review the diff.

—/10

// RATINGS

⭐GitHub Stars
⭐⭐⭐⭐⭐ 1.6k on GitHubGitHub ↗

Very popular

🟢ProSkills Score
—
📍

Not yet listed on ClawHub or SkillsMP

// README

Digital Human Koubo · AI 数字人口播

One photo + one sentence → a finished talking-head video with a digital human. Script, lip-synced AI presenter, voice clean-up, captions, and pro-YouTuber-style packaging — fully automated by your AI agent.

English · 简体中文

License: MIT Agent Skill Renoise MCP Remotion

This 27-second livestream ad has no real presenter. Face, voice, studio, captions and the price animation are all AI. The only input was one sentence: "Use this digital human to make a 30-second livestream ad for the WorkBuddy course — 10 lessons, ¥99, was ¥999." Total cost: 482 Renoise credits.


Demos

Click a GIF (or "Watch") to play the full video. Every demo below was produced with this repo.

Livestream sales ad · 9:16 · 27 sStyle B + depth-text price ¥999→¥99▶ WatchProduct recommendation · 9:16 · 89 sAnimated captions, emoji, picture-in-picture▶ WatchText behind the presenter · 5 sVision person matting, 3-layer composite▶ Watch
Step-by-step tutorial · 16:9 · 4:36The digital human teaches how she was made (Style D)▶ WatchDigital human, upgraded · 16:9 · 5:55Two presenters, 6 languages, 4 scenes, cat & dog (Style E)▶ Watch
Launch breakdown · 16:9 · 39 sPresenter on the side, code B-roll on the right (Style C)▶ WatchFinance / tech explainer · 16:9 · 2:21Charts, documents, chapter cards (Style A)▶ Watch

All presenters in the demos are AI digital humans and every video is labelled "内容由 AI 数字人演绎" (performed by an AI digital human). The male presenter is the author's own digital twin, made from his own photo.


What it does

  • Digital human from one photo — a fixed presenter (face, outfit, voice description, prompt template) stored in persona.json, so every video is the same person. Composite her into any scene (livestream studio, shop, classroom, Kyoto street) with GPT Image first, then make her talk.
  • Lip-synced talking clips — the script is split into ≤ 15-second segments and generated with Grok Video 1.5 through Renoise MCP. Other models (Wan 3.0, OmniHuman for your own recording) are documented.
  • Cost gate — the agent always quotes segments · seconds · credits · balance first and waits for your "yes". It generates segment 1 for you to check before batching the rest.
  • Quality control — every segment is transcribed with whisper and compared with the script, and 4 frames per segment are inspected (Grok sometimes burns subtitles into the picture; those segments get re-shot).
  • Voice unification — 1/3-octave spectral matching, de-essing, one shared small-room reverb and loudness normalisation, so 30 separately-generated clips sound like one recording (sibilance spread 13.2 dB → 5.9 dB in our tests).
  • 5 editing styles, chosen for your content — the agent diagnoses your content, recommends 2 styles with preview images and asks you everything in one go (style · ratio & length · caption intensity · presenter).
  • 48 packaging components — measured frame-by-frame from 25 videos by top creators (MrBeast, Mark Rober, Ryan Trahan, MKBHD, MediaStorm/影视飓风, 何同学, Johnny Harris, Vox, Kurzgesagt, 回形针, 半佛仙人, 差评, 毕导). Each style has a default packaging recipe; add or remove techniques by just asking.
  • Text behind the presenter — big words / numbers between the background and the person (macOS Vision person segmentation → transparent video → 3-layer composite).
  • Cover as the first frame — every video gets a cover by default (16:9 / 9:16 / 3:4: presenter frame + hook headline + evidence cards), spliced in as the first 0.5 s. Platforms use the first frame as the thumbnail, so there is nothing to upload separately.
  • Multi-language — English, Japanese, Korean, French, Spanish, Arabic tested (whisper back-check 94–100 %).
  • Works with your agent — a standard SKILL.md Agent Skill plus scripts; any agent that can load skills, connect a remote MCP server and run local commands can drive it.

How it works

your content ──► 0. setup check (Renoise MCP / ffmpeg / whisper — skip what you already have)
                 1. diagnose content → recommend 2 of 5 styles → ask once → brief.json
                 2. script.json (≤15 s per segment, ~5.4 Chinese chars/s)
                 3. quote credits → wait for "yes" → generate segment 1 → you check → batch
                 4. range-download (CDN-safe) → whisper back-check → frame check
                 5. voice unification (spectral match + de-ess + shared room)
                 6. word-level timeline (tl.json)
                 7. edit in Remotion: style template + default packaging (+ your requests)
                 8. render → check mid-transition frames → loudness (-14 / -16 LUFS)
                 9. cover: pick a presenter frame → 16:9 / 9:16 / 3:4 → splice in as the first frame (0.5 s)

Support

// HOW IT'S BUILT

// FILES

845 files shipped with this skill. Inline text is the catalog copy. The upstream link is the source repository.

  • skills/digital-human-koubo/SKILL.md15 KBe961da9698d5upstream ↗
    ---
    name: digital-human-koubo
    description: 用固定的数字人形象(白背心数字人 / 用户本人数字人 / 猫狗角色)做口播视频,先按内容推荐剪辑风格让用户选(小林式解说 / 网红花字口播 / 发布解读 / 保姆级教程 / 多主播多语言),自动套上从 MrBeast、MKBHD、影视飓风、Johnny Harris、Vox、半佛、差评等头部博主拆出来的 48 个包装组件(开场钩子、数字钉子、文字在人身后的景深字、证据截图、地图路线、弹幕、投票、复盘板…),再写稿 → 按 15 秒切段 → Renoise Grok Video 1.5 分段生成(先报价、用户确认才生成)→ 分片下载校验 → 逐段回听 → 对齐 → Remotion 剪辑出片 → 默认做封面(16:9 / 9:16 / 3:4)并接成成片首帧。触发:用我的数字人讲这段、数字人口播、让白背心数字人说、用数字人 Skill、数字人带货 / 解读 / 教程 / 种草视频、做成小林说那样、加花字、加包装 / 加地图 / 加弹幕 / 开场加预告 / 文字放在人身后、做成 MrBeast 那种节奏、有哪些包装手法。不用于:换一个全新形象(先按 references/new-avatar.md 做形象)、冒充真人。
    ---
    
    # 数字人口播
    
    形象、声音、提示词、切段规则固定在 `persona.json`;剪辑风格在 `references/style-menu.md`。每次照这里做,出来的就是同一个人、同一种风格。
    
    ## 红线
    - 生成花用户的 Renoise credits:create_tasks 之前先报「段数 · 秒数 · 预估 credits · 余额」,等用户在对话里明确同意。先拍第 1 段给用户确认音色,再批量。重拍也要先报价。
    - 成片标「内容由 AI 数字人演绎」;场景、动物片段、B-roll 角上标「AI 生成」。用户明确要去掉画面标注时照做,但要提醒:公开发布时在平台发布页勾选「AI 生成」声明。
    - 用户本人的形象(persona.json → other_hosts.me)只用在用户自己的片子里。
    - 「小林式」只学结构和剪辑手法:不用真实创作者的脸、声音、布景和原句。
    - 点名评价第三方产品的说法,要有出处或标「网友分析 / 个人体验」。展示素材只用用户自己的作品;带歌词字幕的片子不用。
    
    ## 流程
    
    ### 准备:先检查,有就跳过,缺才引导安装(每次新对话第一次用时做)
    **原则:已经装好的一句话带过,不让用户重装;缺什么才给装法,装法给多种,先放用户当前用的那种。** 详细装法在 references/install.md。
    1. **Renoise MCP**:直接调 `get_account`。
       - 成功 → 只说一句「Renoise 已连接,余额 X 积分」,接着干活。
       - 工具不存在 / 未连接 → 停下引导安装。用户还没有 Renoise 账号时,注册链接一律给 https://renoise.ai/mcp?utm_medium=xcom&utm_source=official(原样给出,保留 utm 追踪参数,不要改写成 renoise.ai 首页)。然后把用户当前客户端的装法放第一个并标「推荐」,下面列出其他方式(Claude 桌面端/网页连接器、Claude Code 插件、Codex `codex mcp add`、OpenClaw、Cursor 等通用远程 MCP 配置、renoise.ai/plugin 官网),让用户自己挑。装完让用户重开对话或重连,再调一次确认。
       - 报工具被关闭 → 不是没装,让用户去连接器设置里打开;报授权过期 → 重新登录授权,不用重装。
    2. **本机环境**(要剪辑时才需要):`bash scripts/doctor.sh`。有的打 ✓ 不提;缺的它会按 macOS / Windows / Linux 列出多种装法。系统软件让用户自己装,Python 包可以在用户同意后帮装。
    3. **数字人形象**:persona.json 的 reference_material 能用就直接用;当前账号用不了(换了账号、素材过期、别人的包)→ 按 references/new-avatar.md 用用户自己的照片重做。
    
    ### 0. 看内容 → 推荐风格 → 让用户选
    按 `references/style-menu.md`:
    1. 一行诊断(内容类型、有没有可展示的素材、适合的平台和时长)。
    2. 推荐 2 个风格并说理由,把 `assets/styles/` 里对应的预览图发给用户。
    3. 一次问完:风格 · 比例和时长 · 花字强度(克制 / 标准 / 热闹)· 主播(白背心 / 用户本人 / 两人接力 / 动物)。每题第一个选项是推荐项。Claude Code 用 AskUserQuestion,其他工具列编号。
    4. 用户回「你定」就按推荐,并说一句按了什么。结果写进 `brief.json`,后面每一步按它来。
    
    | 风格 | 比例 | 时长 | 剪辑实现 |
    |---|---|---|---|
    | A 小林式解说 | 16:9 | 3–20 分钟 | `templates/lin-169`(plan.json → scenes.json 驱动:景深字 / 题板+主播小窗 / B-roll / 公式逐项长出 / 算例 / 图表,见 references/lin-style.md) |
    | B 网红花字口播 | 9:16 | 30–120 秒 | `templates/huazi-916`(edit.json 驱动,三档花字) |
    | C 发布解读 | 16:9 | 30–90 秒 | 参考实现 `templates/reference/launch-169` |
    | D 保姆级教程 | 16:9 | 3–8 分钟 | 参考实现 `templates/reference/tutorial-169` |
    | E 多主播多语言 | 16:9 | 3–7 分钟 | 参考实现 `templates/reference/multihost-169` |
    
    ### 1. 写稿 → script.json
    按选定风格的稿子写法(style-menu.md 里每种都有)。每段一句或两句,10 秒左右(约 40–55 字,Grok 中文约 5.4 字/秒),标 `shot`:`full`(全屏出镜)/ `pip`(画中画讲解)/ `vlog`(随意自拍口吻)/ `depth`(要做「文字在人身后」的段:中景、头顶两侧留背景)。英文缩写、网址写成好念的样子;字幕要显示原写法时在那段加 `"sub": {"SKILL 点 M D": "SKILL.md"}`(align.py 按念法对齐、字幕换回写法)。外语段直接写目标语言的台词。
    
    ### 2. 切段 + 报价
    `python3 scripts/build_tasks.py script.json tasks.json --purpose "teaching a beginner tutorial step by step"`
    → 打印段数、秒数、预估 credits。full 段 720p(17/秒),pip 段 480p(10/秒)。**主播要裁成半身 / 放大显示、或者 pip 段的主播卡并不小时,所有出镜段一律 720p(`--all-720p`)**:480p 原片只有 400×736,裁半身再铺满大卡会放大 2 倍以上,明显发糊(vibe-knowledge 介绍片因此重拍 4 段,多花 680 积分)。拿 `estimate_cost` 核一次,报给用户等确认。用户本人或动物主播用 persona.json → other_hosts 里的提示词模板。
    
    ### 3. 生成
    tasks.json 每 10 个一批 create_tasks → wait_tasks。要进场景(直播间、门店、街景)时先用 GPT Image 2.5 合成开场画面(人物参考图 + 场景描述,2k 约 23 积分),再把这张图当 Grok 的参考图。
    
    ### 4. 下载(Renoise 美国 CDN 很慢,必须这样下)
    download_results 拿链接 → 整理成 `urls.txt`(每行 `<taskId>.<ext> <url>`)→ `python3 scripts/rangedl.py`:每个文件 6 段 Range 并发、断点续传、下完 ffmpeg 解码校验。
    
    ### 5. 回听 + 抽帧 + 拼接
    `python3 scripts/assemble.py script.json ids.json --out 成片_完整版.mp4`(ids.json = {段 id: taskId}):whisper 逐段转写比对文稿、只保留到说完后 0.25 秒、拼接、loudnorm -16。剪辑用 `cut/joined.mov`:拼接前已把每段音频补齐到和画面等长,避免几十段拼下来声音累积落后口型;拼完会打印画面和声音的时长,两者必须一致。改过某段后用 `--rejoin` 只重新拼。
    - whisper `--prompt 原文` 会让个别段漏掉前半句,用中性提示「以下是普通话的句子。」。外语段按语言转写;日韩阿拉伯语不要加 `-ml 1`(会把多字节字符截断成乱码)。
    - **每段抽 4 帧看一眼**:Grok 横屏口播偶尔自己烧字幕(提示词写了也挡不住),有就重拍那段。
    - Grok 有时漏念开头的语气词:没影响意思就按实际口播改字幕,别为这个重拍。
    - **念错字(不是漏语气词)要当场修,不能交给用户去听**:
      - **查**:`python3 scripts/misread_check.py script.json`,按停顿切句、不带原文逐句转写,列出可疑字。**不能拿带原文提示的转写判断读音**:它会把念错的字纠正回去(「通胀」念成 tōng zhèng,带原文照样判全对)。同音字会误报,可疑处听一下确认。
      - **修(0 积分、保口型)**:`python3 scripts/patch_words.py script.json patch.json --ref <2–3 段干净原声> --synth-only` → 填克隆句时间 → 再跑 → `assemble.py --rejoin`。只把错的那一句换成 MiMo 克隆音,长度拉到和原句一样,切在停顿上。换整句比只换两个字自然。
      - **别整片换音色**:口型跟的是原声,整片换掉会到处对不上;也别先提 OmniHuman 重做口型(全片约 5,000 积分)。
      - 口型实在差太多,再报价重拍那一段。
    - 开头第一个字最容易被吞或念歪(例:「一个知识点」→「几个知识地点」),写稿时第一段开头别放关键名词,或者先垫一个短词。
    
    ### 6. 对齐 + 剪辑
    `python3 scripts/align.py script.json --out <工程>/src/tl.json` 出逐字时间轴,然后按 brief.json 的风格剪:
    - **B 花字口播**:`bash scripts/new_edit.sh huazi-916 <工程>` → 写 `src/edit.json`(关键词、表情、卡片、作品展示、号召,字段见 references/huazi.md)→ `python3 scripts/check_edit.py <工程>/src` → 抽帧 → 渲染。
    - **A 小林式**:`bash scripts/new_edit.sh lin-169 <工程>`,按 `references/lin-style.md` 做:
      1. `lin_subs.py` 出字幕(数字用 disp.txt 显示成阿拉伯数字)。
      2. 写 `plan.json`,示例见 `templates/lin-169/plan.example.json`,时间写「@s07:两千」。
      3. 跑 `lin_scenes.py --face` 生成 scenes.json,并自动量主播脸的位置给小窗用。
      4. B-roll 用 Wan 3.0 生成(先报价,每段约 60 积分),景深字段跑 `cutout_video.py` 抠像。
      5. 渲染。每个场景抽开头和中点两帧检查,重点看小窗有没有挡住内容、有没有空板。
      - 只做纯图表、不出镜的财经长片,仍可用 finance-explainer 的引擎。
    - **C / D / E**:`bash scripts/new_edit.sh reference/<目录> <工程>`,换 tl.json,按段重写 Scene(templates/reference/README.md)。
    - **包装(每种风格都做)**:按 `references/packaging-presets.json` 里这个风格的默认包装排——开场 30 秒按 open 顺序、正文保证 stimulus_every_s 秒内有一个新视觉事件、讲到 per_beat 里那类内容就用对应组件、recurring 全片挂着。组件写进 `pack` 数组(字段见 references/packaging.md),手法依据见 references/packaging-playbook.md。用户点名要的手法(「加地图」「开场加预告」「加弹幕」「换成 MrBeast 那种」)在默认基础上加减。用户问「有哪些包装」先发 `assets/packaging/图鉴.jpg`。景深字(文字在人身后)要先跑 `scripts/cutout_video.py` 抠像,见 references/packaging.md。
    - 声音:数字人视频轨一定 `muted`,人声单独铺一条;多段 Grok 原声用 `python3 scripts/voicefx/unify.py <输出目录> <片段…>` 统一频谱 + 同一个小房间混响(复用旧段时加 `--ref 旧片段目录`,场景/动物片段加 `--scene`)。BGM 压在人声下约 20 dB。
      - **音效**:`python3 scripts/lin_sfx.py <工程>/src/scenes.json --out audio` 按场景自动排音效(earshot 音效库:切画面 whoosh、景深字和结果「碰」、卡片 pop、结论 bell)。音效要高出人声和音乐 8–10 dB,用 `earshot timeline --cues` 复查。
      - **BGM**:用 `earshot rank` 从曲库挑。
      - **混音和导出**:`python3 scripts/lin_mix.py` 做人声链 + BGM 循环避让人声 + 音效,出 −16 LUFS 的 mix.wav;加 `--speed 1.1` 出 1.1 倍成片(BGM 保持原速)。
      - **音画同步**:交付前在开头、中段、结尾各测一处声音偏移,要小于 10 ms。
    - 抽帧检查一定看过渡的中间帧和零间隔衔接处(上一条的尾巴会盖住下一条)。
    
    ### 7. 封面 + 首帧(默认做,不用问)
    平台默认拿视频第一帧当封面,所以每条片子都做封面,并把它接在成片最前面。交付的主文件就是带封面首帧的版本。
    1. 写 `cover.json`(字段见 references/cover.md):
       - 小字栏目名
       - 钩子标题 ≤8 字
       - 红色强调句 ≤6 字
       - 一句副标题
       - ≤3 个标签
       - 链接或号召
       - 主播帧
       - ≤2 张证据卡(官方截图、作品)
    2. `python3 scripts/make_cover.py cover.json --candidates` 抽 12 帧拼成候选图。挑一帧笑着、眼睛睁开、没在说话或嘴型好看的,时间写进 `host.t`。
    3. `python3 scripts/make_cover.py cover.json` 生成 `cover/cover_16x9.jpg`(横屏),按 ratios 还会出 `cover_9x16.jpg`(竖屏)和 `cover_3x4.jpg`(小红书)。看一眼 `thumb_*.jpg`,540px 宽时标题要读得清,文字不能压到卡片。
    4. `python3 scripts/cover_first.py 成片.mp4 cover/cover_<比例>.jpg 交付.mp4`:封面停 0.5 秒后硬切进正片,声音整体后推 0.5 秒。抽 0 秒、0.45 秒、0.55 秒三帧确认。不带封面的版本另存为 `_无封面.mp4`。
    
    ## 参考
    - references/install.md:Renoise MCP 和本机环境的多种装法(只在缺的时候用)
    - references/style-menu.md:五种风格、内容诊断、怎么问用户、brief.json
    - references/packaging.md:47 个包装组件的用法和参数(pack 写法、9:16 自动适配)
    - references/packaging-playbook.md:头部博主实测结论(节奏、开场公式、字幕、声音、号召、红线),完整报告在 references/research/
    - references/packaging-presets.json:五种风格各自的默认包装
    - references/huazi.md:花字模板 edit.json 字段、九种卡片、三档强度、写法习惯
    - references/lin-style.md:A 小林式的画面语法、13 种场景、流水线、B-roll 提示词、音效档位、踩过的坑
    - scripts:
      - lin_scenes.py:plan.json 转 scenes.json,自动量脸
      - lin_subs.py:字幕
      - lin_sfx.py:earshot 音效
      - lin_mix.py:混音、变速导出
      - misread_check.py:查念错
      - patch_words.py:只换念错的句子,保住口型
    - persona.json:白背心数字人 + 其他主播(用户本人、橘猫店长、柴犬主播)、提示词模板、动作库、多语言实测
    - references/voice.md:换声音(MiMo 克隆 / 音色设计)
    - references/new-avatar.md:从一张照片做新形象
    - references/edit-styles.md:各剪辑工程的入口文件和声音统一做法
    - references/cover.md:封面 cover.json 字段、三种比例的版式、首帧接法
    - assets/styles/:五种风格的预览图(给用户选的时候发)
    - assets/packaging/:包装组件图鉴(47 格总览 + 每个组件一张)
    
  • skills/digital-human-koubo/templates/lin-169/README.md1.2 KB58dd1df9748aupstream ↗
    # lin-169 · 小林式解说模板(16:9)
    
    起工程:`bash ~/.claude/skills/digital-human-koubo/scripts/new_edit.sh lin-169 <工程>`,流程见 `references/lin-style.md`。
    
    - `src/Lin.tsx`:13 种场景(host / broll / board / rates / curve / fall / assume / formula / big / stickers / bars / formula2 / calc),字段写在每个组件上方的注释里
    - `src/scenes.json`、`src/cues.json`:示例数据(72 法则,6 段约 36 秒,时间是手排的),换成本期 lin_scenes.py / lin_subs.py 的输出
    - `plan.example.json` + `script.example.json`:示例分镜和对应的口播稿(时间写 `@s03:等于`),`scripts/lin_scenes.py` 把它转成 scenes.json
    - `disp.example.txt`:显示稿示例(数字写成阿拉伯数字,断句和念稿一致)
    - `public/`:main.mp4(拼好的口播)、mix.wav(lin_mix.py 出的混音)、broll/B01.mp4…、stickers/sticker_0.png…、cut/<段>.webm(景深字抠像)。素材不随模板带。
    
    config(scenes.json 顶层):`face` 主播脸中心(lin_scenes.py --face 自动量)、`audio` 音轨文件、`disclosure` 右上角 AI 标注("" 关掉)、`brollTag` B-roll 角标、`colors` 改配色。
    
  • skills/digital-human-koubo/templates/packaging/README.md1.0 KBba6571efedf9upstream ↗
    # 包装组件库 + 图鉴工程
    
    - `src/kit/`:47 个包装组件(core 底座、Annotate 标注、Text 文字、Overlay 叠加、Map 地图、Wangan 网感、Explain 解说、Beast 节奏、Polish 质感)+ `registry.tsx`(按名字调用,`PackLayer`)。
    - `src/demos/Demos.tsx`:每个组件一段 3–5 秒演示;`Gallery` 合成把它们首尾相接。
    - 用法和参数:`../../references/packaging.md`;手法依据:`../../references/packaging-playbook.md`。
    
    在别的工程里用:把 `src/kit/` 整个复制过去(`new_edit.sh` 起的 huazi-916 已经带了),`import { PackLayer } from "./kit/registry"`。
    地图组件依赖 d3-geo、topojson-client、world-atlas(package.json 已写)。
    
    重渲图鉴:演示用到 `public/media/` 里的素材(数字人口播 host_h.mp4 / host_v.mp4、场景图 shop/ad/travel/class/cat/dog.jpg、截图 screen.png / doc.png),打包版不带这些个人素材,换成你自己的同名文件后:
    ```bash
    npx remotion render src/index.ts Gallery out/图鉴.mp4 --concurrency=6
    ```
    
  • skills/digital-human-koubo/templates/reference/README.md1.3 KBb8b1b7619dc3upstream ↗
    # 参考实现(C / D / E 三种风格)
    
    这三个是做过的真实成片工程的剪辑代码(只有代码,不带素材)。**内容每期都不一样,所以不是填空模板**:起新工程后保留布局、主播框、字幕、音效、过渡这些通用部分,按本期的稿子重写每段的 Scene。
    
    | 目录 | 风格 | 出过的片 | 入口 | 时间轴 |
    |---|---|---|---|---|
    | launch-169 | C 发布解读 | MemT 1.0 发布解读(38 秒) | src/Film.tsx | src/timeline.json(逐字对齐 + 卡点) |
    | tutorial-169 | D 保姆级教程 | AIGC 教程第二期(4 分 36 秒) | src/Tutorial.tsx | src/tl.json(nar 段 + 演示插入) |
    | multihost-169 | E 多主播多语言 | AIGC 教程第三期(5 分 54 秒) | src/Tutorial.tsx | src/tl.json(nar / clip / title / outro) |
    
    起工程:`bash scripts/new_edit.sh reference/tutorial-169 <工程目录>`(会顺带放好 sfx 和配乐)。
    素材文件名看代码里的 `staticFile("…")`,按同样的路径放进 public/。
    
    multihost-169/pipeline 是第三期从规划到时间轴的脚本(plan → build_tasks → qa → build_tl),换声统一用 `scripts/voicefx/unify.py`。
    参考工程里用包装:import { PackLayer } from "./kit/registry",见 references/packaging.md
    
  • skills/digital-human-koubo/scripts/align.py3.2 KBf7cdc5d2249aupstream ↗
    #!/usr/bin/env python3
    """逐字时间轴:把 assemble.py 的 cut/<id>.json(whisper 逐字)和文稿对齐,输出剪辑模板用的 tl.json。
    用法:python3 align.py script.json [--out edit/src/tl.json]
    tl.json = {"total": 秒, "segs": [{"i","id","start","end","text","chars":{"字符下标": 秒}}]}(chars 是整片绝对时间)
    字幕和念法不一样时,在 script.json 那段加 "sub": {"SKILL 点 M D": "SKILL.md"}:对齐按念法,字幕显示右边的写法,时间跟着换。"""
    import json, difflib, sys
    from pathlib import Path
    a = sys.argv[1:]
    if not a: sys.exit(__doc__)
    S = json.load(open(a[0])); Q = {r['id']: r for r in json.load(open('cut/qa.json'))}
    out = a[a.index('--out') + 1] if '--out' in a else 'edit/src/tl.json'
    PUNCT = set(',。、:;!?,.:;!? “”「」')
    T0 = 0.0; segs = []
    for i, s in enumerate(S, 1):
        sid, text = s['id'], s['t']; keep = Q[sid]['keep']
        tk = []
        for t in json.load(open(f'cut/{sid}.json', errors='replace'))['transcription']:
            a0, a1 = t['offsets']['from'] / 1000, t['offsets']['to'] / 1000; tx = t['text'].strip()
            if not tx or tx.startswith('['): continue
            for k, ch in enumerate(tx):
                if ch not in PUNCT: tk.append((ch.lower(), a0 + (a1 - a0) * k / len(tx)))
        clean = [(j, ch.lower()) for j, ch in enumerate(text) if ch not in PUNCT]
        A = ''.join(c for _, c in clean); B = ''.join(c for c, _ in tk)
        sm = difflib.SequenceMatcher(None, A, B, autojunk=False); st = [None] * len(clean)
        for bl in sm.get_matching_blocks():
            for k in range(bl.size): st[bl.a + k] = tk[bl.b + k][1]
        known = [k for k, v in enumerate(st) if v is not None]
        for k in range(len(st)):
            if st[k] is None:
                lo = max([j for j in known if j < k], default=None); hi = min([j for j in known if j > k], default=None)
                st[k] = 0.0 if lo is None and hi is None else (st[hi] if lo is None else (st[lo] + 0.18 * (k - lo) if hi is None else st[lo] + (st[hi] - st[lo]) * (k - lo) / (hi - lo)))
        cov = sum(bl.size for bl in sm.get_matching_blocks()) / max(1, len(A))
        ch = {j: T0 + st[k] for k, (j, _) in enumerate(clean)}
        for say, show in s.get('sub', {}).items():        # 念法 → 字幕写法,这几个字的时间在原跨度里均分
            p0 = text.find(say)
            if p0 < 0: print(f'   ⚠ {sid} 找不到 sub「{say}」'); continue
            span = [ch[j] for j in range(p0, p0 + len(say)) if j in ch]; a0, a1 = (span[0], span[-1]) if span else (T0, T0)
            d = len(show) - len(say)
            ch = {**{j: v for j, v in ch.items() if j < p0}, **{j + d: v for j, v in ch.items() if j >= p0 + len(say)},
                  **{p0 + k: a0 + (a1 - a0) * k / max(1, len(show) - 1) for k, c in enumerate(show) if c not in PUNCT}}
            text = text[:p0] + show + text[p0 + len(say):]
        segs.append(dict(i=i, id=sid, start=round(T0, 3), end=round(T0 + keep, 3), text=text, chars={str(j): round(v, 3) for j, v in sorted(ch.items())}))
        print(f'{i:2d} {sid:5s} 对齐 {cov:.0%}  {T0:.2f}–{T0 + keep:.2f}')
        T0 += keep
    Path(out).parent.mkdir(parents=True, exist_ok=True)
    json.dump(dict(total=round(T0, 3), segs=segs), open(out, 'w'), ensure_ascii=False, indent=0)
    print('total', round(T0, 2), '→', out)
    
  • skills/digital-human-koubo/scripts/assemble.py5.9 KB8792c6955368upstream ↗
    #!/usr/bin/env python3
    """逐段回听 → 剪掉段尾空白 → 统一规格 → 拼接。
    用法:python3 assemble.py script.json ids.json [--out 成片_完整版.mp4] [--lang zh] [--size 宽x高(默认保持源尺寸)]
    - script.json:[{"id","t",...}](和 build_tasks.py 同一份);ids.json:{"s1": 363509, ...}(段 id → Renoise taskId);下载的文件在 gen/renoise-<taskId>.mp4
    - 每段:whisper 转写(中性提示,不用 --prompt 原文,免得漏前半句)→ 和文稿比准确率 → 只保留到说完后 0.25 秒
    - 输出 cut/<id>.mp4(30fps、48k 立体声)、cut/<id>.json(逐字时间,align.py 用)、cut/qa.json、拼接好的 --out(-16 LUFS)
    - 准确率 < 85% 的段打 ⚠,先人工听;真念错就单独重拍那段
    - 念错字另用 misread_check.py(不带原文提示逐句转写)查,用 patch_words.py 只换错句;改完 --rejoin 只重新拼接
    - 拼接前每段音频补齐/裁到和画面完全等长(PCM .mov 中转),否则几十段拼下来声音会累积落后口型(2026-10 实测 44 段到 4:43 晚 0.38 秒)"""
    import json, subprocess, difflib, re, os, sys
    from pathlib import Path
    a = sys.argv[1:]
    if len(a) < 2: sys.exit(__doc__)
    S = json.load(open(a[0])); IDS = json.load(open(a[1]))
    opt = lambda k, d: a[a.index(k) + 1] if k in a else d
    out_name, lang, size = opt('--out', '成片_完整版.mp4'), opt('--lang', 'zh'), opt('--size', '')
    REJOIN = '--rejoin' in a
    WM = os.environ.get('WHISPER_MODEL') or next((p for p in map(os.path.expanduser, ['~/Library/Application Support/Murmur/models/ggml-medium-q5_0.bin', '~/models/ggml-medium-q5_0.bin', '~/.cache/whisper/ggml-medium-q5_0.bin', '~/models/ggml-medium.bin']) if os.path.exists(p)), '~/models/ggml-medium-q5_0.bin')
    clean = lambda s: re.sub(r'[\s,。、:;!?,.:;!?“”]', '', s).lower()
    Path('cut').mkdir(exist_ok=True); rep = []
    for s in ([] if REJOIN else S):
        sid = s['id']; src = f"gen/renoise-{IDS[sid]}.mp4"; wav = f'cut/{sid}.wav'
        lg = s.get('lang_code', lang)
        subprocess.run(['ffmpeg', '-loglevel', 'error', '-y', '-i', src, '-ar', '16000', '-ac', '1', wav], check=True)
        cmd = ['whisper-cli', '-m', WM, '-l', lg] + (['--prompt', '以下是普通话的句子。', '-ml', '1'] if lg == 'zh' else []) + ['-oj', '-of', f'cut/{sid}', '-f', wav]
        subprocess.run(cmd, capture_output=True)
        d = [t for t in json.load(open(f'cut/{sid}.json', errors='replace'))['transcription'] if t['text'].strip() and not t['text'].strip().startswith('[')]
        heard = ''.join(t['text'] for t in d)
        st = min(t['offsets']['from'] for t in d) / 1000 if d else 0; en = max(t['offsets']['to'] for t in d) / 1000 if d else 0
        dur = float(subprocess.run(['ffprobe', '-v', 'error', '-show_entries', 'format=duration', '-of', 'csv=p=0', src], capture_output=True, text=True).stdout)
        w, h = map(int, subprocess.run(['ffprobe', '-v', 'error', '-select_streams', 'v', '-show_entries', 'stream=width,height', '-of', 'csv=p=0', src], capture_output=True, text=True).stdout.split(','))
        sz = size or f'{w - w % 2}x{h - h % 2}'          # 保持源尺寸(Grok 9:16 720p 是 720×1280,别拉成 720×1440)
        acc = difflib.SequenceMatcher(None, clean(s['t']), clean(heard)).ratio()
        keep = min(dur, en + 0.25)
        subprocess.run(['ffmpeg', '-loglevel', 'error', '-y', '-i', src, '-t', f'{keep:.3f}', '-vf', f'scale={sz.replace("x", ":")}:flags=lanczos,fps=30,format=yuv420p',
                        '-af', f'aresample=48000,afade=t=out:st={max(0, keep - 0.12):.3f}:d=0.12', '-ac', '2', '-c:v', 'libx264', '-crf', '17', '-preset', 'medium', '-c:a', 'aac', '-b:a', '192k', f'cut/{sid}.mp4'], check=True)
        rep.append(dict(id=sid, acc=round(acc, 3), speech=[round(st, 2), round(en, 2)], keep=round(keep, 2), src_dur=round(dur, 2), heard=heard))
        print(f"{'⚠' if acc < 0.85 else ' '}{sid:5s} 准确率 {acc:.0%}  说话 {st:.2f}–{en:.2f}s  保留 {keep:.2f}/{dur:.2f}s  听到:{heard}")
    if REJOIN: rep = json.load(open('cut/qa.json'))
    else: json.dump(rep, open('cut/qa.json', 'w'), ensure_ascii=False, indent=1)
    # 拼接:每段音频 pad/trim 到画面帧数长度(PCM),keep 改成真实画面长度,保证 align.py 的累计时间 = 拼好的画面时间
    Path('cut/_join').mkdir(exist_ok=True); Q = {r['id']: r for r in rep}
    for s in S:
        f = f"cut/{s['id']}.mp4"
        nfr = int(subprocess.run(['ffprobe', '-v', 'error', '-select_streams', 'v:0', '-count_packets', '-show_entries', 'stream=nb_read_packets', '-of', 'csv=p=0', f], capture_output=True, text=True).stdout.strip())
        vd = nfr / 30
        subprocess.run(['ffmpeg', '-loglevel', 'error', '-y', '-i', f, '-map', '0:v', '-map', '0:a', '-c:v', 'copy', '-af', f'aresample=48000,apad,atrim=0:{vd:.5f}', '-c:a', 'pcm_s16le', f"cut/_join/{s['id']}.mov"], check=True)
        Q[s['id']]['keep'] = round(vd, 5)
    json.dump(rep, open('cut/qa.json', 'w'), ensure_ascii=False, indent=1)
    open('cut/list.txt', 'w').write(''.join(f"file '_join/{s['id']}.mov'\n" for s in S))
    subprocess.run(['ffmpeg', '-loglevel', 'error', '-y', '-f', 'concat', '-safe', '0', '-i', 'cut/list.txt', '-c:v', 'copy', '-c:a', 'pcm_s16le', 'cut/joined.mov'], check=True)
    sd = lambda f, sel: float(subprocess.run(['ffprobe', '-v', 'error', '-select_streams', sel, '-show_entries', 'stream=duration', '-of', 'csv=p=0', f], capture_output=True, text=True).stdout.strip() or 0)
    dv, da = sd('cut/joined.mov', 'v:0'), sd('cut/joined.mov', 'a:0')
    print(('✓' if abs(dv - da) < 0.02 else '⚠ 音画不等长') + f' 拼接 画面 {dv:.3f}s / 声音 {da:.3f}s')
    subprocess.run(['ffmpeg', '-loglevel', 'error', '-y', '-i', 'cut/joined.mov', '-c:v', 'copy', '-c:a', 'aac', '-b:a', '192k', 'cut/joined.mp4'], check=True)
    subprocess.run(['ffmpeg', '-loglevel', 'error', '-y', '-i', 'cut/joined.mov', '-af', 'loudnorm=I=-16:TP=-1.5:LRA=11', '-c:v', 'copy', '-c:a', 'aac', '-b:a', '192k', '-movflags', '+faststart', out_name], check=True)
    print('拼接完成', out_name, round(sum(r['keep'] for r in rep), 2), '秒(剪辑用 cut/joined.mov / joined.mp4,未做响度)')
    
  • skills/digital-human-koubo/scripts/build_tasks.py3.5 KB4aef50e28803upstream ↗
    #!/usr/bin/env python3
    """口播稿 → Grok 分段任务(create_tasks 的 tasks 数组)+ 费用估算。
    
    用法:
      python3 build_tasks.py script.json out_tasks.json [--purpose "teaching a beginner tutorial step by step"] [--all-720p]
    
    script.json:[{"id": "s1", "shot": "full|pip|vlog", "t": "这一段要念的台词", "host": "tank|me", "lang": "Mandarin Chinese|English|Japanese|…"}, ...]
    - host:tank = 白背心数字人(9:16,默认);me = 用户本人数字人(16:9,persona.json → other_hosts.me)
    - lang:不写就是普通话;外语段台词直接写目标语言
    - 每段时长 = ceil(字数 / 5.4 + 1.0),夹在 4–15 秒(Grok 单段上限 15 秒;5.4 字/秒是实测语速)
    - full 段 720p,pip 段 480p(画中画里看不出差别,便宜四成);--all-720p 全部 720p
    - 超过 15 秒的段会报错:先把台词拆短再跑
    输出的数组每 10 个一批交给 create_tasks;提交前一定先把总价和余额报给用户,等用户确认。
    """
    import json, math, re, sys
    from pathlib import Path
    
    HERE = Path(__file__).resolve().parent.parent
    P = json.loads((HERE / "persona.json").read_text())
    
    def arg(name, default=None):
        return sys.argv[sys.argv.index(name) + 1] if name in sys.argv else default
    
    def main():
        src, dst = sys.argv[1], sys.argv[2]
        purpose = arg("--purpose", "explaining clearly")
        all720 = "--all-720p" in sys.argv
        S = json.loads(Path(src).read_text())
        tasks, total = [], 0
        for s in S:
            lang = s.get("lang", "Mandarin Chinese")
            if lang.startswith("Mandarin") or lang == "Chinese":
                d = math.ceil(len(re.sub(r"[\s,。、:;!?,.:;!?“”]", "", s["t"])) / P["voice"]["speed_cps"] + 1.0)
            elif re.search(r"[぀-ヿ가-힯]", s["t"]):     # 日文 / 韩文:约 7 字/秒
                d = math.ceil(len(re.sub(r"\s", "", s["t"])) / 7 + 1.0)
            else:                                                    # 拉丁 / 阿拉伯等按词:约 2.6 词/秒
                d = math.ceil(len(s["t"].split()) / 2.6 + 1.0)
            if d > P["model"]["max_seconds"]:
                sys.exit(f"{s['id']} 约 {d} 秒,超过 15 秒:拆成两段再跑")
            d = max(4, d)
            shot = s.get("shot", "full")
            res = P["model"]["full_shot_resolution"] if (all720 or shot != "pip") else P["model"]["pip_shot_resolution"]
            total += d * P["model"]["price_per_second"][res]
            act = P["acts"].get(shot, P["acts"]["full"])
            if s.get("host", "tank") == "me":
                H = P["other_hosts"]["me"]; ref = H["reference_material"]; ratio = H["ratio"]
                prompt = H["prompt_template"].format(ref="@" + ref, purpose=purpose, act=act, voice=H["voice"], language=lang, line=s["t"])
            else:
                ref = P["renoise"]["reference_material"]; ratio = P["model"]["ratio"]
                prompt = P["prompt_template"].format(ref="@" + ref, purpose=purpose, act=act, voice=P["voice"]["desc"], line=s["t"]).replace("Mandarin Chinese", lang)
            tasks.append({"model": P["model"]["name"], "kind": "video", "ratio": ratio, "resolution": res, "duration": d,
                          "label": f"口播 {s['id']}", "idempotencyKey": f"dh-{Path(src).stem}-{s['id']}-v1",
                          "references": [{"ref": ref, "role": "reference_image"}], "prompt": prompt})
        Path(dst).write_text(json.dumps(tasks, ensure_ascii=False, indent=1))
        secs = sum(t["duration"] for t in tasks)
        print(f"{len(tasks)} 段 · 口播约 {secs} 秒 · 预估 {total} credits · 分 {math.ceil(len(tasks) / 10)} 批提交")
    
    if __name__ == "__main__":
        main()
    
  • skills/digital-human-koubo/scripts/check_edit.py4.4 KBa6e720a5657eupstream ↗
    #!/usr/bin/env python3
    """渲染前检查 edit.json:所有 "段:词" 时间引用都能在 tl.json 里找到,卡片不互相打架。
    用法:python3 check_edit.py <工程>/src   (目录里要有 tl.json 和 edit.json)"""
    import json, re, sys
    from pathlib import Path
    d = Path(sys.argv[1] if len(sys.argv) > 1 else 'src')
    tl = json.load(open(d / 'tl.json')); ed = json.load(open(d / 'edit.json')); S = tl['segs']
    bad = []
    def T(r, where):
        if isinstance(r, (int, float)): return float(r)
        m = re.match(r'^(\d+):(.*)$', str(r))
        if not m: bad.append(f'{where}: 时间写法不对 {r!r}(应为 "3:" / "3:end" / "3:关键词" / "3:关键词#2" / 秒数)'); return None
        i = int(m.group(1))
        if not 1 <= i <= len(S): bad.append(f'{where}: 没有第 {i} 段(共 {len(S)} 段)'); return None
        s = S[i - 1]; w = m.group(2)
        if not w: return s['start']
        if w == 'end': return s['end']
        word, _, nth = w.partition('#'); idx = -1
        for _ in range(int(nth or 1)):
            idx = s['text'].find(word, idx + 1)
        if idx < 0: bad.append(f'{where}: 第 {i} 段找不到「{word}」— 原文:{s["text"]}'); return None
        return s['chars'].get(str(idx), s['start'])
    for k, c in enumerate(ed.get('chapters', [])): T(c['at'], f'chapters[{k}]')
    for k, e in enumerate(ed.get('emojis', [])): T(e['at'], f'emojis[{k}] {e.get("e")}')
    for k, p in enumerate(ed.get('punch', [])): T(p, f'punch[{k}]')
    spans = []
    for k, c in enumerate(ed.get('cards', [])):
        a = T(c['at'], f'cards[{k}] {c["type"]}')
        if 'until' in c: T(c['until'], f'cards[{k}].until')
        for j, it in enumerate(c.get('items', [])):
            if 'at' in it: T(it['at'], f'cards[{k}].items[{j}]')
        for side in ('left', 'right'):
            if isinstance(c.get(side), dict) and 'at' in c[side]: T(c[side]['at'], f'cards[{k}].{side}')
        if a is not None: spans.append((a, c['type'], k))
    for k, s in enumerate(ed.get('showcase', [])):
        a, b = T(s['from'], f'showcase[{k}].from'), T(s['to'], f'showcase[{k}].to')
        if a is not None and b is not None and b - a < 1.5: bad.append(f'showcase[{k}]: 只有 {b - a:.1f} 秒,作品看不清(建议 ≥ 3 秒)')
    if ed.get('cta'): T(ed['cta']['at'], 'cta')
    # 包装组件:所有嵌套的 at / until 都检查
    KNOWN = set("""RetentionCaption ZoomFocus HandDraw FreezeFrame LowerThird SourceTag Counter Countdown ChapterCard SpecCard Danmaku ReactionPop ProgressChapters TeaserColdOpen CompareWipe PaperCollage MapRoute
    MemeWindow ColdOpenFreeze EvidenceCard PollPop GlitchInterstitial NamePlate HostFloaters Aside TiltLine DocFocus TypedNameTag PunchInHost RecapBoard SearchTyping CalloutPill LeaderLabel LineDraw BarCompare GhostWord SlamText TornStrip ArchiveCards
    NumberSpike ProgressTracker ReviewCards WordStack KeywordStack GlassPanel Odometer SourceDoc TextBehind""".split())
    def walk(v, where):
        if isinstance(v, list):
            for i, x in enumerate(v): walk(x, f'{where}[{i}]')
        elif isinstance(v, dict):
            for k, x in v.items():
                if k in ('at', 'until') and isinstance(x, (str, int, float)): T(x, f'{where}.{k}')
                else: walk(x, f'{where}.{k}')
    for k, it in enumerate(ed.get('pack', [])):
        if it.get('use') not in KNOWN: bad.append(f'pack[{k}]: 没有组件「{it.get("use")}」(见 references/packaging.md)')
        walk(it, f'pack[{k}] {it.get("use")}')
        for fld in ('src', 'img', 'host', 'cutout'):
            if isinstance(it.get(fld), str) and not (d.parent / 'public' / it[fld]).exists(): bad.append(f'pack[{k}] {it.get("use")}: 素材不存在 public/{it[fld]}')
    keys = ed.get('keys', []); text = ''.join(s['text'] for s in S)
    miss = [k for k in keys if k not in text]
    if miss: bad.append(f'keys 里这些词稿子里没有:{miss}')
    spans.sort()
    for (a1, t1, k1), (a2, t2, k2) in zip(spans, spans[1:]):
        if a2 - a1 < 0.8: print(f'提醒:cards[{k1}] {t1} 和 cards[{k2}] {t2} 只隔 {a2 - a1:.2f} 秒,前一张会被挤掉')
    preset = ed.get('preset', '标准')
    if preset not in ('克制', '标准', '热闹'): bad.append(f'preset 只能是 克制 / 标准 / 热闹,现在是 {preset!r}')
    n = len(ed.get('emojis', [])); mins = tl['total'] / 60
    print(f'{len(S)} 段 · {tl["total"]:.1f} 秒 · 花字强度 {preset} · 关键词 {len(keys)} · 表情 {n}(每分钟 {n / mins:.1f})· 卡片 {len(spans)} · 推近 {len(ed.get("punch", []))} · 包装组件 {len(ed.get("pack", []))}')
    if bad:
        print('\n'.join('✗ ' + b for b in bad)); sys.exit(1)
    print('✓ 时间引用全部能对上')
    
  • skills/digital-human-koubo/scripts/cover_first.py1.9 KBb3e2648bcd53upstream ↗
    #!/usr/bin/env python3
    """把封面图接到成片最前面,当开头帧(平台默认取首帧做封面)。
    python3 cover_first.py <成片.mp4> <封面.jpg> <输出.mp4> [--hold 0.5]
    封面停 hold 秒后硬切进正片;声音整体往后推 hold 秒,前面补静音。画幅、帧率跟成片一致,封面按画幅铺满居中裁切。"""
    import json
    import subprocess
    import sys
    
    
    def probe(path):
        out = subprocess.run(["ffprobe", "-v", "error", "-select_streams", "v:0", "-show_entries", "stream=width,height,r_frame_rate",
                              "-of", "json", path], capture_output=True, text=True, check=True).stdout
        s = json.loads(out)["streams"][0]
        a, b = s["r_frame_rate"].split("/")
        return s["width"], s["height"], round(int(a) / int(b))
    
    
    def main():
        args = [a for a in sys.argv[1:] if not a.startswith("--")]
        if len(args) != 3:
            sys.exit(__doc__)
        src, cover, out = args
        hold = float(sys.argv[sys.argv.index("--hold") + 1]) if "--hold" in sys.argv else 0.5
        w, h, fps = probe(src)
        ms = round(hold * 1000)
        fc = (f"[1:v]scale={w}:{h}:force_original_aspect_ratio=increase,crop={w}:{h},setsar=1,fps={fps},format=yuv420p,trim=duration={hold}[c];"
              f"[0:v]setsar=1,format=yuv420p[m];[c][m]concat=n=2:v=1:a=0[v];"
              f"[0:a]adelay={ms}:all=1,alimiter=limit=0.79:level=false[a]")   # 重编 AAC 会让峰值抬高 0.5–1 dB,先限到约 -2 dBFS,编码后真峰值 ≤ -1
        subprocess.run(["ffmpeg", "-y", "-v", "error", "-i", src, "-loop", "1", "-framerate", str(fps), "-t", str(hold), "-i", cover,
                        "-filter_complex", fc, "-map", "[v]", "-map", "[a]", "-c:v", "libx264", "-preset", "slow", "-crf", "18",
                        "-pix_fmt", "yuv420p", "-c:a", "aac", "-b:a", "192k", "-movflags", "+faststart", out], check=True)
        print(f"→ {out}(封面 {hold:g} 秒 + 正片)")
    
    
    if __name__ == "__main__":
        main()
    
  • skills/digital-human-koubo/scripts/cutout_video.py4.2 KBd7d30181f40aupstream ↗
    #!/usr/bin/env python3
    """把数字人视频里的人抠出来,输出带透明通道的视频(给「文字在人身后」TextBehind 用)。
    用法:python3 cutout_video.py <输入.mp4> <输出.webm> [--from 秒] [--to 秒] [--feather 1.5] [--smooth 3] [--shrink 1] [--grow 0]
    - --from / --to:只抠这一段(整条 1 分半的口播抠完要几分钟,只用 2–3 处的话按段抠快得多)。TextBehind 里把 cutoutFrom 设成同一个 --from。
    - 逐帧用 macOS Vision 人像分割(同目录 personmask.swift,精细档;仅 macOS)
    - --smooth N:相邻 N 帧取平均,压住边缘闪烁(默认 3)
    - --shrink:遮罩往里收几像素,去掉边缘的背景灰边(默认 1);--grow:往外扩(头发丝被吃掉时用,会带一点背景色);--feather:边缘羽化(默认 1.5)
    输出 VP9 + alpha 的 .webm(体积小,Remotion OffthreadVideo transparent 直接用);要 ProRes 4444 就写 .mov。
    另存一份 <输出>_mask.mp4(灰度遮罩,方便检查)。"""
    import subprocess, sys, os, json, shutil
    from pathlib import Path
    a = sys.argv[1:]
    if len(a) < 2: sys.exit(__doc__)
    src, dst = Path(a[0]), Path(a[1])
    opt = lambda k, d: float(a[a.index(k) + 1]) if k in a else d
    feather, smooth, grow, shrink = opt("--feather", 1.5), int(opt("--smooth", 3)), int(opt("--grow", 0)), int(opt("--shrink", 1))
    t0, t1 = opt("--from", 0.0), opt("--to", 0.0)
    seek = (["-ss", f"{t0:.3f}"] if t0 > 0 else []) + (["-to", f"{t1:.3f}"] if t1 > 0 else [])
    HERE = Path(__file__).resolve().parent
    PM = HERE / "bin/personmask"
    if not PM.exists():
        sw = HERE / "personmask.swift"   # macOS Vision 人像分割,第一次用时本机编译
        if not sw.exists(): sys.exit("找不到 personmask.swift")
        PM.parent.mkdir(parents=True, exist_ok=True)
        subprocess.run(["swiftc", "-O", "-swift-version", "5", str(sw), "-o", str(PM)], check=True)
    info = json.loads(subprocess.run(["ffprobe", "-v", "error", "-select_streams", "v:0", "-show_entries", "stream=width,height,r_frame_rate", "-of", "json", str(src)], capture_output=True, text=True).stdout)["streams"][0]
    W, H, fps = info["width"], info["height"], info["r_frame_rate"]
    mask = dst.with_name(dst.stem + "_mask.mp4")
    # 1) 原视频 → BGRA 流 → personmask → 灰度遮罩流 → 平滑 / 扩边 / 羽化 → mask.mp4
    dec = subprocess.Popen(["ffmpeg", "-loglevel", "error", *seek, "-i", str(src), "-f", "rawvideo", "-pix_fmt", "bgra", "-"], stdout=subprocess.PIPE)
    pm = subprocess.Popen([str(PM), str(W), str(H), "person"], stdin=dec.stdout, stdout=subprocess.PIPE)
    vf = ",".join(f for f in [f"tmix=frames={smooth}" if smooth > 1 else "", *(["dilation"] * grow), *(["erosion"] * shrink), f"gblur=sigma={feather}" if feather > 0 else "", "format=gray"] if f)
    enc = subprocess.run(["ffmpeg", "-loglevel", "error", "-y", "-f", "rawvideo", "-pix_fmt", "gray", "-s", f"{W}x{H}", "-r", fps, "-i", "-", "-vf", vf, "-c:v", "libx264", "-crf", "12", "-pix_fmt", "yuv420p", str(mask)], stdin=pm.stdout)
    dec.wait(); pm.wait()
    if enc.returncode or not mask.exists(): sys.exit("遮罩生成失败")
    # 2) 原视频 + 遮罩 → alphamerge → 透明视频
    codec = ["-c:v", "libvpx-vp9", "-pix_fmt", "yuva420p", "-b:v", "0", "-crf", "24", "-row-mt", "1", "-auto-alt-ref", "0"] if dst.suffix == ".webm" else ["-c:v", "prores_ks", "-profile:v", "4444", "-pix_fmt", "yuva444p10le"]
    subprocess.run(["ffmpeg", "-loglevel", "error", "-y", *seek, "-i", str(src), "-i", str(mask), "-filter_complex", "[1:v]format=gray,scale=%d:%d[m];[0:v][m]alphamerge" % (W, H), "-an", *codec, str(dst)], check=True)
    cov = subprocess.run(["ffmpeg", "-v", "error", "-i", str(mask), "-vf", "fps=1,scale=64:-2,format=gray", "-f", "rawvideo", "-"], capture_output=True).stdout
    frac = sum(1 for b in cov if b > 128) / max(1, len(cov))
    print(f"✓ {dst}({W}×{H},人像约占画面 {frac:.0%})  遮罩:{mask}")
    # 头顶以上 / 两侧留了多少背景:景深字要放在人身后,人把画面占满就看不见字
    top_rows = [cov[i * 64:(i + 1) * 64] for i in range(len(cov) // 64)]
    if frac > 0.6:
        print(f"⚠ 人像占了 {frac:.0%},几乎没有背景,景深字会被人挡住。换中景素材(生成时提示词加 medium shot, leave headroom and background on both sides),或者改用 NumberSpike / TiltLine。")
    
  • skills/digital-human-koubo/scripts/doctor.sh3.6 KB9c923c87bc7cupstream ↗
    #!/bin/bash
    # 本机环境检查:有的打 ✓ 跳过,缺的才列装法(先列本机系统的,再列其他方式)。不自动安装。
    # 用法:bash doctor.sh        退出码 0 = 齐了,1 = 有缺的
    OS=$(uname -s); case "$OS" in Darwin) SYS=mac;; Linux) SYS=linux;; MINGW*|MSYS*|CYGWIN*) SYS=win;; *) SYS=other;; esac
    MISS=0; OUT=""
    ok(){ printf "  ✓ %s\n" "$1"; }
    need(){ # need 名称 用途 mac装法 win装法 linux装法 其他装法
      MISS=1; printf "  ✗ %s(%s)\n" "$1" "$2"
      case $SYS in mac) first="$3";; win) first="$4";; linux) first="$5";; *) first="$6";; esac
      printf "      推荐:%s\n" "$first"
      for kv in "macOS|$3" "Windows|$4" "Linux|$5" "其他|$6"; do n=${kv%%|*}; v=${kv#*|}; [ "$v" = "$first" ] || [ -z "$v" ] || printf "      %s:%s\n" "$n" "$v"; done
    }
    echo "数字人口播 · 本机环境检查($OS)"
    command -v ffmpeg >/dev/null && ok "ffmpeg $(ffmpeg -version | head -1 | awk '{print $3}')" || need "ffmpeg" "抽帧、拼接、响度" "brew install ffmpeg" "winget install Gyan.FFmpeg  或  choco install ffmpeg" "sudo apt install ffmpeg  (或 dnf / pacman)" "ffmpeg.org 下载安装包"
    PY=$(command -v python3.14 || command -v python3 || command -v python)
    if [ -n "$PY" ]; then
      ok "Python $($PY -c 'import sys;print(sys.version.split()[0])')"
      for m in numpy:numpy PIL:pillow; do mod=${m%%:*}; pkg=${m#*:}
        $PY -c "import $mod" 2>/dev/null && ok "$pkg" || need "$pkg" "声音统一 / 预览图" "$PY -m pip install $pkg" "$PY -m pip install $pkg" "$PY -m pip install $pkg" "conda install $pkg"
      done
      PWI="$PY -m pip install playwright && $PY -m playwright install chromium"
      $PY -c "import playwright" 2>/dev/null && ok "playwright" || need "playwright + chromium" "封面排版截图(make_cover.py)" "$PWI" "$PWI" "$PWI" "$PWI"
    else need "Python 3" "回听、对齐、声音统一脚本" "brew install python" "winget install Python.Python.3.12" "sudo apt install python3 python3-pip" "python.org 下载,或装 Anaconda / Miniconda"; fi
    if command -v node >/dev/null; then
      v=$(node -v | tr -d v | cut -d. -f1); [ "$v" -ge 18 ] && ok "Node $(node -v)" || need "Node 18 以上(现在是 $(node -v))" "Remotion 剪辑" "brew upgrade node" "winget upgrade OpenJS.NodeJS.LTS" "nvm install --lts" "nodejs.org 下载 LTS"
    else need "Node 18+" "Remotion 剪辑" "brew install node" "winget install OpenJS.NodeJS.LTS" "sudo apt install nodejs npm  或  nvm install --lts" "nodejs.org 下载 LTS"; fi
    if command -v whisper-cli >/dev/null; then
      ok "whisper-cli"
      M=$(ls "${WHISPER_MODEL:-/nonexistent}" ~/Library/Application\ Support/Murmur/models/ggml-medium*.bin ~/models/ggml-medium*.bin ~/.cache/whisper/ggml-medium*.bin 2>/dev/null | head -1)
      [ -n "$M" ] && ok "whisper 模型 $(basename "$M")" || need "whisper 模型 ggml-medium-q5_0.bin" "逐段回听、逐字对齐" "下载到 ~/models/:curl -L -o ~/models/ggml-medium-q5_0.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-medium-q5_0.bin" "浏览器打开 huggingface.co/ggerganov/whisper.cpp 下载 ggml-medium-q5_0.bin 放到 %USERPROFILE%\\models\\" "同 macOS 的 curl 命令" "放在任意位置后 export WHISPER_MODEL=模型路径"
    else need "whisper-cli(whisper.cpp)" "逐段回听、逐字对齐" "brew install whisper-cpp" "github.com/ggerganov/whisper.cpp → Releases 下载 Windows 版" "git clone https://github.com/ggerganov/whisper.cpp && cd whisper.cpp && cmake -B build && cmake --build build -j" "源码编译,见 whisper.cpp README"; fi
    echo
    if [ $MISS = 0 ]; then echo "本机环境齐了,不用装任何东西。"; else echo "装好上面 ✗ 的项(任选一种方式),再跑一次 bash doctor.sh 确认。"; fi
    exit $MISS
    
  • skills/digital-human-koubo/scripts/face_center.swift587 Bd741c0a1dde6upstream ↗
    import Foundation
    import Vision
    import AppKit
    // swift face_center.swift frame.png → 打印脸中心(1920×1080 像素坐标,原点左上)
    let img = NSImage(contentsOfFile: CommandLine.arguments[1])!
    let cg = img.cgImage(forProposedRect: nil, context: nil, hints: nil)!
    let req = VNDetectFaceRectanglesRequest()
    try! VNImageRequestHandler(cgImage: cg, options: [:]).perform([req])
    if let f = req.results?.first {
      let b = f.boundingBox; let W = Double(cg.width), H = Double(cg.height)
      print(String(format: "%.0f %.0f", (b.midX) * W * 1920 / W, (1 - b.midY) * H * 1080 / H))
    }
    
  • skills/digital-human-koubo/scripts/lin_mix.py3.6 KBaee9fe82fca2upstream ↗
    #!/usr/bin/env python3
    """人声链 + BGM 循环避让 + 音效 → 母带 -16 LUFS;可选变速导出成片。
    用法:
      python3 lin_mix.py --voice cut/joined.mov --bgm 曲子.mp3 --sfx audio/sfx_bus.wav --out edit/public/mix.wav [--voice-out edit/public/voice.wav] [--male]
      python3 lin_mix.py ... --speed 1.1 --video edit/out/lin.mp4 --final 成片_1.1x.mp4   # 人声和音效 atempo、画面 setpts,BGM 保持原速只裁长度
    - 人声链(女声默认):高通 90 / 220 Hz +1.5 / 420 Hz −2 / 3.2 kHz +2 / 10 kHz +1.5 / 去齿音 / 压缩 3:1 / −17 LUFS;--male 换成 140 Hz +3.5 那条
    - BGM:循环(3 秒交叉淡化)到够长,−24 LUFS 打底,sidechain 被人声压(threshold 0.04 ratio 5),结尾 5 秒淡出
    - 音效总线 −8 dB;总线 limiter + loudnorm −16 LUFS / −1.5 dBTP
    - 不加 --speed 时只出 mix.wav(给 Remotion 的 public/),--video/--final 给了就顺手把 mix 套到渲好的画面上"""
    import subprocess, sys, json
    a = sys.argv[1:]
    if not a: sys.exit(__doc__)
    opt = lambda k, d=None: a[a.index(k) + 1] if k in a else d
    voice, bgm, sfx, out = opt('--voice'), opt('--bgm'), opt('--sfx'), opt('--out', 'mix.wav')
    sp = float(opt('--speed', 1.0)); vout = opt('--voice-out')
    dur = lambda f: float(subprocess.run(['ffprobe', '-v', 'error', '-show_entries', 'format=duration', '-of', 'csv=p=0', f], capture_output=True, text=True).stdout)
    run = lambda *c: subprocess.run(['ffmpeg', '-v', 'error', '-y', *c], check=True)
    chain = ("highpass=f=70,equalizer=f=140:t=o:w=1:g=3.5,equalizer=f=420:t=o:w=1:g=-2,equalizer=f=3200:t=o:w=1:g=3" if '--male' in a else
             "highpass=f=90,equalizer=f=220:t=o:w=1:g=1.5,equalizer=f=420:t=o:w=1:g=-2,equalizer=f=3200:t=o:w=1:g=2,equalizer=f=10000:t=o:w=1:g=1.5,deesser=i=0.35") + \
            ",acompressor=threshold=-22dB:ratio=3:attack=5:release=100:makeup=2,loudnorm=I=-17:TP=-2:LRA=7"
    vw = vout or '/tmp/_lin_voice.wav'
    run('-i', voice, '-vn', '-af', chain, '-ar', '48000', '-ac', '2', vw)
    L = dur(vw) / sp
    bl = dur(bgm); n = int(L // max(1, bl - 3)) + 2
    ins = sum([['-i', bgm] for _ in range(n)], [])
    xf = ''.join(f"[{'a' if i else '0:a'}{i if i else ''}][{i + 1}:a]acrossfade=d=3[a{i + 1}];" for i in range(n - 1)).replace('[a0]', '[0:a]')
    run(*ins, '-filter_complex', f"{xf}[a{n - 1}]atrim=0:{L + 1:.2f},afade=t=in:d=1,afade=t=out:st={max(0, L - 5):.2f}:d=5,aresample=48000,loudnorm=I=-24:TP=-3[o]" if n > 1 else f"[0:a]atrim=0:{L + 1:.2f},afade=t=out:st={max(0, L - 5):.2f}:d=5,aresample=48000,loudnorm=I=-24:TP=-3[o]",
        '-map', '[o]', '-ac', '2', '/tmp/_lin_bgm.wav')
    tempo = f'atempo={sp},' if sp != 1 else ''
    fx = f"[2:a]{tempo}volume=-8dB[fx];" if sfx else ''
    mixn = 3 if sfx else 2
    run('-i', '/tmp/_lin_bgm.wav', '-i', vw, *(['-i', sfx] if sfx else []), '-filter_complex',
        f"[1:a]{tempo}asplit=2[v][key];[0:a][key]sidechaincompress=threshold=0.04:ratio=5:attack=30:release=400:makeup=1[bg];{fx}"
        f"[v][bg]{'[fx]' if sfx else ''}amix=inputs={mixn}:normalize=0:duration=first,alimiter=limit=0.89:level=false,loudnorm=I=-16:TP=-1.5:LRA=9[m]",
        '-map', '[m]', '-ar', '48000', out)
    print('mix', out, round(dur(out), 2), 's')
    if opt('--video') and opt('--final'):
        if sp != 1:
            run('-i', opt('--video'), '-i', out, '-filter_complex', f'[0:v]setpts=PTS/{sp},fps=30[v]', '-map', '[v]', '-map', '1:a', '-c:v', 'libx264', '-crf', '18', '-preset', 'medium', '-c:a', 'aac', '-b:a', '256k', '-shortest', '-movflags', '+faststart', opt('--final'))
        else:
            run('-i', opt('--video'), '-i', out, '-map', '0:v', '-map', '1:a', '-c:v', 'copy', '-c:a', 'aac', '-b:a', '256k', '-shortest', '-movflags', '+faststart', opt('--final'))
        print('成片', opt('--final'), round(dur(opt('--final')), 2), 's')
    
  • skills/digital-human-koubo/scripts/lin_scenes.py3.3 KBf787cbc3256bupstream ↗
    #!/usr/bin/env python3
    """小林式剪辑:把人写的分镜 plan.json 换成 Lin.tsx 用的 scenes.json(整片绝对秒)。
    用法:python3 lin_scenes.py plan.json --tl <工程>/src/tl.json --out <工程>/src/scenes.json
    plan.json = {"config": {...可选:face/audio/disclosure/brollTag/colors}, "scenes": [{"type": ..., "a": "@s01", "b": "@s01:有人说", ...}, ...]}
    时间写法(任何字段、任何嵌套里以 @ 开头的字符串都会被换成秒):
      "@s07"          s07 这段开头
      "@s07:end"      s07 这段结尾
      "@s07:两千"     s07 里第一次出现「两千」那个字的时间(tl.json 逐字时间,按 script.json 的念法写,别写阿拉伯数字)
      "@s07:两千|-0.2" 再提前 0.2 秒(| 后面是偏移秒数)
    检查:相邻场景不衔接(>0.05 秒空隙)会报 GAP;broll 默认 circle-bl 小窗。
    --face:从 public/main.mp4 第 3 秒量主播脸中心,写进 config.face(换形象/机位后跑一次)。"""
    import json, sys, re
    from pathlib import Path
    a = sys.argv[1:]
    if not a: sys.exit(__doc__)
    opt = lambda k, d=None: a[a.index(k) + 1] if k in a else d
    plan = json.load(open(a[0])); tl = json.load(open(opt('--tl', 'src/tl.json'))); S = {s['id']: s for s in tl['segs']}
    
    def at(ref):
        m = re.match(r'^@(s\d+)(?::([^|]+))?(?:\|([-+]?\d*\.?\d+))?$', ref)
        if not m: raise SystemExit(f'看不懂的时间写法:{ref}')
        sid, trig, off = m.group(1), m.group(2), float(m.group(3) or 0)
        if sid not in S: raise SystemExit(f'{ref}:tl.json 里没有 {sid}')
        s = S[sid]
        if not trig: t = s['start']
        elif trig == 'end': t = s['end']
        else:
            i = s['text'].find(trig)
            if i < 0: raise SystemExit(f'{ref}:{sid} 的稿子里找不到「{trig}」(稿子:{s["text"]})')
            ch = {int(k): v for k, v in s['chars'].items()}; ks = [k for k in ch if k >= i]
            t = ch[min(ks)] if ks else s['start']
        return round(t + off, 3)
    
    def walk(x):
        if isinstance(x, str) and x.startswith('@'): return at(x)
        if isinstance(x, list): return [walk(v) for v in x]
        if isinstance(x, dict): return {k: walk(v) for k, v in x.items()}
        return x
    
    scenes = [walk(s) for s in plan['scenes']]
    for s in scenes:
        if s['type'] == 'broll': s.setdefault('pip', 'circle-bl')
    bad = 0
    for x, y in zip(scenes, scenes[1:]):
        if abs(x['b'] - y['a']) > 0.05: print(f"GAP {x['type']} 结束 {x['b']} → {y['type']} 开始 {y['a']}"); bad += 1
    cfg = plan.get('config', {})
    if '--face' in a:
        import subprocess, tempfile, os
        root = Path(opt('--out', 'src/scenes.json')).resolve().parent.parent
        sw = Path(__file__).with_name('face_center.swift')
        png = tempfile.mktemp(suffix='.png')
        subprocess.run(['ffmpeg', '-v', 'error', '-y', '-ss', '3', '-i', str(root / 'public/main.mp4'), '-frames:v', '1', '-vf', 'scale=1920:1080', png], check=True)
        out = subprocess.run(['swift', str(sw), png], capture_output=True, text=True).stdout.split()
        if len(out) == 2: cfg['face'] = [int(float(out[0])), int(float(out[1]))]; print('face', cfg['face'])
    out = {'total': tl['total'], 'config': cfg, 'scenes': scenes}
    json.dump(out, open(opt('--out', 'src/scenes.json'), 'w'), ensure_ascii=False, indent=0)
    print(f"{len(scenes)} 个场景 · 总长 {tl['total']} 秒 · {'有 ' + str(bad) + ' 处空隙' if bad else '首尾相接'}")
    
  • skills/digital-human-koubo/scripts/lin_sfx.py7.6 KBa3e80ce5f1f4upstream ↗
    #!/usr/bin/env python3
    """按 scenes.json 自动排音效(earshot 音效库),渲成一条 sfx_bus.wav。
    用法:python3 lin_sfx.py <工程>/src/scenes.json --out <工程>/audio [--kit kit.json]
    - 第一次跑会 earshot kit init --preset calm,并改两个角色:drop = cut_hit/punch(「碰」:景深字、大数字、算例结果),pop = ui_pop/soft(卡片、标签、条形图)
    - 规则:每次画面类型切换(主播 / B-roll / 题板)一声 whoosh.short;数字卡、标签 pop;清单打勾、推导行 tick;公式新项、利率卡 land;关键结论 bell
    - 档位:drop/bell +7 dB、pop/land +3 dB、whoosh −2 dB(2026-10 实测:不加的话「碰」只比人声+音乐高 5 dB,被埋)
    - 输出 sfx_bus.wav(48k 立体声,与成片同长)、sfx_cues.json、cues_earshot.json(给 earshot timeline --cues 复查)
    earshot(可选,EARSHOT_PY 指向它的 python,默认 ~/tools/earshot/.venv/bin/python);没装就用工程 public/sfx(make_assets.py 合成)或 --sfx-dir 指定的目录兜底。"""
    import json, os, subprocess, sys
    from pathlib import Path
    try:
        import numpy as np  # noqa
    except ImportError:   # 系统 python 没装 numpy 时,换 earshot 自带的 python 重跑
        _E = os.environ.get('EARSHOT_PY', os.path.expanduser('~/tools/earshot/.venv/bin/python'))
        if os.path.exists(_E) and sys.executable != _E: os.execv(_E, [_E] + sys.argv)
        raise
    a = sys.argv[1:]
    if not a: sys.exit(__doc__)
    opt = lambda k, d=None: a[a.index(k) + 1] if k in a else d
    SR = 48000
    P = json.load(open(a[0])); total = P['total']; S = P['scenes']
    out = Path(opt('--out', 'audio')); out.mkdir(parents=True, exist_ok=True)
    EPY = os.environ.get('EARSHOT_PY', os.path.expanduser('~/tools/earshot/.venv/bin/python'))
    kitj = Path(opt('--kit', out / 'kit.json'))
    cues = []
    def c(t, role, label): cues.append((round(float(t), 3), role, label))
    prev = None
    for s in S:
        a0, T = s['a'], s['type']; vis = 'host' if T == 'host' else ('broll' if T == 'broll' else 'board')
        if prev is not None and (vis != prev or vis == 'broll'): c(a0, 'whoosh.short', 'cut→' + T)
        prev = vis
        if T == 'host':
            d = s.get('depth')
            if d: c(d.get('at', a0), 'drop', '景深字')
            if s.get('lower'): c(a0 + 0.4, 'pop', 'lower')
            if s.get('lower2'): c(s['lower2']['at'], 'pop', 'lower2')
        elif T == 'broll':
            for i, _ in enumerate(s.get('float') or []): c(a0 + 0.2 + i * 0.3, 'pop', 'float')
            if s.get('card'): c(s['cardAt'], 'pop', 'card')
            if s.get('slam'): c(s['slamAt'], 'drop', 'slam')
            if s.get('banner'): c(s['bannerAt'], 'land', 'banner')
            for i, _ in enumerate(s.get('chips') or []): c(s['chipsAt'] + i * (1.3 if s.get('stagger') else 0.35), 'pop', 'chip')
            for i, t in enumerate(s.get('statAt') or []): c(t, 'drop' if i == 0 else 'land', 'stat')
            if s.get('doc'): c(s['docAt'], 'land.light', 'doc')
        elif T == 'board':
            if s.get('big'): c(a0 + 0.25, 'land', 'big')
            if s.get('choices'): c(a0 + 0.4, 'pop', 'A'); c(s['reveal'], 'pop', 'B')
            for t in s.get('itemsAt') or []: c(t, 'tick', 'item')
            for i, _ in enumerate(s.get('chips') or []): c(s['chipsAt'] + i * 0.45, 'pop', 'chip')
        elif T == 'rates':
            for t in s['cardsAt']: c(t, 'land', 'rate')
        elif T == 'curve': c(s['labelAt'], 'pop', 'label')
        elif T == 'fall':
            for t in s['stepsAt']: c(t, 'pop', 'step')
        elif T == 'assume': c(s['reveal'], 'land', 'box1'); c(s['reveal'] + 1.6, 'land', 'box2'); c(s['resultAt'], 'bell', 'result')
        elif T == 'formula':
            for t in s['linesAt']: c(t, 'tick', 'line')
        elif T == 'big': c(a0 + 0.2, 'land', 'top'); c(s['bottomAt'], 'drop', 'bottom')
        elif T == 'stickers':
            for it in s['items']:
                if it.get('at') is not None: c(it['at'], 'pop', 'sticker')
        elif T == 'bars':
            for t in s['barsAt']: c(t, 'pop', 'bar')
        elif T == 'formula2':
            seen = set()
            for tm in s['terms']:
                if tm['at'] not in seen: seen.add(tm['at']); c(tm['at'], 'land', 'term')
            if s.get('final'): c(a0 + 0.3, 'bell', 'final')
        elif T == 'calc':
            for t in s.get('rowAt') or []: c(t, 'tick', 'row')
            c(s['resAt'], 'drop', 'result'); c(s['resAt'] + 0.05, 'bell', 'result')
            if s.get('extra'): c(s['extraAt'], 'pop', 'extra')
    cues.sort()
    TRIM = {'drop': 7, 'bell': 7, 'pop': 3, 'land': 3, 'whoosh.short': -2}
    bus = np.zeros((int((total + 3) * SR), 2))
    def put(x, start):
        st = int(max(0, start) * SR); n = min(len(x), len(bus) - st)
        if n > 0: bus[st:st + n] += x[:n]
    def load(f):   # 任意音频 → 48k 立体声 float(只靠 ffmpeg + numpy)
        raw = subprocess.run(['ffmpeg', '-v', 'error', '-i', str(f), '-f', 'f32le', '-ac', '2', '-ar', str(SR), '-'], capture_output=True, check=True).stdout
        return np.frombuffer(raw, np.float32).reshape(-1, 2).astype(np.float64)
    if Path(EPY).exists():
        if not kitj.exists():
            subprocess.run([EPY, '-m', 'earshot', 'kit', 'init', '--preset', 'calm', '-o', str(kitj)], check=True)
            k = json.load(open(kitj))
            k['roles']['drop'] = {'sound': 'cut_hit/punch', 'takes': 3, 'align': 'onset', 'level_db': -4.0, 'note': '碰:景深字、大数字、算例结果'}
            k['roles']['pop'] = {'sound': 'ui_pop/soft', 'takes': 4, 'align': 'onset', 'level_db': -4.0, 'note': '卡片、标签、条形图'}
            k.get('off', {}).pop('drop', None); json.dump(k, open(kitj, 'w'), ensure_ascii=False, indent=1)
        subprocess.run([EPY, '-m', 'earshot', 'kit', 'render', str(kitj), '--out', str(out / 'kit')], check=True, capture_output=True)
        lock = json.load(open(out / 'kit' / 'kit.lock.json'))['roles']; idx = {}
        for t, role, _ in cues:
            r = lock[role]; takes = r['takes']; i = idx.get(role, 0); idx[role] = i + 1
            if role == 'bell': takes = [x for x in takes if x['file'] in ('bell_C6.wav', 'bell_E5.wav', 'bell_G5.wav')] or takes
            tk = takes[i % len(takes)]
            x = load(str(out / 'kit' / tk['file'])) * 10 ** ((float(r['level_db'] or 0) + TRIM.get(role, 0)) / 20)
            put(x, t + (r.get('offset_ms') or 0) / 1000 - tk[(r.get('align') or 'onset') + '_s'])
    else:
        # 没装 earshot:用工程 public/sfx(new_edit.sh 调 make_assets.py 合成的那套),再不行用 promo-video 的
        cands = [Path(opt('--sfx-dir')) if opt('--sfx-dir') else None, Path(a[0]).resolve().parent.parent / 'public' / 'sfx', Path.home() / '.claude/skills/promo-video/assets/sfx']
        F = next((d for d in cands if d and (d / 'pop.wav').exists()), None)
        if not F: raise SystemExit('没装 earshot,也找不到音效目录:用 --sfx-dir 指定(要有 pop.wav whoosh.wav impact.wav tap.wav click.wav ding.wav)')
        M = {'whoosh.short': ('whoosh.wav', -14), 'drop': ('impact.wav', -4), 'pop': ('pop.wav', -8), 'land': ('tap.wav', -6), 'land.light': ('tap.wav', -10), 'tick': ('click.wav', -10), 'bell': ('ding.wav', -8)}
        print(f'没找到 earshot,用 {F} 的音效兜底')
        load_any = load
        cache = {}
        for t, role, _ in cues:
            f, g = M[role]
            if f not in cache: cache[f] = load_any(F / f) if (F / f).exists() else load_any(F / 'pop.wav')
            put(cache[f] * 10 ** (g / 20), t)
    subprocess.run(['ffmpeg', '-v', 'error', '-y', '-f', 'f32le', '-ar', str(SR), '-ac', '2', '-i', '-', str(out / 'sfx_bus.wav')], input=bus.astype(np.float32).tobytes(), check=True)
    json.dump([{'t': t, 'role': r, 'label': l} for t, r, l in cues], open(out / 'sfx_cues.json', 'w'), ensure_ascii=False, indent=0)
    json.dump([{'t': t, 'label': f'{r}:{l}'} for t, r, l in cues], open(out / 'cues_earshot.json', 'w'), ensure_ascii=False)
    from collections import Counter
    print(len(cues), '个音效', dict(Counter(r for _, r, _ in cues)), '→', out / 'sfx_bus.wav')
    
  • skills/digital-human-koubo/scripts/lin_subs.py1.8 KBa61538bd0a56upstream ↗
    #!/usr/bin/env python3
    """tl.json → cues.json 底部字幕(按标点断句,一句一条)。
    用法:python3 lin_subs.py script.json --tl <工程>/src/tl.json --out <工程>/src/cues.json [--disp disp.txt]
    --disp:每段一行的「显示稿」,标点断句数要和 script.json 一致;用来把念法换成写法(「五百万」→「500万」「百分之八」→「8%」)。
    不给就直接用 script.json 的 t(段落里的 sub 映射也会套上)。"""
    import json, re, sys
    a = sys.argv[1:]
    if not a: sys.exit(__doc__)
    opt = lambda k, d=None: a[a.index(k) + 1] if k in a else d
    S = json.load(open(a[0])); tl = json.load(open(opt('--tl', 'src/tl.json')))
    D = [l.strip() for l in open(opt('--disp'))] if opt('--disp') else None
    D = [l for l in D if l] if D else None
    P = ',。?!:;'; subs = []
    for k, seg in enumerate(tl['segs']):
        t = seg['text']; disp = D[k] if D else t
        if not D:
            for x, y in (S[k].get('sub') or {}).items(): disp = disp.replace(x, y)
        ch = {int(i): v for i, v in seg['chars'].items()}
        at = lambda i: (ch[min([j for j in ch if j >= i])] if [j for j in ch if j >= i] else seg['end'])
        cl = [c for c in re.split(f'(?<=[{P}])', t) if c.strip()]; dl = [c for c in re.split(f'(?<=[{P}])', disp) if c.strip()]
        if len(cl) != len(dl): sys.exit(f"{seg['id']}:显示稿断句数 {len(dl)} ≠ 念稿 {len(cl)}\n  念:{t}\n  显:{disp}")
        pos, times = 0, []
        for c in cl: times.append(at(pos)); pos += len(c)
        for i, c in enumerate(dl):
            a0 = max(seg['start'], times[i] - 0.08); b0 = (times[i + 1] - 0.08) if i + 1 < len(times) else seg['end'] - 0.05
            subs.append({'a': round(a0, 2), 'b': round(b0, 2), 't': c.rstrip(',。:;')})
    json.dump({'subs': subs, 'total': tl['total']}, open(opt('--out', 'src/cues.json'), 'w'), ensure_ascii=False, indent=0)
    print(len(subs), '条字幕')
    
  • skills/digital-human-koubo/scripts/make_assets.py6.7 KB17e7fb98bf2fupstream ↗
    #!/usr/bin/env python3
    """Synthesize every sound effect the templates use, plus a placeholder background track — all generated
    from code, so there is no third-party copyright in this repo.
    程序合成模板用到的全部音效 + 一条占位配乐(纯代码生成,无第三方版权)。
    
    Usage / 用法:
      python3 scripts/make_assets.py                 # fill every template of this skill + the sibling finance-explainer skill
      python3 scripts/make_assets.py <project>/public # fill one project (new_edit.sh does this automatically)
    Replace music/bgm.mp3 with any track you have the rights to (e.g. Mixkit / YouTube Audio Library).
    想换更好的配乐:把有授权的曲子放到 public/music/bgm.mp3 覆盖即可。
    Requires: numpy, ffmpeg (for the mp3).
    """
    import subprocess, sys, wave
    from pathlib import Path
    import numpy as np
    
    SR = 48000
    rng = np.random.default_rng(42)
    t_ = lambda d: np.arange(int(SR * d)) / SR
    def env(n, a=0.002, r=0.1):
        x = np.arange(n) / SR
        return np.minimum(1, x / max(a, 1e-4)) * np.exp(-x / max(r, 1e-4))
    def lp(x, k):            # simple one-pole low-pass, k in (0,1]
        y = np.empty_like(x); acc = 0.0
        for i, v in enumerate(x): acc += k * (v - acc); y[i] = acc
        return y
    def bp_noise(d, lo, hi):  # band-limited noise via FFT mask
        n = int(SR * d); X = np.fft.rfft(rng.standard_normal(n)); f = np.fft.rfftfreq(n, 1 / SR)
        X[(f < lo) | (f > hi)] = 0; y = np.fft.irfft(X, n); return y / (np.abs(y).max() + 1e-9)
    def sweep_noise(d, f0, f1):
        n = int(SR * d); out = np.zeros(n); seg = 2048
        for i in range(0, n, seg):
            c = f0 + (f1 - f0) * i / n; out[i:i + seg] = bp_noise(seg / SR, c * 0.6, c * 1.6)[: len(out[i:i + seg])]
        return out
    def tone(f, d, shape="sine"):
        t = t_(d); ph = 2 * np.pi * np.cumsum(np.broadcast_to(f, t.shape)) / SR if np.ndim(f) else 2 * np.pi * f * t
        return np.sin(ph) if shape == "sine" else np.sign(np.sin(ph)) * 0.5
    def norm(x, peak=0.8): return x / (np.abs(x).max() + 1e-9) * peak
    def write_wav(p, x):
        x = np.clip(x, -1, 1); st = np.stack([x, x], 1); d = (st * 32767).astype("<i2")
        with wave.open(str(p), "wb") as w: w.setnchannels(2); w.setsampwidth(2); w.setframerate(SR); w.writeframes(d.tobytes())
    
    def sfx():
        S = {}
        n = lambda d: int(SR * d)
        S["click"] = norm(bp_noise(0.04, 2000, 9000) * env(n(0.04), 0.0005, 0.008), 0.7)
        S["tap"] = norm(tone(1800, 0.06) * env(n(0.06), 0.001, 0.015) + 0.3 * bp_noise(0.06, 3000, 8000) * env(n(0.06), 0.0005, 0.006), 0.6)
        S["pop"] = norm(tone(np.linspace(900, 420, n(0.12)), 0.12) * env(n(0.12), 0.002, 0.04), 0.75)
        S["ding"] = norm(sum(a * tone(f, 1.2) for f, a in [(1318.5, 1), (2637, 0.35), (3951, 0.15)]) * env(n(1.2), 0.002, 0.35), 0.6)
        S["done"] = norm(np.concatenate([tone(880, 0.16) * env(n(0.16), 0.003, 0.08), tone(1318.5, 0.6) * env(n(0.6), 0.003, 0.25)]), 0.6)
        S["whoosh"] = norm(sweep_noise(0.55, 300, 4000) * np.hanning(n(0.55)), 0.6)
        for k, (a, b, d) in enumerate([(500, 5000, 0.3), (800, 6000, 0.25), (400, 3500, 0.35)], 1):
            S[f"swish-{k}"] = norm(sweep_noise(d, a, b) * np.hanning(n(d)) ** 1.5, 0.55)
        thump = lambda f0, d: tone(np.linspace(f0, 40, n(d)), d) * env(n(d), 0.001, d / 4)
        S["impact"] = norm(thump(120, 0.7) + 0.35 * bp_noise(0.7, 100, 2500) * env(n(0.7), 0.001, 0.06), 0.9)
        for k, f0 in enumerate([140, 110, 90], 1):
            S[f"slam-{k}"] = norm(thump(f0, 0.5) + 0.5 * bp_noise(0.5, 200, 5000) * env(n(0.5), 0.0005, 0.04), 0.9)
        S["cut"] = norm(bp_noise(0.08, 1500, 12000) * env(n(0.08), 0.0003, 0.012) + 0.4 * thump(200, 0.08), 0.7)
        for k in range(1, 9):
            f = 2500 + 300 * k; d = 0.05
            S[f"key-{k}"] = norm(bp_noise(d, f * 0.7, f * 1.6) * env(n(d), 0.0004, 0.006 + 0.001 * k) + 0.2 * thump(300, d), 0.5)
        S["key-space"] = norm(bp_noise(0.08, 800, 4000) * env(n(0.08), 0.0005, 0.012) + 0.3 * thump(180, 0.08), 0.55)
        for k in range(1, 4):
            S[f"page-{k}"] = norm(sweep_noise(0.35, 1500 + 400 * k, 6000) * np.hanning(n(0.35)) ** 0.7 * (0.6 + 0.4 * rng.random(n(0.35))), 0.5)
        for k in range(1, 3):
            S[f"paper-place-{k}"] = norm(bp_noise(0.18, 300, 3000) * env(n(0.18), 0.002, 0.04 + 0.01 * k) + 0.3 * thump(160, 0.18), 0.6)
        S["processing"] = norm(np.concatenate([tone(f, 0.07) * env(n(0.07), 0.002, 0.02) for f in [880, 1046, 1174, 1318, 1046, 1568, 1318, 1760] * 2]), 0.4)
        S["riser"] = norm(sweep_noise(1.6, 200, 7000) * np.linspace(0, 1, n(1.6)) ** 2 + 0.3 * tone(np.linspace(200, 900, n(1.6)), 1.6) * np.linspace(0, 1, n(1.6)), 0.6)
        return S
    
    def bgm(seconds=95, bpm=112):
        """Upbeat four-on-the-floor loop: kick, offbeat hat, clap, bass, chords (I–V–vi–IV in C)."""
        beat = 60 / bpm; n = int(SR * seconds); mix = np.zeros(n)
        def add(x, at):
            i = int(at * SR); j = min(n, i + len(x))
            if i < n: mix[i:j] += x[: j - i]
        kick = tone(np.linspace(110, 45, int(SR * 0.25)), 0.25) * env(int(SR * 0.25), 0.001, 0.09)
        hat = bp_noise(0.05, 7000, 14000) * env(int(SR * 0.05), 0.0005, 0.012)
        clap = bp_noise(0.18, 900, 4500) * env(int(SR * 0.18), 0.001, 0.05)
        chords = [[261.6, 329.6, 392.0], [196.0, 246.9, 293.7], [220.0, 261.6, 329.6], [174.6, 220.0, 261.6]]
        roots = [65.4, 49.0, 55.0, 43.7]
        k = 0; t = 0.0
        while t < seconds:
            bar = (k // 4) % 4
            add(0.9 * kick, t); add(0.25 * hat, t + beat / 2)
            if k % 2 == 1: add(0.35 * clap, t)
            bass = tone(roots[bar] * 2, beat * 0.9) * env(int(SR * beat * 0.9), 0.005, beat * 0.5)
            add(0.35 * bass, t + beat / 2)
            if k % 4 == 0:
                d = beat * 4; pad = sum(tone(f, d) + 0.5 * tone(f * 2.003, d) for f in chords[bar]) * env(int(SR * d), 0.08, d * 0.8)
                add(0.08 * pad, t)
            k += 1; t += beat
        fade = np.ones(n); fl = int(SR * 2); fade[:fl] = np.linspace(0, 1, fl); fade[-fl:] = np.linspace(1, 0, fl)
        return norm(lp(mix, 0.6) * fade, 0.7)
    
    def fill(pub: Path, S, music_wav: Path):
        (pub / "sfx").mkdir(parents=True, exist_ok=True); (pub / "music").mkdir(parents=True, exist_ok=True)
        for name, x in S.items(): write_wav(pub / "sfx" / f"{name}.wav", x)
        mp3 = pub / "music" / "bgm.mp3"
        if not mp3.exists():
            subprocess.run(["ffmpeg", "-loglevel", "error", "-y", "-i", str(music_wav), "-b:a", "192k", str(mp3)], check=True)
        print(f"✓ {pub}  ({len(S)} sfx{' + placeholder bgm.mp3' if mp3.exists() else ''})")
    
    if __name__ == "__main__":
        skill = Path(__file__).resolve().parent.parent
        S = sfx()
        tmp = Path("/tmp/_dh_bgm.wav"); write_wav(tmp, bgm())
        targets = [Path(a) for a in sys.argv[1:]] or [p.parent for p in list(skill.glob("templates/**/package.json")) + list((skill.parent / "finance-explainer").glob("templates/**/package.json")) if "node_modules" not in p.parts]
        for tdir in targets:
            fill(tdir if tdir.name == "public" else tdir / "public", S, tmp)
        tmp.unlink(missing_ok=True)
    
  • skills/digital-human-koubo/scripts/make_cover.py9.8 KBb930f45f6f34upstream ↗
    #!/usr/bin/env python3
    """数字人口播封面:cover.json → cover_16x9.jpg / cover_9x16.jpg / cover_3x4.jpg(HTML 排版 + Playwright 截图)。
    用法:
      python3 make_cover.py cover.json                 # 按 ratios 出图,写到 cover.json 同目录的 cover/ 下
      python3 make_cover.py cover.json --candidates    # 先从主播视频里抽 12 帧拼成候选图 cover/candidates.jpg,挑一帧填 host.t
    cover.json 字段(见 references/cover.md):
      ratios ["16:9","3:4"] · theme paper|dark · accent_color · kicker · title · accent · sub · tags[≤3] · url
      host {"video": "…/host.mp4", "t": 3.2} 或 {"image": "…jpg"} · props [{"image": "…png", "crop": [x0,y0,x1,y1]}](≤2 张斜放的证据卡)
      disclosure(默认「内容由 AI 数字人演绎」)
    路径都相对 cover.json 所在目录。"""
    import base64, html, json, os, subprocess, sys, tempfile
    from pathlib import Path
    
    SIZES = {"16:9": (1920, 1080), "9:16": (1080, 1920), "3:4": (1080, 1440)}
    HEADLESS = sorted(Path.home().glob("Library/Caches/ms-playwright/chromium_headless_shell-*/chrome-headless-shell-mac-arm64/chrome-headless-shell"))
    
    
    def frame(video, t, out):
        subprocess.run(["ffmpeg", "-v", "error", "-y", "-ss", str(t), "-i", str(video), "-frames:v", "1", str(out)], check=True)
    
    
    def data_uri(path, crop=None):
        from PIL import Image
        im = Image.open(path).convert("RGB")
        if crop: im = im.crop(tuple(crop))
        tmp = Path(tempfile.mkdtemp()) / "x.jpg"; im.save(tmp, quality=92)
        return "data:image/jpeg;base64," + base64.b64encode(tmp.read_bytes()).decode()
    
    
    def candidates(spec, root, outdir):
        from PIL import Image, ImageDraw
        v = root / spec["host"]["video"]
        dur = float(subprocess.run(["ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "csv=p=0", str(v)], capture_output=True, text=True).stdout)
        ts = [round(dur * (i + 0.5) / 12, 2) for i in range(12)]
        tiles = []
        for t in ts:
            p = outdir / f"_c_{t}.jpg"; frame(v, t, p)
            im = Image.open(p); im.thumbnail((300, 540)); tiles.append((t, im)); p.unlink()
        W, H = tiles[0][1].size
        sheet = Image.new("RGB", (6 * (W + 8), 2 * (H + 8)), "white")
        for i, (t, im) in enumerate(tiles):
            x, y = (i % 6) * (W + 8), (i // 6) * (H + 8); sheet.paste(im, (x, y))
            ImageDraw.Draw(sheet).text((x + 6, y + 6), f"t={t}", fill=(255, 0, 0))
        sheet.save(outdir / "candidates.jpg"); print("候选帧 →", outdir / "candidates.jpg", "(挑笑着、眼睛睁开、手势自然的一帧,写进 host.t)")
    
    
    CSS = """
    *{margin:0;padding:0;box-sizing:border-box}
    body{width:%(W)dpx;height:%(H)dpx;overflow:hidden;font-family:"PingFang SC","Hiragino Sans GB",sans-serif;background:%(bg)s;color:%(ink)s;position:relative}
    .dots{position:absolute;inset:0;background-image:radial-gradient(%(dot)s 2px,transparent 2px);background-size:30px 30px}
    .kicker{font-size:%(k)dpx;font-weight:700;color:%(mute)s;letter-spacing:3px;white-space:nowrap}
    .title{font-weight:900;line-height:1.08;white-space:nowrap;letter-spacing:2px}
    .accent{color:%(acc)s}
    .sub{font-weight:800;white-space:nowrap}
    .tags{display:flex;gap:18px;flex-wrap:nowrap}
    .tag{font-weight:800;color:#fff;background:%(ink)s;border-radius:16px;padding:10px 24px;white-space:nowrap}
    .url{font-family:"SF Mono",Menlo,monospace;font-weight:600;color:%(mute)s;white-space:nowrap}
    .host{position:absolute;overflow:hidden;border-radius:36px;box-shadow:0 40px 90px rgba(15,20,25,.28);background:#cfd0d3}
    .host img{width:100%%;height:100%%;object-fit:cover;object-position:50%% 20%%;display:block}
    .prop{position:absolute;border-radius:22px;overflow:hidden;border:8px solid #fff;box-shadow:0 30px 70px rgba(15,20,25,.3);background:#fff}
    .prop img{width:100%%;display:block}
    .disc{position:absolute;right:28px;bottom:16px;font-size:22px;color:%(mute)s}
    """
    
    FIT = """
    for (const el of document.querySelectorAll('[data-max]')) {
      const max = +el.dataset.max; let fs = parseFloat(getComputedStyle(el).fontSize);
      while (el.scrollWidth > max && fs > 20) { fs -= 2; el.style.fontSize = fs + 'px'; }
    }
    """
    
    
    def page(spec, ratio, host_uri, props):
        W, H = SIZES[ratio]
        dark = spec.get("theme") == "dark"
        pal = dict(W=W, H=H, bg="#0f1419" if dark else "radial-gradient(ellipse at 30% 20%,#fdfdfd 0%,#f4f5f6 50%,#e6e8eb 100%)",
                   ink="#ffffff" if dark else "#0f1419", mute="#8b98a5" if dark else "#536471",
                   dot="rgba(255,255,255,.06)" if dark else "rgba(15,20,25,.08)", acc=spec.get("accent_color", "#f4212e"), k=34)
        e = lambda s: html.escape(s or "")
        tags = "".join(f'<div class="tag" style="font-size:{40 if ratio != "9:16" else 44}px">{e(x)}</div>' for x in spec.get("tags", [])[:3])
        disc = e(spec.get("disclosure", "内容由 AI 数字人演绎"))
        if ratio == "16:9":
            tx, tw = 110, 880
            text = f"""<div style="position:absolute;left:{tx}px;top:190px;width:{tw}px;display:flex;flex-direction:column;gap:30px">
              <div class="kicker" data-max="{tw}">{e(spec.get('kicker'))}</div>
              <div class="title" style="font-size:132px" data-max="{tw}">{e(spec['title'])}</div>
              <div class="title accent" style="font-size:168px;margin-top:-6px" data-max="{tw}">{e(spec.get('accent'))}</div>
              <div class="sub" style="font-size:48px;margin-top:6px" data-max="{tw + 40}">{e(spec.get('sub'))}</div>
              <div class="tags" style="margin-top:8px">{tags}</div>
              <div class="url" style="font-size:40px;margin-top:14px" data-max="{tw}">{e(spec.get('url'))}</div></div>"""
            hostbox = (1300, 50, 540, 980)
            propbox = [(1010, 560, 520, -6), (1000, 150, 500, 5)]
        elif ratio == "3:4":
            tw = 960
            text = f"""<div style="position:absolute;left:60px;top:70px;width:{tw}px;display:flex;flex-direction:column;gap:18px">
              <div class="kicker" data-max="{tw}">{e(spec.get('kicker'))}</div>
              <div class="title" style="font-size:118px" data-max="{tw}">{e(spec['title'])}</div>
              <div class="title accent" style="font-size:140px" data-max="{tw}">{e(spec.get('accent'))}</div>
              <div class="sub" style="font-size:44px" data-max="{tw}">{e(spec.get('sub'))}</div></div>
              <div style="position:absolute;left:60px;bottom:120px;display:flex;flex-direction:column;gap:22px;width:560px">
              <div class="tags" style="flex-wrap:wrap">{tags}</div><div class="url" style="font-size:30px" data-max="560">{e(spec.get('url'))}</div></div>"""
            hostbox = (640, 560, 400, 820)
            propbox = [(80, 640, 560, -5)]
        else:  # 9:16:主播铺满,下方暗渐变压大字
            tw = 960
            text = f"""<div style="position:absolute;inset:0;background:linear-gradient(180deg,rgba(15,20,25,0) 38%,rgba(15,20,25,.82) 66%,rgba(15,20,25,.95) 100%)"></div>
              <div style="position:absolute;left:60px;bottom:150px;width:{tw}px;display:flex;flex-direction:column;gap:22px;color:#fff">
              <div class="kicker" style="color:#c9d1d9" data-max="{tw}">{e(spec.get('kicker'))}</div>
              <div class="title" style="font-size:124px" data-max="{tw}">{e(spec['title'])}</div>
              <div class="title" style="font-size:140px;color:#ffd400" data-max="{tw}">{e(spec.get('accent'))}</div>
              <div class="sub" style="font-size:46px" data-max="{tw}">{e(spec.get('sub'))}</div>
              <div class="tags">{tags.replace('class="tag"', 'class="tag" style="background:#fff;color:#0f1419;font-size:40px"')}</div></div>"""
            hostbox = (0, 0, W, H)
            propbox = [(600, 420, 440, 6)]
        hx, hy, hw, hh = hostbox
        hstyle = f"left:{hx}px;top:{hy}px;width:{hw}px;height:{hh}px" + (";border-radius:0;box-shadow:none" if ratio == "9:16" else "")
        ptags = "".join(f'<div class="prop" style="left:{x}px;top:{y}px;width:{w}px;transform:rotate({r}deg)"><img src="{u}"></div>'
                        for (x, y, w, r), u in zip(propbox, props))
        behind = ratio != "9:16"   # 横版 / 3:4:证据卡压在主播卡后面;竖版:卡片浮在主播上
        body = (ptags + f'<div class="host" style="{hstyle}"><img src="{host_uri}"></div>' if behind else f'<div class="host" style="{hstyle}"><img src="{host_uri}"></div>' + ptags)
        return f"""<!doctype html><html><head><meta charset="utf-8"><style>{CSS % pal}</style></head><body>
          {'' if ratio == '9:16' else '<div class="dots"></div>'}{body}{text}<div class="disc" style="{'color:#c9d1d9' if ratio == '9:16' else ''}">{disc}</div>
          <script>{FIT}</script></body></html>"""
    
    
    def main():
        a = sys.argv[1:]
        if not a: sys.exit(__doc__)
        spec_path = Path(a[0]).resolve(); root = spec_path.parent
        spec = json.loads(spec_path.read_text())
        outdir = root / spec.get("out_dir", "cover"); outdir.mkdir(exist_ok=True)
        if "--candidates" in a:
            return candidates(spec, root, outdir)
        h = spec["host"]
        if "image" in h: host_uri = data_uri(root / h["image"])
        else:
            p = outdir / "host_frame.png"; frame(root / h["video"], h.get("t", 1.0), p); host_uri = data_uri(p)
        props = [data_uri(root / p["image"], p.get("crop")) for p in spec.get("props", [])[:2]]
        from playwright.sync_api import sync_playwright
        with sync_playwright() as pw:
            kw = {"executable_path": str(HEADLESS[-1])} if HEADLESS else {}
            br = pw.chromium.launch(**kw)
            for ratio in spec.get("ratios", ["16:9"]):
                W, H = SIZES[ratio]
                pg = br.new_page(viewport={"width": W, "height": H}, device_scale_factor=1)
                pg.set_content(page(spec, ratio, host_uri, props)); pg.wait_for_timeout(300)
                out = outdir / f"cover_{ratio.replace(':', 'x')}.jpg"
                pg.screenshot(path=str(out), type="jpeg", quality=93); pg.close()
                from PIL import Image
                th = Image.open(out); th.thumbnail((540, 960)); th.save(outdir / f"thumb_{ratio.replace(':', 'x')}.jpg")
                print("封面 →", out, "(缩略图 thumb_*.jpg:540 宽时标题还要读得清)")
            br.close()
    
    
    if __name__ == "__main__":
        main()
    
  • skills/digital-human-koubo/scripts/misread_check.py3.9 KBb6eb199ff23fupstream ↗
    #!/usr/bin/env python3
    """查数字人念错字:每段按停顿切成短句,**只带「普通话、简体」这句中性提示(不带原文)**逐句转写,和稿子逐字比。
    用法:python3 misread_check.py script.json [--ids s10,s11] [--cut cut] [--out cut/misread.json]
    为什么不用 assemble.py 的转写:whisper 带了原文 --prompt 会把念错的字「纠正」回去(2026-10 实测:「通胀」念成 tōng zhèng,带原文转写全对,不带才露出「通证」)。
    输出每段:稿子 / 听到的短句 / 可疑字(稿子里的汉字没被听到的,数字和英文字母忽略)。可疑 ≠ 一定念错(同音字、方言腔会误报),用户要听;确认要修的写进 patch.json 给 patch_words.py。"""
    import json, os, re, subprocess, sys, difflib
    a = sys.argv[1:]
    if not a: sys.exit(__doc__)
    opt = lambda k, d=None: a[a.index(k) + 1] if k in a else d
    S = json.load(open(a[0])); cut = opt('--cut', 'cut'); ids = set(opt('--ids').split(',')) if opt('--ids') else None
    WM = os.environ.get('WHISPER_MODEL') or next((p for p in map(os.path.expanduser, ['~/Library/Application Support/Murmur/models/ggml-medium-q5_0.bin', '~/models/ggml-medium-q5_0.bin', '~/.cache/whisper/ggml-medium-q5_0.bin']) if os.path.exists(p)), None)
    T2S = str.maketrans('們說這個裡麼開銷費國來長還沒錢會時後們對嗎讓過買兩萬億號歲學實際資產聽們讀變賺樂頭點為發見體條經義遠業應與夠單從當進現產間關門問題風險銀行條證寶貝數據統計報告億幾萬塊元萬', '们说这个里么开销费国来长还没钱会时后们对吗让过买两万亿号岁学实际资产听们读变赚乐头点为发见体条经义远业应与够单从当进现产间关门问题风险银行条证宝贝数据统计报告亿几万块元万')
    HAN = re.compile('[^' + chr(0x4e00) + '-' + chr(0x9fff) + ']')
    NUMC = '零〇一二三四五六七八九十百千万亿点两'
    han = lambda s: HAN.sub('', s.translate(T2S).replace('百分之', ''))
    hanx = lambda s: ''.join(ch for ch in han(s) if ch not in NUMC)   # 数字两边写法不同(五百万 / 500万),比对时去掉
    rep = []
    for s in S:
        sid = s['id']
        if ids and sid not in ids: continue
        src = f'{cut}/{sid}.mp4'; wav = f'/tmp/_mr_{sid}.wav'
        subprocess.run(['ffmpeg', '-v', 'error', '-y', '-i', src, '-ar', '16000', '-ac', '1', wav], check=True)
        o = subprocess.run(['ffmpeg', '-i', wav, '-af', 'silencedetect=n=-32dB:d=0.18', '-f', 'null', '-'], capture_output=True, text=True).stderr
        st = [float(x) for x in re.findall(r'silence_start: ([\d.]+)', o)]; en = [float(x) for x in re.findall(r'silence_end: ([\d.]+)', o)]
        dur = float(subprocess.run(['ffprobe', '-v', 'error', '-show_entries', 'format=duration', '-of', 'csv=p=0', wav], capture_output=True, text=True).stdout)
        cuts = [0.0] + [(x + y) / 2 for x, y in zip(st, en) if x > 0.2 and y < dur - 0.1] + [dur]
        heard = []
        for x, y in zip(cuts, cuts[1:]):
            if y - x < 0.4: continue
            subprocess.run(['ffmpeg', '-v', 'error', '-y', '-ss', f'{x:.2f}', '-to', f'{y:.2f}', '-i', wav, '/tmp/_mr_w.wav'])
            r = subprocess.run(['whisper-cli', '-m', WM, '-l', 'zh', '--prompt', '以下是普通话,用简体中文。', '-nt', '-f', '/tmp/_mr_w.wav'], capture_output=True, text=True).stdout.strip().replace('\n', '')
            heard.append({'t': [round(x, 2), round(y, 2)], 'heard': r})
        A, B = hanx(s['t']), hanx(''.join(h['heard'] for h in heard))
        miss = []
        for op, i1, i2, j1, j2 in difflib.SequenceMatcher(None, A, B, autojunk=False).get_opcodes():
            if op in ('replace', 'delete'): miss.append(f"{A[i1:i2]}→{B[j1:j2] or '∅'}")
        rep.append({'id': sid, 'text': s['t'], 'clauses': heard, 'suspect': miss})
        print(f"{'⚠' if miss else ' '} {sid} {' '.join(miss)}\n     " + ' '.join(f"[{h['t'][0]}-{h['t'][1]}]{h['heard']}" for h in heard))
    json.dump(rep, open(opt('--out', f'{cut}/misread.json'), 'w'), ensure_ascii=False, indent=1)
    
  • skills/digital-human-koubo/scripts/new_edit.sh3.5 KBca47d0448f95upstream ↗
    #!/bin/bash
    # 起一个剪辑工程:bash new_edit.sh <模板> <工程目录>
    #   模板:huazi-916(B 网红花字口播,数据驱动)
    #         reference/launch-169 · reference/tutorial-169 · reference/multihost-169(C / D / E 参考实现,按段重写 Scene)
    #   A 小林式解说用 finance-explainer:bash ~/.claude/skills/finance-explainer/scripts/setup_engine.sh <工程目录>
    set -e
    TPL="$1"; DST="$2"
    [ -z "$TPL" ] || [ -z "$DST" ] && { echo "用法:bash new_edit.sh huazi-916 <工程目录>"; exit 1; }
    SRC="$(cd "$(dirname "$0")/.." && pwd)/templates/$TPL"
    [ -d "$SRC" ] || { echo "没有模板 $TPL(可用:huazi-916、reference/launch-169、reference/tutorial-169、reference/multihost-169)"; exit 1; }
    [ -e "$DST/src" ] && { echo "$DST 里已经有 src/,不覆盖"; exit 1; }
    mkdir -p "$DST" && cp -R "$SRC/." "$DST/"
    # 参考实现不带素材:音效和配乐从花字模板拿
    if [ ! -f "$DST/public/sfx/pop.wav" ]; then mkdir -p "$DST/public" && (cp -R "$(dirname "$SRC")/../huazi-916/public/sfx" "$(dirname "$SRC")/../huazi-916/public/music" "$DST/public/" 2>/dev/null || cp -R "$(dirname "$SRC")/huazi-916/public/sfx" "$(dirname "$SRC")/huazi-916/public/music" "$DST/public/" 2>/dev/null || true); fi
    # node_modules:npm 源常 SSL 失败,优先从本机已有的 Remotion 4.0.408 工程克隆(APFS 克隆不占空间)
    for c in ${DH_NODE_MODULES_FROM:-} ~/Desktop/packaging-lab ~/Desktop/renoise-koubo/edit ~/Desktop/renoise-academy-ep3/film; do   # 本机已有 Remotion 工程就克隆它的 node_modules(可用 DH_NODE_MODULES_FROM 指定),否则 npm install
      if [ -d "$c/node_modules/remotion" ] && [ -d "$c/node_modules/lottie-web" ] && [ -d "$c/node_modules/d3-geo" ]; then cp -cR "$c/node_modules" "$DST/" 2>/dev/null || cp -R "$c/node_modules" "$DST/"; echo "node_modules ← $c"; break; fi
    done
    [ -d "$DST/node_modules" ] || (cd "$DST" && npm install)
    # 音效 / 占位配乐:仓库里不带第三方音频,缺了就用代码合成一套(无版权)
    if [ ! -f "$DST/public/sfx/pop.wav" ] || [ ! -f "$DST/public/music/bgm.mp3" ]; then
      PY=""; for p in python3 python3.14 python3.13 python3.12 python3.11 python; do command -v $p >/dev/null 2>&1 && $p -c "import numpy" 2>/dev/null && PY=$p && break; done
      [ -n "$PY" ] && "$PY" "$(dirname "$0")/make_assets.py" "$DST/public" || echo "⚠ 没找到装了 numpy 的 Python,音效没生成:python3 -m pip install numpy 后跑 python3 $(dirname "$0")/make_assets.py $DST/public"
    fi
    ROOT="$(cd "$(dirname "$0")/.." && pwd)"
    if [ "$TPL" = "lin-169" ]; then
      echo "✓ $DST 已就绪(小林式)。放入 public/main.mp4(cut/joined.mp4)、public/broll/、public/stickers/、public/cut/*.webm;然后:"
      echo "  python3 $ROOT/scripts/lin_subs.py script.json --tl $DST/src/tl.json --out $DST/src/cues.json --disp disp.txt"
      echo "  python3 $ROOT/scripts/lin_scenes.py plan.json --tl $DST/src/tl.json --out $DST/src/scenes.json --face   (plan 写法见 $DST/plan.example.json)"
      echo "  python3 $ROOT/scripts/lin_sfx.py $DST/src/scenes.json --out audio && python3 $ROOT/scripts/lin_mix.py --voice cut/joined.mov --bgm 曲子 --sfx audio/sfx_bus.wav --out $DST/public/mix.wav"
    elif [ "$TPL" = "huazi-916" ]; then
      echo "✓ $DST 已就绪。放入 public/main.mp4、public/voice.wav、src/tl.json,改 src/edit.json,然后:"
      echo "  python3 $ROOT/scripts/check_edit.py $DST/src"
    else
      echo "✓ $DST 已就绪(参考实现)。换 src 里的时间轴,按本期稿子重写 Scene;素材路径看代码里的 staticFile(…)"
    fi
    
  • skills/digital-human-koubo/scripts/patch_words.py6.8 KBb8b1c374ffa3upstream ↗
    #!/usr/bin/env python3
    """只替换念错的短句,保住口型(不整片换音色)。
    用法:python3 patch_words.py script.json patch.json [--cut cut] [--ref s24,s41,s05]
    patch.json = [{"id": "s11", "g": [2.1, 5.4], "m": [2.0, 5.3]}, ...]
      g = 原片里要换掉的那几句(秒,粗略即可,会吸附到最近的停顿);m = 克隆音整句里对应的那几句(先不填,跑一次 --synth-only 再看时间)
    步骤:
      1. --synth-only:用 --ref 指定的 2–3 段干净原声(合计 ≥15 秒)当参照,MiMo voiceclone 把要修的段整句重配到 cut/revoice/<id>.wav,并打印逐字时间
      2. 填好 m 再跑:克隆句 atempo 拉到和原句一样长(0.85–1.15 之外会警告:句子差太多,口型会飘)→ 响度对齐 → 25 ms 交叉淡化贴回 → 写回 cut/<id>.mp4(画面不动、长度不变)→ 不带提示转写复核
      3. 改完跑 assemble.py --rejoin 重新拼接(会做音画等长校验)
    切点选在停顿上:一句话中间切会有接缝;整句换比只换两个字自然(2026-10 实测:只换「城镇」两字转写成「承认」,换整句就对)。"""
    import json, os, re, subprocess, sys, base64
    from pathlib import Path
    import numpy as np
    from scipy.io import wavfile
    a = sys.argv[1:]
    if len(a) < 2: sys.exit(__doc__)
    opt = lambda k, d=None: a[a.index(k) + 1] if k in a else d
    S = {s['id']: s for s in json.load(open(a[0]))}; spec = json.load(open(a[1])); cut = Path(opt('--cut', 'cut')); SR = 48000
    rv = cut / 'revoice'; rv.mkdir(exist_ok=True)
    WM = os.environ.get('WHISPER_MODEL') or next((p for p in map(os.path.expanduser, ['~/Library/Application Support/Murmur/models/ggml-medium-q5_0.bin', '~/models/ggml-medium-q5_0.bin']) if os.path.exists(p)), None)
    def whisper(wav, ml=False):
        subprocess.run(['ffmpeg', '-v', 'error', '-y', '-i', wav, '-ar', '16000', '-ac', '1', '/tmp/_pw16.wav'])
        if ml:
            subprocess.run(['whisper-cli', '-m', WM, '-l', 'zh', '--prompt', '以下是普通话的句子。', '-ml', '1', '-oj', '-of', '/tmp/_pwml', '-f', '/tmp/_pw16.wav'], capture_output=True)
            return ' '.join(f"{t['text'].strip()}@{t['offsets']['from'] / 1000:.2f}" for t in json.load(open('/tmp/_pwml.json', errors='replace'))['transcription'] if t['text'].strip())
        return subprocess.run(['whisper-cli', '-m', WM, '-l', 'zh', '-nt', '-f', '/tmp/_pw16.wav'], capture_output=True, text=True).stdout.strip().replace('\n', '')
    if '--synth-only' in a or not all('m' in p for p in spec):
        for d in [Path(__file__).parent, Path(__file__).resolve().parents[2] / 'finance-explainer/scripts', Path.home() / '.claude/skills/finance-explainer/scripts', Path.home() / '.claude/skills/promo-video/scripts']:
            if (d / 'narrate_mimo.py').exists(): sys.path.insert(0, str(d)); break
        import narrate_mimo as N   # MiMo 调用(密钥读 MIMO_API_KEY 或 ~/.config/ai-teardown/mimo.env)
        key, base = N.env()
        refs = (opt('--ref') or '').split(',')
        if not refs[0]: sys.exit('要 --ref:2–3 段念得干净的原片段 id(合计 ≥15 秒)')
        ins = sum([['-i', str(cut / f'{r}.mp4')] for r in refs], [])
        subprocess.run(['ffmpeg', '-v', 'error', '-y', *ins, '-filter_complex', ''.join(f'[{i}:a]' for i in range(len(refs))) + f'concat=n={len(refs)}:v=0:a=1,aresample=24000', '-ac', '1', str(rv / 'ref.wav')], check=True)
        ref = 'data:audio/wav;base64,' + base64.b64encode((rv / 'ref.wav').read_bytes()).decode()
        for p in spec:
            out = rv / f"{p['id']}.wav"
            d = N.call(key, base, {'model': 'mimo-v2.5-tts-voiceclone', 'messages': [{'role': 'assistant', 'content': S[p['id']]['t']}], 'audio': {'format': 'wav', 'voice': ref}})
            out.with_suffix('.raw.wav').write_bytes(base64.b64decode(d['choices'][0]['message']['audio']['data']))
            subprocess.run(['ffmpeg', '-v', 'error', '-y', '-i', str(out.with_suffix('.raw.wav')), '-af', 'silenceremove=start_periods=1:start_threshold=-45dB:start_silence=0.03', '-ar', str(SR), '-ac', '1', str(out)], check=True)
            print(p['id'], '克隆整句:', whisper(str(out)), '\n   逐字:', whisper(str(out), True))
        sys.exit('填好 patch.json 里每条的 m(克隆音里对应句子的起止秒)再跑一次')
    def sil(f):
        o = subprocess.run(['ffmpeg', '-i', f, '-af', 'silencedetect=n=-34dB:d=0.05', '-f', 'null', '-'], capture_output=True, text=True).stderr
        return [(x + y) / 2 for x, y in zip([float(v) for v in re.findall(r'silence_start: ([\d.]+)', o)], [float(v) for v in re.findall(r'silence_end: ([\d.]+)', o)])]
    snap = lambda t, mids: min([m for m in mids if abs(m - t) <= 0.28], key=lambda m: abs(m - t), default=t)
    def L(f):
        sr, x = wavfile.read(f); x = x.astype(np.float64) / 32768.0; return x if x.ndim == 1 else x.mean(1)
    rms = lambda x: np.sqrt(np.mean(x ** 2) + 1e-12)
    by = {}
    for p in spec: by.setdefault(p['id'], []).append(p)
    for sid, ps in by.items():
        src = cut / f'{sid}.mp4'; bak = cut / f'{sid}.orig.mp4'
        if not bak.exists(): bak.write_bytes(src.read_bytes())
        subprocess.run(['ffmpeg', '-v', 'error', '-y', '-i', str(bak), '-ac', '1', '-ar', str(SR), '/tmp/_pw_g.wav'], check=True)
        subprocess.run(['ffmpeg', '-v', 'error', '-y', '-i', str(rv / f'{sid}.wav'), '-ac', '1', '-ar', str(SR), '/tmp/_pw_m.wav'], check=True)
        g = L('/tmp/_pw_g.wav'); y = g.copy(); m = L('/tmp/_pw_m.wav'); gm, mm = sil('/tmp/_pw_g.wav'), sil('/tmp/_pw_m.wav')
        for p in sorted(ps, key=lambda p: -p['g'][0]):
            ga, gb = snap(p['g'][0], gm), min(snap(p['g'][1], gm), len(g) / SR); ma, mb = snap(p['m'][0], mm), min(snap(p['m'][1], mm), len(m) / SR)
            tempo = (mb - ma) / (gb - ga)
            if not 0.85 <= tempo <= 1.15: print(f'⚠ {sid} 伸缩 {tempo:.2f}:克隆句和原句长度差太多,口型会飘,考虑换一次克隆或调切点')
            wavfile.write('/tmp/_pw_in.wav', SR, (m[int(ma * SR):int(mb * SR)] * 32767).astype(np.int16))
            subprocess.run(['ffmpeg', '-v', 'error', '-y', '-i', '/tmp/_pw_in.wav', '-af', f'atempo={tempo:.4f}', '-ar', str(SR), '/tmp/_pw_out.wav'], check=True)
            seg = L('/tmp/_pw_out.wav'); n = int((gb - ga) * SR); seg = np.pad(seg, (0, max(0, n - len(seg))))[:n]
            seg *= rms(g[int(ga * SR):int(gb * SR)]) / rms(seg)
            f = int(0.025 * SR); w = np.ones(n); w[:f] = np.linspace(0, 1, f); w[-f:] = np.linspace(1, 0, f)
            a0 = int(ga * SR); y[a0:a0 + n] = y[a0:a0 + n] * (1 - w) + seg * w
            print(f'{sid} 换 {ga:.2f}–{gb:.2f}s(克隆 {ma:.2f}–{mb:.2f},伸缩 {tempo:.3f})')
        wavfile.write('/tmp/_pw_fixed.wav', SR, (np.clip(y, -1, 1) * 32767).astype(np.int16))
        subprocess.run(['ffmpeg', '-v', 'error', '-y', '-i', str(bak), '-i', '/tmp/_pw_fixed.wav', '-map', '0:v', '-map', '1:a', '-c:v', 'copy', '-ac', '2', '-c:a', 'aac', '-b:a', '192k', '-shortest', str(src)], check=True)
        print(f'   复核(不带提示):{whisper("/tmp/_pw_fixed.wav")}')
    print('改完跑:python3 assemble.py script.json ids.json --rejoin')
    
  • skills/digital-human-koubo/scripts/personmask.swift4.2 KB19d8a6b9a422upstream ↗
    // personmask <W> <H> [person|subject|auto] — 逐帧主体分割
    //   stdin : BGRA 原始帧流(W×H×4 字节/帧,由 ffmpeg 解码喂入)
    //   stdout: 灰度 mask 原始字节流(R8, W×H 字节/帧),与输入帧一一对应
    //   person  : VNGeneratePersonSegmentationRequest,只认人
    //   subject : VNGenerateForegroundInstanceMaskRequest(系统「抠主体」同款),动物/物体/人都认
    //   auto    : 两者取并集(默认) — 人像边缘精细 + 动物/物体也不丢
    // 解码交给 ffmpeg:AVAssetReader 遇到 AV1(M1/M2 无硬解)会静默出 0 帧,
    // 遇到 VFR 又会和 ffmpeg 的帧序列错位 — 两条流用同一解码器就天然对齐。
    // 编译(whitemodel.py 首次运行会自动做): swiftc -O -swift-version 5 personmask.swift -o ../bin/personmask
    
    import Foundation
    import Vision
    import CoreImage
    import CoreVideo
    
    let args = CommandLine.arguments
    guard args.count >= 3, let W = Int(args[1]), let H = Int(args[2]), W > 0, H > 0 else {
        FileHandle.standardError.write("usage: personmask <W> <H> [person|subject|auto] < bgra\n".data(using: .utf8)!)
        exit(2)
    }
    let mode = args.count >= 4 ? args[3] : "auto"
    let usePerson = mode != "subject"
    let useSubject = mode != "person"
    
    let personReq = VNGeneratePersonSegmentationRequest()
    personReq.qualityLevel = .accurate   // 打斗等快速多人场景 balanced 会丢人
    personReq.outputPixelFormat = kCVPixelFormatType_OneComponent8
    let subjectReq = VNGenerateForegroundInstanceMaskRequest()
    
    let ctx = CIContext(options: [.workingColorSpace: NSNull()])
    let stdin = FileHandle.standardInput
    let stdout = FileHandle.standardOutput
    let frameBytes = W * H * 4
    var buf = [UInt8](repeating: 0, count: W * H)
    var tmp = [UInt8](repeating: 0, count: W * H)
    var frames = 0
    
    var pbOpt: CVPixelBuffer?
    CVPixelBufferCreate(nil, W, H, kCVPixelFormatType_32BGRA,
                        [kCVPixelBufferIOSurfacePropertiesKey: [:]] as CFDictionary, &pbOpt)
    guard let pb = pbOpt else {
        FileHandle.standardError.write("CVPixelBufferCreate failed\n".data(using: .utf8)!)
        exit(1)
    }
    
    func readFrame() -> Data? {
        var data = Data(capacity: frameBytes)
        while data.count < frameBytes {
            let chunk = stdin.readData(ofLength: frameBytes - data.count)
            if chunk.isEmpty { return nil }
            data.append(chunk)
        }
        return data
    }
    
    // 任意尺寸的单通道 mask → 缩放到帧尺寸写进 dst
    func renderMask(_ mask: CVPixelBuffer, into dst: inout [UInt8]) {
        let ci = CIImage(cvPixelBuffer: mask)
        let sx = CGFloat(W) / ci.extent.width
        let sy = CGFloat(H) / ci.extent.height
        let scaled = ci.transformed(by: CGAffineTransform(scaleX: sx, y: sy))
        ctx.render(scaled, toBitmap: &dst, rowBytes: W,
                   bounds: CGRect(x: 0, y: 0, width: W, height: H),
                   format: .R8, colorSpace: nil)
    }
    
    while let frame = readFrame() {
        // 原始 BGRA 逐行拷进 CVPixelBuffer(其行宽可能有对齐填充)
        CVPixelBufferLockBaseAddress(pb, [])
        let base = CVPixelBufferGetBaseAddress(pb)!
        let rowBytes = CVPixelBufferGetBytesPerRow(pb)
        frame.withUnsafeBytes { (src: UnsafeRawBufferPointer) in
            for y in 0..<H {
                memcpy(base + y * rowBytes, src.baseAddress! + y * W * 4, W * 4)
            }
        }
        CVPixelBufferUnlockBaseAddress(pb, [])
    
        for i in 0..<buf.count { buf[i] = 0 }
        let handler = VNImageRequestHandler(cvPixelBuffer: pb, options: [:])
        var reqs: [VNRequest] = []
        if usePerson { reqs.append(personReq) }
        if useSubject { reqs.append(subjectReq) }
        if (try? handler.perform(reqs)) != nil {
            if usePerson, let m = personReq.results?.first?.pixelBuffer {
                renderMask(m, into: &buf)
            }
            if useSubject, let obs = subjectReq.results?.first, !obs.allInstances.isEmpty,
               let m = try? obs.generateScaledMaskForImage(forInstances: obs.allInstances, from: handler) {
                // 前景 mask 是 OneComponent32Float,CI 渲染成 R8 后与人像取 max
                renderMask(m, into: &tmp)
                if usePerson {
                    for i in 0..<buf.count where tmp[i] > buf[i] { buf[i] = tmp[i] }
                } else {
                    swap(&buf, &tmp)
                }
            }
        }
        stdout.write(Data(bytes: buf, count: W * H))
        frames += 1
    }
    FileHandle.standardError.write("frames=\(frames)\n".data(using: .utf8)!)
    
  • skills/digital-human-koubo/scripts/rangedl.py1.7 KB6a08a2522beaupstream ↗
    """多连接分片下载:每个文件切 N 段并行,单段失败自动续传重试;全部完成后解码校验"""
    import subprocess, sys, os, concurrent.futures as cf
    N = 6
    def size(url):
        out = subprocess.run(['curl', '-sSI', '--http1.1', '--max-time', '30', url], capture_output=True, text=True).stdout
        for l in out.splitlines():
            if l.lower().startswith('content-length'): return int(l.split(':')[1])
        raise RuntimeError('no length')
    def part(url, path, a, b):
        for _ in range(30):
            have = os.path.getsize(path) if os.path.exists(path) else 0
            if have >= b - a + 1: return True
            r = subprocess.run(['curl', '-sS', '--http1.1', '--max-time', '60', '-r', f'{a + have}-{b}', url], capture_output=True)
            with open(path, 'ab') as f: f.write(r.stdout)
        return os.path.getsize(path) >= b - a + 1
    def fetch(tid, url):
        n = size(url); step = (n + N - 1) // N
        rngs = [(i * step, min(n - 1, (i + 1) * step - 1)) for i in range(N)]
        with cf.ThreadPoolExecutor(N) as ex:
            ok = list(ex.map(lambda ir: part(url, f'.p{tid}_{ir[0]}', *ir[1]), enumerate(rngs)))
        with open(f'renoise-{tid}', 'wb') as out:
            for i in range(N):
                p = f'.p{tid}_{i}'; out.write(open(p, 'rb').read()[: rngs[i][1] - rngs[i][0] + 1]); os.remove(p)
        bad = subprocess.run(['ffmpeg', '-v', 'error', '-i', f'renoise-{tid}', '-f', 'null', '-'], capture_output=True, text=True).stderr.strip()
        return tid, n, all(ok), 'OK' if not bad else 'BAD ' + bad[:60]
    jobs = [l.split() for l in open('urls.txt') if l.strip()]
    for j in jobs:
        for f in os.listdir('.'):
            if f.startswith(f'.p{j[0]}_'): os.remove(f)
    with cf.ThreadPoolExecutor(4) as ex:
        for r in ex.map(lambda j: fetch(*j), jobs): print(*r, flush=True)
    
  • skills/digital-human-koubo/scripts/rangedl_mp4.py1.7 KBdb6274c1fce8upstream ↗
    """多连接分片下载:每个文件切 N 段并行,单段失败自动续传重试;全部完成后解码校验"""
    import subprocess, sys, os, concurrent.futures as cf
    N = 6
    def size(url):
        out = subprocess.run(['curl', '-sSI', '--http1.1', '--max-time', '30', url], capture_output=True, text=True).stdout
        for l in out.splitlines():
            if l.lower().startswith('content-length'): return int(l.split(':')[1])
        raise RuntimeError('no length')
    def part(url, path, a, b):
        for _ in range(30):
            have = os.path.getsize(path) if os.path.exists(path) else 0
            if have >= b - a + 1: return True
            r = subprocess.run(['curl', '-sS', '--http1.1', '--max-time', '60', '-r', f'{a + have}-{b}', url], capture_output=True)
            with open(path, 'ab') as f: f.write(r.stdout)
        return os.path.getsize(path) >= b - a + 1
    def fetch(tid, url):
        n = size(url); step = (n + N - 1) // N
        rngs = [(i * step, min(n - 1, (i + 1) * step - 1)) for i in range(N)]
        with cf.ThreadPoolExecutor(N) as ex:
            ok = list(ex.map(lambda ir: part(url, f'.p{tid}_{ir[0]}', *ir[1]), enumerate(rngs)))
        with open(f'renoise-{tid}.mp4', 'wb') as out:
            for i in range(N):
                p = f'.p{tid}_{i}'; out.write(open(p, 'rb').read()[: rngs[i][1] - rngs[i][0] + 1]); os.remove(p)
        bad = subprocess.run(['ffmpeg', '-v', 'error', '-i', f'renoise-{tid}.mp4', '-f', 'null', '-'], capture_output=True, text=True).stderr.strip()
        return tid, n, all(ok), 'OK' if not bad else 'BAD ' + bad[:60]
    jobs = [l.split() for l in open('urls.txt') if l.strip()]
    for j in jobs:
        for f in os.listdir('.'):
            if f.startswith(f'.p{j[0]}_'): os.remove(f)
    with cf.ThreadPoolExecutor(4) as ex:
        for r in ex.map(lambda j: fetch(*j), jobs): print(*r, flush=True)
    
  • skills/digital-human-koubo/scripts/voicefx/unify.py6.0 KB1453d0169991upstream ↗
    #!/usr/bin/env python3
    """多段 Grok 原声统一音色和空间感(第二、三期实测:齿音段间差 13.2 → 5.9 dB)。
    1) 频谱匹配:每段 1/3 倍频程能量向「参照组」中位数靠拢(±4 dB,平滑后用 firequalizer)
    2) 去刺耳:去齿音 + 6.6 kHz / 3.6 kHz 轻收 + 200 Hz 轻补 + 轻压缩
    3) 同一个小房间混响:原本混响尾巴长的段少加,干的段多加
    4) 每段 -18 LUFS
    
    用法:
      python3 unify.py <输出目录> <片段1.mp4> <片段2.mp4> ...            # 参照组 = 这批片段自己
      python3 unify.py <输出目录> --ref <参照片段目录> <片段…>          # 新片段向旧片段靠拢(比如复用上一期的段)
      python3 unify.py <输出目录> --scene <片段…>                     # 场景 / 动物片段:只去齿音 + 响度,不加房间
      可选:--roomtone <秒数>  另出一条整片房间底噪 roomtone.wav(-60 dBFS 左右,铺在整片下面)
    输出 <输出目录>/<文件名>.wav(48k 立体声)。剪辑时数字人视频轨一定 muted,只用这里的 wav。"""
    import subprocess, sys
    from pathlib import Path
    import numpy as np
    SR = 48000
    CENTERS = [100, 125, 160, 200, 250, 315, 400, 500, 630, 800, 1000, 1250, 1600, 2000, 2500, 3150, 4000, 5000, 6300, 8000, 10000, 12500]
    CHAIN = ("highpass=f=80,lowpass=f=15000,deesser=i=0.6:m=0.6:f=0.55,equalizer=f=6600:t=q:w=1.3:g=-3,equalizer=f=3600:t=q:w=1.1:g=-1.2,"
             "equalizer=f=200:t=q:w=0.9:g=1.4,acompressor=threshold=-22dB:ratio=2.3:attack=8:release=120:makeup=1.4")
    SCENE = "highpass=f=70,deesser=i=0.5:m=0.5:f=0.55,equalizer=f=6600:t=q:w=1.3:g=-2"
    
    def load(p, af=None):
        cmd = ["ffmpeg", "-loglevel", "error", "-i", str(p)] + (["-af", af] if af else []) + ["-ac", "1", "-ar", str(SR), "-f", "f32le", "-"]
        return np.frombuffer(subprocess.run(cmd, capture_output=True, check=True).stdout, np.float32).copy()
    def band_db(x):
        n = 1 << 14; win = np.hanning(n); acc = None; k = 0
        for i in range(0, len(x) - n, n // 2):
            seg = x[i:i + n]
            if np.sqrt(np.mean(seg ** 2)) < 0.01: continue
            s = np.abs(np.fft.rfft(seg * win)) ** 2; acc = s if acc is None else acc + s; k += 1
        f = np.fft.rfftfreq(n, 1 / SR); s = acc / max(1, k)
        out = np.array([10 * np.log10(np.sum(s[(f >= c / 2 ** (1 / 6)) & (f < c * 2 ** (1 / 6))]) + 1e-12) for c in CENTERS])
        return out - out.mean()
    def tail_ms(x):
        """语音峰值后衰减 20 dB 所需时间的中位数(ms),越大越「湿」"""
        hop = SR // 50; env = np.array([np.sqrt(np.mean(x[i:i + hop] ** 2)) + 1e-9 for i in range(0, len(x) - hop, hop)])
        db = 20 * np.log10(env); out = []
        for i in range(1, len(db) - 15):
            if db[i] > db.max() - 18 and db[i + 1] < db[i] - 3:
                j = i
                while j < len(db) - 1 and db[j] > db[i] - 20: j += 1
                if j - i < 40: out.append((j - i) * 20)
        return int(np.median(out)) if out else 0
    def room_ir():
        """小房间脉冲响应:早期反射 + 0.32 s 衰减尾巴,高频吸收(像卧室 / 书房里自拍)"""
        rng = np.random.default_rng(7)
        n = int(0.55 * SR); t = np.arange(n) / SR
        ir = np.zeros((n, 2), np.float32); ir[0] = 1.0
        for d, g in [(0.0061, .42), (0.0093, .33), (0.0137, .28), (0.0189, .22), (0.0247, .17), (0.0311, .12)]:
            j = int(d * SR); ir[j, 0] += g * (1 if rng.random() > .5 else -1); ir[j + int(rng.integers(5, 40)), 1] += g * (1 if rng.random() > .5 else -1)
        tail = rng.standard_normal((n, 2)).astype(np.float32) * np.exp(-6.91 * t / 0.32)[:, None] * 0.09
        tail[: int(0.012 * SR)] = 0
        k = np.exp(-np.arange(0, 60) / 9.0); k /= k.sum()
        for c in range(2): tail[:, c] = np.convolve(tail[:, c], k, mode="same")
        return ir + tail
    IR = room_ir()
    def roomify(dry, wet):
        w = np.stack([np.convolve(dry, IR[:, c])[: len(dry)] for c in range(2)], 1)
        return np.stack([dry, dry], 1) * (1 - wet) + w * wet
    def fq(g):
        g = np.convolve(np.pad(g, 1, mode="edge"), [0.25, 0.5, 0.25], mode="valid")
        return "firequalizer=gain_entry='" + ";".join(f"entry({c},{v:.2f})" for c, v in zip(CENTERS, g)) + "'"
    def write(path, st):
        tmp = path.with_suffix(".tmp.wav")
        subprocess.run(["ffmpeg", "-loglevel", "error", "-y", "-f", "f32le", "-ar", str(SR), "-ac", "2", "-i", "-", str(tmp)], input=st.astype(np.float32).tobytes(), check=True)
        subprocess.run(["ffmpeg", "-loglevel", "error", "-y", "-i", str(tmp), "-af", "loudnorm=I=-18:TP=-2:LRA=7", "-ar", str(SR), "-ac", "2", str(path)], check=True)
        tmp.unlink()
    
    def main():
        a = sys.argv[1:]
        if len(a) < 2: sys.exit(__doc__)
        out = Path(a.pop(0)); out.mkdir(parents=True, exist_ok=True)
        ref = scene = None; roomtone = None
        if "--ref" in a: i = a.index("--ref"); ref = Path(a[i + 1]); del a[i:i + 2]
        if "--roomtone" in a: i = a.index("--roomtone"); roomtone = float(a[i + 1]); del a[i:i + 2]
        if "--scene" in a: a.remove("--scene"); scene = True
        clips = [Path(p) for p in a]
        if scene:
            for c in clips:
                subprocess.run(["ffmpeg", "-loglevel", "error", "-y", "-i", str(c), "-af", SCENE + ",loudnorm=I=-18:TP=-2:LRA=7", "-ar", str(SR), "-ac", "2", str(out / f"{c.stem}.wav")], check=True)
                print(f"{c.stem:10s} 场景:去齿音 + 响度")
        else:
            B = {c: band_db(load(c)) for c in clips}
            pool = [band_db(load(p)) for p in sorted(ref.glob("*.mp4"))] if ref else list(B.values())
            med = np.median(np.stack(pool), 0)
            for c in clips:
                g = np.clip(med - B[c], -4, 4)
                tl = tail_ms(load(c)); wet = float(np.clip(0.24 - (tl - 60) / 320 * 0.16, 0.08, 0.24))
                write(out / f"{c.stem}.wav", roomify(load(c, fq(g) + "," + CHAIN), wet))
                print(f"{c.stem:10s} 频谱修正 {np.abs(g).max():.1f} dB  混响 wet {wet:.2f}(原尾巴 {tl} ms)")
        if roomtone:
            subprocess.run(["ffmpeg", "-loglevel", "error", "-y", "-f", "lavfi", "-i", f"anoisesrc=d={roomtone}:c=brown:r={SR}:a=0.02", "-af", "lowpass=f=1800,highpass=f=60,volume=-14dB", "-ac", "2", str(out / "roomtone.wav")], check=True)
            print("roomtone.wav 完成")
    
    if __name__ == "__main__":
        main()
    
  • skills/digital-human-koubo/references/cover.md2.9 KBbc9d1d22161aupstream ↗
    # 封面 + 首帧
    
    每条片子默认都做封面,并接在成片开头当第一帧。抖音、视频号、X、B 站默认都取首帧做封面,这样发布时不用再单独上传封面。
    
    ## cover.json
    放在工程根目录,所有路径都相对它。
    
    ```json
    {
     "ratios": ["16:9", "3:4"],
     "theme": "paper",
     "accent_color": "#f4212e",
     "kicker": "X 官方新功能 · UNDER THE HOOD",
     "title": "帖子被限流了?",
     "accent": "一个链接自查",
     "sub": "哪几条被打标签 · 什么原因 · 影响多大",
     "tags": ["官方报告", "每月更新", "逐条列出"],
     "url": "x.com/i/jf/under_the_hood",
     "host": {"video": "film/public/host.mp4", "t": 16.94},
     "props": [
      {"image": "film/public/shots/rep_oct.png", "crop": [90, 630, 1080, 1135]},
      {"image": "film/public/shots/rep_sep.png", "crop": [60, 40, 1100, 520]}
     ]
    }
    ```
    
    | 字段 | 写法 |
    |---|---|
    | ratios | 和成片画幅一致的那个必出(16:9 / 9:16),3:4 给小红书 |
    | theme | paper(浅底点阵,默认)/ dark(X 黑) |
    | kicker | 小字栏目名 / 来源,例如「X 官方新功能 · UNDER THE HOOD」 |
    | title | 钩子问题或结论,≤8 字,黑色大字 |
    | accent | 强调句,≤6 字,红色更大字(9:16 版是黄色) |
    | sub | 一句话说清看完能得到什么 |
    | tags | ≤3 个,黑底白字 |
    | url | 链接或号召,等宽字体 |
    | host | `video + t`:从主播视频取一帧,先用 `--candidates` 挑;也可以写 `image` 用定妆照 |
    | props | ≤2 张斜放的证据卡(官方截图、产品界面、作品帧),`crop` 用原图像素坐标,只截最有说服力的那块 |
    | disclosure | 角标,默认「内容由 AI 数字人演绎」(红线要求,别删) |
    
    文字都会自动缩小到不超出栏宽,不用手算字号。
    
    ## 三种版式
    - **16:9**:左边文字栏宽 880px(栏目名 → 标题 → 强调句 → 副标题 → 标签 → 链接),右边主播卡,两张证据卡斜着压在主播卡后面。
    - **9:16**:主播铺满画面,下方加暗色渐变,字压在渐变上(白色标题、黄色强调),证据卡浮在主播胸口右侧。
    - **3:4**:标题在上面,主播卡在右下,证据卡在左中,标签和链接在左下。
    
    ## 接到首帧
    `python3 scripts/cover_first.py 成片.mp4 cover/cover_16x9.jpg 交付.mp4 [--hold 0.5]`
    - 封面停 0.5 秒后硬切进正片,声音整体后推 0.5 秒,前面补静音。成片已经是 -16 LUFS 的话,接完响度不变。
    - 抽 0 秒、0.45 秒、0.55 秒三帧确认:前两帧是封面,第三帧是正片。
    - 交付的主文件 = 带封面的版本;不带封面的版本另存为 `_无封面.mp4`。
    
    ## 挑帧
    - 嘴闭着或微笑;别挑正在念字、嘴型张大的帧,也别挑闭眼的。
    - 手势自然(叉腰、摊手),不挡脸。
    - 和片中主播卡是同一个人、同一身衣服;Grok 段间会有轻微差异,选和参考图最像的那段。
    
  • skills/digital-human-koubo/references/edit-styles.md2.3 KBd2edcd18443eupstream ↗
    # 剪辑模板
    
    几个模板都是 Remotion 工程,`node_modules` 用 `cp -cR` 从任一现有工程克隆(npm 源常 SSL 失败)。时间轴全部来自逐字对齐(tl.json / timeline.json),改文案后重跑对齐即可。
    
    | 风格 | 工程 | 入口 | 适合 |
    |---|---|---|---|
    | B 花字口播(数据驱动) | skill 内 templates/huazi-916 | src/Huazi.tsx + src/edit.json | 抖音 / 小红书口播、带货、种草 |
    | C 发布解读 | templates/reference/launch-169 | src/Film.tsx | 新品发布、横屏 B 站 |
    | D 教程 | templates/reference/tutorial-169 | src/Tutorial.tsx | 保姆级教程、操作演示 |
    | E 多主播多语言 | templates/reference/multihost-169 | src/Tutorial.tsx(nar / clip / title / outro) | 能力展示、多场景、出海 |
    | A 小林式解说 | templates/lin-169(scripts/new_edit.sh lin-169) | src/Lin.tsx + src/scenes.json(lin_scenes.py 从 plan.json 生成)+ src/cues.json | 财经 / 科技事件解说(纯图表长片仍可用 finance-explainer 引擎) |
    
    ## 花字口播
    新片一律用 templates/huazi-916(edit.json 驱动),字段见 references/huazi.md。
    
    ## 渲染
    `npx remotion render src/index.ts <Composition> out/raw.mp4 --concurrency=6` → `ffmpeg -af loudnorm=I=-16:TP=-1.5:LRA=11 -crf 20` 出片。抽帧检查时一定要看过渡中间帧。
    
    ## 声音统一(2026-10-24 教程第二期实测)
    - **数字人视频轨一定要 `muted`**:画面用 OffthreadVideo、声音另铺一条时,视频轨不静音会双声叠加,差几毫秒就梳状滤波——听感就是「刺耳、混响忽远忽近」。
    - Grok 分段生成的原声:段间齿音差可达 13 dB、混响尾巴 60–380 ms。用 `scripts/voicefx/unify.py`:1/3 倍频程频谱向中位数匹配(±4 dB)→ 去齿音 + 3–7 kHz 轻收 → 同一个小房间 IR(原本湿的段 wet 少、干的段多)→ 每段 -18 LUFS → 整片铺 -60 dBFS 房间底噪。实测齿音段间差 13.2→5.9 dB。
    - 只改音频时不用重渲画面:`AUDIO_ONLY=1 npx remotion render … out/mix.wav --codec=wav`(remotion.config.ts 里 CRF/codec 要按 AUDIO_ONLY 跳过),再和旧画面 mux。
    - 换声 + 保留 Grok 口型(MiMo 克隆重念 → 按逐字时间 WSOLA 对齐)实测口型差中位约 100 ms,全屏特写能看出来;要换声又要口型准,得用 Wan 3.0 参考音频重生成画面。
    
  • skills/digital-human-koubo/references/huazi.md4.6 KB06e34446a427upstream ↗
    # 网红花字口播模板(templates/huazi-916)
    
    9:16,1080×1920,30fps。**内容全在 `src/edit.json`,时间全来自 `src/tl.json`**——改稿只动这两个文件。
    
    ## 起一个新工程
    ```bash
    bash ~/.claude/skills/digital-human-koubo/scripts/new_edit.sh huazi-916 <工程目录>
    ```
    然后放素材:`public/main.mp4`(拼好的数字人口播,竖屏)、`public/voice.wav`(处理过的人声)、`public/show/`(要展示的作品)、`src/tl.json`(`scripts/align.py` 的输出)。
    
    ## edit.json 字段
    时间写法:`"3:"` 第 3 段开头 · `"3:end"` 第 3 段结束 · `"3:关键词"` 这个词开始 · `"3:关键词#2"` 第 2 次出现 · 数字 = 绝对秒。
    
    | 字段 | 作用 | 例子 |
    |---|---|---|
    | `preset` | 花字强度 克制 / 标准 / 热闹 | `"标准"` |
    | `title` | 顶部胶囊标题 | `{"left":"真实体验","right":"我为什么推荐 Renoise"}` |
    | `chapters` | 章节胶囊(自动编 ①②③) | `[{"at":"4:","t":"隐私:MCP vs CLI"}]` |
    | `keys` | 字幕里变色放大的关键词 | `["太臃肿","强烈建议"]` |
    | `emojis` | 脸两侧弹的动态表情 | `[{"at":"2:太臃肿","e":"😵‍💫","side":"r"}]` |
    | `punch` | 镜头推一下的时刻(不写就每段第一个关键词) | `["1:最大"]` |
    | `cards` | 卡片,见下表 | |
    | `showcase` | 主播缩小窗、全屏放作品 | `[{"from":"8:尤其","to":"8:end","items":[{"src":"show/a.mp4","label":"复刻"}]}]` |
    | `cta` | 结尾号召大字 | `{"at":"11:强烈建议","text":"强烈建议","sub":"去试试 Renoise","subAt":"11:去试试"}` |
    | `music` | 配乐 | `{"src":"music/bgm.mp3","vol":0.075}` |
    | `badge` / `credits` | 左上角 AI 标识 / 片尾署名 | 默认「内容由 AI 数字人演绎」 |
    | `brand` | 主色 | `"orange"` / `"#FF7A1A"` |
    
    ### 卡片类型(cards[].type)
    每张卡片都有 `at`,可选 `until`(默认到本段结束、下一张卡片或 4.5 秒,取最早)。
    
    | type | 长什么样 | 什么时候用 | 关键字段 |
    |---|---|---|---|
    | `stamp` | 斜盖的描边印章 | 结论、「不用抽卡」 | text, color, x, y, rot |
    | `slam` | 描边大字砸屏 | 吐槽、情绪最高点 | text, color |
    | `big` | 黄色渐变大字块 | 标签式结论「起号神器」 | text |
    | `number` | 数字滚动 | 价格、数量、积分 | value, unit, prefix, label |
    | `vs` | 左右名牌 + VS | 对比两家 | left{at,t}, right{at,t} |
    | `tags` | 2×2 彩色名牌逐个点亮 | 支持的平台 / 工具 | title, items[{at,t,color}] |
    | `bars` | 横条对比 | 速度 / 价格对比(标「个人体验」) | title, items[{t,v,label,color}], note |
    | `list` | ✅ / ❌ 清单 | 优缺点、两面 | title, items[{t,tone,at}] |
    | `image` | 带白边的截图 | 官网、界面、聊天记录 | src, label, x, y, w, rot |
    
    颜色可写 yellow / pink / cyan / red / green / orange / purple / white 或十六进制。
    
    ## 三档花字强度(对比图:assets/styles/B_huazi_presets.jpg,选强度时发给用户)
    | | 克制 | 标准 | 热闹 |
    |---|---|---|---|
    | 字幕字号(普通 / 关键词) | 66 / 76 | 76 / 92 | 82 / 106 |
    | 关键词颜色 | 黄 | 黄 | 黄 / 粉 / 青 轮换 |
    | 逐字弹跳 | 很轻 | 明显 | 更弹 |
    | 表情 | 隔一个出一个,偏小 | 全部 | 全部,更大 |
    | 跳切推近 / 重点推镜 | 不交替 / 很轻 | 1.09 / 14% | 1.11 / 20% |
    | 段间闪白 | 无 | 有 | 更亮 |
    | 音效 | 0.6 倍 | 正常 | 1.2 倍 + 推镜处加 pop |
    适合:克制 = 知识、品牌、严肃话题;标准 = 大多数口播;热闹 = 带货、搞笑、年轻向。不管哪档都**不做整段抖动**,只在关键帧推镜。
    
    ## 写 edit.json 的习惯(参考爆款口播)
    - 关键词:每段 1–3 个,挑「情绪词 + 数字 + 产品名」,不要整句都标黄。
    - 表情:每分钟 6–10 个,跟情绪走(惊讶 😱、推荐 😍、吐槽 😤、秘密 🤫、成功 💯),左右交替。
    - 卡片:一段最多一张;一屏只说一件事,内容完整放下,别拆碎。
    - 引用别人的说法(评测、扒料)在卡片 title 里写「网友分析 / 个人体验」。
    - 作品展示 ≥ 3 秒一个,最多 3 个。
    
    ## 检查 + 渲染
    ```bash
    python3 ~/.claude/skills/digital-human-koubo/scripts/check_edit.py <工程>/src     # 所有时间引用能对上才往下
    npx remotion still src/index.ts Huazi out/a.jpg --frame=<帧>                    # 抽卡片、表情、展示过渡的中间帧
    npx remotion render src/index.ts Huazi out/raw.mp4 --concurrency=6
    ffmpeg -i out/raw.mp4 -af loudnorm=I=-16:TP=-1.5:LRA=11 -c:v libx264 -crf 20 成片.mp4
    ```
    示例数据:模板自带的 tl.json / edit.json 是「Renoise 推荐口播」那期(11 段 · 88 秒),可以直接照着改。
    
  • skills/digital-human-koubo/references/install.md4.0 KB1d8f0c95f5f6upstream ↗
    # 安装引导(只在缺的时候用)
    
    原则:**已经有的一句话带过,不提安装**;缺什么才给装法。装法给多种:先放用户当前在用的那种(标「推荐」),其余列在下面让用户挑。装完再检查一次确认。
    
    ## 1. Renoise MCP
    
    ### 怎么判断有没有
    直接调 Renoise 的 `get_account`:
    - 成功 → 「Renoise 已连接,余额 X 积分」,继续干活。
    - 工具不存在 / 调用报未连接 → 缺,按下面引导。
    - 报「disabled in connector settings」→ 不是没装,是某个工具被关了:让用户在连接器设置里把它打开。
    - 报未登录 / 授权过期 → 不用重装,重新登录授权就行(Claude 连接器点「Connect」;Codex `codex mcp login renoise`)。
    
    ### 装法(先有 Renoise 账号;全部走浏览器登录授权,不用复制 API key)
    
    还没有账号 → 先去注册:**[https://renoise.ai/mcp?utm_medium=xcom&utm_source=official](https://renoise.ai/mcp?utm_medium=xcom&utm_source=official)**(给用户时原样给这条链接,保留 utm 追踪参数,不要改写成 renoise.ai 首页)。
    
    | 用的是 | 怎么装 |
    |---|---|
    | **Claude 桌面端 / claude.ai 网页** | 设置 → 连接器(Connectors)→ Add custom connector → 名称 `Renoise`,地址 `https://renoise.ai/api/public/mcp` → 继续 → 登录 renoise.ai 点同意 |
    | **Claude Code** | 依次输入 `/plugin marketplace add ArcoCodes/renoise-plugins-official`、`/plugin install renoise@renoise-plugins-official`,首次调用时会打开浏览器登录 |
    | **Codex(CLI / 桌面)** | 终端运行 `codex mcp add renoise --url https://renoise.ai/api/public/mcp`,再 `codex mcp login renoise` |
    | **OpenClaw** | `openclaw plugins install renoise --marketplace ArcoCodes/renoise-plugins-official` |
    | **其他支持远程 MCP 的客户端**(Cursor、Windsurf、Cline 等) | 在它的 MCP 配置里加一个远程服务器,地址 `https://renoise.ai/api/public/mcp`。常见写法:`{"mcpServers": {"renoise": {"url": "https://renoise.ai/api/public/mcp"}}}`(字段名以客户端文档为准) |
    | **不确定 / 想看最新** | 打开 renoise.ai/plugin,官网列了各客户端的最新装法 |
    
    装完:Claude 系要重开对话(或在连接器里点重连)才能看到工具;Codex 重开会话。然后再调一次 `get_account`。
    
    ## 2. 本机环境(剪辑时才需要)
    `bash scripts/doctor.sh` 会逐项检查:有的打 ✓ 跳过,缺的才列出多种装法。**系统软件让用户自己装,不要替用户执行安装命令**(Python 包可以在用户同意后帮装)。
    
    | 缺的 | macOS | Windows | Linux | 其他 |
    |---|---|---|---|---|
    | ffmpeg | `brew install ffmpeg` | `winget install Gyan.FFmpeg` 或 `choco install ffmpeg` | `sudo apt install ffmpeg` | 官网 ffmpeg.org 下载 |
    | Python 3 | `brew install python` | `winget install Python.Python.3.12` | `sudo apt install python3 python3-pip` | python.org 下载;或 conda |
    | numpy / Pillow | `python3 -m pip install numpy pillow` | 同左 | 同左 | `conda install numpy pillow` |
    | Node 18+ | `brew install node` | `winget install OpenJS.NodeJS.LTS` | `sudo apt install nodejs npm` 或 nvm | nodejs.org 下载;`nvm install --lts` |
    | whisper-cli | `brew install whisper-cpp` | 从 github.com/ggerganov/whisper.cpp Releases 下载 | 源码编译(`cmake -B build && cmake --build build`) | — |
    | whisper 模型 | 下载 `ggml-medium-q5_0.bin`(huggingface.co/ggerganov/whisper.cpp)放到 `~/models/` | 同左 | 同左 | 或 `export WHISPER_MODEL=模型路径` |
    
    Remotion 不用单独装:`scripts/new_edit.sh` 起工程时会先从本机已有的 Remotion 工程克隆,没有才 `npm install`;npm 源连不上时换镜像 `npm config set registry https://registry.npmmirror.com`。
    
    ## 3. 数字人形象
    persona.json 的 reference_material 在当前账号能用(`view_image` 能打开)→ 直接用。用不了(换了账号、素材过期、别人的包)→ 按 references/new-avatar.md 用用户自己的照片重做。
    
  • skills/digital-human-koubo/references/lin-style.md7.5 KBd15557082ba8upstream ↗
    # A · 小林式解说:剪辑手法与流水线
    
    数据驱动的 Remotion 模板 `templates/lin-169`。第一次实战(2026-10):一期个人理财讲解,44 段口播、5 分 50 秒、42 个场景。模板里的 `plan.example.json` 是一个 6 段的小示例。
    
    **只学结构和剪辑手法**:不用真实创作者的脸、声音、布景、栏目名和原句(见 SKILL.md 红线)。参考片只用来拆节奏。
    
    ## 一、画面语法(从参考片逐帧拆出来的)
    
    | 手法 | 什么时候用 | 模板里的场景类型 |
    |---|---|---|
    | 景深字:金色大字在主播身后 | 开场命题、关键数字、结尾金句。一期 3–4 次 | `host` + `depth` |
    | 紫色题板 + 主播小窗 | 提问(「想一想」)、定义、假设、结论 | `board` |
    | B-roll 实拍空镜 + 主播圆窗 + 数据卡 | 讲到生活场景、机构、行业时(超市、银行、医院、家庭) | `broll` + card / stat / chips / banner / doc / slam / float |
    | 大数字卡 | 两三个利率、比例并排比 | `rates` |
    | 先 ?% 后揭晓 | 「重要假设」:先挂问号,念到时翻牌 | `assume` |
    | 推导逐行出现 | 列方程 | `formula` |
    | 结论砸下 | 一个算式的结果(「72 ÷ 年化」→「≈ 12 年」) | `big` |
    | 公式逐项长出 | 多项公式(A + B×C + D),当前讲的那项高亮,下挂 3D 图标 | `formula2`(`final:1` 全亮) |
    | 算例填数 | 把例子的数字一个个填进公式,结果砸下 | `calc` |
    | 条形图、瀑布图、曲线 | 地区对比、扣费、长期趋势(曲线标「示意」) | `bars` / `fall` / `curve` |
    | 3D 贴纸四宫格 | 列出几大项(比如育儿 / 医疗 / 买房 / 养老) | `stickers` |
    
    **节奏**(参考片实测,实战照做):
    - 画面每 6–9 秒换一次类型(主播 / 题板 / B-roll 交替)。
    - 主播全屏累计不超过全片 20%(实战那期 71 秒 / 350 秒)。
    - 每个数字出现时屏幕上必须有它。
    - 题板和 B-roll 时主播一直在小窗里。小窗只有四个位置:`circle-tl` / `circle-bl` / `rect-l` / `rect-r`。`rect-r` 时面板自动靠左,不会被挡住(实战时踩过公式最后一项被盖住的坑)。
    
    ## 二、流水线(A 风格专用部分,其余同 SKILL.md)
    
    1. **写稿**:同 SKILL.md 第 1 步。数字在稿子里写念法(「百分之二点五」),另写一份 `disp.txt` 显示稿(「2.5%」),每段一行,标点断句数要和念稿一样。
    2. **拍 + 拼**:`build_tasks.py` → Grok → `assemble.py`。拼接已经保证音画等长,不用另外处理。
    3. **查念错**:`python3 scripts/misread_check.py script.json`。按停顿切句,不带原文逐句转写。
       - 不能信 assemble.py 带原文提示的准确率:它会把念错的字「纠正」回去,比如「通胀」念成 tōng zhèng 照样判 100%。
       - 可疑字要让人听一下确认,同音字会误报。
    4. **修念错(0 积分、保口型)**:`patch_words.py script.json patch.json --ref s05,s24,s41 --synth-only` → 填 m → 再跑 → `assemble.py --rejoin`。
       - 只把那一句换成 MiMo 克隆音,长度拉到和原句一样。
       - **不要整片换音色**:口型是跟 Grok 原声走的,整片换完到处对不上,用户一眼看出来。
       - **不要先提 OmniHuman 重做口型**:全片约 5,000 积分,用户明确说没必要。
    5. **对齐**:`align.py` → `lin_subs.py script.json --disp disp.txt` → `src/cues.json`。
    6. **分镜**:写 `plan.json`(格式见 lin_scenes.py 文件头,时间写「@s07:两千」),跑 `lin_scenes.py plan.json --tl src/tl.json --out src/scenes.json --face`。
       - `--face` 自动量主播脸中心,供小窗裁切用。
       - 报 GAP 就是场景没接上。
    7. **素材**:
       - 景深字:`cutout_video.py cut/<段>.mp4 public/cut/<段>.webm`(Vision 抠像,本地)。
       - B-roll:放 `public/broll/B01.mp4…`。
       - 贴纸:放 `public/stickers/`。
    8. **声音**:
       - 音效:`lin_sfx.py src/scenes.json --out audio`。
       - 混音:`lin_mix.py --voice cut/joined.mov --bgm 曲子 --sfx audio/sfx_bus.wav --out public/mix.wav`。
    9. **渲染 + 导出**:
       - `npx remotion render src/index.ts Lin out/lin.mp4`。
       - 要 1.1 倍:`lin_mix.py ... --speed 1.1 --video out/lin.mp4 --final 成片_1.1x.mp4`(人声、音效、画面一起加速,BGM 原速)。
    10. **质检**:
        - 每个场景抽开头 +0.15 秒和中点两帧拼图,看动画中途帧、小窗遮挡、空板。
        - `earshot timeline mix.wav --cues audio/cues_earshot.json` 看音效有没有被埋。
        - 成片和源片在开头、中段、结尾各取一处,对声音互相关、对画面帧匹配:声音 <10 ms、画面 ±1 帧。
    
    ## 三、B-roll(Renoise,花积分前先报价)
    
    - **模型**:Wan 3.0,720p,5 秒,每段 60 积分(账户有限免活动时可能更少)。一期 10–12 段,约 720 积分。
    - **提示词公式**:`Cinematic <镜头运动> of <具体场景+人物动作>, <光线>, shallow depth of field, documentary B-roll. No readable text, no logos, no watermark.`
      - 写中国场景(Chinese city street / red yuan banknotes)。
      - 人物写普通路人,不写名人。
    - **角标**:画面角上自动加「AI 生成画面」(config.brollTag,设成 "" 可关)。
    - **时长**:场景比 5 秒长时自动放慢到最低 0.55 倍,再加 1.02→1.12 慢推。场景超过 9 秒就拆成两个 B-roll 或插一块题板。
    - **贴纸**:GPT Image 2.5 一张 2×2 四宫格(2k,23 积分),本地切成四张、从四角洪泛去掉白底,放 `public/stickers/sticker_0..3.png`。
    
    ## 四、声音
    
    - **音效库**:earshot(可选,`EARSHOT_PY` 指向它的 python);没装时 lin_sfx.py 用工程 `public/sfx`(make_assets.py 合成)兜底。
      - lin_sfx.py 首次会 `kit init --preset calm`,再把 drop 改成 cut_hit/punch(「碰」)、pop 改成 ui_pop/soft。
      - 规则表见脚本文件头。一期约 120 个音效。
    - **音量**:要高出背景(人声 + 音乐)8–10 dB 才听得清。
      - 第一版只高 5 dB,用户说「碰」听不到。
      - 现在的档位:drop / bell +7 dB、pop / land +3 dB、whoosh −2 dB。
      - 复查用 `earshot timeline` 的 event_prominence_db。
    - **BGM**:`earshot rank "<描述>" <曲库目录> --top 6` 挑曲。
      - 首次要拉模型,10 分钟以上,放后台跑。
      - 财经讲解选 light jazz / lo-fi(实战用的是 Mixkit「Upbeat Jazz」,免费可商用)。
      - 循环、sidechain 让人声、结尾淡出都由 lin_mix.py 做。
    - **人声**:女声链 220 Hz +1.5 / 420 Hz −2 / 3.2 kHz +2 / 10 kHz +1.5 / 去齿音 / 3:1 压缩。总线 limiter,整片 −16 LUFS。
    
    ## 五、踩过的坑
    
    - **拼接音画漂移**:44 段直接 `concat -c copy` 再解码音频,到 4:43 声音落后口型 0.38 秒(用户发现)。assemble.py 已修:每段音频 pad/trim 到画面帧长,keep 写真实画面长度。
    - **带原文提示的转写会掩盖念错**:见第二节第 3 步。
    - **只换两个字**:接缝处转写成别的词(「城镇」→「承认」)。换整句、切在停顿上才自然。
    - **小窗挡内容**:`rect-r` 盖住公式最后一项。模板已让面板自动避开小窗。改布局后抽中点帧看一眼。
    - **Remotion 循环里用 hook**:图表的每一行要单独拆成组件(FallBar / BarRow / Term),别在 map 里调 useK。
    - **右上角 AI 标注**:默认显示「内容由 AI 数字人演绎」。用户要去掉时设 `config.disclosure: ""`,并提醒发布时在平台上勾选 AI 生成声明。
    
  • skills/digital-human-koubo/references/new-avatar.md1.1 KB5ac02617e7aaupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/references/packaging-playbook.md5.6 KB4b9ee45975a4upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/references/packaging-presets.json5.2 KBcb19723f723dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/references/packaging.md10 KB2195d6a0ddc4upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/references/research/1_english_top_pacing.md37 KB745e621b450dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/references/research/2_tech_review_polish.md38 KB645b8ce81959upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/references/research/3_explainer_animation.md51 KBbcf96ca58de4upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/references/research/4_chinese_wangan.md34 KB764e9a207097upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/references/style-menu.md8.7 KB073486278434upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/references/voice.md1.1 KB25762b0d7eceupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/avatar_ref.jpg122 KBa676e292289cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/ArchiveCards.jpg23 KBb1d59ce71332upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/CalloutLeader.jpg19 KBf241731da125upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/ChapterCard.jpg8.4 KB006068f4b343upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/Charts.jpg11 KB3854eac72242upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/ColdOpenFreeze.jpg38 KB70e9d56dfb40upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/CompareWipe.jpg19 KBe03ce7f241caupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/Counter.jpg12 KB27085dc44ed8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/Danmaku.jpg20 KB553e3e1e3632upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/DocFocus.jpg19 KB3b9a864148dbupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/EvidenceCard.jpg28 KBd73bbac4dbcbupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/FreezeFrame.jpg24 KB65064d81f854upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/GlassPanel.jpg17 KB31bb6baa3db5upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/GlitchInterstitial.jpg24 KBe045fe51e18cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/HandDraw.jpg23 KB657b5ead091bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/Highlight.jpg15 KBddb9ddbad3c0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/HostFloaters.jpg28 KBea977f83d8a7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/KeywordStack.jpg19 KB02f314c2a95dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/LowerThird.jpg19 KBfc95c68ac61eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/MapRoute.jpg19 KBfbc1734fadabupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/MemeWindow.jpg19 KB7812ac0fbde3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/NamePlate.jpg23 KB573c2594de57upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/NumberSpike.jpg17 KB76d03760ca41upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/Odometer.jpg7.7 KB206c96a9dd00upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/PaperCollage.jpg26 KB04444ff46773upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/PollPop.jpg20 KBcdb619244479upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/ProgressChapters.jpg16 KBdf985df35ea3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/ProgressTracker.jpg18 KB0ae9c93e044cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/PunchInHost.jpg15 KBa109b50a81d4upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/ReactionPop.jpg19 KB8cdfc856cc0eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/RecapBoard.jpg11 KB892dc9eb85bfupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/RetentionCaption.jpg18 KBf1e6fd3f4b43upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/ReviewCards.jpg18 KB7968ceca50a9upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/SearchTyping.jpg16 KB028b359c3cacupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/SlamText.jpg20 KB2b03a28488a7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/SourceDoc.jpg27 KB4378f83e393dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/SpecCard.jpg18 KB47b958265edcupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/TeaserColdOpen.jpg8.6 KBd2af3a4e7329upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/TextBehind.jpg18 KBcf04bc4094cbupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/TiltAside.jpg14 KB30513f6391c3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/TornStrip.jpg19 KB1545e059bac8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/TypedNameTag.jpg20 KBbb26844d9c12upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/WordStack.jpg18 KB65b4f25f90e8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/each/ZoomFocus.jpg21 KBcda6cd640f0dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/packaging/图鉴.jpg592 KB68a199199f9dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/styles/A_xiaolin_explainer.jpg71 KB1556baa468a0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/styles/B_huazi_koubo.jpg70 KB87648e340a49upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/styles/B_huazi_presets.jpg249 KB92b6b0cb2c2eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/styles/C_launch_side.jpg73 KB0da55c8d8bf5upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/styles/D_tutorial.jpg68 KBf2818e9d70c7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/assets/styles/E_multi_host.jpg65 KBda8847584f65upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/persona.json3.3 KB7b99afb43767upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/package.json886 B4f12f1354fc2upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f30d.json184 KBe941d4ace779upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f389.json66 KB223dc64a9449upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f399.svg8.9 KBe996bc1f3210upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f3ac.json38 KBd22ce7590135upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f3af.json45 KBc846903eb4bfupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f3c6.json77 KB552e22682674upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f440.json28 KBd7e152cc5134upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f444.svg1.7 KB3f7b8429e32eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f44b.json93 KB9cbe4174c5a9upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f44d.json40 KB66e5afb14a8aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f44f.json136 KB03b5bff532deupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f4a1.json23 KB2eabf8a64bebupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f4aa.json68 KBe33645a0ce24upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f4af.json65 KB866b2dd35e95upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f4b0.svg22 KB0d281d87d8c5upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f4bb.json82 KB216017db60dcupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f4dd.svg6.4 KB36ab8940150fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f4e3.json44 KB756588d6dcf0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f4f1.svg4.6 KB85f78aadca63upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f50b.json63 KBd6c08b125b1aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f50d.svg3.2 KB3e2470b0fa09upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f525.json29 KBdcca40d67bf7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f602.json58 KBbb717384ed33upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f605.json66 KB52d966254e5eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f60d.json41 KBafb40904a4deupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f60e.json25 KB5b4011db4eb8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f60f.json31 KB55e3d16be4e8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f624.json125 KBe33f14893456upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f62d.json117 KBae422b0a1619upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f62e.json18 KBd3570053e8a0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f631.json88 KB85f96a6200f3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f634.json24 KB4ff2984d1935upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f635_200d_1f4ab.json37 KBf1a3b65f8478upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f645.svg6.3 KBf0b1fb1c059aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f64c.json115 KB16755b0e36feupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f64f.json62 KB8ec0caff852bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f680.json80 KBa795b3184901upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f6d2.json34 KBe995cc82f362upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f911.json61 KB8058212b685bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f914.json66 KBde87b7d53a0fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f916.json183 KB95cadd0eec2dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f91d.json85 KBfc660be16a90upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f929.json46 KB0f27cd9713d0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f92b.json59 KB079b3383ae3cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f92f.json140 KB9193810f0048upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f937.svg7.7 KB0664d217c76eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f972.json29 KB53f169d59987upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f973.json66 KB2aee643fa770upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f9d1.svg9.7 KBa4e960c02236upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1f9e0.json113 KBee82381141caupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1fae1.json49 KB5c6f10b96c41upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/1fae3.json114 KBbf0fec26c01fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/23f1.svg6.7 KB1ce11f8ad359upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/26a0.json16 KB1f33fa272eeaupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/26a1.json87 KB9d6cffe7df35upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/2705.json16 KBa17f6a77a04cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/2728.json15 KBff3c5f37984aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/274c.json7.1 KBa889ac80582bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/2764.json8.2 KB3e5a61613448upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/public/emoji/manifest.json2.9 KB89a5efcfd2b7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/remotion.config.ts232 B1b04ecf07d77upstream ↗
    import { Config } from "@remotion/cli/config";
    
    Config.setVideoImageFormat("jpeg");
    Config.setJpegQuality(95);
    Config.setCodec("h264");
    Config.setCrf(16);
    Config.setPixelFormat("yuv420p");
    Config.setChromiumOpenGlRenderer("angle");
    
  • skills/digital-human-koubo/templates/huazi-916/src/edit.json4.4 KB80d9f7ba9b44upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/src/Huazi.tsx26 KB712bdef6d1beupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/src/icons/NotoEmoji.tsx3.3 KB1aa2ea9ac0f8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/src/index.ts92 Be20ec58da68aupstream ↗
    import { registerRoot } from "remotion";
    import { Root } from "./Root";
    registerRoot(Root);
    
  • skills/digital-human-koubo/templates/huazi-916/src/kit/Annotate.tsx7.0 KB488c6e88fc06upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/src/kit/Beast.tsx8.2 KB49d7ed0d275dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/src/kit/core.tsx2.7 KB4c0d728d195cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/src/kit/Depth.tsx5.2 KBefb26728d20cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/src/kit/Explain.tsx22 KB3a41dbe4ecdeupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/src/kit/Map.tsx4.6 KB7582d2369b75upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/src/kit/Overlay.tsx11 KB958eb0feee71upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/src/kit/Polish.tsx8.0 KB02862a87974aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/src/kit/registry.tsx4.5 KBa7030609c2e7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/src/kit/Text.tsx9.9 KBcef33088cb12upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/src/kit/Wangan.tsx17 KB2a1ac339a567upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/src/Root.tsx271 B14c503f96989upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/src/tl.json7.3 KB207e0ac97e39upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/huazi-916/tsconfig.json328 Baad5670c0e6fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/lin-169/disp.example.txt389 Bfcab5ea30c5bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/lin-169/package.json874 B1008a5cf9f03upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/lin-169/plan.example.json1.2 KB852a4e11be77upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/lin-169/public/broll/.gitkeep0 Be69de29bb2d1upstream ↗
  • skills/digital-human-koubo/templates/lin-169/public/cut/.gitkeep0 Be69de29bb2d1upstream ↗
  • skills/digital-human-koubo/templates/lin-169/public/stickers/.gitkeep0 Be69de29bb2d1upstream ↗
  • skills/digital-human-koubo/templates/lin-169/remotion.config.ts232 B1b04ecf07d77upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/lin-169/script.example.json687 B121f2cc0981dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/lin-169/src/cues.json1011 B85c03cabb91cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/lin-169/src/index.ts92 Be20ec58da68aupstream ↗
    import { registerRoot } from "remotion";
    import { Root } from "./Root";
    registerRoot(Root);
    
  • skills/digital-human-koubo/templates/lin-169/src/Lin.tsx30 KBdba1079120ffupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/lin-169/src/Root.tsx307 B5698b79723f1upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/lin-169/src/scenes.json1.1 KB583628fd6a46upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/lin-169/tsconfig.json328 Baad5670c0e6fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/package.json887 B1f3fc2e74e39upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f30d.json184 KBe941d4ace779upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f389.json66 KB223dc64a9449upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f399.svg8.9 KBe996bc1f3210upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f3ac.json38 KBd22ce7590135upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f3af.json45 KBc846903eb4bfupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f3c6.json77 KB552e22682674upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f440.json28 KBd7e152cc5134upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f444.svg1.7 KB3f7b8429e32eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f44b.json93 KB9cbe4174c5a9upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f44d.json40 KB66e5afb14a8aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f44f.json136 KB03b5bff532deupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f4a1.json23 KB2eabf8a64bebupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f4aa.json68 KBe33645a0ce24upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f4af.json65 KB866b2dd35e95upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f4b0.svg22 KB0d281d87d8c5upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f4bb.json82 KB216017db60dcupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f4dd.svg6.4 KB36ab8940150fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f4e3.json44 KB756588d6dcf0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f4f1.svg4.6 KB85f78aadca63upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f50b.json63 KBd6c08b125b1aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f50d.svg3.2 KB3e2470b0fa09upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f525.json29 KBdcca40d67bf7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f602.json58 KBbb717384ed33upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f605.json66 KB52d966254e5eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f60d.json41 KBafb40904a4deupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f60e.json25 KB5b4011db4eb8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f60f.json31 KB55e3d16be4e8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f624.json125 KBe33f14893456upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f62d.json117 KBae422b0a1619upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f62e.json18 KBd3570053e8a0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f631.json88 KB85f96a6200f3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f634.json24 KB4ff2984d1935upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f635_200d_1f4ab.json37 KBf1a3b65f8478upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f645.svg6.3 KBf0b1fb1c059aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f64c.json115 KB16755b0e36feupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f64f.json62 KB8ec0caff852bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f680.json80 KBa795b3184901upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f6d2.json34 KBe995cc82f362upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f911.json61 KB8058212b685bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f914.json66 KBde87b7d53a0fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f916.json183 KB95cadd0eec2dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f91d.json85 KBfc660be16a90upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f929.json46 KB0f27cd9713d0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f92b.json59 KB079b3383ae3cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f92f.json140 KB9193810f0048upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f937.svg7.7 KB0664d217c76eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f972.json29 KB53f169d59987upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f973.json66 KB2aee643fa770upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f9d1.svg9.7 KBa4e960c02236upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1f9e0.json113 KBee82381141caupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1fae1.json49 KB5c6f10b96c41upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/1fae3.json114 KBbf0fec26c01fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/23f1.svg6.7 KB1ce11f8ad359upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/26a0.json16 KB1f33fa272eeaupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/26a1.json87 KB9d6cffe7df35upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/2705.json16 KBa17f6a77a04cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/2728.json15 KBff3c5f37984aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/274c.json7.1 KBa889ac80582bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/2764.json8.2 KB3e5a61613448upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/public/emoji/manifest.json2.9 KB89a5efcfd2b7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/remotion.config.ts318 B5ece36657d98upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/src/demos/Demos.tsx25 KBbb649cca17e8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/src/index.ts92 Be20ec58da68aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/src/kit/Annotate.tsx7.0 KB488c6e88fc06upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/src/kit/Beast.tsx8.2 KB49d7ed0d275dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/src/kit/core.tsx2.7 KB4c0d728d195cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/src/kit/Depth.tsx5.2 KBefb26728d20cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/src/kit/Explain.tsx22 KB3a41dbe4ecdeupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/src/kit/Map.tsx4.6 KB7582d2369b75upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/src/kit/NotoEmoji.tsx3.3 KB1aa2ea9ac0f8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/src/kit/Overlay.tsx11 KBfa4fc48de9d1upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/src/kit/Polish.tsx8.0 KBb9e180aef22cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/src/kit/registry.tsx4.5 KBa7030609c2e7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/src/kit/Text.tsx9.9 KBcef33088cb12upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/src/kit/Wangan.tsx17 KB2a1ac339a567upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/src/Root.tsx891 Bf5402d91e1b4upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/packaging/tsconfig.json328 Baad5670c0e6fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/package.json886 B4f12f1354fc2upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/remotion.config.ts232 B1b04ecf07d77upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/Film.tsx22 KB61979b2be58cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/index.ts92 Be20ec58da68aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/kit/Annotate.tsx7.0 KB488c6e88fc06upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/kit/Beast.tsx8.2 KB49d7ed0d275dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/kit/core.tsx2.7 KB4c0d728d195cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/kit/Depth.tsx5.2 KBefb26728d20cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/kit/Explain.tsx22 KB3a41dbe4ecdeupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/kit/Map.tsx4.6 KB7582d2369b75upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/kit/NotoEmoji.tsx3.3 KB1aa2ea9ac0f8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/kit/Overlay.tsx11 KBfa4fc48de9d1upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/kit/Polish.tsx8.0 KBb9e180aef22cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/kit/registry.tsx4.5 KBa7030609c2e7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/kit/Text.tsx9.9 KBcef33088cb12upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/kit/Wangan.tsx17 KB2a1ac339a567upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/AudioReactive.tsx8.4 KB7c0ac71694beupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/brand.tsx2.3 KB4023b2e9a16eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/Carousel3D.tsx4.4 KBc2b454c6a119upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/ChipReveal3D.tsx5.9 KBcb50bc6eec28upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/CubeField.tsx3.2 KB4b0c31980ab7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/DataStory.tsx10 KB397784fcd1ffupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/DeviceSwing.tsx2.8 KB4f31319faa09upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/DualBattery.tsx2.7 KB2221fa88e469upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/FlowPipeline.tsx4.3 KB86d82840beedupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/FoldablePhone3D.tsx13 KBa2c64a54ab9cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/Gallery3D.tsx5.3 KBc736c4183e58upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/geist.ts827 B77271c425c22upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/IconTile.tsx2.3 KBb7bb296667f5upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/InfiniteZoom.tsx4.2 KB679c089017e6upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/KineticList.tsx3.6 KBb20ce2300ff7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/Liquid.tsx8.3 KB6e1336ed8dedupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/Logo3D.tsx9.3 KBfd8e9cad0c4aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/motion.ts2.2 KBaf764d1a823aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/MotionKit.tsx15 KB53297eb8fa50upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/PaperCut3D.tsx7.6 KB33d53242e5e2upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/ParticleText.tsx3.7 KB6663ae470e8bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/PromptToVideo.tsx14 KB6813e486e66eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/ProofBeats.tsx6.7 KB35900e447515upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/relay/index.tsx24 KB7ca5d8a44ce2upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/ReportBuild.tsx13 KB4dbf40632f55upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/RepoStack.tsx5.3 KB279f5e90a5ceupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/sfx.tsx1.9 KBa7a2d6094c2cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/SolarSystem3D.tsx5.8 KB0a0ca52f9163upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/spring.ts2.5 KBc5128f53183dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/StatSlam.tsx3.9 KB3f586e52e2bbupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/TemplateWall.tsx6.6 KB55ce1a9e626eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/TerminalDemo.tsx8.6 KB3a881f2f3b42upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/ToolBeats.tsx5.4 KBf4b1bef37ff3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/VerticalPoem.tsx1.3 KBf223f303ab58upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/VideoMontage.tsx4.8 KB5858bb3ec3a4upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/VoxelPortrait.tsx9.4 KB96400faecc09upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/cinematic/XRayReveal.tsx5.0 KBb57cffac1a37upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons.ts1.4 KBc7c6e2a57885upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/AnimatedIcon.tsx2.4 KBebdcc78572a9upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/cn.ts183 B4a78c494076fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/a-arrow-down.tsx2.8 KBd3b7c344af8bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/a-arrow-up.tsx2.8 KBb6bc8fb613f9upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/accessibility.tsx3.7 KBf487fde0418dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/activity.tsx2.6 KBdd1a54363442upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/air-vent.tsx2.9 KB39e08858f2aaupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/airplane.tsx3.7 KB4ef9d4c16857upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/airplay.tsx3.0 KB0e06d1d4b319upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/alarm-clock-check.tsx4.1 KB7c08120e4e1bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/alarm-clock-minus.tsx3.8 KB46a1e6acfb3cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/alarm-clock-plus.tsx4.0 KB805723553804upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/alarm-clock.tsx4.1 KB5a78d2fb2056upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/alarm-smoke.tsx3.4 KB67e8ff6957bcupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/align-center.tsx2.4 KBec877e59900dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/align-horizontal.tsx2.9 KBbc6fa6179407upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/align-left.tsx3.0 KB8713b7e23b91upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/align-right.tsx3.0 KB9d47bfd669eeupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/align-vertical.tsx2.9 KB91c91e9cc703upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/ambulance.tsx5.0 KBf32c6fcda8fbupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/angry.tsx3.8 KB9cb986b93a0dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/annoyed.tsx3.8 KB87ed731c4f62upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/archive.tsx3.1 KBb731989588b2upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-big-down-dash.tsx2.5 KBc2795e239a42upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-big-down.tsx2.3 KBe48a3e5ba2d2upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-big-left-dash.tsx2.5 KB4929219ca28aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-big-left.tsx2.3 KBaa6d32d3e3c0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-big-right-dash.tsx2.5 KB63b5c487f578upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-big-right.tsx2.3 KB96cb782b30abupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-big-up-dash.tsx2.4 KB59b65c8c48a3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-big-up.tsx2.4 KBbed50995b011upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-down-0-1.tsx2.9 KBbceb7f7debf7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-down-1-0.tsx2.9 KBabee2559a606upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-down-a-z.tsx2.8 KB61f9e93e2625upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-down-left.tsx2.6 KB773f99de2892upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-down-right.tsx2.7 KBa0905a394d58upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-down-z-a.tsx2.8 KB02caea522d27upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-down.tsx2.6 KBe9b0fbc43255upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-left.tsx2.6 KB4b02bdcec53eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-right.tsx2.6 KB23f77dceae88upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-up-left.tsx2.4 KBc6a6671b309bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-up-right.tsx2.3 KB65cb522bbea6upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/arrow-up.tsx2.6 KB2808f787ffd4upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/at-sign.tsx3.0 KB4549688e3238upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/atom.tsx3.1 KB0b4c51c9298cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/attach-file.tsx2.6 KBb2c4fee3793dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/audio-lines.tsx3.6 KBae04e71996eaupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/axe.tsx2.7 KB7cca61bb2391upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/badge-alert.tsx2.6 KBfddfc57cc246upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/badge-percent.tsx2.6 KB9f030a1e6ad9upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/ban.tsx3.0 KB1c4d94ebb37bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/banana.tsx2.8 KBec5e75de00c9upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/battery-charging.tsx2.6 KBde4b72b578a6upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/battery-full.tsx3.2 KB34f32e9164afupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/battery-low.tsx2.8 KBf58e169fd53bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/battery-medium.tsx2.9 KB915e3b14c032upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/battery-plus.tsx2.7 KBf545cc2037d5upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/battery-warning.tsx2.6 KB1d9303e06680upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/battery.tsx2.5 KB8d247da969efupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/bell-electric.tsx3.5 KB0c18df532f33upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/bell.tsx2.3 KBc903d4a4530cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/biceps-flexed.tsx3.1 KBaaaa9908186dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/binary.tsx4.7 KB23e0e5004808upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/blocks.tsx2.3 KB11b83f1fdfeeupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/bluetooth-connected.tsx3.1 KBdd2da44305c3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/bluetooth-off.tsx2.8 KB78473c461689upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/bluetooth-searching.tsx2.9 KB8f7b59c499fdupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/bluetooth.tsx2.5 KB8816bdfb6efbupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/bold.tsx2.3 KB6b5e244ca481upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/bone.tsx2.4 KB4d3f07eec6c7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/book-text.tsx2.6 KB458c0ce1c0adupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/bookmark-check.tsx2.8 KB0657142fe279upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/bookmark-minus.tsx2.8 KB676a09043e2bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/bookmark-plus.tsx3.1 KBb0e8f5aef279upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/bookmark-x.tsx3.2 KB157d4288e2a5upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/bookmark.tsx2.4 KB82610afc21f0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/bot-message-square.tsx4.5 KB0ca4ac96ab80upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/bot.tsx3.0 KB319963c69c9dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/box.tsx2.8 KB515a14cd2a65upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/boxes.tsx3.1 KB4ddc914646edupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/brain.tsx4.7 KBa2403ce74fb2upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/briefcase-business.tsx2.6 KB7418e21d080dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/calendar-check-2.tsx2.6 KB1d50cc41b0ddupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/calendar-check.tsx2.6 KB2e6179d57b28upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/calendar-cog.tsx2.8 KB7e0225204a64upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/calendar-days.tsx2.9 KB3c0406e108ebupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cart.tsx2.6 KBe040e5a253deupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cast.tsx2.7 KBaa2c57d0a2f8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cctv.tsx3.1 KB6ff2f5060293upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chart-bar-decreasing.tsx3.2 KB8df7c1523028upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chart-bar-increasing.tsx3.2 KB9e6563a14620upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chart-column-decreasing.tsx3.2 KBd799a4aec202upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chart-column-increasing.tsx3.2 KB0eeb0afb3904upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chart-line.tsx2.4 KB07ad2cbc8c7bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chart-no-axes-column-decreasing.tsx3.2 KB309bbb3d4502upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chart-no-axes-column-increasing.tsx3.2 KB06b0e604d22cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chart-pie.tsx2.5 KBd8623b74a419upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chart-scatter.tsx3.3 KBd3b9346b7220upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chart-spline.tsx2.4 KB446fe0af9e00upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/check-check.tsx2.8 KBf5698af0435bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/check.tsx2.5 KB0f660f0f244bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chess-bishop.tsx3.0 KB2f782321f803upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chess-king.tsx2.9 KBe5079ee279ffupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chess-knight.tsx2.9 KB51a8a75d9473upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chess-pawn.tsx3.6 KBc5f689a53c8bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chevron-down.tsx2.3 KB3c1f026e6c96upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chevron-first.tsx2.4 KBf3a96c7f46cfupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chevron-left.tsx2.3 KBc0e29e0cbc74upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chevron-right.tsx2.2 KB7423739a6caaupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chevron-up.tsx2.3 KB53c2dbaedacaupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chevrons-down-up.tsx2.6 KBee4f88404fd3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chevrons-left-right.tsx2.6 KB6fdc0a42f1e0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chevrons-right-left.tsx2.6 KB557f1c0f168dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chevrons-up-down.tsx2.6 KB3b508789e6f6upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/chrome.tsx3.1 KB7aaca2fca90bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cigarette-off.tsx3.0 KBca22b90112a1upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cigarette.tsx2.8 KB67ad7d410ae5upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/circle-check.tsx2.5 KB213e2593b287upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/circle-chevron-down.tsx2.3 KB6658c46aa4fdupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/circle-chevron-left.tsx2.3 KB2843c4a2e570upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/circle-chevron-right.tsx2.3 KBbc2cda614145upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/circle-chevron-up.tsx2.3 KBc8a15ec9aaefupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/circle-dashed.tsx2.7 KB1537ce54100fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/circle-dollar-sign.tsx3.0 KB193b6b7b9fc0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/circle-gauge.tsx2.3 KB769fea44e9a3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/circle-help.tsx2.4 KB1141fce9bf2aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/clap.tsx2.9 KB682a6d9ed73aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/clipboard-check.tsx2.6 KB5859857e6af8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/clock.tsx3.0 KB5ad85f0a443eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cloud-backup.tsx2.6 KB441b788005afupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cloud-cog.tsx2.7 KBcff4a13e04ecupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cloud-download.tsx2.3 KBe7ea879dc880upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cloud-lightning.tsx2.4 KB6770fc89c891upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cloud-rain-wind.tsx2.6 KB9ce1691960cdupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cloud-rain.tsx2.7 KBfe368f2cd1f5upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cloud-snow.tsx3.0 KB72dab2b95e07upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cloud-sun.tsx3.3 KB4ad41deb53d2upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cloud-sync.tsx2.6 KB3f8a59269f61upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cloud-upload.tsx2.5 KBdfbe9647fdbcupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/coffee.tsx2.8 KBdd7608f9b6e2upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cog.tsx2.7 KBf230ab500c92upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/compass.tsx2.4 KB860ad75c40f8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/concierge-bell.tsx3.1 KBde2dc03aaa47upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/connect.tsx4.1 KB1ea8ce4efe34upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/construction.tsx2.8 KB16a58e8fce8bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/contrast.tsx2.4 KBc84b0fe079c0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cooking-pot.tsx3.0 KB2652807d3469upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/copy.tsx2.7 KB1eb9e98f9748upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/corner-down-left.tsx2.3 KB47460f103a3dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/corner-down-right.tsx2.3 KB12c51653df1fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/corner-left-down.tsx2.3 KB862976c2ef6eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/corner-left-up.tsx2.3 KB01e4ac641da0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/corner-right-down.tsx2.3 KB162fefd8722dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/corner-right-up.tsx2.3 KB08a3455132beupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/corner-up-left.tsx2.3 KB95f08dff3dc6upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/corner-up-right.tsx2.3 KB82b471165e48upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cpu.tsx3.7 KB737c26be0bb0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/credit-card.tsx2.6 KBb3a410946037upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cup-soda.tsx4.3 KBeb2d8fdf89f8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/cursor-click.tsx3.8 KB63ba791c270fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/database-backup.tsx2.5 KB86494e7f6ed1upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/delete.tsx3.3 KBc021770c6f0aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/disc-3.tsx2.4 KBd58166145056upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/discord.tsx3.7 KB8e631d2a7328upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/dollar-sign.tsx3.1 KB3b4149f35d16upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/download.tsx2.4 KB6c968be94085upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/downvote.tsx2.5 KBb4e8f878a2d5upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/dribbble.tsx4.4 KBeabd696187e5upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/droplet.tsx2.5 KB9ddce5bc7b49upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/drum.tsx2.7 KBf75dc283d4edupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/earth.tsx4.0 KB445acbdde58cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/euro.tsx3.2 KB6942f9662c7dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/ev-charger.tsx2.6 KBf4d1c495cd5aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/expand.tsx3.3 KB281fba3187d9upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/external-link.tsx2.4 KBfb0a8ba673a3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/eye-off.tsx2.6 KBe69db4895fffupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/eye.tsx2.7 KB59f1077f6958upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/facebook.tsx2.5 KBcf9f9849792bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/fan.tsx2.5 KB8157df6a080aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/feather.tsx2.5 KBa5e49a740c28upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/figma.tsx3.0 KB8a40e411c98eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/file-chart-line.tsx2.4 KB33cf806c51e4upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/file-check-2.tsx2.6 KB6755c6461955upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/file-check.tsx2.6 KB9a96a50d8354upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/file-cog.tsx2.5 KBb9c8fb0f09c0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/file-pen-line.tsx2.9 KBde3b93fa6913upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/file-stack.tsx2.8 KB1187774e5b6cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/file-text.tsx4.0 KBaf243e844631upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/fingerprint.tsx4.9 KB739fe1dafe60upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/fish-symbol.tsx2.3 KBf8a7717ec0f6upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/flame.tsx2.6 KBff75cdc85448upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/flask.tsx4.6 KBd0475f7c9b36upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-archive.tsx2.4 KB48ddccff74aeupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-check.tsx2.7 KBde2c1a30452fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-clock.tsx3.2 KB433d4f836e88upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-code.tsx2.8 KBa19d766b7fcbupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-cog.tsx2.8 KB6caf7284b515upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-dot.tsx2.5 KB290479383c0cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-down.tsx2.6 KB89a997a3dd87upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-git-2.tsx3.8 KB2eb446281a2cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-git.tsx2.9 KB9d8d43893497upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-heart.tsx2.7 KB5e71fbd85194upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-input.tsx2.6 KB2c39a118fa1bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-kanban.tsx2.7 KB13b1eba6e424upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-key.tsx2.7 KB3684f2c62d35upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-lock.tsx2.7 KBa512fac3655dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-minus.tsx2.5 KB57b2eb149aaeupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-open.tsx2.6 KB988d6d916844upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-output.tsx2.5 KB42425614b73eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-plus.tsx2.8 KBc1778ba5bc31upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-root.tsx2.7 KBf063e2165115upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-sync.tsx2.7 KB30f3a348666aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-tree.tsx3.9 KB75613faf3ef0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-up.tsx2.5 KB978afc111a60upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folder-x.tsx2.6 KB65462ab6b5bbupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/folders.tsx3.1 KB2fd3fa9ad550upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/frame.tsx3.6 KBe3ba32363e60upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/frown.tsx4.2 KB5f8aeeef53aeupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/gallery-horizontal-end.tsx2.7 KBf4ca80096b47upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/gallery-thumbnails.tsx2.4 KB09bad6682046upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/gallery-vertical-end.tsx2.7 KB7da4f384a7d3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/gauge.tsx2.5 KB0bb67ddfd982upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/gavel.tsx2.6 KB77275d7efcdaupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/georgian-lari.tsx3.3 KB43d2bd7a3c4aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/git-branch.tsx4.4 KBa2b39d3b33ecupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/git-commit-horizontal.tsx2.7 KB7b1be0c01411upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/git-commit-vertical.tsx2.6 KBb6d6171ea432upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/git-compare-arrows.tsx4.8 KBbb0e81aad3e3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/git-compare.tsx4.3 KB63184f6bd2c2upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/git-fork.tsx4.8 KBf9d4c0fe0bb7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/git-graph.tsx5.4 KBfcf6b81fe735upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/git-merge.tsx3.7 KB5b5368d4e94fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/git-pull-request-closed.tsx4.9 KBb75a87e6ec46upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/git-pull-request-create.tsx4.6 KB643705538ac9upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/git-pull-request.tsx4.0 KB690b353ed6d3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/github.tsx3.6 KBf8d726596920upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/gitlab.tsx2.8 KBa7488d325ce5upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/graduation-cap.tsx2.8 KB0136b3baead4upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/grip-horizontal.tsx3.2 KBce20f38dfc15upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/grip-vertical.tsx3.2 KB1247b8c7e314upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/grip.tsx3.2 KBf5e55d777e58upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/hammer.tsx2.7 KBf25b0201f68eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/hand-coins.tsx3.4 KBf5698c4ccfc9upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/hand-fist.tsx2.8 KBc22cba31b670upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/hand-grab.tsx2.6 KBc9b5ad27102cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/hand-heart.tsx2.9 KB6859c8ea6e83upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/hand-helping.tsx2.5 KB42ed60ab642cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/hand-metal.tsx2.6 KB8abbd1e017c3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/hand.tsx2.5 KBfe5a4968580fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/hard-drive-download.tsx2.4 KB39a7d60436d4upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/hard-drive-upload.tsx2.4 KB6e927af412caupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/hat-glasses.tsx3.1 KBe5be6cca631cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/heart-handshake.tsx2.7 KB1e2e3984d28eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/heart-pulse.tsx3.9 KB51e62e12cfa6upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/heart.tsx2.3 KBdb2991c1c538upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/history.tsx3.5 KBc0feb1b98ddfupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/home.tsx2.5 KB7e6638400e0fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/hourglass.tsx2.7 KB56307a07938aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/id-card.tsx2.9 KBf80534098d59upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/index.ts37 KB467a0d55c07cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/indian-rupee.tsx3.6 KB13649d931e7fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/instagram.tsx4.3 KB7f675fe4c7d5upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/italic.tsx3.0 KB756d3875d20fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/japanese-yen.tsx3.3 KB91e98829afd5upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/key-circle.tsx2.5 KB036de1d94930upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/key-square.tsx2.6 KB2292b2a29ed9upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/key.tsx2.7 KB92d4d2d726a5upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/keyboard.tsx3.2 KB4bd88d620740upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/languages.tsx3.8 KB338ba837fc09upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/laptop-minimal-check.tsx2.6 KBed0fc133cc65upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/laugh.tsx3.9 KBdd8464bf2786upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/layers.tsx3.0 KBad8b509f7685upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/layout-grid.tsx3.9 KB33e5ad5d90e7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/layout-panel-top.tsx3.4 KBc905539962ffupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/leaf.tsx2.5 KB7ce0edbeb76dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/leafy-green.tsx2.7 KBd82e08c20314upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/LICENSE1.0 KB6148b13f96d4upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/link-2.tsx2.7 KB800105209d1dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/link.tsx2.7 KB26e0cda5998eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/linkedin.tsx4.3 KB3e74354f6d1bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/loader-circle.tsx2.4 KB731f7d6d6bbcupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/loader-pinwheel.tsx2.6 KB2e6f2bb4dba8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/loader.tsx2.8 KBa590cac16ddbupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/lock-keyhole-open.tsx2.7 KBd0fd40c63293upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/lock-keyhole.tsx2.9 KB9f8516c2de54upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/lock-open.tsx2.8 KBa93f8c8acc69upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/lock.tsx2.8 KB9ea717b69e0eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/login.tsx2.5 KB02ca465aa07dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/logout.tsx2.5 KBe9c6340dc71bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/mail-check.tsx2.7 KB965090e91ba7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/mailbox.tsx2.7 KB9adf5f05181eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/map-pin-check-inside.tsx2.7 KB83820f8d0ef9upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/map-pin-check.tsx2.9 KB1961c1f6e8b1upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/map-pin-house.tsx2.9 KBff77a3d7f69eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/map-pin-minus-inside.tsx2.7 KBca6ae7619f6bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/map-pin-minus.tsx2.9 KBc5029e9545a3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/map-pin-off.tsx3.0 KBda54f299f820upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/map-pin-plus-inside.tsx3.1 KBac3ff7d5df67upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/map-pin-plus.tsx3.3 KBde0f6a4b08dbupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/map-pin-x-inside.tsx3.1 KB95f2b1ffca6aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/map-pin.tsx2.8 KB7f3722af1db1upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/maximize-2.tsx2.7 KB203d7e8ff40fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/maximize.tsx3.3 KB47d3f7196771upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/meh.tsx4.1 KB1c660637318bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/menu.tsx3.0 KBd74f0985f4f9upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/message-circle-check.tsx2.6 KBe2270937636eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/message-circle-dashed.tsx2.7 KB664279ed2875upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/message-circle-more.tsx2.8 KB6ab3fe5341bcupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/message-circle-plus.tsx3.1 KBeef58eaaf061upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/message-circle-x.tsx3.0 KB00ee13991951upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/message-circle.tsx2.4 KBfb3537fa7439upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/message-square-check.tsx2.6 KBa81b30531cc7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/message-square-dashed.tsx2.6 KBa2f567967616upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/message-square-more.tsx2.9 KB95aef709bfefupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/message-square-plus.tsx3.1 KBc3d299de6aa0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/message-square-x.tsx3.0 KB0bda46d42b2eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/message-square.tsx2.4 KB06d84161bd74upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/mic-off.tsx2.7 KB69bddec3d7ddupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/mic.tsx2.4 KBa94b1d695a74upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/minimize.tsx3.3 KB22eafd4a986eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/monitor-check.tsx2.5 KB65bbebff84a6upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/monitor-cog.tsx2.9 KB081571d9ab21upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/moon.tsx2.3 KBc6a8768128bcupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/nfc.tsx3.2 KB6d2f61194015upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/palette.tsx4.3 KB09f9e537b9bfupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/panel-left-close.tsx2.4 KBf0fa9f7d67a3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/panel-left-open.tsx2.3 KB5b9f4167b29dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/panel-right-open.tsx2.4 KBbfdf4517f4c7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/party-popper.tsx4.3 KBe66f8890d8bdupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/pause.tsx2.8 KB0c9d8973cb92upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/pen-tool.tsx3.0 KB7f9c25032b85upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/philippine-peso.tsx3.1 KBe34884258c5dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/phone-call.tsx3.8 KB5e97ea3cbebcupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/phone-forwarded.tsx3.2 KBfdb94c544a23upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/phone-incoming.tsx2.9 KB01e7108289deupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/phone-missed.tsx3.1 KB57d69d02387cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/phone-off.tsx2.6 KB6d0b9130623bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/phone.tsx2.5 KB5ffaffdc1af1upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/pickaxe.tsx2.9 KB0cfc3375c641upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/plane-landing.tsx2.8 KBa9a80a8e291cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/plane-takeoff.tsx2.7 KBc1a7d85bbd06upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/play.tsx2.4 KB1342bc43e321upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/plug-zap.tsx2.5 KB33c11480ca30upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/plus.tsx2.2 KBcd1d9f0829b4upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/pound-sterling.tsx3.3 KB5f2c15c3eecdupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/projector.tsx3.9 KBc239381534f1upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/rabbit.tsx2.7 KB575d73841af0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/radio-tower.tsx3.4 KBb56f5b3f4972upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/radio.tsx3.3 KB799c37109eb7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/receipt-cent.tsx3.5 KB299be835bee9upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/receipt-euro.tsx3.5 KB1aa9fdb256d6upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/receipt-indian-rupee.tsx3.6 KB3108135feb29upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/receipt-japanese-yen.tsx3.7 KB9ef15c76ce8bupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/receipt-pound-sterling.tsx3.6 KB8c223da8d7c1upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/receipt-russian-ruble.tsx3.4 KBbf8bf679390dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/receipt-swiss-franc.tsx3.5 KB4acbd5cc8081upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/receipt-text.tsx3.4 KBaa82754ef045upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/receipt-turkish-lira.tsx3.4 KBce0ca8769cd1upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/receipt.tsx3.5 KB222aabf67074upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/redo-dot.tsx3.0 KBe551aea897c1upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/redo.tsx2.7 KBc93230d39844upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/refresh-ccw-dot.tsx2.3 KB6be5899e62a6upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/refresh-ccw.tsx2.3 KBc29f1ec3f4cdupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/refresh-cw-off.tsx2.4 KB3b72175fdfa4upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/refresh-cw.tsx2.3 KBf96a8768ec67upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/rocket.tsx3.7 KBd63a5ad5d464upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/rocking-chair.tsx3.0 KB335a159c0dd5upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/roller-coaster.tsx2.8 KB196c7b312a61upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/rotate-ccw.tsx2.2 KBdc9d0591a798upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/rotate-cw.tsx2.2 KBe572afc0e22eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/route.tsx3.1 KB6714fbeff7dbupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/router.tsx3.1 KBa20b9e4e2f0eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/russian-ruble.tsx3.0 KB1fe45e2acdb1upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/satellite-dish.tsx3.5 KBc398b3d77559upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/saudi-riyal.tsx3.0 KB8c1faa9e66d4upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/scan-face.tsx3.8 KB322b23e0c66eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/scan-text.tsx3.7 KBd116aeb47d28upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/search.tsx2.3 KB326e0d9d2976upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/send.tsx3.3 KB7f27c732bcb2upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/server-cog.tsx2.9 KB984daacb122dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/server-crash.tsx2.6 KB1a578b4de882upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/server.tsx3.0 KB56346f85dc11upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/settings.tsx2.8 KB68235989c0bcupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/shield-check.tsx2.7 KBe5db067e3cbaupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/ship-wheel.tsx2.7 KBc1fbd42ce11fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/ship.tsx3.0 KB39bdeda76162upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/shower-head.tsx3.1 KB7fba4701415cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/shredder.tsx3.5 KB857610b95046upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/shrink.tsx3.3 KB2c504e6a3f1cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/sliders-horizontal.tsx5.1 KB8864cd3aa316upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/smartphone-charging.tsx2.4 KB9898b18ec25aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/smartphone-nfc.tsx3.0 KB8ba0fc0ab0f1upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/smile-plus.tsx2.7 KB62935d5e9044upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/smile.tsx4.0 KBd493c51b589cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/snowflake.tsx2.8 KB3676f9953a1dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/soup.tsx3.1 KBdb03fb5cfff6upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/sparkles.tsx3.7 KB0efd097f8808upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/spray-can.tsx3.5 KBf59cc2801725upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/square-activity.tsx3.0 KB199eb27963ddupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/square-arrow-down.tsx2.9 KBd4d7e9d48d43upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/square-arrow-left.tsx2.9 KB70059755d3f3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/square-arrow-right.tsx2.9 KB9d48fbc8ea31upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/square-arrow-up.tsx2.9 KB514079c528f2upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/square-chevron-down.tsx2.3 KBc878a027b0fcupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/square-chevron-left.tsx2.3 KB0a6be3544da0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/square-chevron-right.tsx2.3 KB6fa4ee0a51f2upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/square-chevron-up.tsx2.3 KB0b4497da2645upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/square-pen.tsx2.5 KB67ef8b7f868cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/square-stack.tsx3.0 KBfd74167c0934upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/stamp.tsx3.2 KBb966f327a9e8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/stethoscope.tsx5.0 KBd776f935ec2aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/sun-dim.tsx2.6 KB0ea6fed410ccupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/sun-medium.tsx2.7 KBdfad96ed55feupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/sun-moon.tsx3.3 KB7103de70a4a3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/sun.tsx2.6 KB3282148af7e2upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/sunset.tsx3.2 KB2a4d982b20b3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/swiss-franc.tsx3.2 KBbdddf0812c35upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/switch-camera.tsx2.7 KB9399f73eb045upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/syringe.tsx4.1 KB43632232cc19upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/telescope.tsx3.1 KB6b981777f018upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/terminal.tsx2.4 KB84e43c697363upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/thermometer.tsx2.4 KB4f0db77e94f9upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/ticket.tsx3.1 KBe93a6638c4abupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/timer.tsx2.9 KB916c4f4d44fdupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/tornado.tsx3.2 KBc53ea7090071upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/train-track.tsx3.1 KB3f2132b882dcupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/tree-deciduous.tsx2.4 KBd37f7fe2f18eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/tree-pine.tsx2.4 KB4249a963a8ecupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/trending-down.tsx3.2 KBa26a9ca6006cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/trending-up-down.tsx3.5 KB116131075526upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/trending-up.tsx3.3 KB39b595d1ff93upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/truck.tsx4.8 KB1f9fee54925dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/turkish-lira.tsx3.2 KBbe8d215dfa57upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/twitch.tsx3.7 KB0a9356e5385fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/twitter.tsx2.6 KBe820bb743d01upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/underline.tsx2.6 KBf484fdd131a0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/undo-dot.tsx3.0 KB3bab2d8ef483upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/undo.tsx2.8 KB9b7b90a93880upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/upload.tsx2.4 KB96b56a50912aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/upvote.tsx2.5 KBf04b5ac7536fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/user-check.tsx2.6 KBce5110f103fbupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/user-plus.tsx2.7 KB8e6166b096a8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/user-round-check.tsx2.5 KBb66b67a178c1upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/user-round-cog.tsx2.7 KB559863668f46upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/user-round-plus.tsx2.8 KB06ae1a01c845upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/user.tsx2.7 KBdfc452f85fcaupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/users-round.tsx2.6 KB58d58f876f34upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/users.tsx2.6 KB73d9f68c1abbupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/vibrate.tsx2.5 KB147318d0949aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/volume.tsx3.7 KB0080a85efd3fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/wallet.tsx2.6 KBf3eb1538d983upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/washing-machine.tsx3.3 KBb6c4fec45912upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/waves-arrow-down.tsx3.0 KB7948d07e2990upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/waves-arrow-up.tsx2.9 KB17a34f087afaupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/waves-ladder.tsx2.5 KB85a245fc535dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/waves.tsx3.1 KB9057b471dc88upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/waypoints.tsx3.4 KB6790421ed914upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/webhook.tsx2.8 KB056c0e1d9623upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/wifi-cog.tsx2.8 KBa026414b26e2upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/wifi-low.tsx4.6 KB6ef176059e95upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/wifi-pen.tsx2.6 KB1b135619674aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/wifi-sync.tsx2.7 KB317bed7af279upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/wifi.tsx2.9 KBb8c58872f727upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/wind-arrow-down.tsx3.3 KB19dec790ee61upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/wind.tsx2.9 KB589225bf0da6upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/workflow.tsx2.9 KBfc5908fae1aaupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/wrench.tsx2.7 KBe402c2bedeaaupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/x.tsx2.4 KBf883be3dfbf8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/youtube.tsx3.5 KBd2639c00a777upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/zap-off.tsx2.8 KB4c1a677a1ccdupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/la/zap.tsx2.5 KB51fbe9f0b9a4upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/motion-shim.tsx16 KBa9d5cf213be1upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/icons/NotoEmoji.tsx3.3 KB1aa2ea9ac0f8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/memt/Film.tsx3.8 KB4e7fd3638895upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/memt/kit.tsx7.2 KBd5451adfb0e0upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/memt/MemParticle.tsx3.8 KB6a31f3670d73upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/memt/scenesA.tsx24 KBb0b32ab1b1c5upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/memt/scenesB.tsx23 KB4ab8924c2208upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/memt/scenesC.tsx11 KB317b7ea262efupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/types.ts2.6 KBc42df57208ecupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/ref/vo.json5.7 KBd78c264fc278upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/Root.tsx300 Bfef614aef2a3upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/src/timeline.json3.2 KB90a3acaac26aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/launch-169/tsconfig.json328 Baad5670c0e6fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/package.json886 B4f12f1354fc2upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/pipeline/build_tasks.py4.7 KBb12f2cfda347upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/pipeline/build_tl.py5.9 KBb67361919f3eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/pipeline/plan.py5.6 KBdd928b759bbbupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/pipeline/qa.py3.2 KB33b1bf460d92upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/remotion.config.ts319 B5ad873f89795upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/src/index.ts92 Be20ec58da68aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/src/kit/Annotate.tsx7.0 KB488c6e88fc06upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/src/kit/Beast.tsx8.2 KB49d7ed0d275dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/src/kit/core.tsx2.7 KB4c0d728d195cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/src/kit/Depth.tsx5.2 KBefb26728d20cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/src/kit/Explain.tsx22 KB3a41dbe4ecdeupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/src/kit/Map.tsx4.6 KB7582d2369b75upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/src/kit/NotoEmoji.tsx3.3 KB1aa2ea9ac0f8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/src/kit/Overlay.tsx11 KBfa4fc48de9d1upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/src/kit/Polish.tsx8.0 KBb9e180aef22cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/src/kit/registry.tsx4.5 KBa7030609c2e7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/src/kit/Text.tsx9.9 KBcef33088cb12upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/src/kit/Wangan.tsx17 KB2a1ac339a567upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/src/qa3.json7.1 KBfca80c864f69upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/src/Root.tsx269 B1fa914081f54upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/src/tl.json31 KB174acae88752upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/src/Tutorial.tsx69 KBd089cdec876eupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/multihost-169/tsconfig.json328 Baad5670c0e6fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/package.json886 B4f12f1354fc2upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/remotion.config.ts319 B5ad873f89795upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/src/index.ts92 Be20ec58da68aupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/src/kit/Annotate.tsx7.0 KB488c6e88fc06upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/src/kit/Beast.tsx8.2 KB49d7ed0d275dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/src/kit/core.tsx2.7 KB4c0d728d195cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/src/kit/Depth.tsx5.2 KBefb26728d20cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/src/kit/Explain.tsx22 KB3a41dbe4ecdeupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/src/kit/Map.tsx4.6 KB7582d2369b75upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/src/kit/NotoEmoji.tsx3.3 KB1aa2ea9ac0f8upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/src/kit/Overlay.tsx11 KBfa4fc48de9d1upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/src/kit/Polish.tsx8.0 KBb9e180aef22cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/src/kit/registry.tsx4.5 KBa7030609c2e7upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/src/kit/Text.tsx9.9 KBcef33088cb12upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/src/kit/Wangan.tsx17 KB2a1ac339a567upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/src/Root.tsx269 B1fa914081f54upstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/src/tl.json20 KBc41405795a9cupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/src/Tutorial.tsx51 KB83beebe23f7dupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

  • skills/digital-human-koubo/templates/reference/tutorial-169/tsconfig.json328 Baad5670c0e6fupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

Plain-text copy, no login: /skill-bundles/andyhuo520-digital-human-koubo-skills-digital-human-koubo.md

// REPO STATS

1.6k stars