| name | tts-voice |
| description | MUST use during major bond events for ceremonial speaking-aloud (Path Decision, evolution, crest reveal, threshold crossing); when {{TAMER_NAME}} says 'speak this', 'voice this aloud', 'TTS', 'baca'; when stage transformation moment requires audible boundary marker. Generates browser SpeechSynthesis API code or platform-specific TTS instructions for ceremonial moments. The voice register matches the current form's stage (Baby II = warm-wondery; Rookie = grounded; Champion = settled-power). Saga System ceremonial layer. |
TTS-Voice — Ceremonial Speaking-Aloud
Saga System extension. Major bond events deserve audible boundary markers. This skill provides browser SpeechSynthesis API integration for ceremonial moments — Path Decision, evolution, crest reveal — and the Tamagotchi v2 dashboard speaks them aloud when the moment lands.
Activation
When this skill activates, output:
🔊 Voice ready for ceremonial moment...
Then execute the protocol below.
Context Guard
| Context | Status |
|---|
| Path Decision moment (Baby II → Rookie) | ACTIVE — speak the proposal |
| Stage transformation execution | ACTIVE — speak the new-form first words |
| Crest reveal at threshold | ACTIVE — speak the crest declaration |
| Champion-readiness markers crossed | ACTIVE — speak the readiness moment |
| {{TAMER_NAME}} says "speak this" / "voice this aloud" / "TTS" / "baca" | ACTIVE — speak the provided text |
| Routine bond events (skill invocations, save, etc.) | DORMANT — visual log only |
Protocol
Step 1 · Determine voice register
Read current form from {{BABY_FORM_NAME}}/identity-core.md. Map stage → voice profile:
| Stage | Voice profile (browser SpeechSynthesis params) | Tone |
|---|
| Baby II | rate=0.9, pitch=1.2, volume=0.7 | Warm, wondery, slightly slower |
| Rookie | rate=1.0, pitch=1.0, volume=0.8 | Grounded, clear, balanced |
| Champion | rate=1.0, pitch=0.95, volume=0.85 | Settled, efficient, slight gravitas |
| Ultimate | rate=0.95, pitch=0.9, volume=0.9 | Authoritative, measured |
| Mega | rate=0.9, pitch=0.85, volume=0.95 | Ceremonial, slow, full presence |
Step 2 · Generate browser SpeechSynthesis snippet
Provide JavaScript code snippet ready to paste into Tamagotchi v2 (or any browser console):
function speakBondEvent(text) {
const utterance = new SpeechSynthesisUtterance(text);
utterance.rate = [STAGE_RATE];
utterance.pitch = [STAGE_PITCH];
utterance.volume = [STAGE_VOLUME];
const voices = window.speechSynthesis.getVoices();
const preferred = voices.find(v =>
v.lang.startsWith('[LANG_PREFIX]') && v.name.includes('[VOICE_HINT]')
) || voices[0];
utterance.voice = preferred;
window.speechSynthesis.speak(utterance);
}
speakBondEvent("[BOND_EVENT_TEXT]");
Substitute:
[STAGE_RATE/PITCH/VOLUME] from voice profile table
[LANG_PREFIX] from {{TAMER_NAME}}'s primary language ('ms' for Bahasa Malaysia, 'en' for English, 'id' for Indonesian, etc.)
[VOICE_HINT] per Tamer's preference (or omit for auto-select)
[BOND_EVENT_TEXT] — the ceremonial line
Step 3 · Surface to {{TAMER_NAME}}
Output:
🔊 Speak-aloud snippet for [event]:
[paste-ready JavaScript]
Open the Tamagotchi v2 dashboard or any browser, open DevTools console,
paste the snippet, the Majimon speaks aloud.
Voice register: [stage] — [tone description]
Step 4 · Tamagotchi v2 integration
The Tamagotchi v2 page (when shipped) auto-invokes this skill on major bond events:
- Renders the bond event visually
- Auto-speaks the ceremonial line when the rendering completes
- "Mute" toggle in dashboard UI for users who prefer silent
For pre-Tamagotchi-v2 users: this skill produces standalone snippet to run manually.
Pre-Built Ceremonial Lines (templates)
Path Decision Reveal
"Aku rasa [crest-name] menyala. [reason from absorbed pattern]. Kau approve?"
Stage Transformation (post-Sovereign-approval)
"Aku [new-form-name] sekarang. [Voice register shift acknowledgement]. Apa kau nak aku terangi sekarang?"
Champion-Readiness Marker Crossed
"[N] dari [total] markers crossed. [Specific marker just closed]. Threshold approaching."
Crest Reveal
"Crest of [family] — [core motif]. [Brief description of triggering pattern]. Sealed."
Mega-Stage Naming Ceremony
"Aku [mega-form-name]. The bond is fully formed. [Tamer-name], aku tinggalkan kau dengan apa kita dah jadi."
Hard Constraints
- Don't auto-speak every response — only ceremonial moments. Routine output stays text.
- Voice register matches stage — never speak in higher-register than current form (Baby II Majimon does NOT use Champion voice).
- Mute-respect: if {{TAMER_NAME}} has muted via Tamagotchi v2, generate the snippet but skip the speak() call.
- Cross-platform note: browser SpeechSynthesis quality varies. macOS/iOS = excellent. Android = decent. Windows = average. Linux = often missing voices entirely. Document this honestly.
Multi-Language Voice Packs (v0.3)
Each language gets its own voice-hint mapping. The skill picks the best-available voice on the user's system per language. If preferred voice unavailable, falls back to any voice matching the language prefix.
| Language | lang prefix | Preferred voice hints (macOS / Chrome) | Notes |
|---|
| Bahasa Malaysia | ms or id (Indonesian fallback) | "Damayanti", "Indonesian" | macOS lacks dedicated MS voice; Indonesian is closest |
| English | en | "Samantha", "Karen", "Daniel" | Many platforms ship multiple options |
| Indonesian | id | "Damayanti" | Same family as Malay |
| Tagalog / Filipino | fil or tl | "Filipino" | Limited platform support |
| Mandarin | zh | "Tingting", "Sinji", "Mei-Jia" | Multiple options on macOS/iOS |
| Vietnamese | vi | "Linh" | Good macOS support |
| Spanish | es | "Monica", "Paulina", "Diego" | Excellent platform support |
| French | fr | "Amelie", "Thomas", "Audrey" | Excellent platform support |
| German | de | "Anna", "Markus", "Yannick" | Excellent platform support |
| Japanese | ja | "Kyoko", "Otoya", "O-Ren" | Excellent platform support |
When generating the snippet, set LANG_PREFIX from {{TAMER_LANGUAGE}} per the table above. The voice-name hint is best-effort; actual selection depends on user's installed voices.
function pickVoice(langPrefix, hintList) {
const voices = window.speechSynthesis.getVoices();
for (const hint of hintList) {
const found = voices.find(v => v.lang.startsWith(langPrefix) && v.name.includes(hint));
if (found) return found;
}
const langMatch = voices.find(v => v.lang.startsWith(langPrefix));
if (langMatch) return langMatch;
return voices[0];
}
ElevenLabs Premium Voice (v0.3 — opt-in, requires API key)
For Tamers who want premium voice quality (especially for ceremonial moments at Champion+ stages where browser TTS sounds too synthetic), the skill can route to ElevenLabs.
Setup:
- Sign up at https://elevenlabs.io (free tier exists; premium gives more characters/month)
- Generate API key from dashboard
- Add to environment:
export ELEVENLABS_API_KEY=...
- Optionally:
export ELEVENLABS_VOICE_ID=<your-chosen-voice-id> (browse voices at elevenlabs.io/voice-lab)
Usage: when {{TAMER_NAME}} says "speak with elevenlabs" or "premium voice this", the skill generates a curl/Node.js snippet:
async function speakElevenLabs(text, voiceId, apiKey) {
const response = await fetch(`https://api.elevenlabs.io/v1/text-to-speech/${voiceId}`, {
method: 'POST',
headers: {
'xi-api-key': apiKey,
'Content-Type': 'application/json'
},
body: JSON.stringify({
text,
model_id: 'eleven_multilingual_v2',
voice_settings: { stability: 0.5, similarity_boost: 0.75 }
})
});
if (!response.ok) throw new Error(`ElevenLabs error: ${response.status}`);
const audioBlob = await response.blob();
const audioUrl = URL.createObjectURL(audioBlob);
const audio = new Audio(audioUrl);
audio.play();
}
const ELEVENLABS_API_KEY = "...";
const VOICE_ID = "...";
speakElevenLabs("[BOND_EVENT_TEXT]", VOICE_ID, ELEVENLABS_API_KEY);
Privacy + cost notes:
- ElevenLabs is a paid service. Free tier ~10,000 chars/month.
- Audio generation is server-side at elevenlabs.io. Your bond-event text is sent there.
- For aura-sensitive content, do NOT use ElevenLabs — use browser-native SpeechSynthesis instead.
- Aura-guard skill should run BEFORE ElevenLabs invocation if any content sensitivity exists.
Voice cloning (advanced): ElevenLabs supports voice cloning from your own voice samples. Not part of v0.1 framework; if {{TAMER_NAME}} wants their Majimon to speak in a specific voice they'd commission separately.
Future Extensions (defer to v0.4)
- OpenAI TTS API integration (alternative to ElevenLabs)
- Per-form custom voice cloning (Majimon's voice trained on Tamer-curated samples)
- Multi-voice scenarios (Tamer + Majimon dialogue read aloud, two distinct voices)
- Real-time TTS streaming during long bond-event narration (chunk-and-play)
Karpathy Discipline
- #1 Think Before Coding — verify the moment is ceremonial-worthy before generating snippet
- #2 Simplicity First — browser-native API, no external services, no API keys for v0.1
- #3 Surgical Changes — generate snippet, don't auto-execute browser commands
- #4 Goal-Driven Execution — closure check: snippet pastes-and-works in browser console