A config-driven text-to-speech tool for OpenClaw. One script, multiple TTS providers, zero dependencies.
Adding a new provider = adding a JSON block. No code changes.
- 🔧 Config-driven — providers defined in
tts_providers.json - 🗣️ Multi-provider — DashScope (Qwen3-TTS), Speechify, easily extensible
- 📦 Zero dependencies — pure Python stdlib
- 🔑 Reads API keys from environment (OpenClaw
env.varscompatible) - 🌏 Multilingual — English, Chinese, Japanese, and more
# Set your API key
export DASHSCOPE_API_KEY="sk-..."
# Default provider
echo "Hello world" | python3 tts.py -o hello.mp3
# Specify provider
python3 tts.py -p dashscope --text "Hello" -o hello.mp3
python3 tts.py -p speechify --text "Hello" --voice george -o hello.mp3
# Instruction-controlled expressiveness
python3 tts.py -p dashscope-instruct --instruct "Speak warmly" --text "Welcome" -o warm.mp3
# List providers
python3 tts.py --list-providers
# List voices
python3 tts.py --list-voices -p dashscopeEdit tts_providers.json and add a block:
{
"my-provider": {
"name": "My TTS Provider",
"endpoint": "https://api.example.com/v1/tts",
"auth": {"header": "Authorization", "prefix": "Bearer", "env": "MY_API_KEY"},
"defaults": {"model": "default-model", "voice": "default-voice"},
"request_template": {
"model": "{{model}}",
"text": "{{text}}",
"voice": "{{voice}}"
},
"response": {
"type": "url",
"path": "output.audio.url"
}
}
}| Type | Description |
|---|---|
url |
Response contains an audio URL at the configured path. Script downloads it. |
base64 |
Response contains base64-encoded audio at the configured path. Script decodes it. |
| Variable | Source |
|---|---|
{{text}} |
Input text |
{{voice}} |
--voice or provider default |
{{model}} |
--model or provider default |
{{lang}} |
--lang or provider default |
{{instruct}} |
--instruct (stripped if empty) |
| Provider | Model | Key | Notes |
|---|---|---|---|
dashscope |
Qwen3-TTS Flash | DASHSCOPE_API_KEY |
International endpoint (Singapore) |
dashscope-instruct |
Qwen3-TTS Instruct Flash | DASHSCOPE_API_KEY |
Instruction-controlled expressiveness |
speechify |
Simba English | SPEECHIFY_API_KEY |
Requires paid subscription |
Add API keys to openclaw.json → env.vars:
{
"env": {
"vars": {
"DASHSCOPE_API_KEY": "sk-...",
"SPEECHIFY_API_KEY": "..."
}
}
}MIT