MaiBot/plugins/tts_voice_plugin
Seiun b6aab61aeb Merge commit '0873d9e68879f7a8f814f656bf0e488b6d2b64b6' as 'plugins/tts_voice_plugin' 2026-02-11 10:26:47 +08:00
..
backends Merge commit '0873d9e68879f7a8f814f656bf0e488b6d2b64b6' as 'plugins/tts_voice_plugin' 2026-02-11 10:26:47 +08:00
utils Merge commit '0873d9e68879f7a8f814f656bf0e488b6d2b64b6' as 'plugins/tts_voice_plugin' 2026-02-11 10:26:47 +08:00
.gitignore Merge commit '0873d9e68879f7a8f814f656bf0e488b6d2b64b6' as 'plugins/tts_voice_plugin' 2026-02-11 10:26:47 +08:00
LICENSE Merge commit '0873d9e68879f7a8f814f656bf0e488b6d2b64b6' as 'plugins/tts_voice_plugin' 2026-02-11 10:26:47 +08:00
README.md Merge commit '0873d9e68879f7a8f814f656bf0e488b6d2b64b6' as 'plugins/tts_voice_plugin' 2026-02-11 10:26:47 +08:00
_manifest.json Merge commit '0873d9e68879f7a8f814f656bf0e488b6d2b64b6' as 'plugins/tts_voice_plugin' 2026-02-11 10:26:47 +08:00
config.toml Merge commit '0873d9e68879f7a8f814f656bf0e488b6d2b64b6' as 'plugins/tts_voice_plugin' 2026-02-11 10:26:47 +08:00
config_keys.py Merge commit '0873d9e68879f7a8f814f656bf0e488b6d2b64b6' as 'plugins/tts_voice_plugin' 2026-02-11 10:26:47 +08:00
plugin.py Merge commit '0873d9e68879f7a8f814f656bf0e488b6d2b64b6' as 'plugins/tts_voice_plugin' 2026-02-11 10:26:47 +08:00
test.wav Merge commit '0873d9e68879f7a8f814f656bf0e488b6d2b64b6' as 'plugins/tts_voice_plugin' 2026-02-11 10:26:47 +08:00

README.md

TTS 语音合成插件

MaiBot 的文本转语音插件,支持多种 TTS 后端。

支持的后端

后端 说明 适用场景
AI Voice MaiCore 内置,无需配置 仅群聊
GSV2P 云端 API需要 Token 群聊/私聊
GPT-SoVITS 本地服务,需自行部署 群聊/私聊
豆包语音 火山引擎云服务,高质量 群聊/私聊
CosyVoice 阿里云 CosyVoice3支持方言和声音克隆 群聊/私聊
ComfyUI 本地 ComfyUI 工作流 APIMLX Qwen3-TTS VoiceClone 群聊/私聊

安装

pip install aiohttp gradio_client

配置

编辑 config.toml,设置默认后端:

[general]
default_backend = "cosyvoice"  # 可选ai_voice / gsv2p / gpt_sovits / doubao / cosyvoice / comfyui
audio_output_dir = ""          # 音频输出目录,留空使用项目根目录
use_base64_audio = false       # 是否使用base64发送备选方案
split_sentences = true         # 是否分段发送语音(长文本逐句发送)
split_delay = 0.3              # 分段发送间隔时间(秒)
send_error_messages = true     # 是否发送错误提示消息false=静默失败)

Docker环境配置说明

问题: Docker环境中可能遇到音频上传失败或文件路径识别错误识别URL失败

解决方案(按推荐顺序):

方案1使用相对路径推荐

[general]
audio_output_dir = ""  # 留空,默认使用项目根目录

音频文件将保存在项目根目录OneBot/NapCat可以正确识别相对路径。

方案2自定义输出目录

[general]
audio_output_dir = "data/tts_audio"  # 相对路径,相对于项目根目录
# 或
audio_output_dir = "/app/data/audio" # 绝对路径

方案3使用base64编码备选

如果路径方案都不生效可启用base64发送

[general]
use_base64_audio = true  # 使用base64编码发送会增加约33%数据大小)

豆包语音配置

