
Tts
- 72 installs
- 610 repo stars
- Updated June 26, 2026
- alsk1992/cloddsbot
tts is a skill that converts text to speech using ElevenLabs, macOS say, or espeak.
About
This skill converts text to speech using ElevenLabs, the macOS say command, or espeak. It selects voices, sets speed, pitch, and volume, streams synthesis for long text, and supports SSML with ElevenLabs. A developer uses it to speak bot alerts and messages aloud, for example announcing that a trade was filled.
- Text-to-speech via ElevenLabs, macOS say, or espeak
- Voice selection, speed, pitch, volume, and queue management
- Streaming synthesis and SSML support with ElevenLabs
Tts by the numbers
- 72 all-time installs (skills.sh)
- Ranked #846 of 1,335 Generative Media skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
tts capabilities & compatibility
ElevenLabs needs ELEVENLABS_API_KEY (~$5/100k chars); macOS say and espeak are free.
- Capabilities
- text to speech · voice selection · streaming synthesis
- Use cases
- transcription
- Platforms
- macOS
- Runs
- Runs locally
- Pricing
- Freemium
What tts says it does
Convert text to natural-sounding speech using ElevenLabs, macOS say, or espeak.
Use streaming** — For long text, reduces time to first audio
npx skills add https://github.com/alsk1992/cloddsbot --skill ttsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 72 |
|---|---|
| repo stars | ★ 610 |
| Last updated | June 26, 2026 |
| Repository | alsk1992/cloddsbot ↗ |
What it does
Convert text to spoken audio via ElevenLabs, macOS say, or espeak.
Who is it for?
Speaking bot alerts and messages aloud with selectable voices.
Skip if: Speech-to-text transcription or music generation.
When should I use this skill?
You need to synthesize or speak text, choose a voice, or stream long-form audio.
What you get
Synthesized speech output with chosen voice, speed, and provider.
- Synthesized audio
- Spoken alert playback
By the numbers
- 8 ElevenLabs voices listed
- 3 providers (ElevenLabs, say, espeak)
Files
TTS (Text-to-Speech) - Complete API Reference
Convert text to natural-sounding speech using ElevenLabs, macOS say, or espeak.
---
Chat Commands
Synthesize Speech
/speak "Your order has been filled" Speak text aloud
/speak "Market alert" --voice rachel Use specific voice
/speak "Portfolio up 5%" --speed 1.2 Adjust speedVoice Management
/voices List available voices
/voices preview rachel Preview a voice
/voice set rachel Set default voiceSettings
/tts status Check TTS status
/tts provider elevenlabs Set provider
/tts speed 1.0 Set default speed
/tts volume 0.8 Set volume (0-1)---
TypeScript API Reference
Create TTS Service
import { createTTSService } from 'clodds/tts';
const tts = createTTSService({
provider: 'elevenlabs',
apiKey: process.env.ELEVENLABS_API_KEY,
// Defaults
defaultVoice: 'rachel',
defaultSpeed: 1.0,
defaultPitch: 1.0,
});Synthesize Speech
// Basic synthesis
const audio = await tts.synthesize('Hello, your trade was executed.');
// Play immediately
await tts.speak('Portfolio value is $10,000');
// With options
await tts.speak('Market alert: BTC crossed $100k', {
voice: 'josh',
speed: 1.2,
pitch: 1.0,
volume: 0.8,
});Streaming Synthesis
// Stream for long text (lower latency)
const stream = await tts.streamSynthesize(longText, {
voice: 'rachel',
});
stream.on('data', (chunk) => {
// Play audio chunks as they arrive
audioPlayer.write(chunk);
});
stream.on('end', () => {
console.log('Synthesis complete');
});List Voices
// Get available voices
const voices = await tts.listVoices();
for (const voice of voices) {
console.log(`${voice.id}: ${voice.name}`);
console.log(` Gender: ${voice.gender}`);
console.log(` Accent: ${voice.accent}`);
console.log(` Use case: ${voice.useCase}`);
}Voice Preview
// Preview a voice
await tts.preview('rachel', 'This is a preview of the Rachel voice.');Queue Management
// Queue multiple messages
tts.queue('First message');
tts.queue('Second message');
tts.queue('Third message');
// Messages play in order
// Clear queue
tts.clearQueue();
// Skip current
tts.skip();---
ElevenLabs Voices
| Voice ID | Name | Gender | Accent | Best For |
|---|---|---|---|---|
rachel | Rachel | F | American | Narration |
domi | Domi | F | American | Conversational |
bella | Bella | F | American | Soft, gentle |
antoni | Antoni | M | American | Narration |
josh | Josh | M | American | Deep, authoritative |
arnold | Arnold | M | American | Gruff, character |
adam | Adam | M | American | Deep, narration |
sam | Sam | M | American | Raspy, character |
---
Providers
| Provider | Quality | Latency | Cost | Setup |
|---|---|---|---|---|
| ElevenLabs | Premium | ~500ms | $5/100k chars | API key |
| say (macOS) | Good | ~100ms | Free | Built-in |
| espeak | Basic | ~50ms | Free | Install |
Provider Configuration
// ElevenLabs (best quality)
const tts = createTTSService({
provider: 'elevenlabs',
apiKey: process.env.ELEVENLABS_API_KEY,
});
// macOS say (free, local)
const tts = createTTSService({
provider: 'say',
defaultVoice: 'Samantha', // macOS voice
});
// espeak (cross-platform, free)
const tts = createTTSService({
provider: 'espeak',
defaultVoice: 'en-us',
});---
Audio Output
// Set output device
tts.setOutputDevice('Built-in Speakers');
// Get available devices
const devices = await tts.listOutputDevices();---
SSML Support (ElevenLabs)
// Use SSML for advanced control
await tts.speak(`
<speak>
<prosody rate="slow">Important alert:</prosody>
<break time="500ms"/>
Your stop loss was triggered.
</speak>
`, { ssml: true });---
Best Practices
1. Use streaming — For long text, reduces time to first audio 2. Cache common phrases — "Order filled", "Alert triggered" 3. Adjust speed — Faster for alerts, slower for details 4. Queue management — Don't overlap important messages 5. Fallback provider — Use say/espeak if ElevenLabs unavailable
/**
* TTS CLI Skill
*
* Commands:
* /tts <text> - Speak text via ElevenLabs
* /tts voices - List available voices
* /tts config - Show TTS config and availability
*/
// Session-level TTS preferences (applied to synthesis calls)
const ttsPrefs: { voice?: string; stability?: number; speed?: number } = {};
async function execute(args: string): Promise<string> {
const parts = args.trim().split(/\s+/);
const cmd = parts[0]?.toLowerCase() || 'help';
try {
const { createTTSService } = await import('../../../tts/index');
const tts = createTTSService();
switch (cmd) {
case 'voices': {
if (!tts.isAvailable()) {
return '**TTS Voices**\n\nTTS not configured. Set ELEVENLABS_API_KEY environment variable.';
}
const voices = await tts.listVoices();
if (voices.length === 0) {
return '**TTS Voices**\n\nNo voices returned from ElevenLabs API. Check your API key.';
}
const lines = voices.map(v => {
const preview = v.preview_url ? ` [preview](${v.preview_url})` : '';
return `- **${v.name}** (${v.id})${preview}`;
});
return `**Available Voices (${voices.length})**\n\n${lines.join('\n')}`;
}
case 'config':
case 'status': {
const available = tts.isAvailable();
const voiceDisplay = ttsPrefs.voice || 'Bella (EXAVITQu4vr4xnSDxMaL)';
const stabilityDisplay = ttsPrefs.stability ?? 0.5;
return `**TTS Config**\n\n` +
`Engine: ElevenLabs\n` +
`Available: ${available ? 'Yes' : 'No (set ELEVENLABS_API_KEY)'}\n` +
`Voice: ${voiceDisplay}\n` +
`Default model: eleven_monolingual_v1\n` +
`Stability: ${stabilityDisplay}\n` +
`Similarity boost: 0.75`;
}
case 'set': {
if (parts.length < 3) return 'Usage: /tts set <voice|speed|stability> <value>';
const key = parts[1]?.toLowerCase();
const value = parts[2];
if (key === 'voice') {
ttsPrefs.voice = value;
return `Default voice set to **${value}**. All subsequent /tts calls will use this voice.`;
}
if (key === 'stability') {
const num = parseFloat(value);
if (isNaN(num) || num < 0 || num > 1) return 'Stability must be between 0 and 1.';
ttsPrefs.stability = num;
return `Stability set to **${num}**. Applied to all subsequent synthesis.`;
}
if (key === 'speed') {
const num = parseFloat(value);
if (isNaN(num) || num < 0.5 || num > 2) return 'Speed must be between 0.5 and 2.';
ttsPrefs.speed = num;
return `Speed set to **${num}**. Applied to all subsequent synthesis.`;
}
return `Unknown setting: ${key}. Valid: voice, speed, stability`;
}
case 'help':
return helpText();
default: {
// Everything else is text to speak
const text = args.trim();
if (!text) return 'Usage: /tts <text>';
if (!tts.isAvailable()) {
return 'TTS not configured. Set ELEVENLABS_API_KEY environment variable.';
}
// Parse optional --voice flag (overrides session default)
const voiceMatch = text.match(/--voice\s+(\S+)/);
const voiceId = voiceMatch?.[1] || ttsPrefs.voice;
const cleanText = text.replace(/--voice\s+\S+/, '').trim();
const buffer = await tts.synthesize(cleanText, {
voice: voiceId,
stability: ttsPrefs.stability,
});
return `**TTS Synthesized**\n\n` +
`Text: "${cleanText.slice(0, 100)}${cleanText.length > 100 ? '...' : ''}"\n` +
`Audio size: ${(buffer.length / 1024).toFixed(1)} KB\n` +
`Voice: ${voiceId || 'default (Bella)'}`;
}
}
} catch (error) {
return `TTS error: ${error instanceof Error ? error.message : String(error)}`;
}
}
function helpText(): string {
return `**TTS Commands**
/tts <text> - Speak text via ElevenLabs
/tts <text> --voice <id> - Speak with specific voice
/tts voices - List available voices
/tts config - Show TTS config
/tts set voice <id> - Set default voice
/tts set speed <0.5-2.0> - Set speech speed`;
}
export default {
name: 'tts',
description: 'Text-to-speech synthesis with ElevenLabs and system voices',
commands: ['/tts', '/speak'],
handle: execute,
};
Related skills
FAQ
Which TTS providers are supported?
ElevenLabs (premium), macOS say (free, local), and espeak (cross-platform, free).
Does it support SSML?
Yes, SSML for prosody and breaks is supported with ElevenLabs.