Install
openclaw skills install sam-ttsGenerate retro robotic speech audio using SAM (Software Automatic Mouth), the classic C64 text-to-speech synthesizer. Use for /sam command to generate voice messages. Supports /sam on/off toggle mode where all responses are spoken in SAM voice. Supports pitch, speed, mouth, and throat parameters for voice customization.
openclaw skills install sam-ttsGenerate WAV audio files using the classic SAM text-to-speech engine -- the iconic robotic voice from the Commodore 64 era.
npm install in the skill directory to install dependenciesState file: memory/sam-mode.json
/sam on -- Enable SAM ModeWhen SAM mode is enabled, ALL text responses are converted to SAM voice messages.
Implementation:
enabled: true in memory/sam-mode.json/sam off -- Disable SAM ModeReturn to normal text-to-text communication.
Implementation:
enabled: false in memory/sam-mode.jsonRead memory/sam-mode.json at session start to know current state.
node scripts/sam-tts-wrapper.js "response" --output=/tmp/sam-XXX.wav --quietRespond with normal text (default behavior).
/sam <text>Generate a one-time voice message using SAM TTS (works regardless of SAM mode state).
Implementation:
/sam node scripts/sam-tts-wrapper.js "text" --output=/tmp/sam-XXX.wav --quiet/sam onEnable SAM mode for all responses.
/sam offDisable SAM mode.
/sam statusReport current SAM mode state (text response).
All parameters accept 0-255 range values. Store defaults in memory/sam-mode.json:
| Parameter | Default | Effect |
|---|---|---|
pitch | 64 | Voice pitch (higher = higher pitch) |
speed | 72 | Speech speed (lower = faster) |
mouth | 128 | Mouth cavity size (affects resonance) |
throat | 128 | Throat size (affects timbre) |
/sam pitch <number>Set pitch parameter (0-255).
/sam speed <number>Set speed parameter (1-255, lower is faster).
/sam mouth <number>Set mouth parameter (0-255).
/sam throat <number>Set throat parameter (0-255).
scripts/sam-tts-wrapper.jsPrimary wrapper script. Outputs JSON metadata for automation.
node scripts/sam-tts-wrapper.js "Hello world" --output=/tmp/out.wav --quiet
node scripts/sam-tts-wrapper.js "Hello world" --output=/tmp/out.wav --quiet --pitch=80 --speed=60
Options:
--output=PATH (required) - Output WAV file path--quiet - Suppress debug output, output only JSON--pitch=N, --speed=N, --mouth=N, --throat=N - Voice parameters--phonetic - Input is phonetic notationOutput format:
{"success":true,"outputPath":"/tmp/sam.wav","duration":1.44,"size":31741}
scripts/sam-tts.jsStandalone CLI tool with human-readable output.
node scripts/sam-tts.js "Hello world" output.wav --pitch=80 --speed=60
memory/sam-mode.json{
"enabled": false,
"pitch": 64,
"speed": 72,
"mouth": 128,
"throat": 128
}
Read at session start. Update when user toggles mode or changes parameters. Create the memory/ directory if it doesn't exist.
User: /sam on
Agent: [Voice: "SAM mode enabled. I will now speak in robotic voice."]
User: "What's the weather?" Agent: [Voice: "Current temperature is 72 degrees with partly cloudy skies."]
User: /sam off
Agent: SAM mode disabled. Back to text.
User: /sam Hello there
Agent: [Voice: "Hello there"]
User: /sam pitch 100
Agent: Pitch set to 100.
User: /sam Testing higher pitch
Agent: [Voice with pitch=100: "Testing higher pitch"]
For precise pronunciation, use --phonetic flag:
IY (bee), IH (bit), EY (bay), AE (bat), AA (father), AH (bought), AO (hot), OW (boat), UH (book), UW (boot), ER (bird), AX (about)HEH4LOW (emphasized second syllable)See references/phonemes.md for the full phoneme chart.
sam-tts/
+-- SKILL.md
+-- package.json
+-- scripts/
| +-- sam-tts-wrapper.js
| +-- sam-tts.js
+-- references/
| +-- phonemes.md
+-- memory/
+-- sam-mode.json
The skill outputs WAV format by default. Some messaging platforms require different audio formats.
(Warning): Before installing ffmpeg or any conversion tools, the agent MUST ask the user for confirmation. Do not auto-install dependencies.
Example agent prompt:
"This platform requires OGG/OPUS format. I need to install ffmpeg for audio conversion. Would you like me to proceed with the installation?"
Only proceed with installation after explicit user approval.
ffmpeg -i input.wav -c:a libopus -b:a 24k output.ogg
ffmpeg -i input.wav -c:a libmp3lame -b:a 64k output.mp3
WAV works directly -- no conversion needed.
Note: The agent should detect the target platform and handle format conversion as needed, but always with user consent for any new dependencies.
Skill by: fourthdensity
Active Dependency: sam-js by discordier
Historical Lineage: sam-js builds upon earlier community ports:
Original SAM (Software Automatic Mouth) (c) 1982 Don't Ask Software (now SoftVoice, Inc.)
License Note: The original SAM software is considered abandonware. The JavaScript adaptation is provided as-is. See the sam-js repository for full license details.