语音总结

把 AI 的文字回复一键转成语音消息发到飞书群。每条回复卡片底部会出现一个「🔊 语音总结」按钮,点一下,机器人就把这条回复精简成口语、合成语音气泡发到当前话题。

  • 按需触发:默认不自动生成,想听才点——避免每条回复都附带一大段语音。
  • 先精简、再合成:点击后模型会把原回复压成几句口语(去掉代码、路径、链接等不适合朗读的内容),所以听到的是「讲人话」的总结,而不是把原文照念。
  • 有权限门:只有对该机器人有「对话 / 操作」权限的成员能点;其他人点击会收到「需要授权」的提示。
  • 每条只生成一次:同一条回复的语音只会生成一次,多人点击也不会刷屏。

语音是可选的高级功能:需要先配置一个语音合成(TTS)引擎;没配置时回复卡片不显示这个按钮。

配置语音引擎

用独立命令 botmux voice 交互式配置(特意不和 botmux setup 混在一起)。配置写入全局 ~/.botmux/config.json 的 voice 块,botmux restart 后生效。

支持四类引擎,按你的凭证和服务选择:

字节租户:SAMI(语音合成大模型)

字节内部用户直接用公司的语音合成大模型(SAMI),音色自然、无需自建服务。

① 申请凭证(一次性)

  • 在公司语音能力平台申请「语音合成(大模型)」能力(botmux 只做合成,不需要语音识别)。
  • 拿到三样东西:appkey、AccessKey、SecretKey。
  • 若提示 Namespace 未开通 / 无路由,走内部 Oncall 找语音(Speech)团队在运维中心开通。

申请入口请在内部平台搜索「语音合成大模型 / SAMI」,或直接咨询语音团队。

② 配置

botmux voice          # 交互式:选 SAMI → 依次粘贴 accessKey / secretKey / appkey
botmux restart        # 生效

音色默认用「灿灿」,可在配置时改成其它音色 id。服务端点已内置,无需填写。SecretKey 只在本机签名换取临时 token,不外发。

外部用户:OpenAI 兼容引擎

外部 / 开源用户接任意兼容 OpenAI 语音接口的 TTS 服务——可以是 OpenAI 官方,也可以是自建(如 Kokoro-FastAPI、openedai-speech 等)。

① 准备一个 TTS 服务,拿到三项:

  • baseUrl:服务地址。OpenAI 官方是 https://api.openai.com/v1;自建填你自己的(如 http://127.0.0.1:8880/v1)。
  • apiKey:服务密钥(自建若无鉴权可留空)。
  • model:模型名。OpenAI 是 tts-1;自建按服务文档(如 kokoro)。

② 配置

botmux voice          # 交互式:选 OpenAI 兼容 → 填 baseUrl / apiKey / model
botmux restart        # 生效

音色(voice)可选:OpenAI 默认 alloy,自建按服务支持的音色填。

MiniMax(海螺语音)

有 MiniMax 开放平台 API key 的用户可直接用官方 T2A v2 语音合成,无需自建服务。

① 准备凭证

  • 在 MiniMax 开放平台开通语音合成(T2A)能力,拿到一个 API key。
  • 确认接入区域:国内账号一般选「国内」(api.minimaxi.com);海外账号选「国际」(api.minimax.io)。key 与区域要匹配,配错会报鉴权失败。

② 配置

botmux voice          # 交互式:选 [3] MiniMax → 粘贴 API key → 选区域
botmux restart        # 生效

模型默认 speech-2.8-hd,音色默认 female-shaonv,二者都可在配置时或配置文件里覆盖。若默认音色在你的账号下不可用(不同区域 / 模型开放的音色可能不同),按 MiniMax 控制台列出的系统音色 id 填一个即可。

火山引擎 / 豆包 V3

运行 botmux voice,选择 [4],再明确选择 standard 或 agent-plan,输入该模式的专用 API key。默认音色为 zh_female_vv_uranus_bigtts,语速为 1。有效的正数语速在请求时限制到 0.5 至 2。

普通按量账户的全局配置示例:

{
  "voice": {
    "engine": "volcengine",
    "volcengine": {
      "mode": "standard",
      "apiKey": "<STANDARD_API_KEY>"
    },
    "speaker": "zh_female_vv_uranus_bigtts",
    "rate": 1
  }
}

在 bots.json 的某个机器人条目中加入以下 voice,可改用 Agent Plan 专用账户:

{
  "voice": {
    "engine": "volcengine",
    "volcengine": {
      "mode": "agent-plan",
      "apiKey": "<AGENT_PLAN_API_KEY>"
    }
  }
}

必须显式设置 engine 和 mode。standard 使用 /api/v3/tts/unidirectional,agent-plan 使用 /api/v3/plan/tts/unidirectional,两者固定使用 openspeech.bytedance.com 和资源 seed-tts-2.0。不要填写聊天服务的地址或旧版 app ID。占位 key 需替换为实际凭证,不会自动读取同名环境变量。

切换 mode 时必须同时提供新 key,不能继承另一模式的全局 key。同一 mode 可继承 key,机器人也可只覆盖 speaker 或 rate。"volcengine": null 或显式空 key 禁用该账户的继承。缺失或非法 mode 会使配置不可用,不会改走普通付费端点。请求失败不重试、不跟随重定向,也不切换端点;套餐计费由供应商决定。

botmux voice status 只显示新账户 key 是否设置。交互式保存任何 TTS 引擎都会保留原有 voice.asr。火山引擎返回 24 kHz、单声道、16 位 PCM,飞书语音仍需下述 Opus 编码器。

合成会缓存整个响应,正常 HTTP 结束后才返回音频,不提供流式播放。默认 60 秒超时覆盖响应头和读体;收到完成记录后连接仍不结束也会超时。客户端限制为 16 MiB 响应、8 MiB PCM 和 10000 条 JSON 记录。截断、非法数据、完成帧携带非空音频或超限都会报错,不发送部分音频。

系统依赖

合成产物要编码成飞书语音气泡用的 opus 格式,依赖系统的 opus-tools(提供 opusenc)。跑 botmux voice 配置时会自动检测,没装会询问并帮你装好(沿用和 tmux 一致的包管理器 + sudo 逻辑)。也可手动安装:

# Debian / Ubuntu
sudo apt-get install -y opus-tools
# macOS
brew install opus-tools

管理命令

botmux voice          # 配置(交互式)
botmux voice status   # 查看当前配置(凭证自动打码)
botmux voice disable  # 关闭语音(移除配置,按钮随之消失)

配置文件参考

直接编辑 ~/.botmux/config.json 的 voice 块也可以:

// 字节租户(SAMI)
{
  "voice": {
    "engine": "sami",
    "speaker": "zh_female_cancan_mars_bigtts",   // 可选,默认灿灿
    "sami": { "accessKey": "...", "secretKey": "...", "appkey": "..." }
  }
}

// 外部用户(OpenAI 兼容)
{
  "voice": {
    "engine": "openai",
    "speaker": "alloy",                            // 可选
    "openai": { "baseUrl": "https://api.openai.com/v1", "apiKey": "...", "model": "tts-1" }
  }
}

// MiniMax(region: "cn" 国内 / "global" 国际,默认国际)
{
  "voice": {
    "engine": "minimax",
    "speaker": "female-shaonv",                   // 可选,默认 female-shaonv
    "minimax": { "apiKey": "...", "region": "cn", "model": "speech-2.8-hd" }
  }
}

支持按机器人覆盖:在 bots.json 某个机器人对象里放同样的 voice 块,会逐字段盖在全局配置之上(多个机器人共用一套、或各配各的都行)。