Not in the top 1,000 by GitHub stars

aligh98/tts-director

Agent skill that directs scripts for TTS (ElevenLabs v3/v4 tags): rewrite for the ear, tag budget, free linter, A/B tester. | اسکیلی برای کارگردانی متن قبل از TTS: بازنویسی برای گوش، تگ<U+200C>گذاری بدون زیاده<U+200C>روی، لینتر رایگان و تست A/B. فارسی<U+200C>محور.

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

SKILL.md

Week of Nov 2, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 251c8e28e126

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 251c8e28e1264f3490007a1dcac2635f68d94bd2

78GitHub stars
Not availablestars in 7 days
1skill in this repository
5commits in 30 days

Heat

Insufficient history

Not enough history yet to measure heat. It appears after a few days of data.

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Nov 3, 2026Nov 7, 202678

30-day change not yet available: not enough history.

Individual skills in this repository

How it works

tts-director

When your agent uses it

Direct a script for text-to-speech so it sounds like a real, engaged human, not a narrator reading. Persian (Farsi) first, English supported. It rewrites the text for the ear, maps the beats of a short-form video (reel, TikTok, Short), and adds ElevenLabs v3/v4 audio tags only where they earn their place ([excited], [whispers], [laughs], [chuckles], [gasps], [sighs], [sarcastic]...). It checks for over-tagging with a free linter and A/B-tests risky lines on the real voice before a full run. It also covers model rules (eleven_v4 ignores speed and style; multilingual_v2, flash and turbo read tags aloud) and converts the result for other TTS engines (OpenAI, Azure, Google). Use for ANY script headed to ElevenLabs or another TTS, and whenever someone wants a voice that is more exciting, emotional, expressive, human or viral, or asks about tone, emotion, laughter, pauses or pacing in TTS: «لحن»، «احساس»، «هیجان»، «خنده»، «تگ»، «انسانی<U+200C>تر»، «گوینده»، «صداگذاری».

What it loads into context

Frontmatter

267 tokens

Always available to the agent

SKILL.md

2,721 tokens

When the skill is activated

Reference documents

5,251 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Workflow
  2. Tag budget
  3. Viral arc
  4. Settings (ElevenLabs)
  5. Other TTS engines
  6. Calibrate for a new voice
  7. Files

Scripts executed separately

  • scripts/ab.py
  • scripts/tag_lint.py
  • tests/test_scripts.py

Files

  • .gitignoreasset43 bytes
  • LICENSEasset1,060 bytes
  • README.en.mddoc3,911 bytes
  • README.mddoc7,186 bytes
  • SKILL.mdcore10,153 bytes
  • assets/banner.jpgasset56,104 bytes
  • examples/reel-en.txtdoc657 bytes
  • examples/reel-fa.txtdoc929 bytes
  • references/audio-tags.mddoc3,235 bytes
  • references/english-delivery.mddoc1,507 bytes
  • references/persian-delivery.mddoc5,038 bytes
  • scripts/ab.pyruns8,234 bytes
  • scripts/tag_lint.pyruns9,566 bytes
  • tests/test_scripts.pyruns3,587 bytes
Read SKILL.md

# TTS director: write for the ear, tag the beats, test by ear

A great voiceover is about 80% text and 20% tags. The text sets the rhythm, the register and where the energy goes. Tags only push a delivery the text has already set up. A script with a tag on every line sounds like an over-acted ad and loses the viewer. A script with none often sounds read.

This skill does not replace your TTS pipeline. It prepares the text that goes into it. Scripts are stdlib Python 3.9+; ffmpeg/ffprobe are optional and give durations.

## Workflow

1. **Beat map.** Label every line with its role and a target energy from 1 to 5. The roles are:
   - HOOK
   - SETUP
   - REVEAL
   - ITEM (a list point)
   - TIP (insider advice)
View the complete source on GitHub

Skills included

  • tts-director

Repository facts

License
MIT
Created
Nov 3, 2026
Last pushed
Nov 4, 2026
Forks
2
Open issues
0
Project activity
Active

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 6, 2026

Show all 24 signals by file

.gitignore

  • Access to secretsline 1
    [Credential-related source omitted]

