astrbot_plugin_GPT_SoVITS 用于把 AstrBot 文本输出转换成语音输出,底层调用 GPT-SoVITS 的 API。
支持三种调用方式:
- 指令转语音:手动输入命令立即合成语音。
- 自动转语音:Bot 正常回复文本时,按概率自动转成语音发出。
- 工具调用:LLM 工具调用时,GPT-SoVITS 会作为 LLM 工具的 TTS 接口。
此外还支持情绪参数切换(按关键词或 LLM 判别情绪),实现不同语气/语速的播报效果。
请先完成 GPT-SoVITS 本体部署:
- 官方仓库:RVC-Boss/GPT-SoVITS
- 参考指南:GPT_SoVITS 指南
在 AstrBot 插件市场搜索 astrbot_plugin_GPT_SoVITS 并安装。
Windows 示例(在 GPT-SoVITS 根目录新建 start_api.bat):
runtime\python.exe api_v2.py
pause或直接命令行启动:
python api_v2.py
# 或
python3 api_v2.py路径:插件管理 -> astrbot_plugin_GPT_SoVITS -> 操作 -> 插件配置
至少确认以下三项:
client.base_url:GPT-SoVITS API 地址,默认通常是http://127.0.0.1:9880default_params.ref_audio_path:参考音频路径(必填,建议先用插件默认值)enabled:总开关打开
在聊天中发送:
说 你好,我是语音测试
若收到语音消息,说明链路已打通。
| 命令 | 别名 | 说明 |
|---|---|---|
说 <文本> |
gsv <文本>、GSV <文本> |
手动触发 TTS。启用缓存时,同参数请求会优先复用本地音频 |
| 概率调用(无命令) | - | Bot 回复阶段按概率自动转语音。触发条件:插件启用、命中概率、消息链全为纯文本、文本长度不超过最大长度 |
| 工具调用(无命令) | LLM Tool | 供模型工具调用的 TTS 接口,由 bot 自行决定是否需要转语音 |
重启GSV |
重启gsv |
请求 GPT-SoVITS 执行重启 |
插件支持两种情绪参数匹配方式:
- 关键词匹配:当文本包含某个情绪条目的任一关键词时,使用该条目的语音参数。
- LLM 判别:开启
judge.enabled_llm后,先让 LLM 判断情绪,再映射到对应条目。
优先级:
- 若开启 LLM 判别,则优先使用 LLM 结果;
- 若 LLM 不可用或未匹配成功,则回退到关键词匹配。
首次加载时会自动导入内置情绪条目(如“温柔 / 开心 / 生气”)到 entry_storage。
| 字段 | 说明 | 建议/取值 |
|---|---|---|
enabled |
插件总开关 | 部署完成后开启 |
client.base_url |
GPT-SoVITS API 地址 | 常见为 http://127.0.0.1:9880 |
client.timeout |
API 请求超时时间(秒) | 网络慢或长文本可适当调大 |
model.gpt_path |
GPT 权重路径(.ckpt) |
可空,空则使用 GPT-SoVITS 当前默认模型 |
model.sovits_path |
SoVITS 权重路径(.pth) |
可空,空则使用 GPT-SoVITS 当前默认模型 |
| 字段 | 说明 | 建议/取值 |
|---|---|---|
only_llm_result |
只处理 LLM 生成的回复 | 建议 true |
tts_prob |
自动转语音概率 | 0 ~ 1,例如 0.15 |
max_msg_len |
自动转语音的最大文本长度 | 超过该值不转语音 |
这些参数会作为每次请求 /tts 的默认值:
| 字段 | 说明 | 建议/取值 |
|---|---|---|
text |
默认合成文本 | 手动命令未传文本时会使用 |
text_lang |
目标文本语言 | zh/en/ja/ko |
ref_audio_path |
参考音频路径 | 必填,建议先用可用的 wav |
prompt_text |
参考音频对应文本 | 建议与参考音频内容一致 |
prompt_lang |
参考文本语言 | 与 prompt_text 保持一致 |
top_k / top_p / temperature |
采样参数 | 控制随机性与稳定性 |
speed_factor |
语速倍率 | 1.0 为原速 |
fragment_interval |
语句片段间隔(秒) | 值越小节奏越紧凑 |
media_type |
输出音频格式 | wav/mp3/ogg(建议 wav) |
text_split_method / batch_size / parallel_infer 等 |
长文本和性能相关参数 | 按显存与效果微调 |
| 字段 | 说明 | 建议/取值 |
|---|---|---|
judge.enabled_llm |
是否启用 LLM 判别情绪 | 不开则仅走关键词匹配 |
judge.provider_id |
用于情绪判别的模型提供商 ID | 留空时跟随当前会话模型 |
entry_storage[].name |
情绪名称 | 建议唯一,便于识别 |
entry_storage[].keywords |
触发关键词列表 | 文本包含任一关键词即命中 |
entry_storage[].ref_audio_path |
该情绪使用的参考音频 | 可与默认参考音频不同 |
entry_storage[].prompt_text/prompt_lang |
该参考音频对应文本和语言 | 建议准确填写 |
entry_storage[].speed_factor/fragment_interval |
该情绪下语速与间隔 | 用于塑造语气差异 |
| 字段 | 说明 | 建议/取值 |
|---|---|---|
cache.enabled |
是否启用参数级缓存 | 建议开启;同参数请求可直接复用本地缓存 |
cache.expire_hours |
缓存过期时间(小时) | 0 表示永不过期;大于 0 时按缓存文件修改时间判定 |
cache.path |
三种调用方式共用保存目录 | 支持相对/绝对路径;留空默认 data/plugins_data/astrbot_plugin_GPT_SoVITS/audio |
插件通过 LocalDataManager 统一管理本地音频数据:
- 本地音频文件名:
gsv_<参数哈希>.<ext>。 - 哈希由完整请求参数生成(排序后 JSON + SHA256 截断),确保“参数一致 -> 命中同一文件”。
- 音频扩展名来自
media_type(仅支持wav/mp3/ogg,异常值回退为wav)。 - 当
cache.enabled=true时,请求前先查缓存;命中则直接发送本地缓存文件,未命中才请求 GPT-SoVITS。 - 请求成功后会按同一参数规则写入本地目录,供后续直接复用。
cache.expire_hours=0时缓存永不过期;大于0时,过期缓存会在读取时自动删除。
优先检查:
- GPT-SoVITS API 是否已启动;
client.base_url是否正确;default_params.ref_audio_path文件是否存在;- GPT-SoVITS 控制台是否有报错信息。
常见原因:
tts_prob太低;- 回复文本超过
max_msg_len; - 回复里包含图片/语音等非纯文本片段;
only_llm_result=true且该消息不是 LLM 输出。
- 若使用关键词模式,确认关键词确实出现在回复文本中;
- 若使用 LLM 模式,确认
judge.provider_id可用且返回格式正确; - 确认目标情绪条目名称存在于
entry_storage。
- 🌟 Star 这个项目!(点右上角的星星,感谢支持!)
- 🐛 提交 Issue 报告问题
- 💡 提出新功能建议
- 🔧 提交 Pull Request 改进代码
- 本插件优先兼容 GPT-SoVITS 官方实现与常见整合包。若使用第三方魔改版本,请以其 API 实际行为为准。
- 想第一时间得到反馈的可以来作者的插件反馈群(QQ群):460973561(不点star不给进)
GPT-SoVITS, 1 min voice data can also be used to train a good TTS model! (few shot voice cloning)