Use when generating new content that must match an established writing style profile. Loads the style profile from style-analyzer, constructs a style-constrained system prompt, generates content, and performs A/B comparison against original samples for quality verification.
Installs into .claude/skills of the current project.
Are you the author of Voice Clone Generator?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/oimiragieo-voice-clone-generator)
---
name: voice-clone-generator
description: >-
Use when generating new content that must match an established writing style profile. Loads the style
profile from style-analyzer, constructs a style-constrained system prompt, generates content, and
performs A/B comparison against original samples for quality verification.
version: 1.0.0
source: builtin
trust_score: 100
provenance_sha: bfc77010f8713433
---
# Voice Clone Generator
## Overview
Generate new content that authentically mimics a specific author's writing style. Uses the structured style profile produced by `style-analyzer` to construct generation constraints, then verifies output quality by comparing against the original samples.
**Core principle:** Generation without constraints produces generic text. The style profile is the contract between analysis and generation.
## When to Use
- After `style-analyzer` has produced a style profile at `.claude/context/data/user-style-profile.json`
- When generating blog posts, emails, documentation, or any prose in someone's voice
- When maintaining brand voice consistency across multiple content pieces
- When ghostwriting content that must read as if written by a specific person
## Prerequisites
- A valid style profile must exist at `.claude/context/data/user-style-profile.json`
- At least one original sample must be available for A/B comparison
- The content topic or brief must be provided by the user
## Workflow
### Step 1: Load Style Profile
Read the style profile and validate it has the required fields:
```javascript
const profile = JSON.parse(
fs.readFileSync('.claude/context/data/user-style-profile.json', 'utf-8')
);
// Validate required sections exist
const required = ['vocabulary', 'sentenceStructure', 'tone', 'formatting'];
for (const section of required) {
if (!profile[section]) {
throw new Error(`Style profile missing required section: ${section}`);
}
}
```
If the profile does not exist, invoke `Skill({ skill: 'style-analyzer' })` first.
### Step 2: Construct Style-Constrained System Prompt
Build a system prompt that encodes the style profile as generation constraints:
```
You are writing in the voice of a specific author. Follow these constraints precisely:
VOCABULARY:
- Prefer these words when applicable: [top 20 from profile.vocabulary.topWords]
- Use these signature phrases naturally: [profile.vocabulary.signaturePhrases]
- Vocabulary richness target: [profile.vocabulary.typeTokenRatio] type-token ratio
SENTENCE STRUCTURE:
- Target average sentence length: [profile.sentenceStructure.avgLength] words
- Mix short sentences ([shortSentenceRatio]%) with longer ones ([longSentenceRatio]%)
- Use questions at [questionFrequency]% frequency
- Average [avgCommasPerSentence] commas per sentence for clause complexity
TONE:
- Formality level: [profile.tone.formality]/5.0 ([interpret: 1=very formal, 5=very casual])
- Directness: [profile.tone.directness]/5.0 ([interpret: 1=hedged, 5=blunt])
- Emotional expression: [profile.tone.emotion]/5.0
- Humor: [profile.tone.humor]/5.0
- Authority: [profile.tone.authority]/5.0
FORMATTING:
- Paragraphs should average [profile.formatting.avgParagraphLength] sentences
- Use heading depth up to H[profile.formatting.headingDepth]
- Include approximately [profile.formatting.listFrequencyPer1000] lists per 1000 words
- [If emDashFrequency > 0.02: "Use em-dashes frequently"]
- [If exclamationFrequency < 0.01: "Avoid exclamation marks"]
```
### Step 3: Generate Content
Using the constructed system prompt, generate the requested content. The generation should:
1. Follow the topic/brief provided by the user
2. Adhere to all style constraints from Step 2
3. Be original text -- not copied from the samples
4. Match the approximate length requested by the user
### Step 4: A/B Compare with Original Samples
After generation, compare the output against the original samples on these dimensions:
| Metric | How to Measure | Acceptable Deviation |
| -------------------- | ----------------------------------------------- | --------------------- |
| Avg sentence length | Count words per sentence in generated text | Within 20% of profile |
| Vocabulary overlap | % of top-50 words that appear in generated text | At least 40% |
| Tone formality | Re-score generated text on formality scale | Within 0.5 of profile |
| Paragraph length | Count sentences per paragraph in generated text | Within 30% of profile |
| Punctuation patterns | Count em-dashes, semicolons per sentence | Within 50% of profile |
### Step 5: Refine if Needed
If any metric exceeds acceptable deviation:
1. Identify the specific constraint that was violated
2. Strengthen that constraint in the system prompt
3. Regenerate the content
4. Re-compare
Maximum 3 refinement iterations. After 3 iterations, deliver the best result with a deviation report.
### Step 6: Deliver with Quality Report
Provide the generated content along with a quality summary:
```markdown
## Voice Clone Quality Report
**Profile Used:** user-style-profile.json (N samples, M total words)
| Metric | Target | Actual | Status |
| ------------------- | ------ | ------ | ------ |
| Avg sentence length | 18.3 | 17.8 | PASS |
| Vocabulary overlap | >= 40% | 45% | PASS |
| Tone formality | 2.8 | 3.1 | PASS |
| Paragraph length | 3.2 | 3.5 | PASS |
| Refinement rounds | - | 1 | - |
```
## Iron Laws
1. **ALWAYS** load the style profile before generating any content -- generation without profile constraints produces generic output that does not match the target voice.
2. **NEVER** copy verbatim sentences or distinctive phrases from the original samples into generated content -- the goal is to replicate patterns, not plagiarize.
3. **ALWAYS** perform A/B comparison after generation -- unverified output may drift significantly from the target voice without detection.
4. **NEVER** exceed 3 refinement iterations -- diminishing returns beyond 3 rounds; deliver the best result with a deviation report instead.
5. **ALWAYS** include a quality report with the delivered content -- the consumer needs to know how closely the output matches the target voice.
## Anti-Patterns
| Anti-Pattern | Why It Fails | Correct Approach |
| ------------------------------------------------------- | ----------------------------------------------------- | -------------------------------------------------------- |
| Generating without loading the style profile | No constraints; output is generic | Always load and validate profile before generation |
| Hardcoding style constraints instead of reading profile | Constraints become stale; do not match actual samples | Read from `.claude/context/data/user-style-profile.json` |
| Copying memorable phrases from samples | Plagiarism detection; not authentic style transfer | Extract patterns (word frequency, tone) not content |
| Skipping the comparison step | No quality signal; style drift goes undetected | Always run A/B comparison on all five metrics |
| Infinite refinement loop | Diminishing returns; wastes tokens and time | Cap at 3 iterations; deliver best result with report |
## Integration with style-analyzer
This skill depends on `style-analyzer` for its input:
```
[User samples] --> style-analyzer --> user-style-profile.json --> voice-clone-generator --> [Generated content]
```
If `user-style-profile.json` does not exist when this skill is invoked, the agent should invoke `style-analyzer` first.
## Assigned Agents
This skill is used by:
- `voice-replicator-agent` -- Primary consumer for style-constrained content generation
## Memory Protocol (MANDATORY)
**Before starting:**
```bash
node .claude/lib/memory/memory-search.cjs "voice clone generation style constraints"
```
Read `.claude/context/memory/learnings.md`
**After completing:**
- New generation pattern -> `.claude/context/memory/learnings.md`
- Quality issue found -> `.claude/context/memory/issues.md`
- Constraint tuning decision -> `.claude/context/memory/decisions.md`
> ASSUME INTERRUPTION: Your context may reset. If it's not in memory, it didn't happen.