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.
Heat
Insufficient historyNot 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
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 tokensAlways available to the agent
SKILL.md
2,721 tokensWhen the skill is activated
Reference documents
5,251 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Workflow
- Tag budget
- Viral arc
- Settings (ElevenLabs)
- Other TTS engines
- Calibrate for a new voice
- Files
Scripts executed separately
scripts/ab.pyscripts/tag_lint.pytests/test_scripts.py
Files
.gitignoreasset43 bytesLICENSEasset1,060 bytesREADME.en.mddoc3,911 bytesREADME.mddoc7,186 bytesSKILL.mdcore10,153 bytesassets/banner.jpgasset56,104 bytesexamples/reel-en.txtdoc657 bytesexamples/reel-fa.txtdoc929 bytesreferences/audio-tags.mddoc3,235 bytesreferences/english-delivery.mddoc1,507 bytesreferences/persian-delivery.mddoc5,038 bytesscripts/ab.pyruns8,234 bytesscripts/tag_lint.pyruns9,566 bytestests/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 GitHubSkills 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 shellAutomated signals, not a guarantee
Checked Nov 6, 2026
- No broad tool permissions
- No dangerous shell commands
- 9 network referencesin 3 files: scripts/ab.py:36 README.en.md:20 README.md:43
- 4 obfuscation signalsin 2 files: scripts/ab.py:73 scripts/tag_lint.py:72
- No instruction overrides
- 3 executable scriptsin 3 files: scripts/ab.py:1 scripts/tag_lint.py:1 tests/test_scripts.py:1
- 8 references to secretsin 4 files: scripts/ab.py:18 .gitignore:1 README.en.md:45 and 1 more
- No requests to vote in Hot
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
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 | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard 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.