{"id":"d7716ccd-6907-402f-85ec-6094a3d898ce","entityType":"agent","slug":"clawhub-gizmogremlin-openclaw-skill-voice-ai-voices","name":"Voice Ai Tts","canonicalUrl":"https://www.xpersona.co/agent/clawhub-gizmogremlin-openclaw-skill-voice-ai-voices","canonicalPath":"/agent/clawhub-gizmogremlin-openclaw-skill-voice-ai-voices","generatedAt":"2026-10-10T08:21:36.001Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T22:06:33.210Z","emptyReason":null},"description":"High-quality voice synthesis with 9 personas, 11 languages, and streaming using Voice.ai API.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.9K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s178490vvb7nmykckbyc8sh0sx884gc1:openclaw-skill-voice-ai-voices","sourceUrl":"https://clawhub.ai/gizmogremlin/openclaw-skill-voice-ai-voices","homepage":"https://clawhub.ai/gizmogremlin/skills/openclaw-skill-voice-ai-voices","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/gizmogremlin/openclaw-skill-voice-ai-voices","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/gizmogremlin/skills/openclaw-skill-voice-ai-voices","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":66,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Voice Ai Tts technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T22:06:33.210Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T22:06:33.210Z","emptyReason":null},"stars":null,"forks":null,"downloads":1946,"packageName":null,"latestVersion":"1.1.4","tractionLabel":"1.9K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T22:06:33.210Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T22:06:33.210Z","lastCrawledAt":"2026-10-09T22:06:33.210Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T22:06:33.210Z","lastVerifiedAt":null,"highlights":[{"version":"1.1.4","createdAt":"2026-02-16T21:40:06.435Z","changelog":"- Declare VOICE_AI_API_KEY as the primary environment variable in skill metadata - Minor metadata and documentation updates for clarity","fileCount":11,"zipByteSize":19665},{"version":"1.1.3","createdAt":"2026-02-16T21:23:32.316Z","changelog":"- Removed voice cloning (voice-sample upload) from published bundle for improved privacy and security - Now requires VOICE_AI_API_KEY to be set via environment variable only - Updated documentation and metadata for revised configuration and privacy model - Added LICENSE.md for license clarity and provenance","fileCount":11,"zipByteSize":19561},{"version":"1.1.2","createdAt":"2026-02-16T21:08:57.785Z","changelog":"openclaw-skill-voice-ai-voices v1.1.2 - Added SECURITY.md with security and privacy details. - Updated documentation (README.md, SKILL.md) to reference SECURITY.md and clarify data flow and security practices. - Minor updates and fixes to package files and internal docs. - No user-facing API or CLI changes.","fileCount":10,"zipByteSize":20819},{"version":"1.1.1","createdAt":"2026-02-16T20:40:58.480Z","changelog":"- Added detailed installation instructions and listed key files for easier onboarding. - Updated environment variable requirements note for improved clarity. - Added new support and documentation files: CHANGELOG.md, README.md, package.json, scripts/tts.js, voice-ai-tts-sdk.js, voice-ai-tts.yaml, and voices.json. - Improved SKILL.md structure and consistency.","fileCount":9,"zipByteSize":19509},{"version":"1.1.0","createdAt":"2026-02-16T20:26:07.220Z","changelog":"- Updated metadata to declare required environment variables and config paths - Noted the production API endpoint domain in documentation - Renamed voice personas for IP-safe labeling (e.g., \"corpse\" → \"shadow\", \"skadi\" → \"sakura\", etc.) - Added file references such as `voices.json`, `README.md`, `CHANGELOG.md`, and `package.json` to documentation - Removed obsolete sample configuration and integration details for YAML and older OpenClaw configs - Cleaned up files: removed unused scripts and simplified setup instructions","fileCount":2,"zipByteSize":4333},{"version":"0.1.1","createdAt":"2026-01-31T14:07:55.534Z","changelog":"Voice.ai TTS v1.0.0 initial release: - Introduced high-quality voice synthesis with 9 curated personas and support for 11 languages. - Added real-time streaming mode for instant audio playback. - Enabled voice cloning from audio samples for custom voices. - Exposed voice design parameters (temperature, top_p) for expressive speech control. - Provided a full-featured CLI tool and Node.js SDK. - Seamless integration with OpenClaw for easy configuration and usage.","fileCount":5,"zipByteSize":16273}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s178490vvb7nmykckbyc8sh0sx884gc1:openclaw-skill-voice-ai-voices","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s178490vvb7nmykckbyc8sh0sx884gc1:openclaw-skill-voice-ai-voices` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/gizmogremlin/openclaw-skill-voice-ai-voices before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gizmogremlin-openclaw-skill-voice-ai-voices/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gizmogremlin-openclaw-skill-voice-ai-voices/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gizmogremlin-openclaw-skill-voice-ai-voices/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-gizmogremlin-openclaw-skill-voice-ai-voices/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-gizmogremlin-openclaw-skill-voice-ai-voices/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-gizmogremlin-openclaw-skill-voice-ai-voices/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T08:21:35.981Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gizmogremlin-openclaw-skill-voice-ai-voices/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gizmogremlin-openclaw-skill-voice-ai-voices/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gizmogremlin-openclaw-skill-voice-ai-voices/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gizmogremlin-openclaw-skill-voice-ai-voices/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T22:06:33.210Z","emptyReason":null},"readme":"Skill: Voice Ai Tts\n\nOwner: gizmogremlin\n\nSummary: High-quality voice synthesis with 9 personas, 11 languages, and streaming using Voice.ai API.\n\nTags: latest:1.1.4\n\nVersion history:\n\nv1.1.4 | 2026-02-16T21:40:06.435Z | auto\n\n- Declare VOICE_AI_API_KEY as the primary environment variable in skill metadata\n- Minor metadata and documentation updates for clarity\n\nv1.1.3 | 2026-02-16T21:23:32.316Z | auto\n\n- Removed voice cloning (voice-sample upload) from published bundle for improved privacy and security\n- Now requires VOICE_AI_API_KEY to be set via environment variable only\n- Updated documentation and metadata for revised configuration and privacy model\n- Added LICENSE.md for license clarity and provenance\n\nv1.1.2 | 2026-02-16T21:08:57.785Z | auto\n\nopenclaw-skill-voice-ai-voices v1.1.2\n\n- Added SECURITY.md with security and privacy details.\n- Updated documentation (README.md, SKILL.md) to reference SECURITY.md and clarify data flow and security practices.\n- Minor updates and fixes to package files and internal docs.\n- No user-facing API or CLI changes.\n\nv1.1.1 | 2026-02-16T20:40:58.480Z | auto\n\n- Added detailed installation instructions and listed key files for easier onboarding.\n- Updated environment variable requirements note for improved clarity.\n- Added new support and documentation files: CHANGELOG.md, README.md, package.json, scripts/tts.js, voice-ai-tts-sdk.js, voice-ai-tts.yaml, and voices.json.\n- Improved SKILL.md structure and consistency.\n\nv1.1.0 | 2026-02-16T20:26:07.220Z | auto\n\n- Updated metadata to declare required environment variables and config paths\n- Noted the production API endpoint domain in documentation\n- Renamed voice personas for IP-safe labeling (e.g., \"corpse\" → \"shadow\", \"skadi\" → \"sakura\", etc.)\n- Added file references such as `voices.json`, `README.md`, `CHANGELOG.md`, and `package.json` to documentation\n- Removed obsolete sample configuration and integration details for YAML and older OpenClaw configs\n- Cleaned up files: removed unused scripts and simplified setup instructions\n\nv0.1.1 | 2026-01-31T14:07:55.534Z | auto\n\nVoice.ai TTS v1.0.0 initial release:\n\n- Introduced high-quality voice synthesis with 9 curated personas and support for 11 languages.\n- Added real-time streaming mode for instant audio playback.\n- Enabled voice cloning from audio samples for custom voices.\n- Exposed voice design parameters (temperature, top_p) for expressive speech control.\n- Provided a full-featured CLI tool and Node.js SDK.\n- Seamless integration with OpenClaw for easy configuration and usage.\n\nArchive index:\n\nArchive v1.1.4: 11 files, 19665 bytes\n\nFiles: CHANGELOG.md (807b), LICENSE.md (1066b), package.json (907b), README.md (1125b), scripts/tts.js (2904b), SECURITY.md (979b), SKILL.md (9764b), voice-ai-tts-sdk.js (16227b), voice-ai-tts.yaml (23163b), voices.json (2103b), _meta.json (149b)\n\nFile v1.1.4:SKILL.md\n\n---\nname: voice-ai-tts\ndescription: >\n  High-quality voice synthesis with 9 personas, 11 languages, and streaming using Voice.ai API.\nversion: 1.1.4\ntags: [tts, voice, speech, voice-ai, audio, streaming, multilingual]\nmetadata:\n  openclaw:\n    requires:\n      bins: [\"node\"]\n      env:\n        VOICE_AI_API_KEY: \"required\"\n      primary_env: \"VOICE_AI_API_KEY\"\n      note: \"Set VOICE_AI_API_KEY via an environment variable.\"\n---\n\n# Voice.ai Voices\n\n## ✨ Features\n\n- **9 Voice Personas** - Carefully curated voices for different use cases\n- **11 Languages** - Multi-language synthesis with multilingual model\n- **Streaming Mode** - Real-time audio output as it generates\n- **Voice Design** - Customize with temperature and top_p parameters\n- **OpenClaw Integration** - Works with OpenClaw's built-in TTS\n\n---\n\n## ⚙️ Configuration\n\nSet your API key as an environment variable:\n\n```bash\nexport VOICE_AI_API_KEY=\"your-api-key\"\n```\n\n**Get your API key:** [Voice.ai Dashboard](https://voice.ai/dashboard)\n\n---\n\n## 📦 Installation\n\nNo install step is required. This skill bundles a Node.js CLI and SDK (no external npm dependencies).\n\n## 🧩 Key Files\n\n- [`scripts/tts.js`](scripts/tts.js) - CLI entrypoint\n- [`voice-ai-tts-sdk.js`](voice-ai-tts-sdk.js) - Node.js SDK used by the CLI\n- [`voices.json`](voices.json) - Voice definitions used by the CLI\n- [`voice-ai-tts.yaml`](voice-ai-tts.yaml) - API specification\n- [`package.json`](package.json) - Skill metadata for tooling\n\n## Security Notes\n\nSee [`SECURITY.md`](SECURITY.md) for the full security and privacy overview.\n\nThis skill:\n- Makes outbound HTTPS requests only to `https://dev.voice.ai`\n- Reads local files: `voices.json`\n- Writes audio output to the `--output` path (default `output.mp3`)\n- Does not execute shell commands and does not modify system configuration files\n\n## 🌐 API Endpoint\n\nThe SDK and spec use `https://dev.voice.ai`, which is the official Voice.ai production API domain.\n\n---\n\n## 🤖 OpenClaw Integration\n\nOpenClaw can invoke the CLI script directly if your environment exposes `VOICE_AI_API_KEY`. Use the `/tts` commands as configured by your OpenClaw installation.\n\n---\n\n## 📝 Triggers\n\nThese chat commands work with OpenClaw:\n\n| Command | Description |\n|---------|-------------|\n| `/tts <text>` | Generate speech with default voice |\n| `/tts --voice ellie <text>` | Generate speech with specific voice |\n| `/tts --stream <text>` | Generate with streaming mode |\n| `/voices` | List available voices |\n\n**Examples:**\n\n```\n/tts Hello, welcome to Voice.ai!\n/tts --voice oliver Good morning, everyone.\n/tts --voice lilith --stream This is a long story that will stream as it generates...\n```\n\n---\n\n## 🎙️ Available Voices\n\n| Voice   | ID | Gender | Persona     | Best For                   |\n|---------|-----|--------|-------------|----------------------------|\n| ellie   | `d1bf0f33-8e0e-4fbf-acf8-45c3c6262513` | female | youthful    | Vlogs, social content      |\n| oliver  | `f9e6a5eb-a7fd-4525-9e92-75125249c933` | male   | british     | Narration, tutorials       |\n| lilith  | `4388040c-8812-42f4-a264-f457a6b2b5b9` | female | soft        | ASMR, calm content         |\n| smooth  | `dbb271df-db25-4225-abb0-5200ba1426bc` | male   | deep        | Documentaries, audiobooks  |\n| shadow  | `72d2a864-b236-402e-a166-a838ccc2c273` | male   | distinctive | Gaming, entertainment      |\n| sakura  | `559d3b72-3e79-4f11-9b62-9ec702a6c057` | female | anime       | Character voices           |\n| zenith  | `ed751d4d-e633-4bb0-8f5e-b5c8ddb04402` | male   | deep        | Gaming, dramatic content   |\n| flora   | `a931a6af-fb01-42f0-a8c0-bd14bc302bb1` | female | cheerful    | Kids content, upbeat       |\n| commander | `bd35e4e6-6283-46b9-86b6-7cfa3dd409b9` | male   | heroic      | Gaming, action content     |\n\n---\n\n## 🌍 Supported Languages\n\n| Code | Language   |\n|------|------------|\n| `en` | English    |\n| `es` | Spanish    |\n| `fr` | French     |\n| `de` | German     |\n| `it` | Italian    |\n| `pt` | Portuguese |\n| `pl` | Polish     |\n| `ru` | Russian    |\n| `nl` | Dutch      |\n| `sv` | Swedish    |\n| `ca` | Catalan    |\n\nUse the multilingual model for non-English languages:\n\n```javascript\nconst audio = await client.generateSpeech({\n  text: 'Bonjour le monde!',\n  voice_id: 'ellie-voice-id',\n  model: 'voiceai-tts-multilingual-v1-latest',\n  language: 'fr'\n});\n```\n\n---\n\n## 🎨 Voice Design\n\nCustomize voice output with these parameters:\n\n| Parameter | Range | Default | Description |\n|-----------|-------|---------|-------------|\n| `temperature` | 0-2 | 1.0 | Higher = more expressive, lower = more consistent |\n| `top_p` | 0-1 | 0.8 | Controls randomness in speech generation |\n\n**Example:**\n\n```javascript\nconst audio = await client.generateSpeech({\n  text: 'This will sound very expressive!',\n  voice_id: 'ellie-voice-id',\n  temperature: 1.8,\n  top_p: 0.9\n});\n```\n\n---\n\n## 📡 Streaming Mode\n\nGenerate audio with real-time streaming (recommended for long texts):\n\n```bash\n# Stream audio as it generates\nnode scripts/tts.js --text \"This is a long story...\" --voice ellie --stream\n\n# Streaming with custom output\nnode scripts/tts.js --text \"Chapter one...\" --voice oliver --stream --output chapter1.mp3\n```\n\n**SDK streaming:**\n\n```javascript\nconst stream = await client.streamSpeech({\n  text: 'Long text here...',\n  voice_id: 'ellie-voice-id'\n});\n\n// Pipe to file\nstream.pipe(fs.createWriteStream('output.mp3'));\n\n// Or handle chunks\nstream.on('data', chunk => {\n  // Process audio chunk\n});\n```\n\n---\n\n## 🔊 Audio Formats\n\n| Format | Description | Use Case |\n|--------|-------------|----------|\n| `mp3` | Standard MP3 (32kHz) | General use |\n| `wav` | Uncompressed WAV | High quality |\n| `pcm` | Raw PCM audio | Processing |\n| `opus_48000_128` | Opus 128kbps | Streaming |\n| `mp3_44100_192` | High-quality MP3 | Professional |\n\nSee `voice-ai-tts-sdk.js` for all format options.\n\n---\n\n## 💻 CLI Usage\n\n```bash\n# Set API key\nexport VOICE_AI_API_KEY=\"your-key-here\"\n\n# Generate speech\nnode scripts/tts.js --text \"Hello world!\" --voice ellie\n\n# Choose different voice\nnode scripts/tts.js --text \"Good morning!\" --voice oliver --output morning.mp3\n\n# Use streaming for long texts\nnode scripts/tts.js --text \"Once upon a time...\" --voice lilith --stream\n\n# Show help\nnode scripts/tts.js --help\n```\n\n---\n\n## 📁 Files\n\n```\nvoice-ai-tts/\n├── SKILL.md              # This documentation\n├── README.md             # Quick start\n├── CHANGELOG.md          # Version history\n├── LICENSE.md            # MIT license\n├── SECURITY.md           # Security & privacy notes\n├── voices.json           # Voice definitions\n├── voice-ai-tts.yaml     # OpenAPI specification\n├── voice-ai-tts-sdk.js   # JavaScript/Node.js SDK\n├── package.json          # OpenClaw metadata\n├── scripts/\n│   └── tts.js            # CLI tool\n```\n\n---\n\n## 💰 Cost & Usage\n\nVoice.ai uses a credit-based system. Check your usage:\n\n```javascript\n// The SDK tracks usage via API responses\nconst voices = await client.listVoices();\n// Check response headers for rate limit info\n```\n\n**Tips to reduce costs:**\n- Use streaming for long texts (more efficient)\n- Cache generated audio when possible\n- Use appropriate audio quality for your use case\n\n---\n\n## 🔗 Links\n\n- **[Get API Key](https://voice.ai/dashboard)** - Sign up and get your key\n- **[API Documentation](https://voice.ai/docs)** - Full API reference\n- **[Voice Library](https://voice.ai/voices)** - Browse all voices\n- **[API Reference](https://voice.ai/docs/api-reference/text-to-speech/generate-speech)** - Endpoint details\n- **[Pricing](https://voice.ai/pricing)** - Plans and credits\n\n---\n\n## 📋 Changelog\n\n### v1.1.4 (2026-02-16)\n- Declare `VOICE_AI_API_KEY` as primary env var in metadata\n\n### v1.1.3 (2026-02-16)\n- Remove voice-sample upload features from the published bundle to reduce privacy risk\n- Require `VOICE_AI_API_KEY` via environment variable only\n\n### v1.1.2 (2026-02-16)\n- Added `SECURITY.md` and `LICENSE.md` for provenance and transparency\n- Restricted SDK transport to HTTPS only\n\n### v1.1.1 (2026-02-16)\n- Packaging metadata improvements for ClawHub import (bin/files metadata)\n\n### v1.1.0 (2026-02-16)\n- Declared required credentials in metadata\n- Documented the production API endpoint domain\n- Renamed voice personas for IP-safe labeling\n- Added `voices.json` for voice data\n\n### v1.0.0 (2025-01-31)\n- Initial release\n- 9 curated voice personas\n- 11 language support\n- Streaming mode\n- Voice design parameters\n- Full SDK with error handling\n- CLI tool\n\n---\n\n## 🛠️ SDK Quick Reference\n\n```javascript\nconst VoiceAI = require('./voice-ai-tts-sdk');\nconst client = new VoiceAI(process.env.VOICE_AI_API_KEY);\n\n// List voices\nconst voices = await client.listVoices({ limit: 10 });\n\n// Get voice details\nconst voice = await client.getVoice('voice-id');\n\n// Generate speech\nconst audio = await client.generateSpeech({\n  text: 'Hello, world!',\n  voice_id: 'voice-id',\n  audio_format: 'mp3'\n});\n\n// Generate to file\nawait client.generateSpeechToFile(\n  { text: 'Hello!', voice_id: 'voice-id' },\n  'output.mp3'\n);\n\n// Stream speech\nconst stream = await client.streamSpeech({\n  text: 'Long text...',\n  voice_id: 'voice-id'\n});\n\n// Delete voice\nawait client.deleteVoice('voice-id');\n```\n\n---\n\n## ❓ Troubleshooting\n\n| Error | Cause | Solution |\n|-------|-------|----------|\n| `AuthenticationError` | Invalid API key | Check your `VOICE_AI_API_KEY` |\n| `PaymentRequiredError` | Out of credits | Add credits at voice.ai/dashboard |\n| `RateLimitError` | Too many requests | Wait and retry, or upgrade plan |\n| `ValidationError` | Invalid parameters | Check text length and voice_id |\n\n---\n\nMade with ❤️ by [Nick Gill](https://github.com/gizmoGremlin)\n\nFile v1.1.4:README.md\n\n# Voice.ai Voices\n\nHigh-quality voice synthesis with 9 personas, 11 languages, and streaming using the Voice.ai API.\n\nRequires Node.js 18+.\n\n## Quick Start\n\n```bash\n# Set API key\nexport VOICE_AI_API_KEY=\"your-key-here\"\n\n# Generate speech\nnode scripts/tts.js --text \"Hello world!\" --voice ellie\n\n# Streaming for long text\nnode scripts/tts.js --text \"Once upon a time...\" --voice lilith --stream\n```\n\n## Configuration\n\nThe CLI requires `VOICE_AI_API_KEY` to be set as an environment variable.\n\n## API Endpoint\n\nThe SDK uses `https://dev.voice.ai`, which is the official Voice.ai production API domain.\n\n## Voices\n\nVoice definitions live in `voices.json`. Use the CLI with `--voice <name>`:\n\n```\nellie, oliver, lilith, smooth, shadow, sakura, zenith, flora, commander\n```\n\n## Documentation\n\n- `SKILL.md` for full usage and examples\n- `voice-ai-tts.yaml` for the API spec\n- `voice-ai-tts-sdk.js` for SDK usage\n\n## Security\n\nSee `SECURITY.md` for a clear list of what the skill reads/writes locally and what endpoints it contacts.\n\n## Links\n\n- Voice.ai Dashboard: https://voice.ai/dashboard\n- Voice.ai Docs: https://voice.ai/docs\n\nFile v1.1.4:_meta.json\n\n{\n  \"ownerId\": \"kn73en640mtvfs2neagtbc3b51809cyr\",\n  \"slug\": \"openclaw-skill-voice-ai-voices\",\n  \"version\": \"1.1.4\",\n  \"publishedAt\": 1771278006435\n}\n\nFile v1.1.4:CHANGELOG.md\n\n# Changelog\n\n## [1.1.4] - 2026-02-16\n### Changed\n- Declare `VOICE_AI_API_KEY` as primary env var in metadata\n\n## [1.1.3] - 2026-02-16\n### Changed\n- Remove voice-sample upload features from the published bundle to reduce privacy risk\n- Require `VOICE_AI_API_KEY` via environment variable only\n\n## [1.1.2] - 2026-02-16\n### Changed\n- Added `SECURITY.md` and `LICENSE.md` for provenance and transparency\n- Restricted SDK transport to HTTPS only\n\n## [1.1.1] - 2026-02-16\n### Changed\n- Packaging metadata improvements for ClawHub import (bin/files metadata)\n\n## [1.1.0] - 2026-02-16\n### Changed\n- Declared required credentials in metadata\n- Documented the production API endpoint domain\n- Renamed voice personas for IP-safe labeling\n- Added `voices.json` for voice data\n\n## [1.0.0] - 2026-01-31\n- Initial release\n\nFile v1.1.4:LICENSE.md\n\nMIT License\n\nCopyright (c) 2026 Nick Gill\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nFile v1.1.4:SECURITY.md\n\n# Security\n\nThis skill is a small Node.js CLI + SDK for Voice.ai text-to-speech.\n\n## Credentials\n\n- The only credential used is `VOICE_AI_API_KEY`.\n- The CLI reads it from the `VOICE_AI_API_KEY` environment variable.\n\n## Network Access\n\n- Outbound HTTPS requests are made only to `https://dev.voice.ai` (Voice.ai's production API domain).\n- The SDK rejects non-HTTPS base URLs.\n\n## Local File Access\n\nThe skill reads/writes local files only for its documented behavior:\n\n- Reads `voices.json` to map friendly voice names to voice IDs.\n- Writes the generated audio to `--output` (default `output.mp3`).\n\n## What This Skill Does Not Do\n\n- Does not execute shell commands (`child_process` is not used).\n- Does not download or install other software.\n- Does not modify system configuration files.\n- Does not run persistently in the background.\n\n## Reporting\n\nIf you find a security issue, please open an issue in the GitHub repository with a minimal reproduction and impact summary.\n\nFile v1.1.4:package.json\n\n{\n  \"name\": \"voice-ai-tts\",\n  \"version\": \"1.1.4\",\n  \"description\": \"High-quality voice synthesis with 9 personas, 11 languages, and streaming using Voice.ai API.\",\n  \"main\": \"SKILL.md\",\n  \"bin\": {\n    \"voice-ai-tts\": \"scripts/tts.js\"\n  },\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"files\": [\n    \"SKILL.md\",\n    \"README.md\",\n    \"CHANGELOG.md\",\n    \"LICENSE.md\",\n    \"SECURITY.md\",\n    \"voices.json\",\n    \"voice-ai-tts.yaml\",\n    \"voice-ai-tts-sdk.js\",\n    \"scripts/tts.js\"\n  ],\n  \"keywords\": [\"tts\", \"voice\", \"speech\", \"voice-ai\", \"audio\"],\n  \"author\": \"gizmoGremlin\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/gizmoGremlin/openclaw-skill-voice-ai-voices.git\"\n  },\n  \"openclaw\": {\n    \"skill\": true,\n    \"requirements\": {\n      \"bins\": [\"node\"],\n      \"env\": {\n        \"VOICE_AI_API_KEY\": \"required\"\n      },\n      \"primary_env\": \"VOICE_AI_API_KEY\"\n    }\n  }\n}\n\nFile v1.1.4:voices.json\n\n{\n  \"version\": \"1.1.4\",\n  \"default_voice\": \"ellie\",\n  \"model\": \"voiceai-tts-v1-latest\",\n  \"multilingual_model\": \"voiceai-tts-multilingual-v1-latest\",\n  \"supported_languages\": [\n    \"en\",\n    \"es\",\n    \"fr\",\n    \"de\",\n    \"it\",\n    \"pt\",\n    \"pl\",\n    \"ru\",\n    \"nl\",\n    \"sv\",\n    \"ca\"\n  ],\n  \"voices\": {\n    \"ellie\": {\n      \"voice_id\": \"d1bf0f33-8e0e-4fbf-acf8-45c3c6262513\",\n      \"name\": \"Ellie\",\n      \"gender\": \"female\",\n      \"persona\": \"youthful\",\n      \"best_for\": \"Vlogs, social content\"\n    },\n    \"oliver\": {\n      \"voice_id\": \"f9e6a5eb-a7fd-4525-9e92-75125249c933\",\n      \"name\": \"Oliver\",\n      \"gender\": \"male\",\n      \"persona\": \"british\",\n      \"best_for\": \"Narration, tutorials\"\n    },\n    \"lilith\": {\n      \"voice_id\": \"4388040c-8812-42f4-a264-f457a6b2b5b9\",\n      \"name\": \"Lilith\",\n      \"gender\": \"female\",\n      \"persona\": \"soft\",\n      \"best_for\": \"ASMR, calm content\"\n    },\n    \"smooth\": {\n      \"voice_id\": \"dbb271df-db25-4225-abb0-5200ba1426bc\",\n      \"name\": \"Smooth\",\n      \"gender\": \"male\",\n      \"persona\": \"deep\",\n      \"best_for\": \"Documentaries, audiobooks\"\n    },\n    \"shadow\": {\n      \"voice_id\": \"72d2a864-b236-402e-a166-a838ccc2c273\",\n      \"name\": \"Shadow\",\n      \"gender\": \"male\",\n      \"persona\": \"distinctive\",\n      \"best_for\": \"Gaming, entertainment\"\n    },\n    \"sakura\": {\n      \"voice_id\": \"559d3b72-3e79-4f11-9b62-9ec702a6c057\",\n      \"name\": \"Sakura\",\n      \"gender\": \"female\",\n      \"persona\": \"anime\",\n      \"best_for\": \"Character voices\"\n    },\n    \"zenith\": {\n      \"voice_id\": \"ed751d4d-e633-4bb0-8f5e-b5c8ddb04402\",\n      \"name\": \"Zenith\",\n      \"gender\": \"male\",\n      \"persona\": \"deep\",\n      \"best_for\": \"Gaming, dramatic content\"\n    },\n    \"flora\": {\n      \"voice_id\": \"a931a6af-fb01-42f0-a8c0-bd14bc302bb1\",\n      \"name\": \"Flora\",\n      \"gender\": \"female\",\n      \"persona\": \"cheerful\",\n      \"best_for\": \"Kids content, upbeat\"\n    },\n    \"commander\": {\n      \"voice_id\": \"bd35e4e6-6283-46b9-86b6-7cfa3dd409b9\",\n      \"name\": \"Commander\",\n      \"gender\": \"male\",\n      \"persona\": \"heroic\",\n      \"best_for\": \"Gaming, action content\"\n    }\n  }\n}\n\nFile v1.1.4:voice-ai-tts.yaml\n\n# ============================================================================\n# Voice.ai Text-to-Speech Skill\n# ============================================================================\n# A comprehensive skill for Voice.ai's TTS API with speech generation,\n# streaming, and voice management capabilities.\n#\n# Version: 1.1.4\n# Author: Nick Gill (https://github.com/gizmoGremlin)\n# License: MIT\n# Documentation: https://voice.ai/docs\n# ============================================================================\n\nskill:\n  name: voice-ai-tts\n  display_name: \"Voice.ai Text-to-Speech\"\n  description: |\n    High-quality voice synthesis with streaming audio generation,\n    multilingual support (11 languages), and flexible audio formats using the\n    Voice.ai Developer API. Features include real-time streaming, WebSocket\n    support for low-latency applications, and comprehensive voice management.\n  version: \"1.1.4\"\n  author: \"Nick Gill (https://github.com/gizmoGremlin)\"\n  icon: \"🎙️\"\n  category: \"audio\"\n  tags:\n    - text-to-speech\n    - tts\n    - audio-generation\n    - speech-synthesis\n    - ai-voice\n    - streaming\n    - websocket\n\n# ============================================================================\n# Authentication Configuration\n# ============================================================================\n\nauthentication:\n  type: bearer\n  header: Authorization\n  prefix: \"Bearer \"\n  description: |\n    Voice.ai uses Bearer token authentication. Get your API key from\n    https://voice.ai/dashboard and pass it as: Authorization: Bearer <your-api-key>\n  environment_variable: VOICE_AI_API_KEY\n  required: true\n\n# ============================================================================\n# API Configuration\n# ============================================================================\n\napi:\n  base_url: \"https://dev.voice.ai\" # Official Voice.ai production API endpoint\n  version: \"v1\"\n  content_type: \"application/json\"\n  timeout: 60000\n  rate_limit:\n    requests_per_minute: 60\n    description: \"Rate limits vary by plan. Check your dashboard for details.\"\n\n# ============================================================================\n# Available Models\n# ============================================================================\n\nmodels:\n  - id: \"voiceai-tts-v1-latest\"\n    name: \"Voice.ai TTS v1 (Latest)\"\n    description: \"Latest English TTS model with highest quality\"\n    languages: [\"en\"]\n    \n  - id: \"voiceai-tts-v1-2025-12-19\"\n    name: \"Voice.ai TTS v1 (2025-12-19)\"\n    description: \"Stable English TTS model snapshot\"\n    languages: [\"en\"]\n    \n  - id: \"voiceai-tts-multilingual-v1-latest\"\n    name: \"Voice.ai Multilingual v1 (Latest)\"\n    description: \"Latest multilingual TTS model\"\n    languages: [\"en\", \"es\", \"fr\", \"de\", \"it\", \"pt\", \"pl\", \"ru\", \"nl\", \"sv\", \"ca\"]\n    \n  - id: \"voiceai-tts-multilingual-v1-2025-01-14\"\n    name: \"Voice.ai Multilingual v1 (2025-01-14)\"\n    description: \"Stable multilingual TTS model snapshot\"\n    languages: [\"en\", \"es\", \"fr\", \"de\", \"it\", \"pt\", \"pl\", \"ru\", \"nl\", \"sv\", \"ca\"]\n\n# ============================================================================\n# Popular Voices\n# ============================================================================\n\nvoices:\n  - id: \"d1bf0f33-8e0e-4fbf-acf8-45c3c6262513\"\n    name: \"Ellie\"\n    gender: female\n    style: \"Youthful, vibrant fashion vlogger\"\n    \n  - id: \"f9e6a5eb-a7fd-4525-9e92-75125249c933\"\n    name: \"Oliver\"\n    gender: male\n    style: \"Friendly British, conversational\"\n    \n  - id: \"4388040c-8812-42f4-a264-f457a6b2b5b9\"\n    name: \"Lilith\"\n    gender: female\n    style: \"Soft, feminine\"\n    \n  - id: \"dbb271df-db25-4225-abb0-5200ba1426bc\"\n    name: \"Smooth Calm Voice\"\n    gender: male\n    style: \"Deep, smooth narrator\"\n    \n  - id: \"72d2a864-b236-402e-a166-a838ccc2c273\"\n    name: \"Shadow\"\n    gender: male\n    style: \"Deep, distinctive narrator\"\n    \n  - id: \"559d3b72-3e79-4f11-9b62-9ec702a6c057\"\n    name: \"Sakura\"\n    gender: female\n    style: \"Anime-inspired character\"\n    \n  - id: \"ed751d4d-e633-4bb0-8f5e-b5c8ddb04402\"\n    name: \"Zenith\"\n    gender: male\n    style: \"Deep, dramatic baritone\"\n    \n  - id: \"a931a6af-fb01-42f0-a8c0-bd14bc302bb1\"\n    name: \"Flora\"\n    gender: female\n    style: \"High pitch, cheerful\"\n    \n  - id: \"bd35e4e6-6283-46b9-86b6-7cfa3dd409b9\"\n    name: \"Commander\"\n    gender: male\n    style: \"Deep heroic, commanding\"\n\n# ============================================================================\n# Audio Formats\n# ============================================================================\n\naudio_formats:\n  basic:\n    - mp3: \"MP3 at 32kHz (default)\"\n    - wav: \"WAV at 32kHz\"\n    - pcm: \"Raw PCM 16-bit signed little-endian at 32kHz\"\n  \n  mp3_variants:\n    - mp3_22050_32: \"MP3 22.05kHz, 32kbps\"\n    - mp3_24000_48: \"MP3 24kHz, 48kbps\"\n    - mp3_44100_32: \"MP3 44.1kHz, 32kbps\"\n    - mp3_44100_64: \"MP3 44.1kHz, 64kbps\"\n    - mp3_44100_96: \"MP3 44.1kHz, 96kbps\"\n    - mp3_44100_128: \"MP3 44.1kHz, 128kbps\"\n    - mp3_44100_192: \"MP3 44.1kHz, 192kbps\"\n  \n  opus_variants:\n    - opus_48000_32: \"Opus 48kHz, 32kbps\"\n    - opus_48000_64: \"Opus 48kHz, 64kbps\"\n    - opus_48000_96: \"Opus 48kHz, 96kbps\"\n    - opus_48000_128: \"Opus 48kHz, 128kbps\"\n    - opus_48000_192: \"Opus 48kHz, 192kbps\"\n  \n  pcm_variants:\n    - pcm_8000: \"PCM 8kHz\"\n    - pcm_16000: \"PCM 16kHz\"\n    - pcm_22050: \"PCM 22.05kHz\"\n    - pcm_24000: \"PCM 24kHz\"\n    - pcm_32000: \"PCM 32kHz\"\n    - pcm_44100: \"PCM 44.1kHz\"\n    - pcm_48000: \"PCM 48kHz\"\n  \n  wav_variants:\n    - wav_16000: \"WAV 16kHz\"\n    - wav_22050: \"WAV 22.05kHz\"\n    - wav_24000: \"WAV 24kHz\"\n  \n  telephony:\n    - alaw_8000: \"A-law 8kHz (telephony)\"\n    - ulaw_8000: \"μ-law 8kHz (telephony)\"\n\n# ============================================================================\n# Tools / Actions\n# ============================================================================\n\ntools:\n\n  # --------------------------------------------------------------------------\n  # List Voices\n  # --------------------------------------------------------------------------\n  - name: list_voices\n    display_name: \"List Voices\"\n    description: |\n      Retrieve a list of available voices including public voices and your\n      private voices. Returns voice metadata including ID, name, language,\n      and visibility status.\n    method: GET\n    endpoint: \"/api/v1/tts/voices\"\n    parameters:\n      - name: limit\n        type: integer\n        required: false\n        default: 10\n        description: \"Maximum number of voices to return (default: 10)\"\n      - name: offset\n        type: integer\n        required: false\n        default: 0\n        description: \"Offset for pagination\"\n      - name: visibility\n        type: string\n        required: false\n        enum: [\"PUBLIC\", \"PRIVATE\"]\n        description: \"Filter by voice visibility\"\n    response:\n      type: object\n      properties:\n        voices:\n          type: array\n          items:\n            type: object\n            properties:\n              voice_id:\n                type: string\n                description: \"Unique voice identifier\"\n              name:\n                type: string\n                description: \"Voice name\"\n              language:\n                type: string\n                description: \"Voice language (ISO 639-1)\"\n              visibility:\n                type: string\n                enum: [\"PUBLIC\", \"PRIVATE\"]\n              status:\n                type: string\n                enum: [\"PENDING\", \"PROCESSING\", \"AVAILABLE\", \"FAILED\"]\n    example:\n      request:\n        method: GET\n        url: \"https://dev.voice.ai/api/v1/tts/voices?limit=10\"\n        headers:\n          Authorization: \"Bearer YOUR_API_KEY\"\n      response:\n        voices:\n          - voice_id: \"abc123\"\n            name: \"Sarah\"\n            language: \"en\"\n            visibility: \"PUBLIC\"\n            status: \"AVAILABLE\"\n\n  # --------------------------------------------------------------------------\n  # Get Voice\n  # --------------------------------------------------------------------------\n  - name: get_voice\n    display_name: \"Get Voice Details\"\n    description: |\n      Retrieve detailed information about a specific voice by its ID.\n    method: GET\n    endpoint: \"/api/v1/tts/voice/{voice_id}\"\n    parameters:\n      - name: voice_id\n        type: string\n        required: true\n        in: path\n        description: \"The unique voice identifier\"\n    response:\n      type: object\n      properties:\n        voice_id:\n          type: string\n        name:\n          type: string\n        language:\n          type: string\n        visibility:\n          type: string\n        status:\n          type: string\n        created_at:\n          type: string\n          format: datetime\n    example:\n      request:\n        method: GET\n        url: \"https://dev.voice.ai/api/v1/tts/voice/abc123\"\n      response:\n        voice_id: \"abc123\"\n        name: \"Sarah\"\n        language: \"en\"\n        visibility: \"PUBLIC\"\n        status: \"AVAILABLE\"\n\n  # --------------------------------------------------------------------------\n  # Generate Speech\n  # --------------------------------------------------------------------------\n  - name: generate_speech\n    display_name: \"Generate Speech\"\n    description: |\n      Generate speech from text. Returns complete audio file after generation\n      is complete. For real-time streaming, use the speech_stream endpoint instead.\n    method: POST\n    endpoint: \"/api/v1/tts/speech\"\n    parameters:\n      - name: text\n        type: string\n        required: true\n        description: \"The text to convert to speech\"\n        max_length: 5000\n      - name: voice_id\n        type: string\n        required: false\n        description: \"Voice ID to use. Omit to use the default built-in voice.\"\n      - name: audio_format\n        type: string\n        required: false\n        default: \"mp3\"\n        enum: [\"mp3\", \"wav\", \"pcm\", \"alaw_8000\", \"ulaw_8000\", \"mp3_44100_128\", \"opus_48000_64\"]\n        description: \"Output audio format (32kHz sample rate for basic formats)\"\n      - name: temperature\n        type: number\n        required: false\n        default: 1.0\n        minimum: 0.0\n        maximum: 2.0\n        description: \"Sampling temperature for variation (0.0-2.0)\"\n      - name: top_p\n        type: number\n        required: false\n        default: 0.8\n        minimum: 0.0\n        maximum: 1.0\n        description: \"Nucleus sampling parameter (0.0-1.0)\"\n      - name: model\n        type: string\n        required: false\n        enum: [\"voiceai-tts-v1-latest\", \"voiceai-tts-multilingual-v1-latest\"]\n        description: \"TTS model. Auto-selected based on language if not specified.\"\n      - name: language\n        type: string\n        required: false\n        default: \"en\"\n        enum: [\"en\", \"es\", \"fr\", \"de\", \"it\", \"pt\", \"pl\", \"ru\", \"nl\", \"sv\", \"ca\"]\n        description: \"Language code (ISO 639-1)\"\n    response:\n      type: binary\n      content_type: \"audio/mpeg\"\n      description: \"Audio file in the requested format\"\n    example:\n      request:\n        method: POST\n        url: \"https://dev.voice.ai/api/v1/tts/speech\"\n        headers:\n          Authorization: \"Bearer YOUR_API_KEY\"\n          Content-Type: \"application/json\"\n        body:\n          text: \"Hello, this is a test of Voice.ai text to speech.\"\n          voice_id: \"abc123\"\n          audio_format: \"mp3\"\n          language: \"en\"\n\n  # --------------------------------------------------------------------------\n  # Speech Stream\n  # --------------------------------------------------------------------------\n  - name: speech_stream\n    display_name: \"Speech Stream\"\n    description: |\n      Generate speech from text with HTTP chunked streaming. Returns audio\n      chunks as they are generated for low-latency playback. Ideal for\n      real-time applications.\n    method: POST\n    endpoint: \"/api/v1/tts/speech/stream\"\n    streaming: true\n    parameters:\n      - name: text\n        type: string\n        required: true\n        description: \"The text to convert to speech\"\n      - name: voice_id\n        type: string\n        required: false\n        description: \"Voice ID to use. Omit for default voice.\"\n      - name: audio_format\n        type: string\n        required: false\n        default: \"mp3\"\n        description: \"Output audio format\"\n      - name: temperature\n        type: number\n        required: false\n        default: 1.0\n        minimum: 0.0\n        maximum: 2.0\n      - name: top_p\n        type: number\n        required: false\n        default: 0.8\n      - name: model\n        type: string\n        required: false\n      - name: language\n        type: string\n        required: false\n        default: \"en\"\n    response:\n      type: stream\n      content_type: [\"audio/mpeg\", \"audio/wav\", \"audio/pcm\"]\n      description: \"Chunked audio stream via HTTP chunked transfer encoding\"\n    example:\n      request:\n        method: POST\n        url: \"https://dev.voice.ai/api/v1/tts/speech/stream\"\n        headers:\n          Authorization: \"Bearer YOUR_API_KEY\"\n          Content-Type: \"application/json\"\n        body:\n          text: \"Streaming audio is great for real-time applications.\"\n          audio_format: \"mp3\"\n\n  # --------------------------------------------------------------------------\n  # Update Voice\n  # --------------------------------------------------------------------------\n  - name: update_voice\n    display_name: \"Update Voice\"\n    description: |\n      Update voice metadata such as name and visibility. Owner-only operation.\n    method: PATCH\n    endpoint: \"/api/v1/tts/voice/{voice_id}\"\n    parameters:\n      - name: voice_id\n        type: string\n        required: true\n        in: path\n        description: \"The voice ID to update\"\n      - name: name\n        type: string\n        required: false\n        description: \"New name for the voice\"\n      - name: voice_visibility\n        type: string\n        required: false\n        enum: [\"PUBLIC\", \"PRIVATE\"]\n        description: \"New visibility setting\"\n    response:\n      type: object\n      properties:\n        voice_id:\n          type: string\n        name:\n          type: string\n        visibility:\n          type: string\n        updated_at:\n          type: string\n    example:\n      request:\n        method: PATCH\n        url: \"https://dev.voice.ai/api/v1/tts/voice/abc123\"\n        body:\n          name: \"Updated Voice Name\"\n          voice_visibility: \"PRIVATE\"\n\n  # --------------------------------------------------------------------------\n  # Delete Voice\n  # --------------------------------------------------------------------------\n  - name: delete_voice\n    display_name: \"Delete Voice\"\n    description: |\n      Delete a voice. This is a permanent action and cannot be undone.\n      Owner-only operation.\n    method: DELETE\n    endpoint: \"/api/v1/tts/voice/{voice_id}\"\n    parameters:\n      - name: voice_id\n        type: string\n        required: true\n        in: path\n        description: \"The voice ID to delete\"\n    response:\n      type: object\n      properties:\n        success:\n          type: boolean\n        message:\n          type: string\n    example:\n      request:\n        method: DELETE\n        url: \"https://dev.voice.ai/api/v1/tts/voice/abc123\"\n      response:\n        success: true\n        message: \"Voice deleted successfully\"\n\n  # --------------------------------------------------------------------------\n  # Single Context WebSocket\n  # --------------------------------------------------------------------------\n  - name: websocket_single_context\n    display_name: \"WebSocket (Single Context)\"\n    description: |\n      Real-time bidirectional streaming via WebSocket for single conversation\n      context. Ideal for interactive applications requiring ultra-low latency.\n      Send text chunks and receive audio chunks in real-time.\n    method: WEBSOCKET\n    endpoint: \"/api/v1/tts/ws\"\n    parameters:\n      - name: voice_id\n        type: string\n        required: false\n        description: \"Voice ID to use\"\n      - name: audio_format\n        type: string\n        required: false\n        default: \"pcm_16000\"\n        description: \"Audio format for streaming\"\n      - name: model\n        type: string\n        required: false\n    messages:\n      send:\n        type: object\n        properties:\n          text:\n            type: string\n            description: \"Text chunk to synthesize\"\n          flush:\n            type: boolean\n            description: \"Force flush buffered audio\"\n          end:\n            type: boolean\n            description: \"Signal end of stream\"\n      receive:\n        type: binary\n        description: \"Audio data chunks\"\n    example:\n      url: \"wss://dev.voice.ai/api/v1/tts/ws?voice_id=abc123&audio_format=pcm_16000\"\n      send: '{\"text\": \"Hello, how are you today?\"}'\n      receive: \"<binary audio data>\"\n\n  # --------------------------------------------------------------------------\n  # Multi Context WebSocket\n  # --------------------------------------------------------------------------\n  - name: websocket_multi_context\n    display_name: \"WebSocket (Multi Context)\"\n    description: |\n      Real-time bidirectional streaming via WebSocket with support for multiple\n      conversation contexts. Allows switching between different voice contexts\n      within a single connection for complex applications.\n    method: WEBSOCKET\n    endpoint: \"/api/v1/tts/ws/multi\"\n    parameters:\n      - name: audio_format\n        type: string\n        required: false\n        default: \"pcm_16000\"\n    messages:\n      send:\n        type: object\n        properties:\n          context_id:\n            type: string\n            description: \"Context identifier for multiplexing\"\n          voice_id:\n            type: string\n            description: \"Voice ID for this context\"\n          text:\n            type: string\n            description: \"Text chunk to synthesize\"\n          flush:\n            type: boolean\n          end:\n            type: boolean\n      receive:\n        type: object\n        properties:\n          context_id:\n            type: string\n          audio:\n            type: binary\n            description: \"Audio data for the context\"\n    example:\n      url: \"wss://dev.voice.ai/api/v1/tts/ws/multi?audio_format=pcm_16000\"\n      send: '{\"context_id\": \"conv1\", \"voice_id\": \"abc123\", \"text\": \"Hello!\"}'\n\n# ============================================================================\n# Error Codes\n# ============================================================================\n\nerrors:\n  - code: 401\n    name: \"Unauthorized\"\n    description: \"Invalid or missing API key\"\n    \n  - code: 402\n    name: \"Payment Required\"\n    description: \"Insufficient credits or voice slot limit reached\"\n    \n  - code: 403\n    name: \"Forbidden\"\n    description: \"Insufficient permissions for the requested operation\"\n    \n  - code: 404\n    name: \"Not Found\"\n    description: \"Voice ID does not exist or is not accessible\"\n    \n  - code: 422\n    name: \"Validation Error\"\n    description: \"Invalid request parameters\"\n    \n  - code: 429\n    name: \"Rate Limited\"\n    description: \"Too many requests. Please slow down.\"\n    \n  - code: 500\n    name: \"Internal Server Error\"\n    description: \"Server error. Please try again later.\"\n\n# ============================================================================\n# Code Examples\n# ============================================================================\n\nexamples:\n  python:\n    list_voices: |\n      import requests\n\n      API_KEY = \"your_api_key_here\"\n      \n      response = requests.get(\n          \"https://dev.voice.ai/api/v1/tts/voices\",\n          headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n          params={\"limit\": 10}\n      )\n      \n      voices = response.json()[\"voices\"]\n      for voice in voices:\n          print(f\"{voice['name']} ({voice['voice_id']})\")\n\n    generate_speech: |\n      import requests\n\n      API_KEY = \"your_api_key_here\"\n      \n      response = requests.post(\n          \"https://dev.voice.ai/api/v1/tts/speech\",\n          headers={\n              \"Authorization\": f\"Bearer {API_KEY}\",\n              \"Content-Type\": \"application/json\"\n          },\n          json={\n              \"text\": \"Hello, this is Voice.ai text to speech!\",\n              \"voice_id\": \"your_voice_id\",  # optional\n              \"audio_format\": \"mp3\"\n          }\n      )\n      \n      with open(\"output.mp3\", \"wb\") as f:\n          f.write(response.content)\n\n    stream_speech: |\n      import requests\n\n      API_KEY = \"your_api_key_here\"\n      \n      response = requests.post(\n          \"https://dev.voice.ai/api/v1/tts/speech/stream\",\n          headers={\n              \"Authorization\": f\"Bearer {API_KEY}\",\n              \"Content-Type\": \"application/json\"\n          },\n          json={\n              \"text\": \"Streaming audio for real-time playback.\",\n              \"audio_format\": \"mp3\"\n          },\n          stream=True\n      )\n      \n      with open(\"stream_output.mp3\", \"wb\") as f:\n          for chunk in response.iter_content(chunk_size=1024):\n              f.write(chunk)\n\n  curl:\n    list_voices: |\n      curl -X GET \"https://dev.voice.ai/api/v1/tts/voices?limit=10\" \\\n        -H \"Authorization: Bearer YOUR_API_KEY\"\n\n    generate_speech: |\n      curl -X POST \"https://dev.voice.ai/api/v1/tts/speech\" \\\n        -H \"Authorization: Bearer YOUR_API_KEY\" \\\n        -H \"Content-Type: application/json\" \\\n        -d '{\"text\": \"Hello world!\", \"audio_format\": \"mp3\"}' \\\n        --output speech.mp3\n\n  typescript:\n    generate_speech: |\n      const response = await fetch(\"https://dev.voice.ai/api/v1/tts/speech\", {\n        method: \"POST\",\n        headers: {\n          \"Authorization\": `Bearer ${API_KEY}`,\n          \"Content-Type\": \"application/json\"\n        },\n        body: JSON.stringify({\n          text: \"Hello from TypeScript!\",\n          audio_format: \"mp3\"\n        })\n      });\n      \n      const audioBlob = await response.blob();\n      const audioUrl = URL.createObjectURL(audioBlob);\n      \n      // Play the audio\n      const audio = new Audio(audioUrl);\n      audio.play();\n\n# ============================================================================\n# Changelog\n# ============================================================================\n\nchangelog:\n  - version: \"1.1.4\"\n    date: \"2026-02-16\"\n    changes:\n      - \"Declare primary env var in metadata for scanners\"\n  - version: \"1.1.3\"\n    date: \"2026-02-16\"\n    changes:\n      - \"Remove voice-sample upload tool entry to reduce privacy risk\"\n  - version: \"1.1.2\"\n    date: \"2026-02-16\"\n    changes:\n      - \"Add SECURITY.md and LICENSE.md for provenance\"\n      - \"Restrict SDK to https only (remove http transport)\"\n  - version: \"1.1.1\"\n    date: \"2026-02-16\"\n    changes:\n      - \"Packaging metadata improvements for ClawHub import\"\n  - version: \"1.1.0\"\n    date: \"2026-02-16\"\n    changes:\n      - \"Documented production API endpoint\"\n      - \"Renamed voice personas for IP-safe labeling\"\n      - \"Metadata alignment for required credentials\"\n  - version: \"1.0.0\"\n    date: \"2026-01-30\"\n    changes:\n      - \"Initial release\"\n      - \"Support for all TTS endpoints\"\n      - \"HTTP and WebSocket streaming\"\n      - \"Multilingual support (11 languages)\"\n      - \"Comprehensive audio format options\"\n\nArchive v1.1.3: 11 files, 19561 bytes\n\nFiles: CHANGELOG.md (710b), LICENSE.md (1066b), package.json (866b), README.md (1125b), scripts/tts.js (2904b), SECURITY.md (979b), SKILL.md (9623b), voice-ai-tts-sdk.js (16227b), voice-ai-tts.yaml (23047b), voices.json (2103b), _meta.json (149b)\n\nFile v1.1.3:SKILL.md\n\n---\nname: voice-ai-tts\ndescription: >\n  High-quality voice synthesis with 9 personas, 11 languages, and streaming using Voice.ai API.\nversion: 1.1.3\ntags: [tts, voice, speech, voice-ai, audio, streaming, multilingual]\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"node\"],\"env\":{\"VOICE_AI_API_KEY\":\"required\"},\"note\":\"Set VOICE_AI_API_KEY via an environment variable.\"}}}\n---\n\n# Voice.ai Voices\n\n## ✨ Features\n\n- **9 Voice Personas** - Carefully curated voices for different use cases\n- **11 Languages** - Multi-language synthesis with multilingual model\n- **Streaming Mode** - Real-time audio output as it generates\n- **Voice Design** - Customize with temperature and top_p parameters\n- **OpenClaw Integration** - Works with OpenClaw's built-in TTS\n\n---\n\n## ⚙️ Configuration\n\nSet your API key as an environment variable:\n\n```bash\nexport VOICE_AI_API_KEY=\"your-api-key\"\n```\n\n**Get your API key:** [Voice.ai Dashboard](https://voice.ai/dashboard)\n\n---\n\n## 📦 Installation\n\nNo install step is required. This skill bundles a Node.js CLI and SDK (no external npm dependencies).\n\n## 🧩 Key Files\n\n- [`scripts/tts.js`](scripts/tts.js) - CLI entrypoint\n- [`voice-ai-tts-sdk.js`](voice-ai-tts-sdk.js) - Node.js SDK used by the CLI\n- [`voices.json`](voices.json) - Voice definitions used by the CLI\n- [`voice-ai-tts.yaml`](voice-ai-tts.yaml) - API specification\n- [`package.json`](package.json) - Skill metadata for tooling\n\n## Security Notes\n\nSee [`SECURITY.md`](SECURITY.md) for the full security and privacy overview.\n\nThis skill:\n- Makes outbound HTTPS requests only to `https://dev.voice.ai`\n- Reads local files: `voices.json`\n- Writes audio output to the `--output` path (default `output.mp3`)\n- Does not execute shell commands and does not modify system configuration files\n\n## 🌐 API Endpoint\n\nThe SDK and spec use `https://dev.voice.ai`, which is the official Voice.ai production API domain.\n\n---\n\n## 🤖 OpenClaw Integration\n\nOpenClaw can invoke the CLI script directly if your environment exposes `VOICE_AI_API_KEY`. Use the `/tts` commands as configured by your OpenClaw installation.\n\n---\n\n## 📝 Triggers\n\nThese chat commands work with OpenClaw:\n\n| Command | Description |\n|---------|-------------|\n| `/tts <text>` | Generate speech with default voice |\n| `/tts --voice ellie <text>` | Generate speech with specific voice |\n| `/tts --stream <text>` | Generate with streaming mode |\n| `/voices` | List available voices |\n\n**Examples:**\n\n```\n/tts Hello, welcome to Voice.ai!\n/tts --voice oliver Good morning, everyone.\n/tts --voice lilith --stream This is a long story that will stream as it generates...\n```\n\n---\n\n## 🎙️ Available Voices\n\n| Voice   | ID | Gender | Persona     | Best For                   |\n|---------|-----|--------|-------------|----------------------------|\n| ellie   | `d1bf0f33-8e0e-4fbf-acf8-45c3c6262513` | female | youthful    | Vlogs, social content      |\n| oliver  | `f9e6a5eb-a7fd-4525-9e92-75125249c933` | male   | british     | Narration, tutorials       |\n| lilith  | `4388040c-8812-42f4-a264-f457a6b2b5b9` | female | soft        | ASMR, calm content         |\n| smooth  | `dbb271df-db25-4225-abb0-5200ba1426bc` | male   | deep        | Documentaries, audiobooks  |\n| shadow  | `72d2a864-b236-402e-a166-a838ccc2c273` | male   | distinctive | Gaming, entertainment      |\n| sakura  | `559d3b72-3e79-4f11-9b62-9ec702a6c057` | female | anime       | Character voices           |\n| zenith  | `ed751d4d-e633-4bb0-8f5e-b5c8ddb04402` | male   | deep        | Gaming, dramatic content   |\n| flora   | `a931a6af-fb01-42f0-a8c0-bd14bc302bb1` | female | cheerful    | Kids content, upbeat       |\n| commander | `bd35e4e6-6283-46b9-86b6-7cfa3dd409b9` | male   | heroic      | Gaming, action content     |\n\n---\n\n## 🌍 Supported Languages\n\n| Code | Language   |\n|------|------------|\n| `en` | English    |\n| `es` | Spanish    |\n| `fr` | French     |\n| `de` | German     |\n| `it` | Italian    |\n| `pt` | Portuguese |\n| `pl` | Polish     |\n| `ru` | Russian    |\n| `nl` | Dutch      |\n| `sv` | Swedish    |\n| `ca` | Catalan    |\n\nUse the multilingual model for non-English languages:\n\n```javascript\nconst audio = await client.generateSpeech({\n  text: 'Bonjour le monde!',\n  voice_id: 'ellie-voice-id',\n  model: 'voiceai-tts-multilingual-v1-latest',\n  language: 'fr'\n});\n```\n\n---\n\n## 🎨 Voice Design\n\nCustomize voice output with these parameters:\n\n| Parameter | Range | Default | Description |\n|-----------|-------|---------|-------------|\n| `temperature` | 0-2 | 1.0 | Higher = more expressive, lower = more consistent |\n| `top_p` | 0-1 | 0.8 | Controls randomness in speech generation |\n\n**Example:**\n\n```javascript\nconst audio = await client.generateSpeech({\n  text: 'This will sound very expressive!',\n  voice_id: 'ellie-voice-id',\n  temperature: 1.8,\n  top_p: 0.9\n});\n```\n\n---\n\n## 📡 Streaming Mode\n\nGenerate audio with real-time streaming (recommended for long texts):\n\n```bash\n# Stream audio as it generates\nnode scripts/tts.js --text \"This is a long story...\" --voice ellie --stream\n\n# Streaming with custom output\nnode scripts/tts.js --text \"Chapter one...\" --voice oliver --stream --output chapter1.mp3\n```\n\n**SDK streaming:**\n\n```javascript\nconst stream = await client.streamSpeech({\n  text: 'Long text here...',\n  voice_id: 'ellie-voice-id'\n});\n\n// Pipe to file\nstream.pipe(fs.createWriteStream('output.mp3'));\n\n// Or handle chunks\nstream.on('data', chunk => {\n  // Process audio chunk\n});\n```\n\n---\n\n## 🔊 Audio Formats\n\n| Format | Description | Use Case |\n|--------|-------------|----------|\n| `mp3` | Standard MP3 (32kHz) | General use |\n| `wav` | Uncompressed WAV | High quality |\n| `pcm` | Raw PCM audio | Processing |\n| `opus_48000_128` | Opus 128kbps | Streaming |\n| `mp3_44100_192` | High-quality MP3 | Professional |\n\nSee `voice-ai-tts-sdk.js` for all format options.\n\n---\n\n## 💻 CLI Usage\n\n```bash\n# Set API key\nexport VOICE_AI_API_KEY=\"your-key-here\"\n\n# Generate speech\nnode scripts/tts.js --text \"Hello world!\" --voice ellie\n\n# Choose different voice\nnode scripts/tts.js --text \"Good morning!\" --voice oliver --output morning.mp3\n\n# Use streaming for long texts\nnode scripts/tts.js --text \"Once upon a time...\" --voice lilith --stream\n\n# Show help\nnode scripts/tts.js --help\n```\n\n---\n\n## 📁 Files\n\n```\nvoice-ai-tts/\n├── SKILL.md              # This documentation\n├── README.md             # Quick start\n├── CHANGELOG.md          # Version history\n├── LICENSE.md            # MIT license\n├── SECURITY.md           # Security & privacy notes\n├── voices.json           # Voice definitions\n├── voice-ai-tts.yaml     # OpenAPI specification\n├── voice-ai-tts-sdk.js   # JavaScript/Node.js SDK\n├── package.json          # OpenClaw metadata\n├── scripts/\n│   └── tts.js            # CLI tool\n```\n\n---\n\n## 💰 Cost & Usage\n\nVoice.ai uses a credit-based system. Check your usage:\n\n```javascript\n// The SDK tracks usage via API responses\nconst voices = await client.listVoices();\n// Check response headers for rate limit info\n```\n\n**Tips to reduce costs:**\n- Use streaming for long texts (more efficient)\n- Cache generated audio when possible\n- Use appropriate audio quality for your use case\n\n---\n\n## 🔗 Links\n\n- **[Get API Key](https://voice.ai/dashboard)** - Sign up and get your key\n- **[API Documentation](https://voice.ai/docs)** - Full API reference\n- **[Voice Library](https://voice.ai/voices)** - Browse all voices\n- **[API Reference](https://voice.ai/docs/api-reference/text-to-speech/generate-speech)** - Endpoint details\n- **[Pricing](https://voice.ai/pricing)** - Plans and credits\n\n---\n\n## 📋 Changelog\n\n### v1.1.3 (2026-02-16)\n- Remove voice-sample upload features from the published bundle to reduce privacy risk\n- Require `VOICE_AI_API_KEY` via environment variable only\n\n### v1.1.2 (2026-02-16)\n- Added `SECURITY.md` and `LICENSE.md` for provenance and transparency\n- Restricted SDK transport to HTTPS only\n\n### v1.1.1 (2026-02-16)\n- Packaging metadata improvements for ClawHub import (bin/files metadata)\n\n### v1.1.0 (2026-02-16)\n- Declared required credentials in metadata\n- Documented the production API endpoint domain\n- Renamed voice personas for IP-safe labeling\n- Added `voices.json` for voice data\n\n### v1.0.0 (2025-01-31)\n- Initial release\n- 9 curated voice personas\n- 11 language support\n- Streaming mode\n- Voice design parameters\n- Full SDK with error handling\n- CLI tool\n\n---\n\n## 🛠️ SDK Quick Reference\n\n```javascript\nconst VoiceAI = require('./voice-ai-tts-sdk');\nconst client = new VoiceAI(process.env.VOICE_AI_API_KEY);\n\n// List voices\nconst voices = await client.listVoices({ limit: 10 });\n\n// Get voice details\nconst voice = await client.getVoice('voice-id');\n\n// Generate speech\nconst audio = await client.generateSpeech({\n  text: 'Hello, world!',\n  voice_id: 'voice-id',\n  audio_format: 'mp3'\n});\n\n// Generate to file\nawait client.generateSpeechToFile(\n  { text: 'Hello!', voice_id: 'voice-id' },\n  'output.mp3'\n);\n\n// Stream speech\nconst stream = await client.streamSpeech({\n  text: 'Long text...',\n  voice_id: 'voice-id'\n});\n\n// Delete voice\nawait client.deleteVoice('voice-id');\n```\n\n---\n\n## ❓ Troubleshooting\n\n| Error | Cause | Solution |\n|-------|-------|----------|\n| `AuthenticationError` | Invalid API key | Check your `VOICE_AI_API_KEY` |\n| `PaymentRequiredError` | Out of credits | Add credits at voice.ai/dashboard |\n| `RateLimitError` | Too many requests | Wait and retry, or upgrade plan |\n| `ValidationError` | Invalid parameters | Check text length and voice_id |\n\n---\n\nMade with ❤️ by [Nick Gill](https://github.com/gizmoGremlin)\n\nFile v1.1.3:README.md\n\n# Voice.ai Voices\n\nHigh-quality voice synthesis with 9 personas, 11 languages, and streaming using the Voice.ai API.\n\nRequires Node.js 18+.\n\n## Quick Start\n\n```bash\n# Set API key\nexport VOICE_AI_API_KEY=\"your-key-here\"\n\n# Generate speech\nnode scripts/tts.js --text \"Hello world!\" --voice ellie\n\n# Streaming for long text\nnode scripts/tts.js --text \"Once upon a time...\" --voice lilith --stream\n```\n\n## Configuration\n\nThe CLI requires `VOICE_AI_API_KEY` to be set as an environment variable.\n\n## API Endpoint\n\nThe SDK uses `https://dev.voice.ai`, which is the official Voice.ai production API domain.\n\n## Voices\n\nVoice definitions live in `voices.json`. Use the CLI with `--voice <name>`:\n\n```\nellie, oliver, lilith, smooth, shadow, sakura, zenith, flora, commander\n```\n\n## Documentation\n\n- `SKILL.md` for full usage and examples\n- `voice-ai-tts.yaml` for the API spec\n- `voice-ai-tts-sdk.js` for SDK usage\n\n## Security\n\nSee `SECURITY.md` for a clear list of what the skill reads/writes locally and what endpoints it contacts.\n\n## Links\n\n- Voice.ai Dashboard: https://voice.ai/dashboard\n- Voice.ai Docs: https://voice.ai/docs\n\nFile v1.1.3:_meta.json\n\n{\n  \"ownerId\": \"kn73en640mtvfs2neagtbc3b51809cyr\",\n  \"slug\": \"openclaw-skill-voice-ai-voices\",\n  \"version\": \"1.1.3\",\n  \"publishedAt\": 1771277012316\n}\n\nFile v1.1.3:CHANGELOG.md\n\n# Changelog\n\n## [1.1.3] - 2026-02-16\n### Changed\n- Remove voice-sample upload features from the published bundle to reduce privacy risk\n- Require `VOICE_AI_API_KEY` via environment variable only\n\n## [1.1.2] - 2026-02-16\n### Changed\n- Added `SECURITY.md` and `LICENSE.md` for provenance and transparency\n- Restricted SDK transport to HTTPS only\n\n## [1.1.1] - 2026-02-16\n### Changed\n- Packaging metadata improvements for ClawHub import (bin/files metadata)\n\n## [1.1.0] - 2026-02-16\n### Changed\n- Declared required credentials in metadata\n- Documented the production API endpoint domain\n- Renamed voice personas for IP-safe labeling\n- Added `voices.json` for voice data\n\n## [1.0.0] - 2026-01-31\n- Initial release\n\nFile v1.1.3:LICENSE.md\n\nMIT License\n\nCopyright (c) 2026 Nick Gill\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nFile v1.1.3:SECURITY.md\n\n# Security\n\nThis skill is a small Node.js CLI + SDK for Voice.ai text-to-speech.\n\n## Credentials\n\n- The only credential used is `VOICE_AI_API_KEY`.\n- The CLI reads it from the `VOICE_AI_API_KEY` environment variable.\n\n## Network Access\n\n- Outbound HTTPS requests are made only to `https://dev.voice.ai` (Voice.ai's production API domain).\n- The SDK rejects non-HTTPS base URLs.\n\n## Local File Access\n\nThe skill reads/writes local files only for its documented behavior:\n\n- Reads `voices.json` to map friendly voice names to voice IDs.\n- Writes the generated audio to `--output` (default `output.mp3`).\n\n## What This Skill Does Not Do\n\n- Does not execute shell commands (`child_process` is not used).\n- Does not download or install other software.\n- Does not modify system configuration files.\n- Does not run persistently in the background.\n\n## Reporting\n\nIf you find a security issue, please open an issue in the GitHub repository with a minimal reproduction and impact summary.\n\nFile v1.1.3:package.json\n\n{\n  \"name\": \"voice-ai-tts\",\n  \"version\": \"1.1.3\",\n  \"description\": \"High-quality voice synthesis with 9 personas, 11 languages, and streaming using Voice.ai API.\",\n  \"main\": \"SKILL.md\",\n  \"bin\": {\n    \"voice-ai-tts\": \"scripts/tts.js\"\n  },\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"files\": [\n    \"SKILL.md\",\n    \"README.md\",\n    \"CHANGELOG.md\",\n    \"LICENSE.md\",\n    \"SECURITY.md\",\n    \"voices.json\",\n    \"voice-ai-tts.yaml\",\n    \"voice-ai-tts-sdk.js\",\n    \"scripts/tts.js\"\n  ],\n  \"keywords\": [\"tts\", \"voice\", \"speech\", \"voice-ai\", \"audio\"],\n  \"author\": \"gizmoGremlin\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/gizmoGremlin/openclaw-skill-voice-ai-voices.git\"\n  },\n  \"openclaw\": {\n    \"skill\": true,\n    \"requirements\": {\n      \"bins\": [\"node\"],\n      \"env\": {\n        \"VOICE_AI_API_KEY\": \"required\"\n      }\n    }\n  }\n}\n\nFile v1.1.3:voices.json\n\n{\n  \"version\": \"1.1.3\",\n  \"default_voice\": \"ellie\",\n  \"model\": \"voiceai-tts-v1-latest\",\n  \"multilingual_model\": \"voiceai-tts-multilingual-v1-latest\",\n  \"supported_languages\": [\n    \"en\",\n    \"es\",\n    \"fr\",\n    \"de\",\n    \"it\",\n    \"pt\",\n    \"pl\",\n    \"ru\",\n    \"nl\",\n    \"sv\",\n    \"ca\"\n  ],\n  \"voices\": {\n    \"ellie\": {\n      \"voice_id\": \"d1bf0f33-8e0e-4fbf-acf8-45c3c6262513\",\n      \"name\": \"Ellie\",\n      \"gender\": \"female\",\n      \"persona\": \"youthful\",\n      \"best_for\": \"Vlogs, social content\"\n    },\n    \"oliver\": {\n      \"voice_id\": \"f9e6a5eb-a7fd-4525-9e92-75125249c933\",\n      \"name\": \"Oliver\",\n      \"gender\": \"male\",\n      \"persona\": \"british\",\n      \"best_for\": \"Narration, tutorials\"\n    },\n    \"lilith\": {\n      \"voice_id\": \"4388040c-8812-42f4-a264-f457a6b2b5b9\",\n      \"name\": \"Lilith\",\n      \"gender\": \"female\",\n      \"persona\": \"soft\",\n      \"best_for\": \"ASMR, calm content\"\n    },\n    \"smooth\": {\n      \"voice_id\": \"dbb271df-db25-4225-abb0-5200ba1426bc\",\n      \"name\": \"Smooth\",\n      \"gender\": \"male\",\n      \"persona\": \"deep\",\n      \"best_for\": \"Documentaries, audiobooks\"\n    },\n    \"shadow\": {\n      \"voice_id\": \"72d2a864-b236-402e-a166-a838ccc2c273\",\n      \"name\": \"Shadow\",\n      \"gender\": \"male\",\n      \"persona\": \"distinctive\",\n      \"best_for\": \"Gaming, entertainment\"\n    },\n    \"sakura\": {\n      \"voice_id\": \"559d3b72-3e79-4f11-9b62-9ec702a6c057\",\n      \"name\": \"Sakura\",\n      \"gender\": \"female\",\n      \"persona\": \"anime\",\n      \"best_for\": \"Character voices\"\n    },\n    \"zenith\": {\n      \"voice_id\": \"ed751d4d-e633-4bb0-8f5e-b5c8ddb04402\",\n      \"name\": \"Zenith\",\n      \"gender\": \"male\",\n      \"persona\": \"deep\",\n      \"best_for\": \"Gaming, dramatic content\"\n    },\n    \"flora\": {\n      \"voice_id\": \"a931a6af-fb01-42f0-a8c0-bd14bc302bb1\",\n      \"name\": \"Flora\",\n      \"gender\": \"female\",\n      \"persona\": \"cheerful\",\n      \"best_for\": \"Kids content, upbeat\"\n    },\n    \"commander\": {\n      \"voice_id\": \"bd35e4e6-6283-46b9-86b6-7cfa3dd409b9\",\n      \"name\": \"Commander\",\n      \"gender\": \"male\",\n      \"persona\": \"heroic\",\n      \"best_for\": \"Gaming, action content\"\n    }\n  }\n}\n\nFile v1.1.3:voice-ai-tts.yaml\n\n# ============================================================================\n# Voice.ai Text-to-Speech Skill\n# ============================================================================\n# A comprehensive skill for Voice.ai's TTS API with speech generation,\n# streaming, and voice management capabilities.\n#\n# Version: 1.1.3\n# Author: Nick Gill (https://github.com/gizmoGremlin)\n# License: MIT\n# Documentation: https://voice.ai/docs\n# ============================================================================\n\nskill:\n  name: voice-ai-tts\n  display_name: \"Voice.ai Text-to-Speech\"\n  description: |\n    High-quality voice synthesis with streaming audio generation,\n    multilingual support (11 languages), and flexible audio formats using the\n    Voice.ai Developer API. Features include real-time streaming, WebSocket\n    support for low-latency applications, and comprehensive voice management.\n  version: \"1.1.3\"\n  author: \"Nick Gill (https://github.com/gizmoGremlin)\"\n  icon: \"🎙️\"\n  category: \"audio\"\n  tags:\n    - text-to-speech\n    - tts\n    - audio-generation\n    - speech-synthesis\n    - ai-voice\n    - streaming\n    - websocket\n\n# ============================================================================\n# Authentication Configuration\n# ============================================================================\n\nauthentication:\n  type: bearer\n  header: Authorization\n  prefix: \"Bearer \"\n  description: |\n    Voice.ai uses Bearer token authentication. Get your API key from\n    https://voice.ai/dashboard and pass it as: Authorization: Bearer <your-api-key>\n  environment_variable: VOICE_AI_API_KEY\n  required: true\n\n# ============================================================================\n# API Configuration\n# ============================================================================\n\napi:\n  base_url: \"https://dev.voice.ai\" # Official Voice.ai production API endpoint\n  version: \"v1\"\n  content_type: \"application/json\"\n  timeout: 60000\n  rate_limit:\n    requests_per_minute: 60\n    description: \"Rate limits vary by plan. Check your dashboard for details.\"\n\n# ============================================================================\n# Available Models\n# ============================================================================\n\nmodels:\n  - id: \"voiceai-tts-v1-latest\"\n    name: \"Voice.ai TTS v1 (Latest)\"\n    description: \"Latest English TTS model with highest quality\"\n    languages: [\"en\"]\n    \n  - id: \"voiceai-tts-v1-2025-12-19\"\n    name: \"Voice.ai TTS v1 (2025-12-19)\"\n    description: \"Stable English TTS model snapshot\"\n    languages: [\"en\"]\n    \n  - id: \"voiceai-tts-multilingual-v1-latest\"\n    name: \"Voice.ai Multilingual v1 (Latest)\"\n    description: \"Latest multilingual TTS model\"\n    languages: [\"en\", \"es\", \"fr\", \"de\", \"it\", \"pt\", \"pl\", \"ru\", \"nl\", \"sv\", \"ca\"]\n    \n  - id: \"voiceai-tts-multilingual-v1-2025-01-14\"\n    name: \"Voice.ai Multilingual v1 (2025-01-14)\"\n    description: \"Stable multilingual TTS model snapshot\"\n    languages: [\"en\", \"es\", \"fr\", \"de\", \"it\", \"pt\", \"pl\", \"ru\", \"nl\", \"sv\", \"ca\"]\n\n# ============================================================================\n# Popular Voices\n# ============================================================================\n\nvoices:\n  - id: \"d1bf0f33-8e0e-4fbf-acf8-45c3c6262513\"\n    name: \"Ellie\"\n    gender: female\n    style: \"Youthful, vibrant fashion vlogger\"\n    \n  - id: \"f9e6a5eb-a7fd-4525-9e92-75125249c933\"\n    name: \"Oliver\"\n    gender: male\n    style: \"Friendly British, conversational\"\n    \n  - id: \"4388040c-8812-42f4-a264-f457a6b2b5b9\"\n    name: \"Lilith\"\n    gender: female\n    style: \"Soft, feminine\"\n    \n  - id: \"dbb271df-db25-4225-abb0-5200ba1426bc\"\n    name: \"Smooth Calm Voice\"\n    gender: male\n    style: \"Deep, smooth narrator\"\n    \n  - id: \"72d2a864-b236-402e-a166-a838ccc2c273\"\n    name: \"Shadow\"\n    gender: male\n    style: \"Deep, distinctive narrator\"\n    \n  - id: \"559d3b72-3e79-4f11-9b62-9ec702a6c057\"\n    name: \"Sakura\"\n    gender: female\n    style: \"Anime-inspired character\"\n    \n  - id: \"ed751d4d-e633-4bb0-8f5e-b5c8ddb04402\"\n    name: \"Zenith\"\n    gender: male\n    style: \"Deep, dramatic baritone\"\n    \n  - id: \"a931a6af-fb01-42f0-a8c0-bd14bc302bb1\"\n    name: \"Flora\"\n    gender: female\n    style: \"High pitch, cheerful\"\n    \n  - id: \"bd35e4e6-6283-46b9-86b6-7cfa3dd409b9\"\n    name: \"Commander\"\n    gender: male\n    style: \"Deep heroic, commanding\"\n\n# ============================================================================\n# Audio Formats\n# ============================================================================\n\naudio_formats:\n  basic:\n    - mp3: \"MP3 at 32kHz (default)\"\n    - wav: \"WAV at 32kHz\"\n    - pcm: \"Raw PCM 16-bit signed little-endian at 32kHz\"\n  \n  mp3_variants:\n    - mp3_22050_32: \"MP3 22.05kHz, 32kbps\"\n    - mp3_24000_48: \"MP3 24kHz, 48kbps\"\n    - mp3_44100_32: \"MP3 44.1kHz, 32kbps\"\n    - mp3_44100_64: \"MP3 44.1kHz, 64kbps\"\n    - mp3_44100_96: \"MP3 44.1kHz, 96kbps\"\n    - mp3_44100_128: \"MP3 44.1kHz, 128kbps\"\n    - mp3_44100_192: \"MP3 44.1kHz, 192kbps\"\n  \n  opus_variants:\n    - opus_48000_32: \"Opus 48kHz, 32kbps\"\n    - opus_48000_64: \"Opus 48kHz, 64kbps\"\n    - opus_48000_96: \"Opus 48kHz, 96kbps\"\n    - opus_48000_128: \"Opus 48kHz, 128kbps\"\n    - opus_48000_192: \"Opus 48kHz, 192kbps\"\n  \n  pcm_variants:\n    - pcm_8000: \"PCM 8kHz\"\n    - pcm_16000: \"PCM 16kHz\"\n    - pcm_22050: \"PCM 22.05kHz\"\n    - pcm_24000: \"PCM 24kHz\"\n    - pcm_32000: \"PCM 32kHz\"\n    - pcm_44100: \"PCM 44.1kHz\"\n    - pcm_48000: \"PCM 48kHz\"\n  \n  wav_variants:\n    - wav_16000: \"WAV 16kHz\"\n    - wav_22050: \"WAV 22.05kHz\"\n    - wav_24000: \"WAV 24kHz\"\n  \n  telephony:\n    - alaw_8000: \"A-law 8kHz (telephony)\"\n    - ulaw_8000: \"μ-law 8kHz (telephony)\"\n\n# ============================================================================\n# Tools / Actions\n# ============================================================================\n\ntools:\n\n  # --------------------------------------------------------------------------\n  # List Voices\n  # --------------------------------------------------------------------------\n  - name: list_voices\n    display_name: \"List Voices\"\n    description: |\n      Retrieve a list of available voices including public voices and your\n      private voices. Returns voice metadata including ID, name, language,\n      and visibility status.\n    method: GET\n    endpoint: \"/api/v1/tts/voices\"\n    parameters:\n      - name: limit\n        type: integer\n        required: false\n        default: 10\n        description: \"Maximum number of voices to return (default: 10)\"\n      - name: offset\n        type: integer\n        required: false\n        default: 0\n        description: \"Offset for pagination\"\n      - name: visibility\n        type: string\n        required: false\n        enum: [\"PUBLIC\", \"PRIVATE\"]\n        description: \"Filter by voice visibility\"\n    response:\n      type: object\n      properties:\n        voices:\n          type: array\n          items:\n            type: object\n            properties:\n              voice_id:\n                type: string\n                description: \"Unique voice identifier\"\n              name:\n                type: string\n                description: \"Voice name\"\n              language:\n                type: string\n                description: \"Voice language (ISO 639-1)\"\n              visibility:\n                type: string\n                enum: [\"PUBLIC\", \"PRIVATE\"]\n              status:\n                type: string\n                enum: [\"PENDING\", \"PROCESSING\", \"AVAILABLE\", \"FAILED\"]\n    example:\n      request:\n        method: GET\n        url: \"https://dev.voice.ai/api/v1/tts/voices?limit=10\"\n        headers:\n          Authorization: \"Bearer YOUR_API_KEY\"\n      response:\n        voices:\n          - voice_id: \"abc123\"\n            name: \"Sarah\"\n            language: \"en\"\n            visibility: \"PUBLIC\"\n            status: \"AVAILABLE\"\n\n  # --------------------------------------------------------------------------\n  # Get Voice\n  # --------------------------------------------------------------------------\n  - name: get_voice\n    display_name: \"Get Voice Details\"\n    description: |\n      Retrieve detailed information about a specific voice by its ID.\n    method: GET\n    endpoint: \"/api/v1/tts/voice/{voice_id}\"\n    parameters:\n      - name: voice_id\n        type: string\n        required: true\n        in: path\n        description: \"The unique voice identifier\"\n    response:\n      type: object\n      properties:\n        voice_id:\n          type: string\n        name:\n          type: string\n        language:\n          type: string\n        visibility:\n          type: string\n        status:\n          type: string\n        created_at:\n          type: string\n          format: datetime\n    example:\n      request:\n        method: GET\n        url: \"https://dev.voice.ai/api/v1/tts/voice/abc123\"\n      response:\n        voice_id: \"abc123\"\n        name: \"Sarah\"\n        language: \"en\"\n        visibility: \"PUBLIC\"\n        status: \"AVAILABLE\"\n\n  # --------------------------------------------------------------------------\n  # Generate Speech\n  # --------------------------------------------------------------------------\n  - name: generate_speech\n    display_name: \"Generate Speech\"\n    description: |\n      Generate speech from text. Returns complete audio file after generation\n      is complete. For real-time streaming, use the speech_stream endpoint instead.\n    method: POST\n    endpoint: \"/api/v1/tts/speech\"\n    parameters:\n      - name: text\n        type: string\n        required: true\n        description: \"The text to convert to speech\"\n        max_length: 5000\n      - name: voice_id\n        type: string\n        required: false\n        description: \"Voice ID to use. Omit to use the default built-in voice.\"\n      - name: audio_format\n        type: string\n        required: false\n        default: \"mp3\"\n        enum: [\"mp3\", \"wav\", \"pcm\", \"alaw_8000\", \"ulaw_8000\", \"mp3_44100_128\", \"opus_48000_64\"]\n        description: \"Output audio format (32kHz sample rate for basic formats)\"\n      - name: temperature\n        type: number\n        required: false\n        default: 1.0\n        minimum: 0.0\n        maximum: 2.0\n        description: \"Sampling temperature for variation (0.0-2.0)\"\n      - name: top_p\n        type: number\n        required: false\n        default: 0.8\n        minimum: 0.0\n        maximum: 1.0\n        description: \"Nucleus sampling parameter (0.0-1.0)\"\n      - name: model\n        type: string\n        required: false\n        enum: [\"voiceai-tts-v1-latest\", \"voiceai-tts-multilingual-v1-latest\"]\n        description: \"TTS model. Auto-selected based on language if not specified.\"\n      - name: language\n        type: string\n        required: false\n        default: \"en\"\n        enum: [\"en\", \"es\", \"fr\", \"de\", \"it\", \"pt\", \"pl\", \"ru\", \"nl\", \"sv\", \"ca\"]\n        description: \"Language code (ISO 639-1)\"\n    response:\n      type: binary\n      content_type: \"audio/mpeg\"\n      description: \"Audio file in the requested format\"\n    example:\n      request:\n        method: POST\n        url: \"https://dev.voice.ai/api/v1/tts/speech\"\n        headers:\n          Authorization: \"Bearer YOUR_API_KEY\"\n          Content-Type: \"application/json\"\n        body:\n          text: \"Hello, this is a test of Voice.ai text to speech.\"\n          voice_id: \"abc123\"\n          audio_format: \"mp3\"\n          language: \"en\"\n\n  # --------------------------------------------------------------------------\n  # Speech Stream\n  # --------------------------------------------------------------------------\n  - name: speech_stream\n    display_name: \"Speech Stream\"\n    description: |\n      Generate speech from text with HTTP chunked streaming. Returns audio\n      chunks as they are generated for low-latency playback. Ideal for\n      real-time applications.\n    method: POST\n    endpoint: \"/api/v1/tts/speech/stream\"\n    streaming: true\n    parameters:\n      - name: text\n        type: string\n        required: true\n        description: \"The text to convert to speech\"\n      - name: voice_id\n        type: string\n        required: false\n        description: \"Voice ID to use. Omit for default voice.\"\n      - name: audio_format\n        type: string\n        required: false\n        default: \"mp3\"\n        description: \"Output audio format\"\n      - name: temperature\n        type: number\n        required: false\n        default: 1.0\n        minimum: 0.0\n        maximum: 2.0\n      - name: top_p\n        type: number\n        required: false\n        default: 0.8\n      - name: model\n        type: string\n        required: false\n      - name: language\n        type: string\n        required: false\n        default: \"en\"\n    response:\n      type: stream\n      content_type: [\"audio/mpeg\", \"audio/wav\", \"audio/pcm\"]\n      description: \"Chunked audio stream via HTTP chunked transfer encoding\"\n    example:\n      request:\n        method: POST\n        url: \"https://dev.voice.ai/api/v1/tts/speech/stream\"\n        headers:\n          Authorization: \"Bearer YOUR_API_KEY\"\n          Content-Type: \"application/json\"\n        body:\n          text: \"Streaming audio is great for real-time applications.\"\n          audio_format: \"mp3\"\n\n  # --------------------------------------------------------------------------\n  # Update Voice\n  # --------------------------------------------------------------------------\n  - name: update_voice\n    display_name: \"Update Voice\"\n    description: |\n      Update voice metadata such as name and visibility. Owner-only operation.\n    method: PATCH\n    endpoint: \"/api/v1/tts/voice/{voice_id}\"\n    parameters:\n      - name: voice_id\n        type: string\n        required: true\n        in: path\n        description: \"The voice ID to update\"\n      - name: name\n        type: string\n        required: false\n        description: \"New name for the voice\"\n      - name: voice_visibility\n        type: string\n        required: false\n        enum: [\"PUBLIC\", \"PRIVATE\"]\n        description: \"New visibility setting\"\n    response:\n      type: object\n      properties:\n        voice_id:\n          type: string\n        name:\n          type: string\n        visibility:\n          type: string\n        updated_at:\n          type: string\n    example:\n      request:\n        method: PATCH\n        url: \"https://dev.voice.ai/api/v1/tts/voice/abc123\"\n        body:\n          name: \"Updated Voice Name\"\n          voice_visibility: \"PRIVATE\"\n\n  # --------------------------------------------------------------------------\n  # Delete Voice\n  # --------------------------------------------------------------------------\n  - name: delete_voice\n    display_name: \"Delete Voice\"\n    description: |\n      Delete a voice. This is a permanent action and cannot be undone.\n      Owner-only operation.\n    method: DELETE\n    endpoint: \"/api/v1/tts/voice/{voice_id}\"\n    parameters:\n      - name: voice_id\n        type: string\n        required: true\n        in: path\n        description: \"The voice ID to delete\"\n    response:\n      type: object\n      properties:\n        success:\n          type: boolean\n        message:\n          type: string\n    example:\n      request:\n        method: DELETE\n        url: \"https://dev.voice.ai/api/v1/tts/voice/abc123\"\n      response:\n        success: true\n        message: \"Voice deleted successfully\"\n\n  # --------------------------------------------------------------------------\n  # Single Context WebSocket\n  # --------------------------------------------------------------------------\n  - name: websocket_single_context\n    display_name: \"WebSocket (Single Context)\"\n    description: |\n      Real-time bidirectional streaming via WebSocket for single conversation\n      context. Ideal for interactive applications requiring ultra-low latency.\n      Send text chunks and receive audio chunks in real-time.\n    method: WEBSOCKET\n    endpoint: \"/api/v1/tts/ws\"\n    parameters:\n      - name: voice_id\n        type: string\n        required: false\n        description: \"Voice ID to use\"\n      - name: audio_format\n        type: string\n        required: false\n        default: \"pcm_16000\"\n        description: \"Audio format for streaming\"\n      - name: model\n        type: string\n        required: false\n    messages:\n      send:\n        type: object\n        properties:\n          text:\n            type: string\n            description: \"Text chunk to synthesize\"\n          flush:\n            type: boolean\n            description: \"Force flush buffered audio\"\n          end:\n            type: boolean\n            description: \"Signal end of stream\"\n      receive:\n        type: binary\n        description: \"Audio data chunks\"\n    example:\n      url: \"wss://dev.voice.ai/api/v1/tts/ws?voice_id=abc123&audio_format=pcm_16000\"\n      send: '{\"text\": \"Hello, how are you today?\"}'\n      receive: \"<binary audio data>\"\n\n  # --------------------------------------------------------------------------\n  # Multi Context WebSocket\n  # --------------------------------------------------------------------------\n  - name: websocket_multi_context\n    display_name: \"WebSocket (Multi Context)\"\n    description: |\n      Real-time bidirectional streaming via WebSocket with support for multiple\n      conversation contexts. Allows switching between different voice contexts\n      within a single connection for complex applications.\n    method: WEBSOCKET\n    endpoint: \"/api/v1/tts/ws/multi\"\n    parameters:\n      - name: audio_format\n        type: string\n        required: false\n        default: \"pcm_16000\"\n    messages:\n      send:\n        type: object\n        properties:\n          context_id:\n            type: string\n            description: \"Context identifier for multiplexing\"\n          voice_id:\n            type: string\n            description: \"Voice ID for this context\"\n          text:\n            type: string\n            description: \"Text chunk to synthesize\"\n          flush:\n            type: boolean\n          end:\n            type: boolean\n      receive:\n        type: object\n        properties:\n          context_id:\n            type: string\n          audio:\n            type: binary\n            description: \"Audio data for the context\"\n    example:\n      url: \"wss://dev.voice.ai/api/v1/tts/ws/multi?audio_format=pcm_16000\"\n      send: '{\"context_id\": \"conv1\", \"voice_id\": \"abc123\", \"text\": \"Hello!\"}'\n\n# ============================================================================\n# Error Codes\n# ============================================================================\n\nerrors:\n  - code: 401\n    name: \"Unauthorized\"\n    description: \"Invalid or missing API key\"\n    \n  - code: 402\n    name: \"Payment Required\"\n    description: \"Insufficient credits or voice slot limit reached\"\n    \n  - code: 403\n    name: \"Forbidden\"\n    description: \"Insufficient permissions for the requested operation\"\n    \n  - code: 404\n    name: \"Not Found\"\n    description: \"Voice ID does not exist or is not accessible\"\n    \n  - code: 422\n    name: \"Validation Error\"\n    description: \"Invalid request parameters\"\n    \n  - code: 429\n    name: \"Rate Limited\"\n    description: \"Too many requests. Please slow down.\"\n    \n  - code: 500\n    name: \"Internal Server Error\"\n    description: \"Server error. Please try again later.\"\n\n# ============================================================================\n# Code Examples\n# ============================================================================\n\nexamples:\n  python:\n    list_voices: |\n      import requests\n\n      API_KEY = \"your_api_key_here\"\n      \n      response = requests.get(\n          \"https://dev.voice.ai/api/v1/tts/voices\",\n          headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n          params={\"limit\": 10}\n      )\n      \n      voices = response.json()[\"voices\"]\n      for voice in voices:\n          print(f\"{voice['name']} ({voice['voice_id']})\")\n\n    generate_speech: |\n      import requests\n\n      API_KEY = \"your_api_key_here\"\n      \n      response = requests.post(\n          \"https://dev.voice.ai/api/v1/tts/speech\",\n          headers={\n              \"Authorization\": f\"Bearer {API_KEY}\",\n              \"Content-Type\": \"application/json\"\n          },\n          json={\n              \"text\": \"Hello, this is Voice.ai text to speech!\",\n              \"voice_id\": \"your_voice_id\",  # optional\n              \"audio_format\": \"mp3\"\n          }\n      )\n      \n      with open(\"output.mp3\", \"wb\") as f:\n          f.write(response.content)\n\n    stream_speech: |\n      import requests\n\n      API_KEY = \"your_api_key_here\"\n      \n      response = requests.post(\n          \"https://dev.voice.ai/api/v1/tts/speech/stream\",\n          headers={\n              \"Authorization\": f\"Bearer {API_KEY}\",\n              \"Content-Type\": \"application/json\"\n          },\n          json={\n              \"text\": \"Streaming audio for real-time playback.\",\n              \"audio_format\": \"mp3\"\n          },\n          stream=True\n      )\n      \n      with open(\"stream_output.mp3\", \"wb\") as f:\n          for chunk in response.iter_content(chunk_size=1024):\n              f.write(chunk)\n\n  curl:\n    list_voices: |\n      curl -X GET \"https://dev.voice.ai/api/v1/tts/voices?limit=10\" \\\n        -H \"Authorization: Bearer YOUR_API_KEY\"\n\n    generate_speech: |\n      curl -X POST \"https://dev.voice.ai/api/v1/tts/speech\" \\\n        -H \"Authorization: Bearer YOUR_API_KEY\" \\\n        -H \"Content-Type: application/json\" \\\n        -d '{\"text\": \"Hello world!\", \"audio_format\": \"mp3\"}' \\\n        --output speech.mp3\n\n  typescript:\n    generate_speech: |\n      const response = await fetch(\"https://dev.voice.ai/api/v1/tts/speech\", {\n        method: \"POST\",\n        headers: {\n          \"Authorization\": `Bearer ${API_KEY}`,\n          \"Content-Type\": \"application/json\"\n        },\n        body: JSON.stringify({\n          text: \"Hello from TypeScript!\",\n          audio_format: \"mp3\"\n        })\n      });\n      \n      const audioBlob = await response.blob();\n      const audioUrl = URL.createObjectURL(audioBlob);\n      \n      // Play the audio\n      const audio = new Audio(audioUrl);\n      audio.play();\n\n# ============================================================================\n# Changelog\n# ============================================================================\n\nchangelog:\n  - version: \"1.1.3\"\n    date: \"2026-02-16\"\n    changes:\n      - \"Remove voice-sample upload tool entry to reduce privacy risk\"\n  - version: \"1.1.2\"\n    date: \"2026-02-16\"\n    changes:\n      - \"Add SECURITY.md and LICENSE.md for provenance\"\n      - \"Restrict SDK to https only (remove http transport)\"\n  - version: \"1.1.1\"\n    date: \"2026-02-16\"\n    changes:\n      - \"Packaging metadata improvements for ClawHub import\"\n  - version: \"1.1.0\"\n    date: \"2026-02-16\"\n    changes:\n      - \"Documented production API endpoint\"\n      - \"Renamed voice personas for IP-safe labeling\"\n      - \"Metadata alignment for required credentials\"\n  - version: \"1.0.0\"\n    date: \"2026-01-30\"\n    changes:\n      - \"Initial release\"\n      - \"Support for all TTS endpoints\"\n      - \"HTTP and WebSocket streaming\"\n      - \"Multilingual support (11 languages)\"\n      - \"Comprehensive audio format options\"\n\nArchive v1.1.2: 10 files, 20819 bytes\n\nFiles: CHANGELOG.md (524b), package.json (878b), README.md (1188b), scripts/tts.js (3684b), SECURITY.md (1192b), SKILL.md (10725b), voice-ai-tts-sdk.js (19610b), voice-ai-tts.yaml (25908b), voices.json (2103b), _meta.json (149b)\n\nFile v1.1.2:SKILL.md\n\n---\nname: voice-ai-tts\ndescription: >\n  High-quality voice synthesis with 9 personas, 11 languages, streaming, and voice cloning using Voice.ai API.\nversion: 1.1.2\ntags: [tts, voice, speech, voice-ai, audio, streaming, voice-cloning, multilingual]\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"node\"],\"env\":{\"VOICE_AI_API_KEY\":\"required\"},\"note\":\"Set VOICE_AI_API_KEY via environment variable or a skill-local .env file.\"}}}\n---\n\n# Voice.ai Voices\n\n## ✨ Features\n\n- **9 Voice Personas** - Carefully curated voices for different use cases\n- **11 Languages** - Multi-language synthesis with multilingual model\n- **Streaming Mode** - Real-time audio output as it generates\n- **Voice Cloning** - Clone voices from audio samples\n- **Voice Design** - Customize with temperature and top_p parameters\n- **OpenClaw Integration** - Works with OpenClaw's built-in TTS\n\n---\n\n## ⚙️ Configuration\n\nThe scripts look for your API key in this order:\n\n1. `VOICE_AI_API_KEY` environment variable\n2. Skill-local `.env` file\n\n**Get your API key:** [Voice.ai Dashboard](https://voice.ai/dashboard)\n\n### Create `.env` file (Recommended)\n\n```bash\necho 'VOICE_AI_API_KEY=your-key-here' > .env\n```\n\n### Or export directly\n\n```bash\nexport VOICE_AI_API_KEY=\"your-api-key\"\n```\n\n---\n\n## 📦 Installation\n\nNo install step is required. This skill bundles a Node.js CLI and SDK (no external npm dependencies).\n\n## 🧩 Key Files\n\n- [`scripts/tts.js`](scripts/tts.js) - CLI entrypoint\n- [`voice-ai-tts-sdk.js`](voice-ai-tts-sdk.js) - Node.js SDK used by the CLI\n- [`voices.json`](voices.json) - Voice definitions used by the CLI\n- [`voice-ai-tts.yaml`](voice-ai-tts.yaml) - API specification\n- [`package.json`](package.json) - Skill metadata for tooling\n\n## Security Notes\n\nSee [`SECURITY.md`](SECURITY.md) for the full security and privacy overview.\n\nThis skill:\n- Makes outbound HTTPS requests only to `https://dev.voice.ai`\n- Reads local files: `voices.json`, optional `.env`, and (only for voice cloning) the audio file path you provide\n- Writes audio output to the `--output` path (default `output.mp3`)\n- Does not execute shell commands and does not modify system configuration files\n\n## 🌐 API Endpoint\n\nThe SDK and spec use `https://dev.voice.ai`, which is the official Voice.ai production API domain.\n\n---\n\n## 🤖 OpenClaw Integration\n\nOpenClaw can invoke the CLI script directly if your environment exposes `VOICE_AI_API_KEY`. Use the `/tts` commands as configured by your OpenClaw installation.\n\n---\n\n## 📝 Triggers\n\nThese chat commands work with OpenClaw:\n\n| Command | Description |\n|---------|-------------|\n| `/tts <text>` | Generate speech with default voice |\n| `/tts --voice ellie <text>` | Generate speech with specific voice |\n| `/tts --stream <text>` | Generate with streaming mode |\n| `/voices` | List available voices |\n| `/clone <audio_url>` | Clone a voice from audio |\n\n**Examples:**\n\n```\n/tts Hello, welcome to Voice.ai!\n/tts --voice oliver Good morning, everyone.\n/tts --voice lilith --stream This is a long story that will stream as it generates...\n```\n\n---\n\n## 🎙️ Available Voices\n\n| Voice   | ID | Gender | Persona     | Best For                   |\n|---------|-----|--------|-------------|----------------------------|\n| ellie   | `d1bf0f33-8e0e-4fbf-acf8-45c3c6262513` | female | youthful    | Vlogs, social content      |\n| oliver  | `f9e6a5eb-a7fd-4525-9e92-75125249c933` | male   | british     | Narration, tutorials       |\n| lilith  | `4388040c-8812-42f4-a264-f457a6b2b5b9` | female | soft        | ASMR, calm content         |\n| smooth  | `dbb271df-db25-4225-abb0-5200ba1426bc` | male   | deep        | Documentaries, audiobooks  |\n| shadow  | `72d2a864-b236-402e-a166-a838ccc2c273` | male   | distinctive | Gaming, entertainment      |\n| sakura  | `559d3b72-3e79-4f11-9b62-9ec702a6c057` | female | anime       | Character voices           |\n| zenith  | `ed751d4d-e633-4bb0-8f5e-b5c8ddb04402` | male   | deep        | Gaming, dramatic content   |\n| flora   | `a931a6af-fb01-42f0-a8c0-bd14bc302bb1` | female | cheerful    | Kids content, upbeat       |\n| commander | `bd35e4e6-6283-46b9-86b6-7cfa3dd409b9` | male   | heroic      | Gaming, action content     |\n\n---\n\n## 🌍 Supported Languages\n\n| Code | Language   |\n|------|------------|\n| `en` | English    |\n| `es` | Spanish    |\n| `fr` | French     |\n| `de` | German     |\n| `it` | Italian    |\n| `pt` | Portuguese |\n| `pl` | Polish     |\n| `ru` | Russian    |\n| `nl` | Dutch      |\n| `sv` | Swedish    |\n| `ca` | Catalan    |\n\nUse the multilingual model for non-English languages:\n\n```javascript\nconst audio = await client.generateSpeech({\n  text: 'Bonjour le monde!',\n  voice_id: 'ellie-voice-id',\n  model: 'voiceai-tts-multilingual-v1-latest',\n  language: 'fr'\n});\n```\n\n---\n\n## 🎨 Voice Design\n\nCustomize voice output with these parameters:\n\n| Parameter | Range | Default | Description |\n|-----------|-------|---------|-------------|\n| `temperature` | 0-2 | 1.0 | Higher = more expressive, lower = more consistent |\n| `top_p` | 0-1 | 0.8 | Controls randomness in speech generation |\n\n**Example:**\n\n```javascript\nconst audio = await client.generateSpeech({\n  text: 'This will sound very expressive!',\n  voice_id: 'ellie-voice-id',\n  temperature: 1.8,\n  top_p: 0.9\n});\n```\n\n---\n\n## 📡 Streaming Mode\n\nGenerate audio with real-time streaming (recommended for long texts):\n\n```bash\n# Stream audio as it generates\nnode scripts/tts.js --text \"This is a long story...\" --voice ellie --stream\n\n# Streaming with custom output\nnode scripts/tts.js --text \"Chapter one...\" --voice oliver --stream --output chapter1.mp3\n```\n\n**SDK streaming:**\n\n```javascript\nconst stream = await client.streamSpeech({\n  text: 'Long text here...',\n  voice_id: 'ellie-voice-id'\n});\n\n// Pipe to file\nstream.pipe(fs.createWriteStream('output.mp3'));\n\n// Or handle chunks\nstream.on('data', chunk => {\n  // Process audio chunk\n});\n```\n\n---\n\n## 🔊 Audio Formats\n\n| Format | Description | Use Case |\n|--------|-------------|----------|\n| `mp3` | Standard MP3 (32kHz) | General use |\n| `wav` | Uncompressed WAV | High quality |\n| `pcm` | Raw PCM audio | Processing |\n| `opus_48000_128` | Opus 128kbps | Streaming |\n| `mp3_44100_192` | High-quality MP3 | Professional |\n\nSee `voice-ai-tts-sdk.js` for all format options.\n\n---\n\n## 💻 CLI Usage\n\n```bash\n# Set API key\necho 'VOICE_AI_API_KEY=your-key-here' > .env\n\n# Generate speech\nnode scripts/tts.js --text \"Hello world!\" --voice ellie\n\n# Choose different voice\nnode scripts/tts.js --text \"Good morning!\" --voice oliver --output morning.mp3\n\n# Use streaming for long texts\nnode scripts/tts.js --text \"Once upon a time...\" --voice lilith --stream\n\n# Show help\nnode scripts/tts.js --help\n```\n\n---\n\n## 🧬 Voice Cloning\n\nClone any voice from an audio sample:\n\n```javascript\nconst VoiceAI = require('./voice-ai-tts-sdk');\nconst client = new VoiceAI(process.env.VOICE_AI_API_KEY);\n\n// Clone from file\nconst result = await client.cloneVoice({\n  file: './my-voice-sample.mp3',\n  name: 'My Custom Voice',\n  visibility: 'PRIVATE',\n  language: 'en'\n});\n\nconsole.log('Voice ID:', result.voice_id);\nconsole.log('Status:', result.status);\n\n// Wait for voice to be ready\nconst voice = await client.waitForVoice(result.voice_id);\nconsole.log('Voice ready!', voice);\n```\n\n**Requirements:**\n- Audio sample: 10-30 seconds recommended\n- Clear speech, minimal background noise\n- Supported formats: MP3, WAV, M4A\n\n---\n\n## 📁 Files\n\n```\nvoice-ai-tts/\n├── SKILL.md              # This documentation\n├── README.md             # Quick start\n├── CHANGELOG.md          # Version history\n├── voices.json           # Voice definitions\n├── voice-ai-tts.yaml     # OpenAPI specification\n├── voice-ai-tts-sdk.js   # JavaScript/Node.js SDK\n├── package.json          # OpenClaw metadata\n├── .gitignore            # Ignore local config and audio\n├── scripts/\n│   └── tts.js            # CLI tool\n└── .env                  # API key (create this)\n```\n\n---\n\n## 💰 Cost & Usage\n\nVoice.ai uses a credit-based system. Check your usage:\n\n```javascript\n// The SDK tracks usage via API responses\nconst voices = await client.listVoices();\n// Check response headers for rate limit info\n```\n\n**Tips to reduce costs:**\n- Use streaming for long texts (more efficient)\n- Cache generated audio when possible\n- Use appropriate audio quality for your use case\n\n---\n\n## 🔗 Links\n\n- **[Get API Key](https://voice.ai/dashboard)** - Sign up and get your key\n- **[API Documentation](https://voice.ai/docs)** - Full API reference\n- **[Voice Library](https://voice.ai/voices)** - Browse all voices\n- **[API Reference](https://voice.ai/docs/api-reference/text-to-speech/generate-speech)** - Endpoint details\n- **[Pricing](https://voice.ai/pricing)** - Plans and credits\n\n---\n\n## 📋 Changelog\n\n### v1.1.2 (2026-02-16)\n- Added `SECURITY.md` and `LICENSE` for provenance and transparency\n- Restricted SDK transport to HTTPS only\n\n### v1.1.1 (2026-02-16)\n- Packaging metadata improvements for ClawHub import (bin/files metadata)\n\n### v1.1.0 (2026-02-16)\n- Declared required credentials in metadata\n- Documented the production API endpoint domain\n- Renamed voice personas for IP-safe labeling\n- Added `voices.json` for voice data\n\n### v1.0.0 (2025-01-31)\n- Initial release\n- 9 curated voice personas\n- 11 language support\n- Streaming mode\n- Voice cloning\n- Voice design parameters\n- Full SDK with error handling\n- CLI tool\n\n---\n\n## 🛠️ SDK Quick Reference\n\n```javascript\nconst VoiceAI = require('./voice-ai-tts-sdk');\nconst client = new VoiceAI(process.env.VOICE_AI_API_KEY);\n\n// List voices\nconst voices = await client.listVoices({ limit: 10 });\n\n// Get voice details\nconst voice = await client.getVoice('voice-id');\n\n// Generate speech\nconst audio = await client.generateSpeech({\n  text: 'Hello, world!',\n  voice_id: 'voice-id',\n  audio_format: 'mp3'\n});\n\n// Generate to file\nawait client.generateSpeechToFile(\n  { text: 'Hello!', voice_id: 'voice-id' },\n  'output.mp3'\n);\n\n// Stream speech\nconst stream = await client.streamSpeech({\n  text: 'Long text...',\n  voice_id: 'voice-id'\n});\n\n// Clone voice\nconst clone = await client.cloneVoice({\n  file: './sample.mp3',\n  name: 'My Voice'\n});\n\n// Delete voice\nawait client.deleteVoice('voice-id');\n```\n\n---\n\n## ❓ Troubleshooting\n\n| Error | Cause | Solution |\n|-------|-------|----------|\n| `AuthenticationError` | Invalid API key | Check your `VOICE_AI_API_KEY` |\n| `PaymentRequiredError` | Out of credits | Add credits at voice.ai/dashboard |\n| `RateLimitError` | Too many requests | Wait and retry, or upgrade plan |\n| `ValidationError` | Invalid parameters | Check text length and voice_id |\n\n---\n\nMade with ❤️ by [Nick Gill](https://github.com/gizmoGremlin)\n\nFile v1.1.2:README.md\n\n# Voice.ai Voices\n\nHigh-quality voice synthesis with 9 personas, 11 languages, streaming, and voice cloning using the Voice.ai API.\n\nRequires Node.js 18+.\n\n## Quick Start\n\n```bash\n# Set API key (recommended)\necho 'VOICE_AI_API_KEY=your-key-here' > .env\n\n# Generate speech\nnode scripts/tts.js --text \"Hello world!\" --voice ellie\n\n# Streaming for long text\nnode scripts/tts.js --text \"Once upon a time...\" --voice lilith --stream\n```\n\n## Configuration\n\nThe CLI looks for `VOICE_AI_API_KEY` in this order:\n1. Environment variable\n2. Skill-local `.env` file\n\n## API Endpoint\n\nThe SDK uses `https://dev.voice.ai`, which is the official Voice.ai production API domain.\n\n## Voices\n\nVoice definitions live in `voices.json`. Use the CLI with `--voice <name>`:\n\n```\nellie, oliver, lilith, smooth, shadow, sakura, zenith, flora, commander\n```\n\n## Documentation\n\n- `SKILL.md` for full usage and examples\n- `voice-ai-tts.yaml` for the API spec\n- `voice-ai-tts-sdk.js` for SDK usage\n\n## Security\n\nSee `SECURITY.md` for a clear list of what the skill reads/writes locally and what endpoints it contacts.\n\n## Links\n\n- Voice.ai Dashboard: https://voice.ai/dashboard\n- Voice.ai Docs: https://voice.ai/docs\n\nFile v1.1.2:_meta.json\n\n{\n  \"ownerId\": \"kn73en640mtvfs2neagtbc3b51809cyr\",\n  \"slug\": \"openclaw-skill-voice-ai-voices\",\n  \"version\": \"1.1.2\",\n  \"publishedAt\": 1771276137785\n}\n\nFile v1.1.2:CHANGELOG.md\n\n# Changelog\n\n## [1.1.2] - 2026-02-16\n### Changed\n- Added `SECURITY.md` and `LICENSE` for provenance and transparency\n- Restricted SDK transport to HTTPS only\n\n## [1.1.1] - 2026-02-16\n### Changed\n- Packaging metadata improvements for ClawHub import (bin/files metadata)\n\n## [1.1.0] - 2026-02-16\n### Changed\n- Declared required credentials in metadata\n- Documented the production API endpoint domain\n- Renamed voice personas for IP-safe labeling\n- Added `voices.json` for voice data\n\n## [1.0.0] - 2026-01-31\n- Initial release\n\nFile v1.1.2:SECURITY.md\n\n# Security\n\nThis skill is a small Node.js CLI + SDK for Voice.ai text-to-speech.\n\n## Credentials\n\n- The only credential used is `VOICE_AI_API_KEY`.\n- The CLI reads it from the `VOICE_AI_API_KEY` environment variable, or from a skill-local `.env` file.\n\n## Network Access\n\n- Outbound HTTPS requests are made only to `https://dev.voice.ai` (Voice.ai's production API domain).\n- The SDK rejects non-HTTPS base URLs.\n\n## Local File Access\n\nThe skill reads/writes local files only for its documented behavior:\n\n- Reads `voices.json` to map friendly voice names to voice IDs.\n- Reads `.env` (if present) to load `VOICE_AI_API_KEY`.\n- Writes the generated audio to `--output` (default `output.mp3`).\n- Voice cloning (if you use it) uploads the audio file you explicitly provide via `cloneVoice({ file: 'path/to/file' })`.\n\n## What This Skill Does Not Do\n\n- Does not execute shell commands (`child_process` is not used).\n- Does not download or install other software.\n- Does not modify system configuration files.\n- Does not run persistently in the background.\n\n## Reporting\n\nIf you find a security issue, please open an issue in the GitHub repository with a minimal reproduction and impact summary.\n\nFile v1.1.2:package.json\n\n{\n  \"name\": \"voice-ai-tts\",\n  \"version\": \"1.1.2\",\n  \"description\": \"High-quality voice synthesis with 9 personas, 11 languages, streaming, and voice cloning using Voice.ai API.\",\n  \"main\": \"SKILL.md\",\n  \"bin\": {\n    \"voice-ai-tts\": \"scripts/tts.js\"\n  },\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"files\": [\n    \"SKILL.md\",\n    \"README.md\",\n    \"CHANGELOG.md\",\n    \"LICENSE\",\n    \"SECURITY.md\",\n    \"voices.json\",\n    \"voice-ai-tts.yaml\",\n    \"voice-ai-tts-sdk.js\",\n    \"scripts/tts.js\"\n  ],\n  \"keywords\": [\"tts\", \"voice\", \"speech\", \"voice-ai\", \"audio\"],\n  \"author\": \"gizmoGremlin\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/gizmoGremlin/openclaw-skill-voice-ai-voices.git\"\n  },\n  \"openclaw\": {\n    \"skill\": true,\n    \"requirements\": {\n      \"bins\": [\"node\"],\n      \"env\": {\n        \"VOICE_AI_API_KEY\": \"required\"\n      }\n    }\n  }\n}\n\nFile v1.1.2:voices.json\n\n{\n  \"version\": \"1.1.2\",\n  \"default_voice\": \"ellie\",\n  \"model\": \"voiceai-tts-v1-latest\",\n  \"multilingual_model\": \"voiceai-tts-multilingual-v1-latest\",\n  \"supported_languages\": [\n    \"en\",\n    \"es\",\n    \"fr\",\n    \"de\",\n    \"it\",\n    \"pt\",\n    \"pl\",\n    \"ru\",\n    \"nl\",\n    \"sv\",\n    \"ca\"\n  ],\n  \"voices\": {\n    \"ellie\": {\n      \"voice_id\": \"d1bf0f33-8e0e-4fbf-acf8-45c3c6262513\",\n      \"name\": \"Ellie\",\n      \"gender\": \"female\",\n      \"persona\": \"youthful\",\n      \"best_for\": \"Vlogs, social content\"\n    },\n    \"oliver\": {\n      \"voice_id\": \"f9e6a5eb-a7fd-4525-9e92-75125249c933\",\n      \"name\": \"Oliver\",\n      \"gender\": \"male\",\n      \"persona\": \"british\",\n      \"best_for\": \"Narration, tutorials\"\n    },\n    \"lilith\": {\n      \"voice_id\": \"4388040c-8812-42f4-a264-f457a6b2b5b9\",\n      \"name\": \"Lilith\",\n      \"gender\": \"female\",\n      \"persona\": \"soft\",\n      \"best_for\": \"ASMR, calm content\"\n    },\n    \"smooth\": {\n      \"voice_id\": \"dbb271df-db25-4225-abb0-5200ba1426bc\",\n      \"name\": \"Smooth\",\n      \"gender\": \"male\",\n      \"persona\": \"deep\",\n      \"best_for\": \"Documentaries, audiobooks\"\n    },\n    \"shadow\": {\n      \"voice_id\": \"72d2a864-b236-402e-a166-a838ccc2c273\",\n      \"name\": \"Shadow\",\n      \"gender\": \"male\",\n      \"persona\": \"distinctive\",\n      \"best_for\": \"Gaming, entertainment\"\n    },\n    \"sakura\": {\n      \"voice_id\": \"559d3b72-3e79-4f11-9b62-9ec702a6c057\",\n      \"name\": \"Sakura\",\n      \"gender\": \"female\",\n      \"persona\": \"anime\",\n      \"best_for\": \"Character voices\"\n    },\n    \"zenith\": {\n      \"voice_id\": \"ed751d4d-e633-4bb0-8f5e-b5c8ddb04402\",\n      \"name\": \"Zenith\",\n      \"gender\": \"male\",\n      \"persona\": \"deep\",\n      \"best_for\": \"Gaming, dramatic content\"\n    },\n    \"flora\": {\n      \"voice_id\": \"a931a6af-fb01-42f0-a8c0-bd14bc302bb1\",\n      \"name\": \"Flora\",\n      \"gender\": \"female\",\n      \"persona\": \"cheerful\",\n      \"best_for\": \"Kids content, upbeat\"\n    },\n    \"commander\": {\n      \"voice_id\": \"bd35e4e6-6283-46b9-86b6-7cfa3dd409b9\",\n      \"name\": \"Commander\",\n      \"gender\": \"male\",\n      \"persona\": \"heroic\",\n      \"best_for\": \"Gaming, action content\"\n    }\n  }\n}\n\nFile v1.1.2:voice-ai-tts.yaml\n\n# ============================================================================\n# Voice.ai Text-to-Speech Skill\n# ============================================================================\n# A comprehensive skill for Voice.ai's TTS API with voice cloning,\n# speech generation, streaming, and voice management capabilities.\n#\n# Version: 1.1.2\n# Author: Nick Gill (https://github.com/gizmoGremlin)\n# License: MIT\n# Documentation: https://voice.ai/docs\n# ============================================================================\n\nskill:\n  name: voice-ai-tts\n  display_name: \"Voice.ai Text-to-Speech\"\n  description: |\n    High-quality voice synthesis with voice cloning, streaming audio generation,\n    multilingual support (11 languages), and flexible audio formats using the\n    Voice.ai Developer API. Features include instant voice cloning, real-time\n    streaming, WebSocket support for low-latency applications, and comprehensive\n    voice management.\n  version: \"1.1.2\"\n  author: \"Nick Gill (https://github.com/gizmoGremlin)\"\n  icon: \"🎙️\"\n  category: \"audio\"\n  tags:\n    - text-to-speech\n    - tts\n    - voice-cloning\n    - audio-generation\n    - speech-synthesis\n    - ai-voice\n    - streaming\n    - websocket\n\n# ============================================================================\n# Authentication Configuration\n# ============================================================================\n\nauthentication:\n  type: bearer\n  header: Authorization\n  prefix: \"Bearer \"\n  description: |\n    Voice.ai uses Bearer token authentication. Get your API key from\n    https://voice.ai/dashboard and pass it as: Authorization: Bearer <your-api-key>\n  environment_variable: VOICE_AI_API_KEY\n  required: true\n\n# ============================================================================\n# API Configuration\n# ============================================================================\n\napi:\n  base_url: \"https://dev.voice.ai\" # Official Voice.ai production API endpoint\n  version: \"v1\"\n  content_type: \"application/json\"\n  timeout: 60000\n  rate_limit:\n    requests_per_minute: 60\n    description: \"Rate limits vary by plan. Check your dashboard for details.\"\n\n# ============================================================================\n# Available Models\n# ============================================================================\n\nmodels:\n  - id: \"voiceai-tts-v1-latest\"\n    name: \"Voice.ai TTS v1 (Latest)\"\n    description: \"Latest English TTS model with highest quality\"\n    languages: [\"en\"]\n    \n  - id: \"voiceai-tts-v1-2025-12-19\"\n    name: \"Voice.ai TTS v1 (2025-12-19)\"\n    description: \"Stable English TTS model snapshot\"\n    languages: [\"en\"]\n    \n  - id: \"voiceai-tts-multilingual-v1-latest\"\n    name: \"Voice.ai Multilingual v1 (Latest)\"\n    description: \"Latest multilingual TTS model\"\n    languages: [\"en\", \"es\", \"fr\", \"de\", \"it\", \"pt\", \"pl\", \"ru\", \"nl\", \"sv\", \"ca\"]\n    \n  - id: \"voiceai-tts-multilingual-v1-2025-01-14\"\n    name: \"Voice.ai Multilingual v1 (2025-01-14)\"\n    description: \"Stable multilingual TTS model snapshot\"\n    languages: [\"en\", \"es\", \"fr\", \"de\", \"it\", \"pt\", \"pl\", \"ru\", \"nl\", \"sv\", \"ca\"]\n\n# ============================================================================\n# Popular Voices\n# ============================================================================\n\nvoices:\n  - id: \"d1bf0f33-8e0e-4fbf-acf8-45c3c6262513\"\n    name: \"Ellie\"\n    gender: female\n    style: \"Youthful, vibrant fashion vlogger\"\n    \n  - id: \"f9e6a5eb-a7fd-4525-9e92-75125249c933\"\n    name: \"Oliver\"\n    gender: male\n    style: \"Friendly British, conversational\"\n    \n  - id: \"4388040c-8812-42f4-a264-f457a6b2b5b9\"\n    name: \"Lilith\"\n    gender: female\n    style: \"Soft, feminine\"\n    \n  - id: \"dbb271df-db25-4225-abb0-5200ba1426bc\"\n    name: \"Smooth Calm Voice\"\n    gender: male\n    style: \"Deep, smooth narrator\"\n    \n  - id: \"72d2a864-b236-402e-a166-a838ccc2c273\"\n    name: \"Shadow\"\n    gender: male\n    style: \"Deep, distinctive narrator\"\n    \n  - id: \"559d3b72-3e79-4f11-9b62-9ec702a6c057\"\n    name: \"Sakura\"\n    gender: female\n    style: \"Anime-inspired character\"\n    \n  - id: \"ed751d4d-e633-4bb0-8f5e-b5c8ddb04402\"\n    name: \"Zenith\"\n    gender: male\n    style: \"Deep, dramatic baritone\"\n    \n  - id: \"a931a6af-fb01-42f0-a8c0-bd14bc302bb1\"\n    name: \"Flora\"\n    gender: female\n    style: \"High pitch, cheerful\"\n    \n  - id: \"bd35e4e6-6283-46b9-86b6-7cfa3dd409b9\"\n    name: \"Commander\"\n    gender: male\n    style: \"Deep heroic, commanding\"\n\n# ============================================================================\n# Audio Formats\n# ============================================================================\n\naudio_formats:\n  basic:\n    - mp3: \"MP3 at 32kHz (default)\"\n    - wav: \"WAV at 32kHz\"\n    - pcm: \"Raw PCM 16-bit signed little-endian at 32kHz\"\n  \n  mp3_variants:\n    - mp3_22050_32: \"MP3 22.05kHz, 32kbps\"\n    - mp3_24000_48: \"MP3 24kHz, 48kbps\"\n    - mp3_44100_32: \"MP3 44.1kHz, 32kbps\"\n    - mp3_44100_64: \"MP3 44.1kHz, 64kbps\"\n    - mp3_44100_96: \"MP3 44.1kHz, 96kbps\"\n    - mp3_44100_128: \"MP3 44.1kHz, 128kbps\"\n    - mp3_44100_192: \"MP3 44.1kHz, 192kbps\"\n  \n  opus_variants:\n    - opus_48000_32: \"Opus 48kHz, 32kbps\"\n    - opus_48000_64: \"Opus 48kHz, 64kbps\"\n    - opus_48000_96: \"Opus 48kHz, 96kbps\"\n    - opus_48000_128: \"Opus 48kHz, 128kbps\"\n    - opus_48000_192: \"Opus 48kHz, 192kbps\"\n  \n  pcm_variants:\n    - pcm_8000: \"PCM 8kHz\"\n    - pcm_16000: \"PCM 16kHz\"\n    - pcm_22050: \"PCM 22.05kHz\"\n    - pcm_24000: \"PCM 24kHz\"\n    - pcm_32000: \"PCM 32kHz\"\n    - pcm_44100: \"PCM 44.1kHz\"\n    - pcm_48000: \"PCM 48kHz\"\n  \n  wav_variants:\n    - wav_16000: \"WAV 16kHz\"\n    - wav_22050: \"WAV 22.05kHz\"\n    - wav_24000: \"WAV 24kHz\"\n  \n  telephony:\n    - alaw_8000: \"A-law 8kHz (telephony)\"\n    - ulaw_8000: \"μ-law 8kHz (telephony)\"\n\n# ============================================================================\n# Tools / Actions\n# ============================================================================\n\ntools:\n\n  # --------------------------------------------------------------------------\n  # List Voices\n  # --------------------------------------------------------------------------\n  - name: list_voices\n    display_name: \"List Voices\"\n    description: |\n      Retrieve a list of available voices including public voices and your\n      cloned voices. Returns voice metadata including ID, name, language,\n      and visibility status.\n    method: GET\n    endpoint: \"/api/v1/tts/voices\"\n    parameters:\n      - name: limit\n        type: integer\n        required: false\n        default: 10\n        description: \"Maximum number of voices to return (default: 10)\"\n      - name: offset\n        type: integer\n        required: false\n        default: 0\n        description: \"Offset for pagination\"\n      - name: visibility\n        type: string\n        required: false\n        enum: [\"PUBLIC\", \"PRIVATE\"]\n        description: \"Filter by voice visibility\"\n    response:\n      type: object\n      properties:\n        voices:\n          type: array\n          items:\n            type: object\n            properties:\n              voice_id:\n                type: string\n                description: \"Unique voice identifier\"\n              name:\n                type: string\n                description: \"Voice name\"\n              language:\n                type: string\n                description: \"Voice language (ISO 639-1)\"\n              visibility:\n                type: string\n                enum: [\"PUBLIC\", \"PRIVATE\"]\n              status:\n                type: string\n                enum: [\"PENDING\", \"PROCESSING\", \"AVAILABLE\", \"FAILED\"]\n    example:\n      request:\n        method: GET\n        url: \"https://dev.voice.ai/api/v1/tts/voices?limit=10\"\n        headers:\n          Authorization: \"Bearer YOUR_API_KEY\"\n      response:\n        voices:\n          - voice_id: \"abc123\"\n            name: \"Sarah\"\n            language: \"en\"\n            visibility: \"PUBLIC\"\n            status: \"AVAILABLE\"\n\n  # --------------------------------------------------------------------------\n  # Get Voice\n  # --------------------------------------------------------------------------\n  - name: get_voice\n    display_name: \"Get Voice Details\"\n    description: |\n      Retrieve detailed information about a specific voice by its ID.\n    method: GET\n    endpoint: \"/api/v1/tts/voice/{voice_id}\"\n    parameters:\n      - name: voice_id\n        type: string\n        required: true\n        in: path\n        description: \"The unique voice identifier\"\n    response:\n      type: object\n      properties:\n        voice_id:\n          type: string\n        name:\n          type: string\n        language:\n          type: string\n        visibility:\n          type: string\n        status:\n          type: string\n        created_at:\n          type: string\n          format: datetime\n    example:\n      request:\n        method: GET\n        url: \"https://dev.voice.ai/api/v1/tts/voice/abc123\"\n      response:\n        voice_id: \"abc123\"\n        name: \"Sarah\"\n        language: \"en\"\n        visibility: \"PUBLIC\"\n        status: \"AVAILABLE\"\n\n  # --------------------------------------------------------------------------\n  # Generate Speech\n  # --------------------------------------------------------------------------\n  - name: generate_speech\n    display_name: \"Generate Speech\"\n    description: |\n      Generate speech from text. Returns complete audio file after generation\n      is complete. For real-time streaming, use the speech_stream endpoint instead.\n    method: POST\n    endpoint: \"/api/v1/tts/speech\"\n    parameters:\n      - name: text\n        type: string\n        required: true\n        description: \"The text to convert to speech\"\n        max_length: 5000\n      - name: voice_id\n        type: string\n        required: false\n        description: \"Voice ID to use. Omit to use the default built-in voice.\"\n      - name: audio_format\n        type: string\n        required: false\n        default: \"mp3\"\n        enum: [\"mp3\", \"wav\", \"pcm\", \"alaw_8000\", \"ulaw_8000\", \"mp3_44100_128\", \"opus_48000_64\"]\n        description: \"Output audio format (32kHz sample rate for basic formats)\"\n      - name: temperature\n        type: number\n        required: false\n        default: 1.0\n        minimum: 0.0\n        maximum: 2.0\n        description: \"Sampling temperature for variation (0.0-2.0)\"\n      - name: top_p\n        type: number\n        required: false\n        default: 0.8\n        minimum: 0.0\n        maximum: 1.0\n        description: \"Nucleus sampling parameter (0.0-1.0)\"\n      - name: model\n        type: string\n        required: false\n        enum: [\"voiceai-tts-v1-latest\", \"voiceai-tts-multilingual-v1-latest\"]\n        description: \"TTS model. Auto-selected based on language if not specified.\"\n      - name: language\n        type: string\n        required: false\n        default: \"en\"\n        enum: [\"en\", \"es\", \"fr\", \"de\", \"it\", \"pt\", \"pl\", \"ru\", \"nl\", \"sv\", \"ca\"]\n        description: \"Language code (ISO 639-1)\"\n    response:\n      type: binary\n      content_type: \"audio/mpeg\"\n      description: \"Audio file in the requested format\"\n    example:\n      request:\n        method: POST\n        url: \"https://dev.voice.ai/api/v1/tts/speech\"\n        headers:\n          Authorization: \"Bearer YOUR_API_KEY\"\n          Content-Type: \"application/json\"\n        body:\n          text: \"Hello, this is a test of Voice.ai text to speech.\"\n          voice_id: \"abc123\"\n          audio_format: \"mp3\"\n          language: \"en\"\n\n  # --------------------------------------------------------------------------\n  # Speech Stream\n  # --------------------------------------------------------------------------\n  - name: speech_stream\n    display_name: \"Speech Stream\"\n    description: |\n      Generate speech from text with HTTP chunked streaming. Returns audio\n      chunks as they are generated for low-latency playback. Ideal for\n      real-time applications.\n    method: POST\n    endpoint: \"/api/v1/tts/speech/stream\"\n    streaming: true\n    parameters:\n      - name: text\n        type: string\n        required: true\n        description: \"The text to convert to speech\"\n      - name: voice_id\n        type: string\n        required: false\n        description: \"Voice ID to use. Omit for default voice.\"\n      - name: audio_format\n        type: string\n        required: false\n        default: \"mp3\"\n        description: \"Output audio format\"\n      - name: temperature\n        type: number\n        required: false\n        default: 1.0\n        minimum: 0.0\n        maximum: 2.0\n      - name: top_p\n        type: number\n        required: false\n        default: 0.8\n      - name: model\n        type: string\n        required: false\n      - name: language\n        type: string\n        required: false\n        default: \"en\"\n    response:\n      type: stream\n      content_type: [\"audio/mpeg\", \"audio/wav\", \"audio/pcm\"]\n      description: \"Chunked audio stream via HTTP chunked transfer encoding\"\n    example:\n      request:\n        method: POST\n        url: \"https://dev.voice.ai/api/v1/tts/speech/stream\"\n        headers:\n          Authorization: \"Bearer YOUR_API_KEY\"\n          Content-Type: \"application/json\"\n        body:\n          text: \"Streaming audio is great for real-time applications.\"\n          audio_format: \"mp3\"\n\n  # --------------------------------------------------------------------------\n  # Clone Voice\n  # --------------------------------------------------------------------------\n  - name: clone_voice\n    display_name: \"Clone Voice\"\n    description: |\n      Clone a voice from reference audio. Upload an audio file (MP3, WAV, or OGG,\n      max 7.5MB) and get back a voice_id for future speech generation requests.\n    method: POST\n    endpoint: \"/api/v1/tts/clone-voice\"\n    content_type: \"multipart/form-data\"\n    parameters:\n      - name: file\n        type: file\n        required: true\n        description: \"Audio file (MP3, WAV, or OGG format, max 7.5MB)\"\n        accept: [\".mp3\", \".wav\", \".ogg\"]\n        max_size: \"7.5MB\"\n      - name: name\n        type: string\n        required: false\n        description: \"Name for the cloned voice\"\n      - name: voice_visibility\n        type: string\n        required: false\n        default: \"PUBLIC\"\n        enum: [\"PUBLIC\", \"PRIVATE\"]\n        description: \"Voice visibility setting\"\n      - name: language\n        type: string\n        required: false\n        default: \"en\"\n        enum: [\"en\", \"es\", \"fr\", \"de\", \"it\", \"pt\", \"pl\", \"ru\", \"nl\", \"sv\", \"ca\"]\n        description: \"Primary language of the voice\"\n    response:\n      type: object\n      properties:\n        voice_id:\n          type: string\n          description: \"The created voice ID\"\n        status:\n          type: string\n          enum: [\"PENDING\", \"PROCESSING\", \"AVAILABLE\", \"FAILED\"]\n          description: \"Voice processing status\"\n    example:\n      request:\n        method: POST\n        url: \"https://dev.voice.ai/api/v1/tts/clone-voice\"\n        headers:\n          Authorization: \"Bearer YOUR_API_KEY\"\n          Content-Type: \"multipart/form-data\"\n        body:\n          file: \"@voice_sample.mp3\"\n          name: \"My Custom Voice\"\n          voice_visibility: \"PRIVATE\"\n          language: \"en\"\n      response:\n        voice_id: \"cloned_xyz789\"\n        status: \"PROCESSING\"\n\n  # --------------------------------------------------------------------------\n  # Update Voice\n  # --------------------------------------------------------------------------\n  - name: update_voice\n    display_name: \"Update Voice\"\n    description: |\n      Update voice metadata such as name and visibility. Owner-only operation.\n    method: PATCH\n    endpoint: \"/api/v1/tts/voice/{voice_id}\"\n    parameters:\n      - name: voice_id\n        type: string\n        required: true\n        in: path\n        description: \"The voice ID to update\"\n      - name: name\n        type: string\n        required: false\n        description: \"New name for the voice\"\n      - name: voice_visibility\n        type: string\n        required: false\n        enum: [\"PUBLIC\", \"PRIVATE\"]\n        description: \"New visibility setting\"\n    response:\n      type: object\n      properties:\n        voice_id:\n          type: string\n        name:\n          type: string\n        visibility:\n          type: string\n        updated_at:\n          type: string\n    example:\n      request:\n        method: PATCH\n        url: \"https://dev.voice.ai/api/v1/tts/voice/abc123\"\n        body:\n          name: \"Updated Voice Name\"\n          voice_visibility: \"PRIVATE\"\n\n  # --------------------------------------------------------------------------\n  # Delete Voice\n  # --------------------------------------------------------------------------\n  - name: delete_voice\n    display_name: \"Delete Voice\"\n    description: |\n      Delete a cloned voice. This is a permanent action and cannot be undone.\n      Owner-only operation.\n    method: DELETE\n    endpoint: \"/api/v1/tts/voice/{voice_id}\"\n    parameters:\n      - name: voice_id\n        type: string\n        required: true\n        in: path\n        description: \"The voice ID to delete\"\n    response:\n      type: object\n      properties:\n        success:\n          type: boolean\n        message:\n          type: string\n    example:\n      request:\n        method: DELETE\n        url: \"https://dev.voice.ai/api/v1/tts/voice/abc123\"\n      response:\n        success: true\n        message: \"Voice deleted successfully\"\n\n  # --------------------------------------------------------------------------\n  # Single Context WebSocket\n  # --------------------------------------------------------------------------\n  - name: websocket_single_context\n    display_name: \"WebSocket (Single Context)\"\n    description: |\n      Real-time bidirectional streaming via WebSocket for single conversation\n      context. Ideal for interactive applications requiring ultra-low latency.\n      Send text chunks and receive audio chunks in real-time.\n    method: WEBSOCKET\n    endpoint: \"/api/v1/tts/ws\"\n    parameters:\n      - name: voice_id\n        type: string\n        required: false\n        description: \"Voice ID to use\"\n      - name: audio_format\n        type: string\n        required: false\n        default: \"pcm_16000\"\n        description: \"Audio format for streaming\"\n      - name: model\n        type: string\n        required: false\n    messages:\n      send:\n        type: object\n        properties:\n          text:\n            type: string\n            description: \"Text chunk to synthesize\"\n          flush:\n            type: boolean\n            description: \"Force flush buffered audio\"\n          end:\n            type: boolean\n            description: \"Signal end of stream\"\n      receive:\n        type: binary\n        description: \"Audio data chunks\"\n    example:\n      url: \"wss://dev.voice.ai/api/v1/tts/ws?voice_id=abc123&audio_format=pcm_16000\"\n      send: '{\"text\": \"Hello, how are you today?\"}'\n      receive: \"<binary audio data>\"\n\n  # --------------------------------------------------------------------------\n  # Multi Context WebSocket\n  # --------------------------------------------------------------------------\n  - name: websocket_multi_context\n    display_name: \"WebSocket (Multi Context)\"\n    description: |\n      Real-time bidirectional streaming via WebSocket with support for multiple\n      conversation contexts. Allows switching between different voice contexts\n      within a single connection for complex applications.\n    method: WEBSOCKET\n    endpoint: \"/api/v1/tts/ws/multi\"\n    parameters:\n      - name: audio_format\n        type: string\n        required: false\n        default: \"pcm_16000\"\n    messages:\n      send:\n        type: object\n        properties:\n          context_id:\n            type: string\n            description: \"Context identifier for multiplexing\"\n          voice_id:\n            type: string\n            description: \"Voice ID for this context\"\n          text:\n            type: string\n            description: \"Text chunk to synthesize\"\n          flush:\n            type: boolean\n          end:\n            type: boolean\n      receive:\n        type: object\n        properties:\n          context_id:\n            type: string\n          audio:\n            type: binary\n            description: \"Audio data for the context\"\n    example:\n      url: \"wss://dev.voice.ai/api/v1/tts/ws/multi?audio_format=pcm_16000\"\n      send: '{\"context_id\": \"conv1\", \"voice_id\": \"abc123\", \"text\": \"Hello!\"}'\n\n# ============================================================================\n# Error Codes\n# ============================================================================\n\nerrors:\n  - code: 401\n    name: \"Unauthorized\"\n    description: \"Invalid or missing API key\"\n    \n  - code: 402\n    name: \"Payment Required\"\n    description: \"Insufficient credits or voice slot limit reached\"\n    \n  - code: 403\n    name: \"Forbidden\"\n    description: \"Insufficient permissions for the requested operation\"\n    \n  - code: 404\n    name: \"Not Found\"\n    description: \"Voice ID does not exist or is not accessible\"\n    \n  - code: 422\n    name: \"Validation Error\"\n    description: \"Invalid request parameters\"\n    \n  - code: 429\n    name: \"Rate Limited\"\n    description: \"Too many requests. Please slow down.\"\n    \n  - code: 500\n    name: \"Internal Server Error\"\n    description: \"Server error. Please try again later.\"\n\n# ============================================================================\n# Code Examples\n# ============================================================================\n\nexamples:\n  python:\n    list_voices: |\n      import requests\n\n      API_KEY = \"your_api_key_here\"\n      \n      response = requests.get(\n          \"https://dev.voice.ai/api/v1/tts/voices\",\n          headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n          params={\"limit\": 10}\n      )\n      \n      voices = response.json()[\"voices\"]\n      for voice in voices:\n          print(f\"{voice['name']} ({voice['voice_id']})\")\n\n    generate_speech: |\n      import requests\n\n      API_KEY = \"your_api_key_here\"\n      \n      response = requests.post(\n          \"https://dev.voice.ai/api/v1/tts/speech\",\n          headers={\n              \"Authorization\": f\"Bearer {API_KEY}\",\n              \"Content-Type\": \"application/json\"\n          },\n          json={\n              \"text\": \"Hello, this is Voice.ai text to speech!\",\n              \"voice_id\": \"your_voice_id\",  # optional\n              \"audio_format\": \"mp3\"\n          }\n      )\n      \n      with open(\"output.mp3\", \"wb\") as f:\n          f.write(response.content)\n\n    stream_speech: |\n      import requests\n\n      API_KEY = \"your_api_key_here\"\n      \n      response = requests.post(\n          \"https://dev.voice.ai/api/v1/tts/speech/stream\",\n          headers={\n              \"Authorization\": f\"Bearer {API_KEY}\",\n              \"Content-Type\": \"application/json\"\n          },\n          json={\n              \"text\": \"Streaming audio for real-time playback.\",\n              \"audio_format\": \"mp3\"\n          },\n          stream=True\n      )\n      \n      with open(\"stream_output.mp3\", \"wb\") as f:\n          for chunk in response.iter_content(chunk_size=1024):\n              f.write(chunk)\n\n    clone_voice: |\n      import requests\n\n      API_KEY = \"your_api_key_here\"\n      \n      with open(\"voice_sample.mp3\", \"rb\") as audio_file:\n          response = requests.post(\n              \"https://dev.voice.ai/api/v1/tts/clone-voice\",\n              headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n              files={\"file\": audio_file},\n              data={\n                  \"name\": \"My Cloned Voice\",\n                  \"voice_visibility\": \"PRIVATE\",\n                  \"language\": \"en\"\n              }\n          )\n      \n      result = response.json()\n      print(f\"Voice ID: {result['voice_id']}\")\n      print(f\"Status: {result['status']}\")\n\n  curl:\n    list_voices: |\n      curl -X GET \"https://dev.voice.ai/api/v1/tts/voices?limit=10\" \\\n        -H \"Authorization: Bearer YOUR_API_KEY\"\n\n    generate_speech: |\n      curl -X POST \"https://dev.voice.ai/api/v1/tts/speech\" \\\n        -H \"Authorization: Bearer YOUR_API_KEY\" \\\n        -H \"Content-Type: application/json\" \\\n        -d '{\"text\": \"Hello world!\", \"audio_format\": \"mp3\"}' \\\n        --output speech.mp3\n\n    clone_voice: |\n      curl -X POST \"https://dev.voice.ai/api/v1/tts/clone-voice\" \\\n        -H \"Authorization: Bearer YOUR_API_KEY\" \\\n        -F \"file=@voice_sample.mp3\" \\\n        -F \"name=My Voice\" \\\n        -F \"voice_visibility=PRIVATE\"\n\n  typescript:\n    generate_speech: |\n      const response = await fetch(\"https://dev.voice.ai/api/v1/tts/speech\", {\n        method: \"POST\",\n        headers: {\n          \"Authorization\": `Bearer ${API_KEY}`,\n          \"Content-Type\": \"application/json\"\n        },\n        body: JSON.stringify({\n          text: \"Hello from TypeScript!\",\n          audio_format: \"mp3\"\n        })\n      });\n      \n      const audioBlob = await response.blob();\n      const audioUrl = URL.createObjectURL(audioBlob);\n      \n      // Play the audio\n      const audio = new Audio(audioUrl);\n      audio.play();\n\n# ============================================================================\n# Changelog\n# ============================================================================\n\nchangelog:\n  - version: \"1.1.2\"\n    date: \"2026-02-16\"\n    changes:\n      - \"Add SECURITY.md and LICENSE for provenance\"\n      - \"Restrict SDK to https only (remove http transport)\"\n  - version: \"1.1.1\"\n    date: \"2026-02-16\"\n    changes:\n      - \"Packaging metadata improvements for ClawHub import\"\n  - version: \"1.1.0\"\n    date: \"2026-02-16\"\n    changes:\n      - \"Documented production API endpoint\"\n      - \"Renamed voice personas for IP-safe labeling\"\n      - \"Metadata alignment for required credentials\"\n  - version: \"1.0.0\"\n    date: \"2026-01-30\"\n    changes:\n      - \"Initial release\"\n      - \"Support for all TTS endpoints\"\n      - \"Voice cloning capabilities\"\n      - \"HTTP and WebSocket streaming\"\n      - \"Multilingual support (11 languages)\"\n      - \"Comprehensive audio format options\"\n\nArchive v1.1.1: 9 files, 19509 bytes\n\nFiles: CHANGELOG.md (378b), package.json (805b), README.md (1045b), scripts/tts.js (3684b), SKILL.md (10155b), voice-ai-tts-sdk.js (19592b), voice-ai-tts.yaml (25737b), voices.json (2103b), _meta.json (149b)\n\nFile v1.1.1:SKILL.md\n\n---\nname: voice-ai-tts\ndescription: >\n  High-quality voice synthesis with 9 personas, 11 languages, streaming, and voice cloning using Voice.ai API.\nversion: 1.1.1\ntags: [tts, voice, speech, voice-ai, audio, streaming, voice-cloning, multilingual]\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"node\"],\"env\":{\"VOICE_AI_API_KEY\":\"required\"},\"note\":\"Set VOICE_AI_API_KEY via environment variable or a skill-local .env file.\"}}}\n---\n\n# Voice.ai Voices\n\n## ✨ Features\n\n- **9 Voice Personas** - Carefully curated voices for different use cases\n- **11 Languages** - Multi-language synthesis with multilingual model\n- **Streaming Mode** - Real-time audio output as it generates\n- **Voice Cloning** - Clone voices from audio samples\n- **Voice Design** - Customize with temperature and top_p parameters\n- **OpenClaw Integration** - Works with OpenClaw's built-in TTS\n\n---\n\n## ⚙️ Configuration\n\nThe scripts look for your API key in this order:\n\n1. `VOICE_AI_API_KEY` environment variable\n2. Skill-local `.env` file\n\n**Get your API key:** [Voice.ai Dashboard](https://voice.ai/dashboard)\n\n### Create `.env` file (Recommended)\n\n```bash\necho 'VOICE_AI_API_KEY=your-key-here' > .env\n```\n\n### Or export directly\n\n```bash\nexport VOICE_AI_API_KEY=\"your-api-key\"\n```\n\n---\n\n## 📦 Installation\n\nNo install step is required. This skill bundles a Node.js CLI and SDK (no external npm dependencies).\n\n## 🧩 Key Files\n\n- [`scripts/tts.js`](scripts/tts.js) - CLI entrypoint\n- [`voice-ai-tts-sdk.js`](voice-ai-tts-sdk.js) - Node.js SDK used by the CLI\n- [`voices.json`](voices.json) - Voice definitions used by the CLI\n- [`voice-ai-tts.yaml`](voice-ai-tts.yaml) - API specification\n- [`package.json`](package.json) - Skill metadata for tooling\n\n## 🌐 API Endpoint\n\nThe SDK and spec use `https://dev.voice.ai`, which is the official Voice.ai production API domain.\n\n---\n\n## 🤖 OpenClaw Integration\n\nOpenClaw can invoke the CLI script directly if your environment exposes `VOICE_AI_API_KEY`. Use the `/tts` commands as configured by your OpenClaw installation.\n\n---\n\n## 📝 Triggers\n\nThese chat commands work with OpenClaw:\n\n| Command | Description |\n|---------|-------------|\n| `/tts <text>` | Generate speech with default voice |\n| `/tts --voice ellie <text>` | Generate speech with specific voice |\n| `/tts --stream <text>` | Generate with streaming mode |\n| `/voices` | List available voices |\n| `/clone <audio_url>` | Clone a voice from audio |\n\n**Examples:**\n\n```\n/tts Hello, welcome to Voice.ai!\n/tts --voice oliver Good morning, everyone.\n/tts --voice lilith --stream This is a long story that will stream as it generates...\n```\n\n---\n\n## 🎙️ Available Voices\n\n| Voice   | ID | Gender | Persona     | Best For                   |\n|---------|-----|--------|-------------|----------------------------|\n| ellie   | `d1bf0f33-8e0e-4fbf-acf8-45c3c6262513` | female | youthful    | Vlogs, social content      |\n| oliver  | `f9e6a5eb-a7fd-4525-9e92-75125249c933` | male   | british     | Narration, tutorials       |\n| lilith  | `4388040c-8812-42f4-a264-f457a6b2b5b9` | female | soft        | ASMR, calm content         |\n| smooth  | `dbb271df-db25-4225-abb0-5200ba1426bc` | male   | deep        | Documentaries, audiobooks  |\n| shadow  | `72d2a864-b236-402e-a166-a838ccc2c273` | male   | distinctive | Gaming, entertainment      |\n| sakura  | `559d3b72-3e79-4f11-9b62-9ec702a6c057` | female | anime       | Character voices           |\n| zenith  | `ed751d4d-e633-4bb0-8f5e-b5c8ddb04402` | male   | deep        | Gaming, dramatic content   |\n| flora   | `a931a6af-fb01-42f0-a8c0-bd14bc302bb1` | female | cheerful    | Kids content, upbeat       |\n| commander | `bd35e4e6-6283-46b9-86b6-7cfa3dd409b9` | male   | heroic      | Gaming, action content     |\n\n---\n\n## 🌍 Supported Languages\n\n| Code | Language   |\n|------|------------|\n| `en` | English    |\n| `es` | Spanish    |\n| `fr` | French     |\n| `de` | German     |\n| `it` | Italian    |\n| `pt` | Portuguese |\n| `pl` | Polish     |\n| `ru` | Russian    |\n| `nl` | Dutch      |\n| `sv` | Swedish    |\n| `ca` | Catalan    |\n\nUse the multilingual model for non-English languages:\n\n```javascript\nconst audio = await client.generateSpeech({\n  text: 'Bonjour le monde!',\n  voice_id: 'ellie-voice-id',\n  model: 'voiceai-tts-multilingual-v1-latest',\n  language: 'fr'\n});\n```\n\n---\n\n## 🎨 Voice Design\n\nCustomize voice output with these parameters:\n\n| Parameter | Range | Default | Description |\n|-----------|-------|---------|-------------|\n| `temperature` | 0-2 | 1.0 | Higher = more expressive, lower = more consistent |\n| `top_p` | 0-1 | 0.8 | Controls randomness in speech generation |\n\n**Example:**\n\n```javascript\nconst audio = await client.generateSpeech({\n  text: 'This will sound very expressive!',\n  voice_id: 'ellie-voice-id',\n  temperature: 1.8,\n  top_p: 0.9\n});\n```\n\n---\n\n## 📡 Streaming Mode\n\nGenerate audio with real-time streaming (recommended for long texts):\n\n```bash\n# Stream audio as it generates\nnode scripts/tts.js --text \"This is a long story...\" --voice ellie --stream\n\n# Streaming with custom output\nnode scripts/tts.js --text \"Chapter one...\" --voice oliver --stream --output chapter1.mp3\n```\n\n**SDK streaming:**\n\n```javascript\nconst stream = await client.streamSpeech({\n  text: 'Long text here...',\n  voice_id: 'ellie-voice-id'\n});\n\n// Pipe to file\nstream.pipe(fs.createWriteStream('output.mp3'));\n\n// Or handle chunks\nstream.on('data', chunk => {\n  // Process audio chunk\n});\n```\n\n---\n\n## 🔊 Audio Formats\n\n| Format | Description | Use Case |\n|--------|-------------|----------|\n| `mp3` | Standard MP3 (32kHz) | General use |\n| `wav` | Uncompressed WAV | High quality |\n| `pcm` | Raw PCM audio | Processing |\n| `opus_48000_128` | Opus 128kbps | Streaming |\n| `mp3_44100_192` | High-quality MP3 | Professional |\n\nSee `voice-ai-tts-sdk.js` for all format options.\n\n---\n\n## 💻 CLI Usage\n\n```bash\n# Set API key\necho 'VOICE_AI_API_KEY=your-key-here' > .env\n\n# Generate speech\nnode scripts/tts.js --text \"Hello world!\" --voice ellie\n\n# Choose different voice\nnode scripts/tts.js --text \"Good morning!\" --voice oliver --output morning.mp3\n\n# Use streaming for long texts\nnode scripts/tts.js --text \"Once upon a time...\" --voice lilith --stream\n\n# Show help\nnode scripts/tts.js --help\n```\n\n---\n\n## 🧬 Voice Cloning\n\nClone any voice from an audio sample:\n\n```javascript\nconst VoiceAI = require('./voice-ai-tts-sdk');\nconst client = new VoiceAI(process.env.VOICE_AI_API_KEY);\n\n// Clone from file\nconst result = await client.cloneVoice({\n  file: './my-voice-sample.mp3',\n  name: 'My Custom Voice',\n  visibility: 'PRIVATE',\n  language: 'en'\n});\n\nconsole.log('Voice ID:', result.voice_id);\nconsole.log('Status:', result.status);\n\n// Wait for voice to be ready\nconst voice = await client.waitForVoice(result.voice_id);\nconsole.log('Voice ready!', voice);\n```\n\n**Requirements:**\n- Audio sample: 10-30 seconds recommended\n- Clear speech, minimal background noise\n- Supported formats: MP3, WAV, M4A\n\n---\n\n## 📁 Files\n\n```\nvoice-ai-tts/\n├── SKILL.md              # This documentation\n├── README.md             # Quick start\n├── CHANGELOG.md          # Version history\n├── voices.json           # Voice definitions\n├── voice-ai-tts.yaml     # OpenAPI specification\n├── voice-ai-tts-sdk.js   # JavaScript/Node.js SDK\n├── package.json          # OpenClaw metadata\n├── .gitignore            # Ignore local config and audio\n├── scripts/\n│   └── tts.js            # CLI tool\n└── .env                  # API key (create this)\n```\n\n---\n\n## 💰 Cost & Usage\n\nVoice.ai uses a credit-based system. Check your usage:\n\n```javascript\n// The SDK tracks usage via API responses\nconst voices = await client.listVoices();\n// Check response headers for rate limit info\n```\n\n**Tips to reduce costs:**\n- Use streaming for long texts (more efficient)\n- Cache generated audio when possible\n- Use appropriate audio quality for your use case\n\n---\n\n## 🔗 Links\n\n- **[Get API Key](https://voice.ai/dashboard)** - Sign up and get your key\n- **[API Documentation](https://voice.ai/docs)** - Full API reference\n- **[Voice Library](https://voice.ai/voices)** - Browse all voices\n- **[API Reference](https://voice.ai/docs/api-reference/text-to-speech/generate-speech)** - Endpoint details\n- **[Pricing](https://voice.ai/pricing)** - Plans and credits\n\n---\n\n## 📋 Changelog\n\n### v1.1.1 (2026-02-16)\n- Packaging metadata improvements for ClawHub import (bin/files metadata)\n\n### v1.1.0 (2026-02-16)\n- Declared required credentials in metadata\n- Documented the production API endpoint domain\n- Renamed voice personas for IP-safe labeling\n- Added `voices.json` for voice data\n\n### v1.0.0 (2025-01-31)\n- Initial release\n- 9 curated voice personas\n- 11 language support\n- Streaming mode\n- Voice cloning\n- Voice design parameters\n- Full SDK with error handling\n- CLI tool\n\n---\n\n## 🛠️ SDK Quick Reference\n\n```javascript\nconst VoiceAI = require('./voice-ai-tts-sdk');\nconst client = new VoiceAI(process.env.VOICE_AI_API_KEY);\n\n// List voices\nconst voices = await client.listVoices({ limit: 10 });\n\n// Get voice details\nconst voice = await client.getVoice('voice-id');\n\n// Generate speech\nconst audio = await client.generateSpeech({\n  text: 'Hello, world!',\n  voice_id: 'voice-id',\n  audio_format: 'mp3'\n});\n\n// Generate to file\nawait client.generateSpeechToFile(\n  { text: 'Hello!', voice_id: 'voice-id' },\n  'output.mp3'\n);\n\n// Stream speech\nconst stream = await client.streamSpeech({\n  text: 'Long text...',\n  voice_id: 'voice-id'\n});\n\n// Clone voice\nconst clone = await client.cloneVoice({\n  file: './sample.mp3',\n  name: 'My Voice'\n});\n\n// Delete voice\nawait client.deleteVoice('voice-id');\n```\n\n---\n\n## ❓ Troubleshooting\n\n| Error | Cause | Solution |\n|-------|-------|----------|\n| `AuthenticationError` | Invalid API key | Check your `VOICE_AI_API_KEY` |\n| `PaymentRequiredError` | Out of credits | Add credits at voice.ai/dashboard |\n| `RateLimitError` | Too many requests | Wait and retry, or upgrade plan |\n| `ValidationError` | Invalid parameters | Check text length and voice_id |\n\n---\n\nMade with ❤️ by [Nick Gill](https://github.com/gizmoGremlin)\n\nFile v1.1.1:README.md\n\n# Voice.ai Voices\n\nHigh-quality voice synthesis with 9 personas, 11 languages, streaming, and voice cloning using the Voice.ai API.\n\n## Quick Start\n\n```bash\n# Set API key (recommended)\necho 'VOICE_AI_API_KEY=your-key-here' > .env\n\n# Generate speech\nnode scripts/tts.js --text \"Hello world!\" --voice ellie\n\n# Streaming for long text\nnode scripts/tts.js --text \"Once upon a time...\" --voice lilith --stream\n```\n\n## Configuration\n\nThe CLI looks for `VOICE_AI_API_KEY` in this order:\n1. Environment variable\n2. Skill-local `.env` file\n\n## API Endpoint\n\nThe SDK uses `https://dev.voice.ai`, which is the official Voice.ai production API domain.\n\n## Voices\n\nVoice definitions live in `voices.json`. Use the CLI with `--voice <name>`:\n\n```\nellie, oliver, lilith, smooth, shadow, sakura, zenith, flora, commander\n```\n\n## Documentation\n\n- `SKILL.md` for full usage and examples\n- `voice-ai-tts.yaml` for the API spec\n- `voice-ai-tts-sdk.js` for SDK usage\n\n## Links\n\n- Voice.ai Dashboard: https://voice.ai/dashboard\n- Voice.ai Docs: https://voice.ai/docs\n\nFile v1.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn73en640mtvfs2neagtbc3b51809cyr\",\n  \"slug\": \"openclaw-skill-voice-ai-voices\",\n  \"version\": \"1.1.1\",\n  \"publishedAt\": 1771274458480\n}\n\nFile v1.1.1:CHANGELOG.md\n\n# Changelog\n\n## [1.1.1] - 2026-02-16\n### Changed\n- Packaging metadata improvements for ClawHub import (bin/files metadata)\n\n## [1.1.0] - 2026-02-16\n### Changed\n- Declared required credentials in metadata\n- Documented the production API endpoint domain\n- Renamed voice personas for IP-safe labeling\n- Added `voices.json` for voice data\n\n## [1.0.0] - 2026-01-31\n- Initial release\n\nFile v1.1.1:package.json\n\n{\n  \"name\": \"voice-ai-tts\",\n  \"version\": \"1.1.1\",\n  \"description\": \"High-quality voice synthesis with 9 personas, 11 languages, streaming, and voice cloning using Voice.ai API.\",\n  \"main\": \"SKILL.md\",\n  \"bin\": {\n    \"voice-ai-tts\": \"scripts/tts.js\"\n  },\n  \"files\": [\n    \"SKILL.md\",\n    \"README.md\",\n    \"CHANGELOG.md\",\n    \"voices.json\",\n    \"voice-ai-tts.yaml\",\n    \"voice-ai-tts-sdk.js\",\n    \"scripts/tts.js\"\n  ],\n  \"keywords\": [\"tts\", \"voice\", \"speech\", \"voice-ai\", \"audio\"],\n  \"author\": \"gizmoGremlin\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/gizmoGremlin/openclaw-skill-voice-ai-voices.git\"\n  },\n  \"openclaw\": {\n    \"skill\": true,\n    \"requirements\": {\n      \"bins\": [\"node\"],\n      \"env\": {\n        \"VOICE_AI_API_KEY\": \"required\"\n      }\n    }\n  }\n}\n\nFile v1.1.1:voices.json\n\n{\n  \"version\": \"1.1.1\",\n  \"default_voice\": \"ellie\",\n  \"model\": \"voiceai-tts-v1-latest\",\n  \"multilingual_model\": \"voiceai-tts-multilingual-v1-latest\",\n  \"supported_languages\": [\n    \"en\",\n    \"es\",\n    \"fr\",\n    \"de\",\n    \"it\",\n    \"pt\",\n    \"pl\",\n    \"ru\",\n    \"nl\",\n    \"sv\",\n    \"ca\"\n  ],\n  \"voices\": {\n    \"ellie\": {\n      \"voice_id\": \"d1bf0f33-8e0e-4fbf-acf8-45c3c6262513\",\n      \"name\": \"Ellie\",\n      \"gender\": \"female\",\n      \"persona\": \"youthful\",\n      \"best_for\": \"Vlogs, social content\"\n    },\n    \"oliver\": {\n      \"voice_id\": \"f9e6a5eb-a7fd-4525-9e92-75125249c933\",\n      \"name\": \"Oliver\",\n      \"gender\": \"male\",\n      \"persona\": \"british\",\n      \"best_for\": \"Narration, tutorials\"\n    },\n    \"lilith\": {\n      \"voice_id\": \"4388040c-8812-42f4-a264-f457a6b2b5b9\",\n      \"name\": \"Lilith\",\n      \"gender\": \"female\",\n      \"persona\": \"soft\",\n      \"best_for\": \"ASMR, calm content\"\n    },\n    \"smooth\": {\n      \"voice_id\": \"dbb271df-db25-4225-abb0-5200ba1426bc\",\n      \"name\": \"Smooth\",\n      \"gender\": \"male\",\n      \"persona\": \"deep\",\n      \"best_for\": \"Documentaries, audiobooks\"\n    },\n    \"shadow\": {\n      \"voice_id\": \"72d2a864-b236-402e-a166-a838ccc2c273\",\n      \"name\": \"Shadow\",\n      \"gender\": \"male\",\n      \"persona\": \"distinctive\",\n      \"best_for\": \"Gaming, entertainment\"\n    },\n    \"sakura\": {\n      \"voice_id\": \"559d3b72-3e79-4f11-9b62-9ec702a6c057\",\n      \"name\": \"Sakura\",\n      \"gender\": \"female\",\n      \"persona\": \"anime\",\n      \"best_for\": \"Character voices\"\n    },\n    \"zenith\": {\n      \"voice_id\": \"ed751d4d-e633-4bb0-8f5e-b5c8ddb04402\",\n      \"name\": \"Zenith\",\n      \"gender\": \"male\",\n      \"persona\": \"deep\",\n      \"best_for\": \"Gaming, dramatic content\"\n    },\n    \"flora\": {\n      \"voice_id\": \"a931a6af-fb01-42f0-a8c0-bd14bc302bb1\",\n      \"name\": \"Flora\",\n      \"gender\": \"female\",\n      \"persona\": \"cheerful\",\n      \"best_for\": \"Kids content, upbeat\"\n    },\n    \"commander\": {\n      \"voice_id\": \"bd35e4e6-6283-46b9-86b6-7cfa3dd409b9\",\n      \"name\": \"Commander\",\n      \"gender\": \"male\",\n      \"persona\": \"heroic\",\n      \"best_for\": \"Gaming, action content\"\n    }\n  }\n}\n\nFile v1.1.1:voice-ai-tts.yaml\n\n# ============================================================================\n# Voice.ai Text-to-Speech Skill\n# ============================================================================\n# A comprehensive skill for Voice.ai's TTS API with voice cloning,\n# speech generation, streaming, and voice management capabilities.\n#\n# Version: 1.1.1\n# Author: Nick Gill (https://github.com/gizmoGremlin)\n# License: MIT\n# Documentation: https://voice.ai/docs\n# ============================================================================\n\nskill:\n  name: voice-ai-tts\n  display_name: \"Voice.ai Text-to-Speech\"\n  description: |\n    High-quality voice synthesis with voice cloning, streaming audio generation,\n    multilingual support (11 languages), and flexible audio formats using the\n    Voice.ai Developer API. Features include instant voice cloning, real-time\n    streaming, WebSocket support for low-latency applications, and comprehensive\n    voice management.\n  version: \"1.1.1\"\n  author: \"Nick Gill (https://github.com/gizmoGremlin)\"\n  icon: \"🎙️\"\n  category: \"audio\"\n  tags:\n    - text-to-speech\n    - tts\n    - voice-cloning\n    - audio-generation\n    - speech-synthesis\n    - ai-voice\n    - streaming\n    - websocket\n\n# ============================================================================\n# Authentication Configuration\n# ============================================================================\n\nauthentication:\n  type: bearer\n  header: Authorization\n  prefix: \"Bearer \"\n  description: |\n    Voice.ai uses Bearer token authentication. Get your API key from\n    https://voice.ai/dashboard and pass it as: Authorization: Bearer <your-api-key>\n  environment_variable: VOICE_AI_API_KEY\n  required: true\n\n# ============================================================================\n# API Configuration\n# ============================================================================\n\napi:\n  base_url: \"https://dev.voice.ai\" # Official Voice.ai production API endpoint\n  version: \"v1\"\n  content_type: \"application/json\"\n  timeout: 60000\n  rate_limit:\n    requests_per_minute: 60\n    description: \"Rate limits vary by plan. Check your dashboard for details.\"\n\n# ============================================================================\n# Available Models\n# ============================================================================\n\nmodels:\n  - id: \"voiceai-tts-v1-latest\"\n    name: \"Voice.ai TTS v1 (Latest)\"\n    description: \"Latest English TTS model with highest quality\"\n    languages: [\"en\"]\n    \n  - id: \"voiceai-tts-v1-2025-12-19\"\n    name: \"Voice.ai TTS v1 (2025-12-19)\"\n    description: \"Stable English TTS model snapshot\"\n    languages: [\"en\"]\n    \n  - id: \"voiceai-tts-multilingual-v1-latest\"\n    name: \"Voice.ai Multilingual v1 (Latest)\"\n    description: \"Latest multilingual TTS model\"\n    languages: [\"en\", \"es\", \"fr\", \"de\", \"it\", \"pt\", \"pl\", \"ru\", \"nl\", \"sv\", \"ca\"]\n    \n  - id: \"voiceai-tts-multilingual-v1-2025-01-14\"\n    name: \"Voice.ai Multilingual v1 (2025-01-14)\"\n    description: \"Stable multilingual TTS model snapshot\"\n    languages: [\"en\", \"es\", \"fr\", \"de\", \"it\", \"pt\", \"pl\", \"ru\", \"nl\", \"sv\", \"ca\"]\n\n# ============================================================================\n# Popular Voices\n# ============================================================================\n\nvoices:\n  - id: \"d1bf0f33-8e0e-4fbf-acf8-45c3c6262513\"\n    name: \"Ellie\"\n    gender: female\n    style: \"Youthful, vibrant fashion vlogger\"\n    \n  - id: \"f9e6a5eb-a7\n\nArchive v1.1.0: 2 files, 4333 bytes\n\nFiles: SKILL.md (9600b), _meta.json (149b)\n\nArchive v0.1.1: 5 files, 16273 bytes\n\nFiles: scripts/tts.js (2611b), SKILL.md (9151b), voice-ai-tts-sdk.js (19441b), voice-ai-tts.yaml (25389b), _meta.json (149b)","readmeExcerpt":"Skill: Voice Ai Tts Owner: gizmogremlin Summary: High-quality voice synthesis with 9 personas, 11 languages, and streaming using Voice.ai API. Tags: latest:1.1.4 Version history: v1.1.4 | 2026-02-16T21:40:06.435Z | auto - Declare VOICE_AI_API_KEY as the primary environment variable in skill metadata - Minor metadata and documentation updates for clarity v1.1.3 | 2026-02-16T21:23:32.316Z | auto - Removed voice cloning","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"export VOICE_AI_API_KEY=\"your-api-key\""},{"language":"text","snippet":"/tts Hello, welcome to Voice.ai!\n/tts --voice oliver Good morning, everyone.\n/tts --voice lilith --stream This is a long story that will stream as it generates..."},{"language":"javascript","snippet":"const audio = await client.generateSpeech({\n  text: 'Bonjour le monde!',\n  voice_id: 'ellie-voice-id',\n  model: 'voiceai-tts-multilingual-v1-latest',\n  language: 'fr'\n});"},{"language":"javascript","snippet":"const audio = await client.generateSpeech({\n  text: 'This will sound very expressive!',\n  voice_id: 'ellie-voice-id',\n  temperature: 1.8,\n  top_p: 0.9\n});"},{"language":"bash","snippet":"# Stream audio as it generates\nnode scripts/tts.js --text \"This is a long story...\" --voice ellie --stream\n\n# Streaming with custom output\nnode scripts/tts.js --text \"Chapter one...\" --voice oliver --stream --output chapter1.mp3"},{"language":"javascript","snippet":"const stream = await client.streamSpeech({\n  text: 'Long text here...',\n  voice_id: 'ellie-voice-id'\n});\n\n// Pipe to file\nstream.pipe(fs.createWriteStream('output.mp3'));\n\n// Or handle chunks\nstream.on('data', chunk => {\n  // Process audio chunk\n});"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: voice-ai-tts\ndescription: >\n  High-quality voice synthesis with 9 personas, 11 languages, and streaming using Voice.ai API.\nversion: 1.1.4\ntags: [tts, voice, speech, voice-ai, audio, streaming, multilingual]\nmetadata:\n  openclaw:\n    requires:\n      bins: [\"node\"]\n      env:\n        VOICE_AI_API_KEY: \"required\"\n      primary_env: \"VOICE_AI_API_KEY\"\n      note: \"Set VOICE_AI_API_KEY via an environment variable.\"\n---\n\n# Voice.ai Voices\n\n## ✨ Features\n\n- **9 Voice Personas** - Carefully curated voices for different use cases\n- **11 Languages** - Multi-language synthesis with multilingual model\n- **Streaming Mode** - Real-time audio output as it generates\n- **Voice Design** - Customize with temperature and top_p parameters\n- **OpenClaw Integration** - Works with OpenClaw's built-in TTS\n\n---\n\n## ⚙️ Configuration\n\nSet your API key as an environment variable:\n\n```bash\nexport VOICE_AI_API_KEY=\"your-api-key\"\n```\n\n**Get your API key:** [Voice.ai Dashboard](https://voice.ai/dashboard)\n\n---\n\n## 📦 Installation\n\nNo install step is required. This skill bundles a Node.js CLI and SDK (no external npm dependencies).\n\n## 🧩 Key Files\n\n- [`scripts/tts.js`](scripts/tts.js) - CLI entrypoint\n- [`voice-ai-tts-sdk.js`](voice-ai-tts-sdk.js) - Node.js SDK used by the CLI\n- [`voices.json`](voices.json) - Voice definitions used by the CLI\n- [`voice-ai-tts.yaml`](voice-ai-tts.yaml) - API specification\n- [`package.json`](package.json) - Skill metadata for tooling\n\n## Security Notes\n\nSee [`SECURITY.md`](SECURITY.md) for the full security and privacy overview.\n\nThis skill:\n- Makes outbound HTTPS requests only to `https://dev.voice.ai`\n- Reads local files: `voices.json`\n- Writes audio output to the `--output` path (default `output.mp3`)\n- Does not execute shell commands and does not modify system configuration files\n\n## 🌐 API Endpoint\n\nThe SDK and spec use `https://dev.voice.ai`, which is the official Voice.ai production API domain.\n\n---\n\n## 🤖 OpenClaw Integration\n\nOpenClaw can invoke the CLI script directly if your environment exposes `VOICE_AI_API_KEY`. Use the `/tts` commands as configured by your OpenClaw installation.\n\n---\n\n## 📝 Triggers\n\nThese chat commands work with OpenClaw:\n\n| Command | Description |\n|---------|-------------|\n| `/tts <text>` | Generate speech with default voice |\n| `/tts --voice ellie <text>` | Generate speech with specific voice |\n| `/tts --stream <text>` | Generate with streaming mode |\n| `/voices` | List available voices |\n\n**Examples:**\n\n```\n/tts Hello, welcome to Voice.ai!\n/tts --voice oliver Good morning, everyone.\n/tts --voice lilith --stream This is a long story that will stream as it generates...\n```\n\n---\n\n## 🎙️ Available Voices\n\n| Voice   | ID | Gender | Persona     | Best For                   |\n|---------|-----|--------|-------------|----------------------------|\n| ellie   | `d1bf0f33-8e0e-4fbf-acf8-45c3c6262513` | female | youthful    | Vlogs, social content      |\n| oliver  | `f9e6a5eb-a7fd-4525-9e92-75125249c933` | male   | "},{"path":"README.md","content":"# Voice.ai Voices\n\nHigh-quality voice synthesis with 9 personas, 11 languages, and streaming using the Voice.ai API.\n\nRequires Node.js 18+.\n\n## Quick Start\n\n```bash\n# Set API key\nexport VOICE_AI_API_KEY=\"your-key-here\"\n\n# Generate speech\nnode scripts/tts.js --text \"Hello world!\" --voice ellie\n\n# Streaming for long text\nnode scripts/tts.js --text \"Once upon a time...\" --voice lilith --stream\n```\n\n## Configuration\n\nThe CLI requires `VOICE_AI_API_KEY` to be set as an environment variable.\n\n## API Endpoint\n\nThe SDK uses `https://dev.voice.ai`, which is the official Voice.ai production API domain.\n\n## Voices\n\nVoice definitions live in `voices.json`. Use the CLI with `--voice <name>`:\n\n```\nellie, oliver, lilith, smooth, shadow, sakura, zenith, flora, commander\n```\n\n## Documentation\n\n- `SKILL.md` for full usage and examples\n- `voice-ai-tts.yaml` for the API spec\n- `voice-ai-tts-sdk.js` for SDK usage\n\n## Security\n\nSee `SECURITY.md` for a clear list of what the skill reads/writes locally and what endpoints it contacts.\n\n## Links\n\n- Voice.ai Dashboard: https://voice.ai/dashboard\n- Voice.ai Docs: https://voice.ai/docs"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn73en640mtvfs2neagtbc3b51809cyr\",\n  \"slug\": \"openclaw-skill-voice-ai-voices\",\n  \"version\": \"1.1.4\",\n  \"publishedAt\": 1771278006435\n}"},{"path":"CHANGELOG.md","content":"# Changelog\n\n## [1.1.4] - 2026-02-16\n### Changed\n- Declare `VOICE_AI_API_KEY` as primary env var in metadata\n\n## [1.1.3] - 2026-02-16\n### Changed\n- Remove voice-sample upload features from the published bundle to reduce privacy risk\n- Require `VOICE_AI_API_KEY` via environment variable only\n\n## [1.1.2] - 2026-02-16\n### Changed\n- Added `SECURITY.md` and `LICENSE.md` for provenance and transparency\n- Restricted SDK transport to HTTPS only\n\n## [1.1.1] - 2026-02-16\n### Changed\n- Packaging metadata improvements for ClawHub import (bin/files metadata)\n\n## [1.1.0] - 2026-02-16\n### Changed\n- Declared required credentials in metadata\n- Documented the production API endpoint domain\n- Renamed voice personas for IP-safe labeling\n- Added `voices.json` for voice data\n\n## [1.0.0] - 2026-01-31\n- Initial release"},{"path":"LICENSE.md","content":"MIT License\n\nCopyright (c) 2026 Nick Gill\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1450,"uniquenessScore":42,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T22:06:33.210Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T22:06:33.210Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T08:21:36.001Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}