[object Object]

← back to Crankd

add Jill persona stub + ElevenLabs wrapper + onboarding script + consent release template

e09786c30ee18fc49676df5c718ae7df3865e82e · 2026-05-13 10:13:49 -0700 · Steve Abrams

Files touched

Diff

commit e09786c30ee18fc49676df5c718ae7df3865e82e
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed May 13 10:13:49 2026 -0700

    add Jill persona stub + ElevenLabs wrapper + onboarding script + consent release template
---
 lib/elevenlabs.js                             |  51 ++++++++
 personas/consent-release-template.txt         | 133 +++++++++++++++++++
 personas/index.json                           |  11 ++
 personas/jill.json                            |  27 ++++
 personas/scripts/jill-recording-script.md     |  52 ++++++++
 personas/scripts/voice-cloning-onboarding.txt | 179 ++++++++++++++++++++++++++
 6 files changed, 453 insertions(+)

diff --git a/lib/elevenlabs.js b/lib/elevenlabs.js
new file mode 100644
index 0000000..ec32f95
--- /dev/null
+++ b/lib/elevenlabs.js
@@ -0,0 +1,51 @@
+'use strict';
+
+const fs = require('fs');
+const path = require('path');
+
+const PERSONAS_DIR = path.join(__dirname, '..', 'personas');
+
+function loadPersona(slug) {
+  const idxPath = path.join(PERSONAS_DIR, 'index.json');
+  if (!fs.existsSync(idxPath)) throw new Error('personas/index.json missing');
+  const idx = JSON.parse(fs.readFileSync(idxPath, 'utf8'));
+  const meta = idx.personas[slug];
+  if (!meta) throw new Error(`unknown persona: ${slug}`);
+  const file = path.join(PERSONAS_DIR, meta.file);
+  return JSON.parse(fs.readFileSync(file, 'utf8'));
+}
+
+function listPersonas() {
+  const idx = JSON.parse(fs.readFileSync(path.join(PERSONAS_DIR, 'index.json'), 'utf8'));
+  return Object.entries(idx.personas).map(([slug, meta]) => ({ slug, ...meta }));
+}
+
+async function tts({ persona, text }) {
+  const p = loadPersona(persona);
+  if (!p.elevenlabs.voice_id) {
+    throw new Error(`persona '${persona}' has no voice_id yet — record samples + run PVC submission first`);
+  }
+  const key = process.env.ELEVENLABS_API_KEY;
+  if (!key) throw new Error('ELEVENLABS_API_KEY not set');
+
+  const url = `https://api.elevenlabs.io/v1/text-to-speech/${p.elevenlabs.voice_id}`;
+  const body = {
+    text,
+    model_id: p.elevenlabs.model_id || 'eleven_turbo_v2_5',
+    voice_settings: {
+      stability: p.elevenlabs.stability ?? 0.45,
+      similarity_boost: p.elevenlabs.similarity_boost ?? 0.75,
+      style: p.elevenlabs.style ?? 0.15,
+      use_speaker_boost: p.elevenlabs.use_speaker_boost ?? true,
+    },
+  };
+  const r = await fetch(url, {
+    method: 'POST',
+    headers: { 'xi-api-key': key, 'content-type': 'application/json', accept: 'audio/mpeg' },
+    body: JSON.stringify(body),
+  });
+  if (!r.ok) throw new Error(`elevenlabs ${r.status}: ${await r.text()}`);
+  return Buffer.from(await r.arrayBuffer());
+}
+
+module.exports = { loadPersona, listPersonas, tts };
diff --git a/personas/consent-release-template.txt b/personas/consent-release-template.txt
new file mode 100644
index 0000000..c23f1d8
--- /dev/null
+++ b/personas/consent-release-template.txt
@@ -0,0 +1,133 @@
+================================================================================
+VOICE RECORDING & LIKENESS RELEASE
+Template — REVIEW WITH AN ATTORNEY BEFORE USE
+================================================================================
+
+TEMPLATE NOTICE: This document is a starting point, not legal advice. Voice
+cloning rights vary by state (California, Tennessee, New York and others
+have right-of-publicity statutes that interact with this in non-obvious
+ways). Have a licensed attorney review and adapt this before signing it
+with a real contractor or employee.
+
+================================================================================
+
+VOICE RECORDING, LIKENESS, AND DIGITAL VOICE CLONE RELEASE
+
+This Release is entered into as of ______________ ("Effective Date"), by
+and between:
+
+  CONTRIBUTOR:
+    Full legal name:  _______________________________________
+    Address:          _______________________________________
+    Email:            _______________________________________
+    Phone:            _______________________________________
+
+  COMPANY:
+    Designer Wallcoverings, by Steve Abrams
+    15442 Ventura Bl #102, Sherman Oaks CA 91403
+    steve@designerwallcoverings.com
+
+1. PURPOSE
+   Contributor will provide voice recordings ("Voice Samples") to Company.
+   Company intends to use the Voice Samples to create a digital synthetic
+   voice ("Voice Clone") via a third-party voice-cloning service (currently
+   ElevenLabs, Inc.) for use in Company products and services, including
+   but not limited to the application currently known as "CRankd".
+
+2. GRANT OF RIGHTS
+   Contributor grants Company a worldwide, royalty-free, sublicensable,
+   transferable license to:
+   (a) record, reproduce, and store the Voice Samples;
+   (b) submit the Voice Samples to ElevenLabs (and successor or alternate
+       voice-cloning vendors selected by Company) for the purpose of
+       creating, training, and maintaining the Voice Clone;
+   (c) use the Voice Clone to generate synthetic speech in Company
+       products, marketing, demos, and customer-facing features; and
+   (d) modify, derive, and combine the Voice Clone with other audio.
+
+   This license is exclusive with respect to commercial use of the Voice
+   Clone by Company; Contributor retains the right to use their own
+   natural voice for any purpose.
+
+3. NAME AND LIKENESS
+   Contributor grants Company the right to associate the Voice Clone with
+   a stage name or persona name chosen by Company (e.g., "Jill"), which
+   may or may not be Contributor's legal name. Company will NOT publicly
+   identify Contributor by legal name in connection with the Voice Clone
+   without Contributor's separate written consent.
+
+4. COMPENSATION
+   Compensation for the rights granted herein is set forth in the
+   accompanying Statement of Work / employment agreement, and is
+   acknowledged by Contributor as sufficient consideration. If no separate
+   compensation document exists, the parties will sign one before any use
+   of the Voice Clone in a commercial product.
+
+5. PROHIBITED USES (CONTRIBUTOR PROTECTIONS)
+   Company will NOT use the Voice Clone to:
+   (a) impersonate Contributor in any context that could reasonably
+       deceive Contributor's friends, family, employer, financial
+       institutions, or government agencies;
+   (b) make political endorsements or political statements;
+   (c) generate sexually explicit content;
+   (d) generate content that targets, harasses, or defames any
+       identifiable individual;
+   (e) place outbound calls to recipients who have not provided prior
+       express opt-in consent, in violation of the Telephone Consumer
+       Protection Act (TCPA) or comparable state law;
+   (f) be used in any application that violates the FCC's February 8, 2024
+       declaratory ruling regarding AI-generated voices in robocalls.
+
+6. CONTRIBUTOR REPRESENTATIONS
+   Contributor represents that:
+   (a) the voice in the Voice Samples is Contributor's own natural voice;
+   (b) Contributor is at least eighteen (18) years of age;
+   (c) Contributor has the full legal right to grant the rights herein and
+       is not bound by any conflicting agreement (e.g., union/SAG-AFTRA
+       contract, prior exclusive voice deal); and
+   (d) Contributor's Voice Samples do not infringe any third-party rights.
+
+7. REVOCATION & DELETION
+   Contributor may, at any time, request that Company:
+   (a) cease creating new audio using the Voice Clone, and/or
+   (b) delete the Voice Clone from ElevenLabs and Company's systems.
+
+   Company will honor the request within thirty (30) days of receipt at
+   the revocation email address listed below. Audio already published or
+   distributed prior to the request is not subject to recall, but Company
+   will not create new audio after the cease date.
+
+   Revocation email: ___________________________________________
+
+8. TERM
+   This Release is effective from the Effective Date and continues until
+   terminated by either party with 30 days' written notice, or by
+   Contributor exercising the revocation right in Section 7.
+
+9. GOVERNING LAW & VENUE
+   This Release is governed by the laws of the State of California,
+   without regard to its conflict-of-laws principles. Any dispute will be
+   resolved exclusively in the state or federal courts located in Los
+   Angeles County, California.
+
+10. ENTIRE AGREEMENT
+    This Release, together with any signed Statement of Work, constitutes
+    the entire agreement between the parties regarding the Voice Samples
+    and Voice Clone, and supersedes any prior understandings.
+
+CONTRIBUTOR SIGNATURE:
+
+  Signature:  _______________________________________
+  Print name: _______________________________________
+  Date:       _______________________________________
+
+COMPANY SIGNATURE:
+
+  Signature:  _______________________________________
+  Print name: Steve Abrams
+  Title:      Owner, Designer Wallcoverings
+  Date:       _______________________________________
+
+================================================================================
+END
+================================================================================
diff --git a/personas/index.json b/personas/index.json
new file mode 100644
index 0000000..8450c6e
--- /dev/null
+++ b/personas/index.json
@@ -0,0 +1,11 @@
+{
+  "version": 1,
+  "default_persona": "jill",
+  "personas": {
+    "jill": {
+      "file": "jill.json",
+      "status": "pending_recording",
+      "elevenlabs_voice_id": null
+    }
+  }
+}
diff --git a/personas/jill.json b/personas/jill.json
new file mode 100644
index 0000000..b06da51
--- /dev/null
+++ b/personas/jill.json
@@ -0,0 +1,27 @@
+{
+  "name": "Jill",
+  "slug": "jill",
+  "status": "pending_recording",
+  "elevenlabs": {
+    "voice_id": null,
+    "model_id": "eleven_turbo_v2_5",
+    "clone_type": "PVC",
+    "stability": 0.45,
+    "similarity_boost": 0.75,
+    "style": 0.15,
+    "use_speaker_boost": true
+  },
+  "persona_notes": {
+    "tone": "warm, slightly amused, never mean",
+    "pace": "conversational — pauses on punctuation",
+    "use_cases": ["fake-call escape", "opt-in friend pranks", "scheduled wake-up"]
+  },
+  "consent": {
+    "release_signed_at": null,
+    "release_signed_by": null,
+    "verification_statement_recorded_at": null,
+    "recording_minutes": 0,
+    "revocation_email": null
+  },
+  "created_at": "2026-05-13"
+}
diff --git a/personas/scripts/jill-recording-script.md b/personas/scripts/jill-recording-script.md
new file mode 100644
index 0000000..759e0a6
--- /dev/null
+++ b/personas/scripts/jill-recording-script.md
@@ -0,0 +1,52 @@
+# Jill's voice cloning script (~3 minutes at calm pace)
+
+Read everything below in your normal speaking voice — the same way you'd narrate
+a demo video for an investor. Don't perform; don't smile-talk; don't whisper.
+Pause briefly at paragraph breaks. If you stumble, just pause and pick up
+where you left off — we'll trim later.
+
+Recording requirements:
+- Quiet room. AC off if possible.
+- Phone or AirPods 2-3 inches from mouth, OR USB mic at standard distance.
+- One single-speaker take. Don't clap, don't slate, don't restart.
+- Aim for 2 min 30 sec to 3 min 30 sec total.
+
+================================================================================
+
+Hi, this is Jill. I'm recording this voice sample so my voice can be used to
+narrate calls, reminders, and friendly messages inside the CRankd platform
+built by Steve Abrams.
+
+The quick brown fox jumps over the lazy dog. She sells seashells by the
+seashore. How much wood would a woodchuck chuck if a woodchuck could chuck
+wood? The rain in Spain falls mainly on the plain. Pack my box with five
+dozen liquor jugs.
+
+CRankd is an opt-in calling service — every person on the other end of the
+line has already agreed to hear from us. The job of this voice is to feel
+warm, slightly amused, and never mean. Think "friend calling to give you an
+excuse to leave a meeting" — not "robot reading a script."
+
+Every call this voice will make starts the same way: a quick disclosure that
+the voice is A I generated, that the recipient opted in, and that they can
+press one to continue or two to stop forever. Listen for the cadence — calm,
+clear, a little playful. That energy needs to come through in the cloned
+voice too, otherwise the calls will feel hollow.
+
+Here are some numbers for prosody training: one, two, three, four, five,
+six, seven, eight, nine, ten. Twenty thousand. One hundred thousand. One
+million, two million, ten million. Three thousand four hundred and
+ninety-two. The meeting is Tuesday, January twenty-second, at three
+forty-five.
+
+A few sentences with question marks and emphasis: Did you really need an
+excuse to leave that meeting? Yes, you really did. Was the call helpful? Of
+course it was helpful — that's why you scheduled it. Now go enjoy the rest
+of your day, and remember: you can stop these any time by pressing two.
+
+When this voice calls someone, I want them to feel like a friend is on the
+line. Not a polished marketing voice. Not a phone tree. Not a robocaller.
+Just a real, warm voice walking them through whatever they signed up for.
+Calm, confident, occasionally funny, never robotic.
+
+That's the voice we're cloning. Thanks for capturing it.
diff --git a/personas/scripts/voice-cloning-onboarding.txt b/personas/scripts/voice-cloning-onboarding.txt
new file mode 100644
index 0000000..329847a
--- /dev/null
+++ b/personas/scripts/voice-cloning-onboarding.txt
@@ -0,0 +1,179 @@
+================================================================================
+CRANKD — VOICE CLONING ONBOARDING SCRIPT
+For: new employees and contractors providing voice samples for ElevenLabs PVC
+================================================================================
+
+INSTRUCTIONS FOR THE SPEAKER
+- Record in a quiet room. No fans, no AC hum, no music, no second voice.
+- Use a USB condenser mic or your iPhone Voice Memos app held ~6 inches away.
+- Speak naturally. Don't perform. Don't read like a newscaster.
+- If you misspeak, pause 2 seconds and re-read that sentence — don't restart.
+- Total target length: 30 to 45 minutes of clean audio.
+- Save the file as WAV or high-bitrate MP3 (192 kbps or higher), MONO.
+- Hand the file to Steve. Do not upload it anywhere yourself.
+
+DO NOT SKIP SECTIONS. ElevenLabs needs phonetic variety to make a good clone.
+
+================================================================================
+SECTION 1 — ELEVENLABS VERIFICATION STATEMENT  (required, read first, verbatim)
+================================================================================
+
+NOTE: ElevenLabs occasionally updates the exact wording of their PVC consent
+statement. Before recording, log in to elevenlabs.io, start the Professional
+Voice Cloning submission flow, and COPY THE CURRENT STATEMENT VERBATIM from
+their dashboard. The template below is the canonical shape — use it only if
+ElevenLabs' UI is down or as a sanity check against their current text.
+
+  "I, [SPEAKER FULL LEGAL NAME], confirm that the voice in this recording is
+   my own. I am over the age of eighteen. I am providing these voice samples
+   to ElevenLabs for the purpose of creating a Professional Voice Clone of my
+   voice. I have read, understood, and agreed to the ElevenLabs Terms of
+   Service and Privacy Policy. Today's date is [SPEAK THE DATE: MONTH, DAY,
+   YEAR]."
+
+Pause for two seconds before continuing.
+
+================================================================================
+SECTION 2 — PHONETIC RANGE PASSAGE  (≈ 3 minutes)
+================================================================================
+
+Read each paragraph at a natural conversational pace. Pause briefly between
+paragraphs.
+
+The rainbow is a division of white light into many beautiful colors. These
+take the shape of a long round arch, with its path high above, and its two
+ends apparently beyond the horizon. There is, according to legend, a boiling
+pot of gold at one end. People look, but no one ever finds it.
+
+When the sunlight strikes raindrops in the air, they act as a prism and form
+a rainbow. The rainbow is a division of white light into many beautiful
+colors. Throughout the centuries people have explained the rainbow in
+various ways. Some have accepted it as a miracle without physical
+explanation.
+
+To the Hebrews it was a token that there would be no more universal floods.
+The Greeks used to imagine that it was a sign from the gods to foretell war
+or heavy rain. The Norsemen considered the rainbow as a bridge over which
+the gods passed from earth to their home in the sky.
+
+Others have tried to explain the phenomenon physically. Aristotle thought
+that the rainbow was caused by reflection of the sun's rays by the rain.
+Since then physicists have found that it is not reflection, but refraction
+by the raindrops, which causes the rainbows.
+
+================================================================================
+SECTION 3 — NUMBERS, DATES, NAMES  (≈ 2 minutes)
+================================================================================
+
+Read clearly. These train the clone on tricky pronunciation.
+
+The meeting is scheduled for Tuesday, January twenty-second, twenty
+twenty-six, at three forty-five in the afternoon. Please confirm by replying
+to this message or calling six-one-nine, five-five-five, zero-one-four-two.
+
+The invoice total is one thousand, two hundred and forty-seven dollars and
+ninety-three cents. The order shipped on March fifteenth and should arrive
+by April second.
+
+My name is Jill. I live in Sherman Oaks, California. I work with Steve
+Abrams at Designer Wallcoverings. I can be reached at jill at example dot
+com, or by phone at the number on file.
+
+Common words people get wrong: schedule, almond, caramel, Worcestershire,
+quinoa, route, pecan, syrup, salmon, often, espresso, sherbet, library,
+Wednesday, February, candidate, mischievous.
+
+================================================================================
+SECTION 4 — EMOTIONAL & PACING RANGE  (≈ 4 minutes)
+================================================================================
+
+Read each line in the indicated tone. Don't overdo it. Subtle is better.
+
+(Calm and reassuring)
+Hi there. I just wanted to call and let you know everything is fine. There
+is nothing to worry about. Take your time and call me back whenever you can.
+
+(Mildly excited, smiling while you talk)
+You are not going to believe this, but I just heard the best news. I had to
+call you the second I found out. Are you sitting down? Okay, here it goes.
+
+(Apologetic, slower)
+I am so sorry to bother you with this. I know you are busy, and I know this
+is probably the last thing you want to hear right now. But I think you
+should know.
+
+(Confidently delivering information)
+The order has been confirmed. Your sample will ship today, and you should
+receive a tracking number by end of business. If anything changes, I will
+let you know right away.
+
+(Casually asking a question)
+Hey, quick question for you. Do you remember if we said three o'clock or
+three thirty? I just want to make sure I have it right before I head out.
+
+(Slightly tired, but warm)
+It has been a long day, but I wanted to say thank you. Honestly. I really
+appreciate everything you did this week. Get some rest.
+
+(Pretending to read off a list, neutral)
+Apples, oranges, bananas, pears, peaches, blueberries, raspberries,
+strawberries, watermelon, cantaloupe, grapes, plums, mangoes, pineapples,
+kiwis.
+
+(Quick, energetic — like leaving a fast voicemail)
+Hi, it's Jill. Sorry I missed you. Give me a call back when you get a
+chance. Talk soon. Bye.
+
+================================================================================
+SECTION 5 — FREE-FORM CONVERSATIONAL  (≈ 5 minutes)
+================================================================================
+
+Improvise. Stay in your natural voice. Suggested topics — pick three and
+talk for about ninety seconds each:
+
+  - Describe your favorite meal and how you would explain it to someone who
+    has never had it.
+  - Tell the story of how you got your first job.
+  - Describe the route from your front door to the nearest coffee shop, as
+    if you were giving directions to a friend.
+  - Talk about something you learned recently that surprised you.
+  - Describe a movie or show you watched last week, without spoilers.
+  - Explain to a ten-year-old how Wi-Fi works.
+
+Speak naturally. Use "um" and "you know" if that's how you really talk —
+the clone will sound more human for it. Do not perform.
+
+================================================================================
+SECTION 6 — CRANKD-SPECIFIC LINES  (≈ 2 minutes)
+================================================================================
+
+These are sample lines the clone is most likely to need to say. Read them
+once each in a natural, friendly tone.
+
+"Heads up — this is an A I generated voice call from Steve. You opted in
+to receive this. Press one to continue, two to stop these forever, or
+hang up at any time."
+
+"Hey, sorry to bug you. I know you said you might need a fake reason to
+leave the meeting — that's me. Just nod a few times and say 'okay, I'll
+be right there'."
+
+"Hi, this is Jill calling. Steve asked me to give you a quick wake-up
+call. You said seven-thirty. It is now seven-thirty. Time to get up."
+
+"This is a friendly reminder that your dinner reservation is in fifteen
+minutes. Have a great time tonight."
+
+"You asked me to call you in five minutes if you needed an excuse to
+leave. This is that call. You're welcome. Bye."
+
+================================================================================
+END OF SCRIPT — TOTAL TARGET 30 TO 45 MINUTES
+================================================================================
+
+After recording:
+  1. Save as WAV or 192+ kbps MP3, mono.
+  2. Listen back once to confirm no background noise / dropouts.
+  3. Send the file to Steve via the agreed channel.
+  4. Do NOT upload to ElevenLabs yourself. Steve handles submission so the
+     consent paperwork stays attached to the cloned voice.

← 64becec initial scaffold — crankd v0.1 (opt-in AI-voice calls, compl  ·  back to Crankd  ·  gitignore: exclude .bak/.pre-* snapshot artifacts 25ee12d →