/install macos-say
Say + FFmpeg TTS Pipeline
Use say (macOS native TTS) + ffmpeg to generate Opus voice messages for Telegram/Matrix.
Why not just say?
- Telegram/Matrix require Opus codec voice messages
sayoutputs AIFF/m4a; must convert to.ogg(Opus) before sending- Telegram accepts: OGG/MP3/M4A as voice — but Opus OGG is the native format
Workflow
say -v "\x3Cvoice>" -o \x3Ctmpdir>/\x3Cname>.aiff "\x3Ctext>"
ffmpeg -i \x3Ctmpdir>/\x3Cname>.aiff -acodec libopus \x3Ctmpdir>/\x3Cname>.ogg -y
Send with message tool:
{
"action": "send",
"channel": "telegram",
"media": "\x3Ctmpdir>/\x3Cname>.ogg",
"asVoice": true,
"target": "\x3Cchat_id>"
}
Recommended workspace directory
~/.openclaw/workspace/tmp/audio/
(Whitelist this path in exec permissions for faster approval)
Voice selection
Use say -v '?' to list available voices. Notable ones:
Trinoids— robotic/electronic voice (popular for bots)Samantha— warm US female voiceAlex— US male voiceFred— neutral US male voiceKaren— Australian female voice
Note: pass just the voice name (e.g. "Trinoids"), not the full en_US suffix.
Example: send a hello voice message
VOICE="Trinoids"
TEXT="Hello!"
DIR="$HOME/.openclaw/workspace/tmp/audio"
mkdir -p "$DIR"
say -v "$VOICE" -o "$DIR/hello.aiff" "$TEXT"
ffmpeg -i "$DIR/hello.aiff" -acodec libopus "$DIR/hello.ogg" -y
# Then send via message tool with asVoice: true
Format notes
- Input to ffmpeg: AIFF (
.aiff) works reliably; avoid.m4awithsay - Output: Opus in Ogg container (
libopuscodec) — required for Telegram voice messages - Telegram
sendVoiceaccepts: OGG, MP3, M4A — but native is Opus OGG - Sample rate:
sayoutputs 24kHz AIFF; ffmpeg re-encodes to Opus at 24kHz
Integration with OpenClaw TTS
OpenClaw's built-in messages.tts only supports: ElevenLabs, Microsoft Edge, MiniMax, OpenAI.
This say+ffmpeg pipeline is a workaround for local-only TTS without API keys or cloud services. It's not auto-triggered by OpenClaw — call it manually via exec + message tool.
Language Detection → Voice Mapping
When responding to a voice message, detect the language from the STT output (Parakeet auto-detects). Then pick the matching say voice using i18n locale codes.
Finding voices by language:
say -v '?' 2>&1 | grep -E "cs_CZ|en_US|de_DE|fr_FR|it_IT|es_ES"
Language → voice selection priority:
- Use
\x3Cvoice> (Premium)if available - Fall back to
\x3Cvoice> (Enhanced)if available - Fall back to base
\x3Cvoice>name - Never use a voice that doesn't match the language
| Language | i18n code | Preferred Voice |
|---|---|---|
| Czech | cs_CZ |
Zuzana (Premium) |
| English (US) | en_US |
Trinoids (no Premium/Enhanced available) |
| German | de_DE |
Grandma (Premium) if available |
| French | fr_FR |
Grandma (Premium) if available |
| Spanish | es_ES |
Grandma (Premium) if available |
| Italian | it_IT |
Grandma (Premium) if available |
Key: Always use just the voice name (e.g. "Trinoids", "Zuzana"), not the full locale suffix. The locale suffix in say -v '?' output is for grepping/identification only.
Example workflow:
LANG="cs_CZ"
# Find best available voice for this language (Premium > Enhanced > base)
VOICE=$(say -v '?' 2>&1 | grep "$LANG" | head -3 | awk '{print $1}' | sed -n '1p')
say -v "$VOICE" -o reply.aiff "Česká odpověď"
ffmpeg -i reply.aiff -acodec libopus reply.ogg -y
TODOs
- Detect language from STT transcription and auto-select appropriate
sayvoice - Explore integrating into OpenClaw via custom TTS provider plugin
- Investigate if OpenClaw supports post-processing TTS output via a hook
- Test Matrix channel voice message format compatibility
- 确保已安装 OpenClaw(本地或 Docker 部署)
- 在对话框中输入安装命令:
/install macos-say - 安装完成后,直接呼叫该 Skill 的名称或使用
/macos-say触发 - 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
Text to speech using the default macOS "say" command. No need for 3rd party APIs or models. Supports many languages. Also, Trinoids! 是什么?
Local text-to-speech using macOS `say` + ffmpeg for Telegram/Matrix voice messages. 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 76 次。
如何安装 Text to speech using the default macOS "say" command. No need for 3rd party APIs or models. Supports many languages. Also, Trinoids!?
在 OpenClaw 或 Claude Code 对话框中运行命令「/install macos-say」即可一键安装,无需额外配置。
Text to speech using the default macOS "say" command. No need for 3rd party APIs or models. Supports many languages. Also, Trinoids! 是免费的吗?
是的,Text to speech using the default macOS "say" command. No need for 3rd party APIs or models. Supports many languages. Also, Trinoids! 完全免费,采用 MIT-0 许可证,可自由下载、安装和使用。
Text to speech using the default macOS "say" command. No need for 3rd party APIs or models. Supports many languages. Also, Trinoids! 支持哪些平台?
Text to speech using the default macOS "say" command. No need for 3rd party APIs or models. Supports many languages. Also, Trinoids! 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。
谁开发了 Text to speech using the default macOS "say" command. No need for 3rd party APIs or models. Supports many languages. Also, Trinoids!?
由 zviratko(@zviratko)开发并维护,当前版本 v0.0.2。