Sag:ElevenLabs 语音合成 Skill,带 Mac 风格 say 交互

前言

很多 Agent 接到「把这句话念出来」的需求时,只能先调 OpenAI 或浏览器 TTS,或者去写一段几十行的 ElevenLabs 调用脚本,再自己处理音频落盘。Sag 把这件事压缩成一条命令:sag "Hello there",本地播放,参数用开关控制,不写脚本。

下面介绍这个 Skill 是什么、怎么装、怎么用,以及它把哪些调参细节固化成了约定。

这是什么

Sag 是一个面向创意、语音与多媒体场景的 text-to-speech synthesis Skill,基于通用 SKILL.md 格式。一句话定位:用 ElevenLabs 做语音合成,交互风格照搬 macOS 的 say 命令。

  • 出品/维护:steipete(Peter Steinberger),发布在 ClawHub
  • 来源:clawhub,坐标 @clawhub_steipete/sag
  • 版本:1.0.0,许可证 MIT-0
  • 分类:design-media(ClawHub 页面归在 Creative / #text-to-speech)
  • Skill 线索中的中文名是「语音合成(sag)」,官方地址 https://api.skillhub.cn/indiv-seafish/sag,对应 SkillHub 页面为 https://www.skillhub.cn/skills/clawhub_steipete/sag

它解决的问题不是「能不能合成语音」,而是把模型选择、发音矫正、停顿和语气标签这些每次都要重新摸索的参数,变成稳定可复用的命令行约定。

核心功能

只列 ClawHub 技能卡上明确写出的能力。

  1. Mac 风格的 say 交互:文本直接作为位置参数传入,输出本地播放。
  2. 显式指定音色:-v / --voice 传音色 ID 或音色别名,另有 sag voices 列出可用音色。
  3. 文件输出:-o 把音频写到指定路径(mp3),便于作为附件返回。
  4. 提示词指南:sag prompting 输出模型专属的提示技巧。
  5. 发音与播报规则内置:重拼(respell)、数字/单位/URL 的规范化、语言倾向开关都由命令行参数控制,不需要在正文里手写规则。
  6. 模型切换:默认 eleven_v3(expressive),另有 stable 和 fast 档位。

安装与启用

Skill 通过 OpenClaw 的 CLI 安装,不需要手工 clone 仓库。

openclaw skills install @steipete/sag

安装前需要先准备好 API key。技能卡列出两个环境变量:

# 推荐
export ELEVENLABS_API_KEY=sk_xxx

# CLI 也支持
export SAG_API_KEY=sk_xxx

音色默认值同样走环境变量:

export ELEVENLABS_VOICE_ID=lj2rcrvANS3gaWWnczSX
# 或 SAG_VOICE_ID

技能卡上 ELEVENLABS_VOICE_ID 与 SAG_VOICE_ID 并列列出;ClawHub 示例里 Clawd 的默认音色 ID 就是 lj2rcrvANS3gaWWnczSX,用 -v Clawd 也可以。

说明:资料里只给出 OpenClaw CLI 这一种安装方式,没有提到 Cursor、Codex CLI 或 Claude Code 的差异化安装步骤,这里不做推测。

典型用法

下面几条都来自技能卡的 Quick start 段落。

最简单的一条,合成并本地播放:

sag "Hello there"

指定音色,用别名更直观:

sag speak -v "Roger" "Hello"

查看可用音色、查看提示技巧:

sag voices
sag prompting

生成音频文件并作为回复附件返回。技能卡给出的是给 Peter 做语音回复的例子:

sag -v Clawd -o /tmp/voice-reply.mp3 "Your message here"
# 然后在同一条回复里附上:
# MEDIA:/tmp/voice-reply.mp3

技能卡对不同人设给了建议:crazy scientist 用 [excited] 标签加短停顿并变换强度;calm 用 [whispers] 或放慢节奏;dramatic 少量使用 [sings] 或 [shouts]。

发音、停顿与语气标签

这一节容易踩坑,单独说。技能卡给的规则按模型版本区分。

发音矫正,第一优先级是重拼:

"key-note"、加连字符、调整大小写

数字、单位和 URL 走规范化开关:

# 默认 auto;如果规范化反而破坏了专名,可以关掉
sag --normalize auto "..."

语言倾向用来指导规范化方向:

sag --lang en|de|fr|... "..."

停顿标签。eleven_v3 不支持 SSML <break>,要用方括号标签:

[pause]、[short pause]、[long pause]

eleven_multilingual_v2 / eleven_flash_v2_5 支持 SSML <break time="1.5s" />,但 <phoneme> 在 sag 里没有暴露。

语气标签写在行首,v3 可用:

[whispers]、[shouts]、[sings]
[laughs]、[starts laughing]、[sighs]、[exhales]
[sarcastic]、[curious]、[excited]、[crying]、[mischievously]

技能卡给出的完整示例:

sag "[whispers] keep this quiet. [short pause] ok?"

注意:标签必须放在行首,不能夹在句子中间;这是 v3 的约束,换模型后要用 SSML 写法。

模型选择

技能卡列出三档,参数写全:

  • 默认:eleven_v3(expressive)
  • Stable:eleven_multilingual_v2
  • Fast:eleven_flash_v2_5

需要稳定的多语种输出时换 stable,需要低延迟时换 fast,默认档位表达力最强但 SSML 能力受限。换模型前先确认停顿和语气标签的写法是否仍然有效。

适用场景与注意

适合的人:已经在用 OpenClaw / ClawHub 生态的开发者,需要给 Agent 加一条稳定的「说话」能力,且不想自己维护调用脚本和调参逻辑。也适合需要把语音回复作为附件回传给用户的聊天类场景。

限制和坑:

  1. 必须提供 API key,技能卡的 tag 是 requires_api_key=true。没有 key 时命令不会成功,部署前先检查环境变量是否注入到 Agent 实际运行的进程里。
  2. 模型版本决定标签语法。v3 不支持 SSML <break>,v2/v2.5 不支持通过 sag 使用 <phoneme>。从默认档切到 stable 或 fast 时,正文里的停顿写法要跟着改。
  3. 长输出前先确认音色和说话人。音色 ID 是环境变量,一旦设错,批量生成的音频会全部落在错误音色上,返工成本高于一开始就核对一次。
  4. --normalize 可能破坏专名。技能卡明确说可以 off,所以遇到产品名、人名读错时,先关规范化再排查重拼。
  5. 技能卡标注 Last updated 5mo ago,Security audit 为 Pass,许可证 MIT-0。功能细节以当前技能卡为准。

结尾

Sag 的价值在于把 ElevenLabs TTS 的一次调用变成一条带默认值的命令,同时把发音、停顿、语气这些最容易反复试错的地方固化成文档。如果你已经在 ClawHub 生态里,装一条命令就能用;如果不在,它的价值就只是把同样的调用封装得更顺手。

官方地址:https://api.skillhub.cn/indiv-seafish/sag
技能卡:https://clawhub.ai/steipete/sag

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye