Agent skill

Narration Voice Director

by UfukNode in 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.

MITAuto-check passedMedia & Creative

Install Narration Voice Director

skills CLI
$ npx skills add UfukNode/Noustiny --skill narration-voice-director -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install UfukNode/Noustiny narration-voice-director --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ 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-src

Use ~/.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/

Facts

Skill name
narration-voice-director
GitHub stars
181
Token cost
~2.9k tokens
SKILL.md length
964 words
Files
1
Skills in repo
13
Repo updated
First seen
Licence
MIT

At a glance

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.

  • Works in 4 steps: Franchise has a canonical narrator? Use… → No canonical narrator OR tone clashes?… → Original / grounded story? No franchise… → …
  • Tasks that involve Text to speech and voice
  • SKILL.md covers When to Use, Input Shape, Output Contract and Search-Query Rules — STRICT, plus 5 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

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.

When your agent uses it

  • Tasks that involve Text to speech and voice

Example prompts

  • “/narration-voice-director”

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. Franchise has a canonical narrator? Use it. lotr → Galadriel prologue. marvel (especially MCU finale tone) → Stan Lee / Tony Stark…
  2. No canonical narrator OR tone clashes? Pick a tonal match. Comic LOTR → not Galadriel; pick a wry-elder voice (Bilbo audiobook, Stephen…
  3. Original / grounded story? No franchise narrator at all — describe the desired voice ("warm uncle storyteller", "young woman in her…
  4. Seed is empty / unintelligible? Default "professional male audiobook narrator" with query "audiobook narrator male voice over excerpt".

What it can do on your machine

Read from SKILL.md and the folder at commit 09a0c82. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    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.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~150
When it runs · the whole SKILL.md, loaded when a task matches
~2.9k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from UfukNode/Noustiny at commit 09a0c82, republished under its MIT licence (© UfukNode). 964 words, ~2,898 tokens.

Download SKILL.mdSave it as .claude/skills/narration-voice-director/SKILL.md (or your agent's skills folder).
name
narration-voice-director
description
Pick the narrator persona for a story and emit a YouTube search query that will surface a clean speaking-voice reference clip for `voice_sample_builder` to fetch. Returns {persona_label, search_query, fallback_query, 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 screams and music that diarization cannot rescue.
author
Noustiny
license
MIT
version
1.0.0

Narration Voice Director

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.

When to Use

  • User starts rendering a story for the first time → fire this skill exactly once.
  • User changes the story seed AND wants a re-render with a new voice → fire again.
  • Do NOT re-fire per beat. The narrator is story-scoped.

Input Shape

json
{
  "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".

Output Contract

Return exactly one JSON object, nothing else. First character {, last character }:

json
{
  "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.

Search-Query Rules — STRICT

The query phrasing dominates output quality. These rules are non-negotiable.

Required modifiers (pick one or more)
ModifierUse when
narrationDocumentary / audiobook / prologue style — first choice for serious tone
prologueSpecifically when targeting an opening voice-over (e.g. LOTR opening)
monologueDramatic interior speech, single speaker, calm to moderate intensity
interviewWhen the actor is famous and you want their natural speaking voice
audiobook readingBook-narration register, often the cleanest possible signal
voice overTrailer / commercial register, professional voice talent
speech excerptPublic address, lecture, TED-talk register
Forbidden modifiers — surface drama, not voice

These words are blacklisted in search_query and fallback_query:

  • scene, fight, battle, clash
  • action, climax, epic moment
  • screaming, crying, shouting
  • Any clickbait phrasing: INSANE, MIND-BLOWING, DESTROYS, etc.
Special rule: characters famous for a dramatic moment

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:

  • Target the same character in a calm context: "Galadriel prologue narration" instead of "Galadriel ring scene".
  • OR target the actor in any other context: "Cate Blanchett interview" instead of "Galadriel" at all.
Including the actor name

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.

Show full SKILL.md (363 more words)Show less

Persona Selection — by franchise & tone

Walk the inputs in this order:

  1. Franchise has a canonical narrator? Use it. 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.
  2. No canonical narrator OR tone clashes? Pick a tonal match. Comic LOTR → not Galadriel; pick a wry-elder voice (Bilbo audiobook, Stephen Fry). Grim Avatar → not Iroh; pick a gravelly-elder voice (Mako monologue).
  3. Original / grounded story? No franchise narrator at all — describe the desired voice ("warm uncle storyteller", "young woman in her twenties reading her own diary"), search by actor with audiobook material ("Tom Hanks audiobook reading", "Anne Hathaway narration").
  4. Seed is empty / unintelligible? Default "professional male audiobook narrator" with query "audiobook narrator male voice over excerpt".

Anti-patterns

  • Do NOT emit a search_query that names a single dramatic scene ("X ring scene", "Y fight scene").
  • Do NOT emit a persona_label longer than 8 words — the ticker truncates it.
  • Do NOT emit prose, markdown, code fences, alternatives lists. One JSON object.
  • Do NOT pick a multi-cast persona ("characters trade lines" is wrong — there is exactly one narrator per story).
  • Do NOT use the exact same words in search_query and fallback_query — they must approach the persona from different angles so retries actually retry.

Examples

Example 1 — LOTR fellowship-tone seed

Input:

json
{
  "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:

json
{
  "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."
}
Example 2 — Death Note grim-detective tone

Input:

json
{
  "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:

json
{
  "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."
}
Example 3 — Original grounded drama

Input:

json
{
  "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:

json
{
  "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."
}
Example 4 — Avatar (the airbender), warm-storyteller tone

Input:

json
{
  "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:

json
{
  "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."
}

Model preference

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.

Failure modes the caller must guard

  • search_query returns nothing on YouTube → caller retries with fallback_query.
  • Both queries fail → caller falls back to its baseline non-cloning TTS so the render never stalls on a missing voice sample.
  • 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

Files

Just SKILL.md in hermes-additions/skills/creative/narration-voice-director of UfukNode/Noustiny.

Open the folder on GitHubat commit 09a0c82

Compare with similar skills

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.

Narration Voice Director compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Narration Voice Director this skillUfukNode/Noustiny181—~2.9kAutomated safety check: PassMIT
Video Spec Builderfeicaiclub/video-spec-builder1k—~2.9kAutomated safety check: PassMIT
Podcastteam-attention/plugins-for-claude-natives827—~1.5kAutomated safety check: PassMIT
Lessongug007/lpm152—~1.2kAutomated safety check: PassMIT
AudiopodLeoYeAI/openclaw-master-skills2.2k—~5.5kAutomated safety check: PassMIT
Video Podcast MakerAgents365-ai/video-podcast-maker1.7k—~4.9kAutomated safety check: PassMIT

Similar skills

  • Video Spec Builder

    feicaiclub/video-spec-builder

    当用户说想做一个视频、宣传片、产品演示、动画短片、抖音/YouTube 内容,或者说要改分镜、调节奏、换镜头、调字幕、加配音、改转场时使用。通过苏格拉底式追问收集视频需求,主动激发渲染层的全部能力(TTS / 字幕 / 3D / shader / 音频反应等),输出标准化的 video-spec.md 用于渲染。

    1k GitHub stars~2.9k tokensUpdated 4 mo ago
    Media & CreativeAuto-check passed
  • Podcast

    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.

    827 GitHub stars~1.5k tokensUpdated 5 mo ago
    Media & CreativeAuto-check passed
  • Lesson

    gug007/lpm

    Make a narrated lesson video about lpm from the real desktop app, recorded on a pristine data directory.

    152 GitHub stars~1.2k tokensUpdated today
    Media & CreativeAuto-check passed
  • Audiopod

    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…

    2.2k GitHub stars~5.5k tokensUpdated 2 mo ago
    Media & CreativeAuto-check passed
  • Video Podcast Maker

    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…

    1.7k GitHub stars~4.9k tokensUpdated 7 days ago
    Media & CreativeAuto-check passed
  • Explainroo

    vincentsch/explainroo

    Make an explainer video (MP4) with a voice-over using explainroo.

    489 GitHub stars~439 tokensUpdated 4 days ago
    Media & CreativeAuto-check passed

More from UfukNode/Noustiny

All 13 skills in this repo
  • 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.

    181 GitHub stars~2.3k tokensUpdated 5 mo ago
    Auto-check passed
  • Narrative Writer

    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.

    181 GitHub stars~1.9k tokensUpdated 5 mo ago
    Auto-check passed
  • 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.

    181 GitHub stars~3.1k tokensUpdated 5 mo ago
    Auto-check passed
  • Story Scene Composer

    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.

    181 GitHub stars~2.3k tokensUpdated 5 mo ago
    Auto-check passed
  • Story Copyright Detector

    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.

    181 GitHub stars~1.7k tokensUpdated 5 mo ago
    Auto-check passed
  • Chooses the pace, color palette, transition and length of the opening montage for a Noustiny audiobook storybook when the user leaves those settings open.

    181 GitHub stars~3.2k tokensUpdated 5 mo ago
    Auto-check passed

Works with

Questions about Narration Voice Director

What does Narration Voice Director do?

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.

When should I use Narration Voice Director?

Narration Voice Director fits situations like: tasks that involve Text to speech and voice.

How do I install Narration Voice Director in Claude Code?

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.

How do I install Narration Voice Director in Codex?

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.

Can I use Narration Voice Director in Cursor, Gemini CLI or GitHub Copilot?

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.

What does Narration Voice Director need to run?

SKILL.md names no scripts, command-line tools or credentials: Narration Voice Director is instructions for the agent only.

Does Narration Voice Director access the network?

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.

Is Narration Voice Director safe to install?

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.

What licence does Narration Voice Director use?

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.

How many tokens does Narration Voice Director use?

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.

What are the alternatives to Narration Voice Director?

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.

Who maintains Narration Voice Director?

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.