[doubao]
app_id = "你的APP_ID"
access_key = "你的ACCESS_KEY"
resource_id = "seed-tts-2.0"
default_voice = "zh_female_vv_uranus_bigtts"

预置音色:

音色名称 voice_type
vivi 2.0 zh_female_vv_uranus_bigtts
大壹 zh_male_dayi_saturn_bigtts
黑猫侦探社咪仔 zh_female_mizai_saturn_bigtts

复刻音色:resource_id 改为 seed-icl-2.0default_voice 填音色 IDS_xxxxxx

凭证获取:火山引擎控制台

GSV2P 配置

[gsv2p]
api_token = "你的Token"
default_voice = "原神-中文-派蒙_ZH"

Token 获取:https://tts.acgnai.top

AI Voice 配置

[ai_voice]
default_character = "温柔妹妹"

可用音色:小新、猴哥、妲己、酥心御姐、温柔妹妹、邻家小妹 等 22 种

GPT-SoVITS 配置

支持两种配置格式:

格式1数组格式推荐WebUI 友好)

[gpt_sovits]
server = "http://127.0.0.1:9880"

[[gpt_sovits.styles]]
name = "default"
refer_wav = "/path/to/reference.wav"
prompt_text = "参考文本"
prompt_language = "zh"
gpt_weights = "/path/to/model.ckpt"      # 可选:动态模型切换
sovits_weights = "/path/to/model.pth"    # 可选:动态模型切换

[[gpt_sovits.styles]]
name = "happy"
refer_wav = "/path/to/happy.wav"
prompt_text = "开心的参考文本"
prompt_language = "zh"

格式2字典格式兼容旧版

[gpt_sovits]
server = "http://127.0.0.1:9880"

[gpt_sovits.styles.default]
refer_wav = "/path/to/reference.wav"
prompt_text = "参考文本"
prompt_language = "zh"
gpt_weights = "/path/to/model.ckpt"
sovits_weights = "/path/to/model.pth"

提示: 插件会自动识别并兼容两种格式,推荐使用数组格式以获得更好的 WebUI 支持。

CosyVoice 配置

[cosyvoice]
gradio_url = "https://funaudiollm-fun-cosyvoice3-0-5b.ms.show/"
default_mode = "3s极速复刻"           # 或 "自然语言控制"
default_instruct = "You are a helpful assistant. 请用广东话表达。<|endofprompt|>" # 只有自然语言控制模式才会生效3s极速复刻模式下不生效
reference_audio = "/path/to/ref.wav"  # 参考音频路径
prompt_text = "参考音频对应的文本"      # 参考音频的对应文本
timeout = 300                          # API超时

支持的方言/情感/语速:

类型 可用选项
方言 广东话、东北话、四川话、上海话、闽南话、山东话、陕西话、湖南话等17种
情感 开心、伤心、生气
语速 慢速、快速
音量 大声、小声
特殊风格 小猪佩奇、机器人

推理模式:

  • 3s极速复刻:需要提供参考音频进行声音克隆
  • 自然语言控制:通过指令控制方言、情感、语速等

使用方法

命令触发

/tts 你好世界                    # 使用默认后端
/tts 今天天气不错 小新            # 指定音色
/gsv2p 你好世界                  # 使用 GSV2P
/doubao 你好世界                 # 使用豆包
/cosyvoice 你好世界 四川话        # 使用 CosyVoice四川话
/comfyui 你好世界 -v default     # 使用 ComfyUI 本地工作流MLX VoiceClone

ComfyUI 后端配置

该后端通过 ComfyUI 的 HTTP API 执行工作流(/prompt -> /history -> /view),并用 LoadAudio 从 ComfyUI 的 input 目录读取参考音频。

[comfyui]
server = "http://127.0.0.1:8188"
input_dir = "/Users/xenon/Downloads/seiun_tts/ComfyUI/ComfyUI/input"
timeout = 120
audio_quality = "128k" # SaveAudioMP3: V0/128k/320k
mlx_python = "/Users/xenon/Downloads/seiun_tts/qwen3-tts-apple-silicon/.venv/bin/python"
mlx_cli = "/Users/xenon/Downloads/seiun_tts/qwen3-tts-apple-silicon/mlx_voice_clone_cli.py"
default_style = "default"

