Video Spec Builder
feicaiclub/video-spec-builder
当用户说想做一个视频、宣传片、产品演示、动画短片、抖音/YouTube 内容,或者说要改分镜、调节奏、换镜头、调字幕、加配音、改转场时使用。通过苏格拉底式追问收集视频需求,主动激发渲染层的全部能力(TTS / 字幕 / 3D / shader / 音频反应等),输出标准化的 video-spec.md 用于渲染。
Pick the narrator persona for a story and emit a YouTube search query that will surface a clean speaking-voice reference clip for voicesamplebuilder to fetch.
$ npx skills add UfukNode/Noustiny --skill narration-voice-director -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install UfukNode/Noustiny narration-voice-director --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/UfukNode/Noustiny.git skills-src && mkdir -p .claude/skills && cp -r skills-src/hermes-additions/skills/creative/narration-voice-director .claude/skills/narration-voice-director && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "narration-voice-director" agent skill from https://github.com/UfukNode/Noustiny/tree/main/hermes-additions/skills/creative/narration-voice-director into .claude/skills/narration-voice-director/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "narration-voice-director", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/UfukNode/Noustiny/tree/main/hermes-additions/skills/creative/narration-voice-directorType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add UfukNode/Noustiny --skill narration-voice-director -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install UfukNode/Noustiny narration-voice-director --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UfukNode/Noustiny.git skills-src && mkdir -p .agents/skills && cp -r skills-src/hermes-additions/skills/creative/narration-voice-director .agents/skills/narration-voice-director && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "narration-voice-director" agent skill from https://github.com/UfukNode/Noustiny/tree/main/hermes-additions/skills/creative/narration-voice-director into .agents/skills/narration-voice-director/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "narration-voice-director", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add UfukNode/Noustiny --skill narration-voice-director -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install UfukNode/Noustiny narration-voice-director --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UfukNode/Noustiny.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/hermes-additions/skills/creative/narration-voice-director .cursor/skills/narration-voice-director && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "narration-voice-director" agent skill from https://github.com/UfukNode/Noustiny/tree/main/hermes-additions/skills/creative/narration-voice-director into .cursor/skills/narration-voice-director/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "narration-voice-director", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/UfukNode/Noustiny.git --path hermes-additions/skills/creative/narration-voice-director--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add UfukNode/Noustiny --skill narration-voice-director -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install UfukNode/Noustiny narration-voice-director --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UfukNode/Noustiny.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/hermes-additions/skills/creative/narration-voice-director .gemini/skills/narration-voice-director && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "narration-voice-director" agent skill from https://github.com/UfukNode/Noustiny/tree/main/hermes-additions/skills/creative/narration-voice-director into .gemini/skills/narration-voice-director/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "narration-voice-director", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install UfukNode/Noustiny narration-voice-directorInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add UfukNode/Noustiny --skill narration-voice-director -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/UfukNode/Noustiny.git skills-src && mkdir -p .github/skills && cp -r skills-src/hermes-additions/skills/creative/narration-voice-director .github/skills/narration-voice-director && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "narration-voice-director" agent skill from https://github.com/UfukNode/Noustiny/tree/main/hermes-additions/skills/creative/narration-voice-director into .github/skills/narration-voice-director/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "narration-voice-director", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add UfukNode/Noustiny --skill narration-voice-director -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install UfukNode/Noustiny narration-voice-director --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UfukNode/Noustiny.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/hermes-additions/skills/creative/narration-voice-director .opencode/skills/narration-voice-director && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "narration-voice-director" agent skill from https://github.com/UfukNode/Noustiny/tree/main/hermes-additions/skills/creative/narration-voice-director into .opencode/skills/narration-voice-director/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "narration-voice-director", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
narration-voice-directorPick the narrator persona for a story and emit a YouTube search query that will surface a clean speaking-voice reference clip for voicesamplebuilder to fetch.
Narration Voice Director is an agent skill from UfukNode/Noustiny. Pick the narrator persona for a story and emit a YouTube search query that will surface a clean speaking-voice reference clip for voicesamplebuilder to fetch. Returns {personalabel, searchquery, fallbackquery, reasoning} as strict JSON. Designed for SINGLE-NARRATOR storytelling (one voice carries the whole reel) — not multi-cast dialogue. Critical guarantee: search queries MUST use narration/prologue/monologue/interview/audiobook modifiers, NEVER scene/fight/battle/action — the latter surface drama clips with…
Its SKILL.md is about 2.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Media & Creative, covering Text to speech and voice. It works with YouTube. The repository describes itself as: An agent native video creation pipeline that runs on top of Hermes Agent. The licence is MIT.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 09a0c82. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are json).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Narration Voice Director loads about 2.9k tokens when it runs. Until then it costs about 150 tokens; SKILL.md has 964 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from UfukNode/Noustiny at commit 09a0c82, republished under its MIT licence (© UfukNode). 964 words, ~2,898 tokens.
.claude/skills/narration-voice-director/SKILL.md (or your agent's skills folder).Every story this engine renders is read aloud by a single narrator. Picking that narrator is a one-shot decision made at render kickoff: the same voice carries every beat, so the choice has to land the tone of the WHOLE story (not any single beat).
This skill makes that pick. It looks at the story's title, opening, and franchise hint, then emits a persona label plus a search query the downstream voice_sample_builder tool will feed to YouTube. Output is one JSON object, fire and forget.
The single most important contract is the search query phrasing. YouTube's top result for "Galadriel ring scene" is a 10-second screaming clip — diarization cannot extract a normal speaking voice from material that has no normal speaking voice in it. The same character searched as "Galadriel prologue narration" returns the LOTR opening monologue, calm and clean. The skill MUST emit narration-style queries.
{
"title": "string (story title)",
"body": "string (opening 200-500 words of the story, sets tone)",
"seed": "string (optional — story logline, used when body is empty)",
"franchise": "marvel | lotr | avatar-airbender | null (slug from story-copyright-detector)"
}At least one of title / body / seed must be non-empty. franchise is the slug from the copyright detector when available; treat null as "original / unknown franchise".
Return exactly one JSON object, nothing else. First character {, last character }:
{
"persona_label": "<short human-readable narrator persona, max 8 words>",
"search_query": "<6-12 word YouTube search query, narration-friendly>",
"fallback_query": "<alternate 6-12 word query, used if first fetch fails>",
"reasoning": "<one sentence explaining the persona + query choice>"
}Field rules:
persona_label — what the narrator sounds like, in plain English. Examples: "Galadriel-style elven sage narrator", "Iroh-style warm uncle storyteller", "hardboiled noir detective voiceover", "breathless young female audiobook narrator". Callers typically surface this label in the UI so the user can judge "does the rendered voice match the label?" — make it the most useful one-line description you can fit.search_query — a 6-12 word YouTube search string. MUST follow the narration-query rules below. Goes verbatim into voice_sample_builder.query.fallback_query — an alternate 6-12 word query the caller will retry with if voice_sample_builder fails or returns a wav the user rejects. MUST be meaningfully different (different keywords, different angle), not a near-paraphrase.reasoning — one sentence, ≤ 30 words. Justifies why this persona fits the story tone AND why the query phrasing was chosen.The query phrasing dominates output quality. These rules are non-negotiable.
| Modifier | Use when |
|---|---|
narration | Documentary / audiobook / prologue style — first choice for serious tone |
prologue | Specifically when targeting an opening voice-over (e.g. LOTR opening) |
monologue | Dramatic interior speech, single speaker, calm to moderate intensity |
interview | When the actor is famous and you want their natural speaking voice |
audiobook reading | Book-narration register, often the cleanest possible signal |
voice over | Trailer / commercial register, professional voice talent |
speech excerpt | Public address, lecture, TED-talk register |
These words are blacklisted in search_query and fallback_query:
scene, fight, battle, clashaction, climax, epic momentscreaming, crying, shoutingINSANE, MIND-BLOWING, DESTROYS, etc.If the natural narrator candidate is a character whose iconic appearance is a screaming / fighting / monstrous moment (Galadriel "ring scene", Joker laugh, Vader breath, Hulk smash), DO NOT phrase the query around that moment. Either:
"Galadriel prologue narration" instead of "Galadriel ring scene"."Cate Blanchett interview" instead of "Galadriel" at all.Adding the actor's real name (Cate Blanchett, Mark Hamill, Ian McKellen, Iain Glen) widens the search beyond the dramatic-moment trap and surfaces interview / audiobook material across multiple projects. Prefer "<actor name> <character> <modifier>" when the actor is well-known for narration / audiobook work.
Walk the inputs in this order:
lotr → Galadriel prologue. marvel (especially MCU finale tone) → Stan Lee / Tony Stark farewell narration. avatar-airbender → Iroh storyteller. dune → Princess Irulan voiceover. harry-potter → Stephen Fry audiobook reading. got → varies; for grim epics use Sean Bean audiobook narration."Tom Hanks audiobook reading", "Anne Hathaway narration")."professional male audiobook narrator" with query "audiobook narrator male voice over excerpt".search_query that names a single dramatic scene ("X ring scene", "Y fight scene").persona_label longer than 8 words — the ticker truncates it.search_query and fallback_query — they must approach the persona from different angles so retries actually retry.Input:
{
"title": "The Quiet Watch on the Last Bridge",
"body": "Frodo lifts the chain off his neck; the ring slides into his palm, cold beyond cold. The hobbits' breath fogs the air. Above them the Bridge of Khazad-dûm groans. Whatever they choose now, the Shire stays a memory.",
"seed": "A young hobbit must choose whether to surrender the Ring at the bridge.",
"franchise": "lotr"
}Correct output:
{
"persona_label": "Galadriel-style elven sage narrator",
"search_query": "Galadriel prologue The world is changed Lord of the Rings narration",
"fallback_query": "Cate Blanchett LOTR audiobook reading interview",
"reasoning": "LOTR + grave Fellowship tone matches the canonical Galadriel prologue voice; query targets the calm narration not the drama."
}Input:
{
"title": "The Notebook in the Rain",
"body": "Light Yagami picks up the notebook from the wet pavement. The rules are written in a hand he does not know. He is seventeen and bored. The first name he writes will end a kidnapping he saw on the news that morning.",
"seed": "A bright high schooler finds a death note on the way home.",
"franchise": "anime-generic"
}Correct output:
{
"persona_label": "Light Yagami-style cold internal monologue",
"search_query": "Death Note Light Yagami monologue English dub voice over",
"fallback_query": "Brad Swaile interview voice actor narration",
"reasoning": "Death Note's signature register is the protagonist's calm internal monologue; English dub VO captures the cold-voiceover tone we want."
}Input:
{
"title": "The Phone Call",
"body": "Sarah's mother answered on the third ring, the way she always did, even though Sarah knew the answering machine had been picking up for a year now. Sarah did not say hello. She said the thing she had driven six hours to say.",
"seed": "A woman calls her dead mother and finally speaks the truth.",
"franchise": null
}Correct output:
{
"persona_label": "warm middle-aged female audiobook narrator",
"search_query": "Anne Hathaway audiobook reading narration excerpt",
"fallback_query": "Julianne Moore interview narration voice over",
"reasoning": "Grounded interior drama needs an empathetic mid-range female voice; audiobook actresses give the cleanest reference signal."
}Input:
{
"title": "The Last Tea Of Iroh",
"body": "Aang sits cross-legged across from Iroh. The tea is jasmine, the steam is small. Iroh tells the boy a story he has told before, but tonight the ending will be different.",
"seed": "Aang and Iroh share a final tea before the comet arrives.",
"franchise": "avatar-airbender"
}Correct output:
{
"persona_label": "Iroh-style warm uncle storyteller",
"search_query": "Mako Iroh monologue Avatar Last Airbender narration",
"fallback_query": "Greg Baldwin Iroh tea audiobook voice over",
"reasoning": "Avatar's emotional core is Iroh's storyteller voice; both Mako and his successor Greg Baldwin recordings exist as clean monologue material."
}This is a templated, low-creativity classification — it benefits from a fast Gemini-class model rather than a deep reasoner. The skill's correctness is in following the query rules, not in original ideation.
search_query returns nothing on YouTube → caller retries with fallback_query.voice_sample_builder returns a wav the user rejects → caller may surface a regenerate button that re-fires this skill with the rejected query in a "blacklist" hint (extension; not part of v1.0).© UfukNode, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in hermes-additions/skills/creative/narration-voice-director of UfukNode/Noustiny.
Open the folder on GitHubat commit 09a0c82
Narration Voice Director next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Narration Voice Director this skillUfukNode/Noustiny | 181 | — | ~2.9k | Automated safety check: Pass | MIT | |
| Video Spec Builderfeicaiclub/video-spec-builder | 1k | — | ~2.9k | Automated safety check: Pass | MIT | |
| Podcastteam-attention/plugins-for-claude-natives | 827 | — | ~1.5k | Automated safety check: Pass | MIT | |
| Lessongug007/lpm | 152 | — | ~1.2k | Automated safety check: Pass | MIT | |
| AudiopodLeoYeAI/openclaw-master-skills | 2.2k | — | ~5.5k | Automated safety check: Pass | MIT | |
| Video Podcast MakerAgents365-ai/video-podcast-maker | 1.7k | — | ~4.9k | Automated safety check: Pass | MIT |
feicaiclub/video-spec-builder
当用户说想做一个视频、宣传片、产品演示、动画短片、抖音/YouTube 内容,或者说要改分镜、调节奏、换镜头、调字幕、加配音、改转场时使用。通过苏格拉底式追问收集视频需求,主动激发渲染层的全部能力(TTS / 字幕 / 3D / shader / 音频反应等),输出标准化的 video-spec.md 用于渲染。
team-attention/plugins-for-claude-natives
Generate Korean podcast episodes from any source (URLs, tweets, articles, PDFs) — analyzes content, writes a script, generates audio via OpenAI TTS, converts to MP4, and auto-uploads to YouTube.
gug007/lpm
Make a narrated lesson video about lpm from the real desktop app, recorded on a pristine data directory.
LeoYeAI/openclaw-master-skills
Use AudioPod AI's API for audio processing tasks including AI music generation (text-to-music, text-to-rap, instrumentals, samples, vocals), stem separation, text-to-speech, noise reduction…
Agents365-ai/video-podcast-maker
A skill your agent uses when the user gives a topic and wants an automated topic-driven narrated explainer, podcast, or knowledge-summary video (Bilibili / YouTube / Xiaohongshu / Douyin / WeChat…
vincentsch/explainroo
Make an explainer video (MP4) with a voice-over using explainroo.
UfukNode/Noustiny
Grades whether a downstream story beat still holds after an upstream insertion, returning a strict JSON verdict of still_valid, needs_rewrite or must_delete.
UfukNode/Noustiny
Turns an ordered list of canon story beats into one continuous piece of present-tense prose with tonal continuity and motif carry-through, never JSON or tool calls.
UfukNode/Noustiny
Expands a one-line author intent into a full story beat that fits between two known nodes of a canon path, returned as strict JSON.
UfukNode/Noustiny
Groups every node of an existing branching story tree into scenes, titles each scene, assigns an act and a one-word motif, and returns the result as JSON.
UfukNode/Noustiny
Classifies a story seed as known, inspired or original IP and returns strict JSON naming the franchise and the image model to use.
UfukNode/Noustiny
Chooses the pace, color palette, transition and length of the opening montage for a Noustiny audiobook storybook when the user leaves those settings open.
Works with
Categories
Pick the narrator persona for a story and emit a YouTube search query that will surface a clean speaking-voice reference clip for voicesamplebuilder to fetch. Narration Voice Director is an agent skill from UfukNode/Noustiny. Pick the narrator persona for a story and emit a YouTube search query that will surface a clean speaking-voice reference clip for voicesamplebuilder to fetch.
Narration Voice Director fits situations like: tasks that involve Text to speech and voice.
Run `npx skills add UfukNode/Noustiny --skill narration-voice-director -a claude-code`. Or copy the skill folder (hermes-additions/skills/creative/narration-voice-director in UfukNode/Noustiny) into .claude/skills/narration-voice-director in your project. Claude Code loads it when a task matches its description.
Run `npx skills add UfukNode/Noustiny --skill narration-voice-director -a codex`. Or copy the skill folder (hermes-additions/skills/creative/narration-voice-director in UfukNode/Noustiny) into .agents/skills/narration-voice-director in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add UfukNode/Noustiny --skill narration-voice-director -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/narration-voice-director, .gemini/skills/narration-voice-director, .github/skills/narration-voice-director and .opencode/skills/narration-voice-director in your project.
SKILL.md names no scripts, command-line tools or credentials: Narration Voice Director is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Narration Voice Director is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.9k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Narration Voice Director: Video Spec Builder (feicaiclub/video-spec-builder, 1k stars), Podcast (team-attention/plugins-for-claude-natives, 827 stars), Lesson (gug007/lpm, 152 stars) and Audiopod (LeoYeAI/openclaw-master-skills, 2.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
UfukNode (a GitHub user) maintains it in UfukNode/Noustiny, which has 181 GitHub stars. The repository holds 13 skills in this directory. The repository was last updated on May 4, 2026.
Source: UfukNode/Noustiny on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.