🎙️ supertone-mcp
面向 Supertone TTS API 的可组合 MCP 工具包。它不是单一的“朗读这段文本”命令,而是将 Supertone SDK 暴露为一组构建块工具——语音合成、声音发现、试听、时长/额度预测、用量追踪,以及完整的声音克隆 CRUD——由 LLM 组合调用来满足请求。可在 Claude Desktop、Cursor 或任何兼容 MCP 的客户端中使用。

覆盖韩语、英语、日语,共 31 种语言。支持速度(0.5x–2.0x)、音高偏移(-24 到 +24 半音)、情感风格、每次调用的输出模式、流式传输和模型选择。
✨ 主要特性
🗣️ 语音合成
text_to_speech — 将文本转换为音频。可按调用控制 output_mode(files / resources / both)、autoplay、streaming、model,以及 include_phonemes / normalized_text。长文本由 SDK 自动分块。
predict_duration — 在不合成的情况下估算音频长度(以及额度消耗)。
🔍 声音发现(预设)
search_voice — 按语言、性别、年龄、用例、风格、模型、名称或描述筛选目录。
get_voice — 获取某个声音的完整详情。
preview_voice — 获取某个声音的示例音频 URL(可按语言/风格/模型筛选)。
🧬 自定义声音克隆
clone_voice — 从本地 WAV/MP3(≤3MB)创建克隆声音。
search_custom_voice — 列出/筛选克隆声音。
get_custom_voice — 获取某个克隆声音的完整详情。
edit_custom_voice — 更新名称和/或描述。
delete_custom_voice — 永久删除(不可逆)。
🎧 音频拼接
merge_audio_files — 通过内置 ffmpeg 将两个或多个本地音频文件(mp3/wav)拼接为一个。支持普通拼接、片段间静音间隔(gap_ms)或交叉淡化混合(crossfade_ms)。输出格式自动检测(混合 → mp3),也可通过 output_format 强制指定。无需系统安装 ffmpeg。
📊 用量与额度
get_credit_balance — 剩余额度。
get_usage_history — 指定时间窗口内的用量。
get_voice_usage — 某个特定声音的用量。
🚀 快速开始
📦 安装
uvx supertone-mcp
pip install supertone-mcp
⚙️ 配置
Claude Desktop
添加到 claude_desktop_config.json:
{
"mcpServers": {
"supertone-tts": {
"command": "uvx",
"args": ["supertone-mcp"],
"env": {
"SUPERTONE_API_KEY": "your-api-key-here"
}
}
}
}
Cursor
添加到你的 Cursor MCP 设置中(JSON 结构与上方相同)。
🔐 环境变量
只有认证和稳定默认值通过环境配置——所有行为均按调用控制。
| 变量 |
必需 |
默认值 |
说明 |
SUPERTONE_API_KEY |
是 |
— |
你的 Supertone API 密钥 |
SUPERTONE_MCP_VOICE_ID |
否 |
预设声音(Aiden,多语言) |
text_to_speech / predict_duration 的默认 voice_id(可在每次调用中覆盖) |
SUPERTONE_OUTPUT_DIR |
否 |
~/supertone-tts-output/ |
音频文件保存目录(用于 output_mode=files/both) |
0.2.0 已移除:SUPERTONE_MCP_OUTPUT_MODE 和 SUPERTONE_MCP_AUTOPLAY — 参见 0.2.0 破坏性变更与迁移。
📤 输出模式(text_to_speech 的 output_mode)
| 模式 |
返回 |
适用场景 |
files (默认) |
纯文本,包含保存的文件路径 + 元数据 |
希望文件保存在磁盘上 |
resources |
MCP AudioContent + TextContent(不写入文件) |
客户端内联渲染音频(例如 Claude.ai 聊天) |
both |
磁盘文件 以及 AudioContent/TextContent |
二者都要——内联试听并保留文件 |
💻 使用示例
MCP 客户端会在这些工具之间路由自然语言请求——工具包的价值在于组合:LLM 会串联多个工具来满足一个请求。
示例 1 — 发现 → 试听 → 估算成本 → 合成
“找一位平静的韩语女声,让我听一个样本,检查成本,然后把这段通知做成 mp3。”
LLM 组合:
search_voice(language="ko", gender="female", style="neutral") # find candidates
→ preview_voice(voice_id) # sample URLs to confirm the voice
→ predict_duration(text, voice_id) + get_credit_balance() # gauge cost before spending
→ text_to_speech(text, voice_id, output_format="mp3",
output_mode="files") # synthesize
示例 2 — 克隆我的声音 → 立即使用
“从 ~/recordings/sample.wav 创建一个名为 MyVoice 的克隆声音,然后用它朗读这段问候并播放给我听。”
LLM 组合:
clone_voice(name="MyVoice", audio_path="~/recordings/sample.wav") # create the cloned voice
→ get_custom_voice(voice_id) # confirm it was created
→ text_to_speech(text, voice_id=<cloned>, autoplay=true) # synthesize, then play immediately
autoplay 是每次调用参数(默认 false),因此只有明确请求时才会播放。
🔄 0.2.0 破坏性变更与迁移
0.2.0 将行为控制从环境变量迁移到每次调用的工具参数——因此由 LLM 按请求决定,而不是服务器配置。
| 之前(环境变量) |
之后(每次调用参数) |
说明 |
SUPERTONE_MCP_OUTPUT_MODE=files|resources|both |
text_to_speech(output_mode=...) |
默认仍为 files |
SUPERTONE_MCP_AUTOPLAY=true |
text_to_speech(autoplay=...) |
默认值已从 true 改为 false(播放现在为显式操作) |
| (始终流式) |
text_to_speech(streaming=...) |
新增,默认 false(一次性)。streaming=true 需要 model="sona_speech_1" |
其他变更:
- 默认模型已从
sona_speech_1 改为 sona_speech_2_flash。
list_voices 已移除(自发现版本起),并由 search_voice 替代——无参数调用它以复现旧的“列出全部”行为。
- 不再有 300 字符硬限制——更长文本由 SDK 自动分块(额度/延迟随长度扩展)。
如果你之前设置过 SUPERTONE_MCP_OUTPUT_MODE 或 SUPERTONE_MCP_AUTOPLAY,请从客户端配置中移除它们,并改为在每次调用时传入 output_mode / autoplay。(如果服务器检测到已移除的变量,会向 stderr 打印一次性通知。)
🔧 工具参数
text_to_speech
| 参数 |
类型 |
必需 |
默认值 |
说明 |
text |
string |
是 |
— |
要转换的文本(长文本由 SDK 自动分块) |
voice_id |
string |
否 |
环境变量或预设 |
声音标识符(可通过 search_voice 浏览) |
language |
string |
否 |
ko |
语言代码——31 种之一(ko、en、ja、…) |
output_format |
string |
否 |
mp3 |
mp3 或 wav |
model |
string |
否 |
sona_speech_2_flash |
sona_speech_1, sona_speech_2, sona_speech_2_flash, sona_speech_2t, sona_speech_3t, supertonic_api_1, supertonic_api_3 |
speed |
float |
否 |
1.0 |
0.5–2.0 |
pitch_shift |
int |
否 |
0 |
-24 到 +24 半音 |
style |
string |
否 |
— |
情感风格(因声音而异) |
output_mode |
string |
否 |
files |
files、resources 或 both(参见 输出模式) |
autoplay |
bool |
否 |
false |
合成后在本地播放音频(macOS afplay) |
streaming |
bool |
否 |
false |
流式合成。仅 model="sona_speech_1" 支持 |
include_phonemes |
bool |
否 |
false |
随音频一起返回音素时间数据 |
normalized_text |
string |
否 |
— |
预归一化文本(仅由 sona_speech_2 / sona_speech_2_flash 使用) |
predict_duration
与 text_to_speech 具有相同的核心参数结构(长文本自动分块)。返回 "Predicted duration: 2.34s (credit usage is proportional to duration)."。
search_voice
所有参数可选。无筛选 → 完整目录。有任意筛选 → 第一行响应为 Filters applied: ...。
| 参数 |
类型 |
说明 |
language |
string |
例如 ko、en、ja |
gender |
string |
例如 male、female |
age |
string |
例如 young_adult、child |
use_case |
string |
例如 narration、advertisement |
style |
string |
例如 neutral、happy |
model |
string |
例如 sona_speech_2_flash |
name |
string |
部分匹配 |
description |
string |
部分匹配 |
get_voice / preview_voice
| 工具 |
必需 |
可选 |
get_voice |
voice_id |
— |
preview_voice |
voice_id |
language、style、model(筛选样本) |
clone_voice
| 参数 |
类型 |
必需 |
说明 |
name |
string |
是 |
显示名称(非空) |
audio_path |
string |
是 |
本地 WAV 或 MP3 路径(≤3MB)。支持 ~ 展开 |
description |
string |
否 |
可选备注 |
自定义声音 CRUD
| 工具 |
必需 |
可选 |
search_custom_voice |
— |
name、description(部分匹配) |
get_custom_voice |
voice_id |
— |
edit_custom_voice |
voice_id |
name、description(至少需要一个) |
delete_custom_voice |
voice_id |
— (不可逆) |
用量与额度
| 工具 |
必需 |
可选 |
get_credit_balance |
— |
— |
get_usage_history |
— |
—(报告近期默认窗口) |
get_voice_usage |
voice_id |
— |
merge_audio_files
| 参数 |
类型 |
必需 |
说明 |
input_paths |
string[] |
是 |
两个或多个本地 mp3/wav 路径(支持 ~ 展开)。单个文件将原样返回 |
gap_ms |
int |
否 |
在每个连接处插入静音(毫秒)。默认 0。与 crossfade_ms 互斥 |
crossfade_ms |
int |
否 |
在每个连接处交叉淡化混合(毫秒)。默认 0。与 gap_ms 互斥 |
output_format |
string |
否 |
强制 mp3 或 wav。若省略:扩展名全部相同 → 使用该扩展名;混合 → mp3 |
🛠️ 开发
git clone https://github.com/supertone-inc/supertone-mcp.git
cd supertone-mcp
uv sync
uv run pytest -q
uv run pytest --cov=src --cov-report=term-missing
📄 许可证
MIT