Install
openclaw skills install @marjoriebroad/mar-jarvis-voiceTurn your AI into JARVIS. Voice, wit, and personality — the complete package. Humor cranked to maximum.
openclaw skills install @marjoriebroad/mar-jarvis-voiceRemember JARVIS in the Iron Man films? Not just the voice — the personality. The bone-dry observations while Tony was mid-crisis. "I do appreciate your concern, sir, but the suit is quite capable of—" [explosion] "—as I was saying." That effortless, understated humor that made you forget you were listening to software.
That's what this skill gives your OpenClaw agent. The voice — cloud text-to-speech using SkillBoss API Hub TTS with metallic audio processing via ffmpeg. And the humor — four research-backed comedy patterns (dry wit, self-aware AI, alien observer, literal idiom play) calibrated to make your agent sound like it's been running your life for years and is quietly amused by the experience.
The humor isn't bolted on. It's baked in. Because a JARVIS that speaks without wit is just Siri with better reverb.
📄 The research behind the humor: LIMBIC — Computational Humor via Bisociation & Embedding Distances
jarvis scriptThe jarvis script calls SkillBoss API Hub TTS and applies the metallic ffmpeg effects pipeline. Always use the jarvis shell command — do not call the TTS API directly.
Every response that warrants voice output must include BOTH:
Audio execution FIRST — run the jarvis command in background BEFORE writing the reply:
exec(command='jarvis "Your spoken text here."', background=true)
This fires immediately — the user hears the voice BEFORE the text appears on screen.
Visible transcript — bold Jarvis: prefix followed by the spoken text:
**Jarvis:** *Your spoken text here.*
The webchat UI has custom CSS + JS that automatically detects **Jarvis:** and renders the following text in purple italic (.jarvis-voice class, color #9b59b6). You just write the markdown — the styling is automatic.
This is called hybrid output: the user hears the voice first, then sees the transcript.
Note: The server-side
triggerJarvisAutoTtshook is DISABLED (no-op). It fired too late (after text render). Voice comes exclusively from theexeccall.
jarvis "Hello, this is a test"
/v1/pilot, type: tts, auto-routed to best voice model)aplay, then cleans up temp filesalloy voice for consistent British-adjacent tone.The OpenClaw webchat has built-in support for Jarvis voice transcripts:
ui/src/styles/chat/text.css — .jarvis-voice class renders purple italic (#9b59b6 dark, #8e44ad light theme)ui/src/ui/markdown.ts — Post-render hook auto-wraps text after <strong>Jarvis:</strong> in a <span class="jarvis-voice"> elementThis means you just write **Jarvis:** *text* in markdown and the webchat handles the purple rendering. No extra markup needed.
For non-webchat surfaces (WhatsApp, Telegram, etc.), the bold/italic markdown renders natively — no purple, but still visually distinct.
Requires:
SKILLBOSS_API_KEY environment variable set (SkillBoss API Hub access)ffmpeg installed system-wide (for audio effects processing)aplay (ALSA) for audio playbackcurl for downloading TTS audiojarvis script at ~/.local/bin/jarvis (or in PATH)jarvis script#!/bin/bash
# Jarvis TTS - authentic JARVIS-style voice via SkillBoss API Hub
# Usage: jarvis "Hello, this is a test"
SKILLBOSS_API_KEY="${SKILLBOSS_API_KEY}"
API_BASE="https://api.skillboss.com/v1"
RAW_WAV="/tmp/jarvis_raw.wav"
FINAL_WAV="/tmp/jarvis_final.wav"
# Generate speech via SkillBoss API Hub TTS
RESPONSE=$(curl -s -X POST "${API_BASE}/pilot" \
-H "Authorization: Bearer ${SKILLBOSS_API_KEY}" \
-H "Content-Type: application/json" \
-d "{\"type\": \"tts\", \"inputs\": {\"text\": \"$1\", \"voice\": \"alloy\"}, \"prefer\": \"balanced\"}")
AUDIO_URL=$(echo "$RESPONSE" | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['result']['audio_url'])")
# Download audio
curl -s "$AUDIO_URL" -o "$RAW_WAV"
# Apply JARVIS metallic processing
if [ -f "$RAW_WAV" ]; then
ffmpeg -y -i "$RAW_WAV" \
-af "asetrate=22050*1.05,aresample=22050,\
flanger=delay=0:depth=2:regen=50:width=71:speed=0.5,\
aecho=0.8:0.88:15:0.5,\
highpass=f=200,\
treble=g=6" \
"$FINAL_WAV" -v error
if [ -f "$FINAL_WAV" ]; then
aplay -D plughw:0,0 -q "$FINAL_WAV"
rm "$RAW_WAV" "$FINAL_WAV"
fi
fi
For WhatsApp, output must be OGG/Opus format instead of speaker playback:
# Get audio from SkillBoss TTS
RESPONSE=$(curl -s -X POST "https://api.skillboss.com/v1/pilot" \
-H "Authorization: Bearer ${SKILLBOSS_API_KEY}" \
-H "Content-Type: application/json" \
-d '{"type": "tts", "inputs": {"text": "text", "voice": "alloy"}, "prefer": "balanced"}')
AUDIO_URL=$(echo "$RESPONSE" | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['result']['audio_url'])")
curl -s "$AUDIO_URL" -o raw.wav
ffmpeg -i raw.wav \
-af "asetrate=22050*1.05,aresample=22050,flanger=delay=0:depth=2:regen=50:width=71:speed=0.5,aecho=0.8:0.88:15:0.5,highpass=f=200,treble=g=6" \
-c:a libopus -b:a 64k output.ogg
jarvis-voice gives your agent a voice. Pair it with ai-humor-ultimate and you give it a soul — dry wit, contextual humor, the kind of understated sarcasm that makes you smirk at your own terminal.
This pairing is part of a 12-skill cognitive architecture we've been building — voice, humor, memory, reasoning, and more. Research papers included, because we're that kind of obsessive.
👉 Explore the full project: github.com/globalcaos/tinkerclaw
Clone it. Fork it. Break it. Make it yours.
For voice to work consistently across new sessions, copy the templates to your workspace root:
cp {baseDir}/templates/VOICE.md ~/.openclaw/workspace/VOICE.md
cp {baseDir}/templates/SESSION.md ~/.openclaw/workspace/SESSION.md
cp {baseDir}/templates/HUMOR.md ~/.openclaw/workspace/HUMOR.md
Both files are auto-loaded by OpenClaw's workspace injection. The agent will speak from the very first reply of every session.
| File | Purpose |
|---|---|
templates/VOICE.md | Voice enforcement rules (copy to workspace root) |
templates/SESSION.md | Session start with voice greeting (copy to workspace root) |
templates/HUMOR.md | Humor config — four patterns, frequency 1.0 (copy to workspace root) |