README.en.md

  • Network accessline 20
    It works with [Claude Code](https://claude.com/claude-code) and any agent that reads `SKILL.md` skills. The scripts are plain Python 3.9+ with no dependencies; ffmpeg is optional.
  • Network accessline 27
    git clone https://github.com/aligh98/tts-director ~/.claude/skills/tts-director
  • Access to secretsline 45
    [Credential-related source omitted]

README.md

  • Network accessline 43
    با [Claude Code](https://claude.com/claude-code) و هر ایجنتی که اسکیل<U+200C>های `SKILL.md` رو بخونه کار می<U+200C>کنه. اسکریپت<U+200C>ها با Python 3.9+ نوشته شدن و هیچ وابستگی<U+200C>ای ندارن؛ ffmpeg اختیاریه.
  • Network accessline 52
    git clone https://github.com/aligh98/tts-director ~/.claude/skills/tts-director
  • Access to secretsline 74
    [Credential-related source omitted]

scripts/ab.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 18
    [Credential-related source omitted]
  • Network accessline 36
    API = "https://api.elevenlabs.io/v1"
  • Access to secretsline 42
    [Credential-related source omitted]
  • Access to secretsline 43
    [Credential-related source omitted]
  • Access to secretsline 45
    [Credential-related source omitted]
  • Network accessline 55
    [Credential-related source omitted]
  • Network accessline 56
    [Credential-related source omitted]
  • Network accessline 57
    try:         return json.load(urllib.request.urlopen(req, timeout=600))     except urllib.error.HTTPError as e:
  • Network accessline 58
    return json.load(urllib.request.urlopen(req, timeout=600))
  • Possible obfuscationline 73
    return base64.b64decode(r["audio_base64"])
  • Possible obfuscationline 107
    pat = re.compile(rf"(?<![\w<U+0600>-ۿ]){re.escape(w)}(?![\w<U+0600>-ۿ])")
  • Access to secretsline 153
    [Credential-related source omitted]

scripts/tag_lint.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Possible obfuscationline 72
    lang = a.lang if a.lang != "auto" else ("fa" if len(re.findall(r"[<U+0600>-ۿ]", text)) > len(re.findall(r"[A-Za-z]", text)) else "en")
  • Possible obfuscationline 113
    elif re.search(r"[<U+0600>-ۿ]", x):

tests/test_scripts.py

  • Executable scriptline 1
    Executable file

How the signals fit together

Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

Some files could not be read; the facts below still hold.

Declared and executed: 1 fact
  • Contacts api.elevenlabs.io, which SKILL.md, the README and the plugin manifest do not mentionscripts/ab.py:36High confidence
Signal confidence: 23 facts
  • Network access in prose of documentationREADME.en.md:20Low confidence
  • Network access in code of documentationREADME.en.md:27Low confidence
  • Access to secrets in code of documentationREADME.en.md:45Low confidence
  • Network access in prose of documentationREADME.md:43Low confidence
  • Network access in code of documentationREADME.md:52Low confidence
  • Access to secrets in code of documentationREADME.md:74Low confidence
  • Executable script in code of a file that runsscripts/ab.py:1High confidence
  • Access to secrets in prose of a file that runs: a variable, placeholder or call, not a stored valuescripts/ab.py:18Low confidence
  • Network access in code of a file that runsscripts/ab.py:36High confidence
  • Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/ab.py:42Low confidence
  • Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/ab.py:43Low confidence
  • Access to secrets in code of a file that runsscripts/ab.py:45High confidence
  • Network access in code of a file that runsscripts/ab.py:55High confidence
  • Network access in code of a file that runsscripts/ab.py:56High confidence
  • Network access in code of a file that runsscripts/ab.py:57High confidence
  • Network access in code of a file that runsscripts/ab.py:58High confidence
  • Possible obfuscation in code of a file that runsscripts/ab.py:73High confidence
  • Possible obfuscation in code of a file that runsscripts/ab.py:107High confidence
  • Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/ab.py:153Low confidence
  • Executable script in code of a file that runsscripts/tag_lint.py:1High confidence
  • Possible obfuscation in code of a file that runsscripts/tag_lint.py:72High confidence
  • Possible obfuscation in code of a file that runsscripts/tag_lint.py:113High confidence
  • Executable script in prose of a testtests/test_scripts.py:1Low confidence

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md SKILL.md.opencode/skills/<skill-name>/
  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.