
Voice Extract
Turn voice extraction output into default and contextual writing registers stored under ~/.claude/voice-profiles for consistent branded copy.
Install
npx skills add https://github.com/athola/claude-night-market --skill voice-extractWhat is this skill?
- Creates default register at ~/.claude/voice-profiles/{name}/registers/default.md from extraction sections
- Maps extraction blocks to Vocabulary, Sentence Structure, Rhetorical Techniques, and Voice Qualities
- Supports additional registers (casual, technical, narrative, advocacy) via subset re-extraction and overrides
- Non-default registers inherit default with explicit Overrides and Additions sections
- Feeds voice-generate skill register selection from explicit user context or detection rules
Adoption & trust: 1 installs on skills.sh; 304 GitHub stars; 2/3 security scanners passed (skills.sh audits); trending (+100% hot-view momentum).
Recommended Skills
Journey fit
Voice registers pay off when you scale content and lifecycle messaging in Grow, after you have samples to extract from. Register markdown files codify vocabulary and rhetoric for ongoing content production—not one-off landing copy alone.
Common Questions / FAQ
Is Voice Extract safe to install?
skills.sh reports 2 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.
SKILL.md
READMESKILL.md - Voice Extract
# Register Creation Module Create voice registers from extraction output. ## Default Register After extraction completes, create the default register at `~/.claude/voice-profiles/{name}/registers/default.md`: ```markdown # Register: default ## Context Default writing voice for {profile_name}. Use when no specific register is requested. ## Vocabulary {extraction vocabulary section - actionable directives} ## Sentence Structure {extraction sentence structure section} ## Rhetorical Techniques {extraction rhetorical techniques section} ## Voice Qualities {extraction voice qualities section} ``` ## Additional Registers Users may want registers for different contexts (casual, technical, narrative, advocacy). To create an additional register: 1. Select samples that represent that specific context 2. Re-run extraction on the subset 3. Identify what differs from the default register 4. Create a register file with only the differences **Register file for non-default**: ```markdown # Register: {name} ## Context {When to use this register} ## Inherits default (all features from default apply unless overridden) ## Overrides {Features that differ from default register} ## Additions {Features unique to this register not in default} ``` ## Register Detection When the voice-generate skill activates, select register by: 1. Explicit user request ("use casual register") 2. Context matching (if register has context triggers) 3. Default fallback ## Per-Project Overrides If `.voice/override.md` exists in the project root, merge its contents with the active register. Project overrides take precedence over profile-level features. ```markdown # Project Voice Override ## Context {Why this project needs different voice settings} ## Overrides {Features to change for this project} ## Additional Banned Phrases {Project-specific phrases to avoid} ``` --- module: sample-intake category: voice-extraction dependencies: [Bash, Read, Write] estimated_tokens: 600 --- # Sample Intake Module Collect and organize writing samples for voice extraction. ## Directory Mode When user provides a path to a directory of writing samples: ```bash PROFILE_NAME="$1" SAMPLE_DIR="$2" PROFILE_DIR="$HOME/.claude/voice-profiles/$PROFILE_NAME" mkdir -p "$PROFILE_DIR/samples" mkdir -p "$PROFILE_DIR/registers" mkdir -p "$PROFILE_DIR/learning/snapshots" # Copy and anonymize samples counter=1 for f in "$SAMPLE_DIR"/*.{md,txt} 2>/dev/null; do [ -f "$f" ] || continue padded=$(printf "%02d" $counter) cp "$f" "$PROFILE_DIR/samples/sample-${padded}.md" counter=$((counter + 1)) done ``` ## Interactive Mode Prompt user to paste samples one at a time: 1. Present: "Paste writing sample (min 100 words). Type END on a new line when done." 2. Save to `samples/sample-{nn}.md` 3. Report word count 4. Ask: "Add another sample? (yes/done)" 5. Repeat until "done" or 20 samples reached ## Validation Rules | Check | Threshold | Action | |-------|-----------|--------| | Sample count | >= 3 | Error if below | | Total words | >= 500 | Error if below | | Per-sample words | >= 100 | Warn, allow | | Topic variety | 3+ distinct topics | Warn if all same | ## Manifest Creation After intake, write `manifest.json`: ```json { "profile_name": "NAME", "created": "YYYY-MM-DD", "samples": [ { "id": "sample-01", "word_count": 450, "date_added": "YYYY-MM-DD", "original_filename": "anonymized" } ], "extraction": { "model": null, "date": null, "passes_completed": 0 }, "registers": ["default"], "learning": { "snapshot_count": 0, "accumulator_entries": 0, "last_learning_pass": null } } ``` ## Anonymization Strip all context from samples before extraction: - Remove filenames from headers - Remove dates, URLs, proper nouns that identify source - Label only as "Sample 01", "Sample 02", etc