[[comfyui.styles]]
name = "default"
refer_wav = "/path/to/ref.wav"
prompt_text = "参考音频逐字稿"
language = "Auto" # 可选: Auto/Chinese/English/Japanese...
model_choice = "1.7B"
precision = "bf16"
seed = 0
max_new_tokens = 2048
top_p = 0.8
top_k = 20
temperature = 1.0
repetition_penalty = 1.05

自动触发

LLM 判断需要语音回复时会自动触发,可通过概率控制:

[probability]
enabled = false          # 默认关闭,每次都触发语音
base_probability = 0.3   # 启用时 30% 概率触发

智能分割插件支持

本插件已适配智能分割插件,支持使用 |||SPLIT||| 分隔符进行精确分段:

  • 优先级:智能分割标记 > 自动句子分割 > 单句发送
  • 使用方式:智能分割插件会在适当位置插入 |||SPLIT||| 标记,本插件自动识别并按标记分段发送
  • 示例今天天气不错|||SPLIT|||适合出去玩|||SPLIT|||你觉得呢 会分成三段语音依次发送

项目结构

tts_voice_plugin/
├── plugin.py          # 插件入口
├── config.toml        # 配置文件
├── backends/          # 后端实现
│   ├── ai_voice.py
│   ├── gsv2p.py
│   ├── gpt_sovits.py
│   ├── doubao.py
│   └── cosyvoice.py
└── utils/             # 工具函数

常见问题

Q: Docker环境中提示"文件处理失败 识别URL失败" A: 留空 audio_output_dir 配置项,插件将使用项目根目录保存音频(相对路径)。如仍有问题,可设置 use_base64_audio = true 使用base64编码发送。

Q: AI Voice 提示"仅支持群聊" A: AI Voice 只能在群聊使用,私聊会自动切换到其他后端。

Q: 豆包语音怎么获取凭证? A: 登录火山引擎控制台,开通语音合成服务获取。

Q: 文本太长被截断? A: 修改 config.tomlmax_text_length = 1000

Q: 语音合成失败时不想让Bot发送错误消息 A: 设置 send_error_messages = false,语音合成失败时将静默处理,不向用户发送错误提示。

更新日志

v3.2.3

  • 修复豆包语音 WAV 流式响应合并问题(正确处理 LIST/INFO 元数据块和多 header 情况)
  • 默认后端改为 CosyVoice更稳定的声音克隆体验
  • 默认关闭概率控制(每次触发都生成语音,更可预期的行为)
  • 优化 LLM 长度约束提示(利用"近因效应"提高遵守率)
  • 优化 action 记录格式,帮助 planner 避免重复执行
  • GSV2P/豆包音频格式默认改为 WAV更好的兼容性
  • CosyVoice 默认模式改为 3s 极速复刻(更快响应)
  • 更新默认超时配置CosyVoice 300s, GSV2P 120s

v3.2.2

  • 适配智能分割插件(支持 |||SPLIT||| 分隔符精确分段)
  • GPT-SoVITS 支持数组格式配置WebUI 友好,向后兼容字典格式)
  • 修复豆包语音音色信息显示乱码问题
  • 优化配置文件注释,更简洁清晰
  • 优化分段发送逻辑优先级(智能分割 > 自动分割 > 单句)
  • 禁用 Python 字节码生成(保持目录干净)
  • 添加插件 ID 标识字段

v3.2.1

  • 新增 send_error_messages 配置项(可选择关闭错误提示消息)
  • 统一错误消息处理逻辑(通过 _send_error 方法)

v3.2.0

  • 新增 CosyVoice 后端(阿里云 ModelScope支持 17 种方言、3 秒声音克隆)
  • 新增分段发送功能(长文本自动分割逐句发送)
  • GPT-SoVITS 支持动态模型切换(在风格配置中指定 gpt_weights/sovits_weights
  • GSV2P 后端新增重试机制5 次重试3 秒间隔)
  • 新增 /cosyvoice 命令
  • 新增 gradio_client 依赖

v3.1.0

  • 新增豆包语音后端(火山引擎云服务)
  • 重构为模块化架构
  • HTTP Session 复用优化

信息

  • 版本3.2.3
  • 作者:靓仔
  • 许可AGPL-v3.0