语音总结

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

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

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

配置语音引擎

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

支持两类引擎,按你的身份二选一

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

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

① 申请凭证(一次性)

  • 在公司语音能力平台申请「语音合成(大模型)」能力(botmux 只做合成,不需要语音识别)。
  • 拿到三样东西:appkeyAccessKeySecretKey
  • 若提示 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,自建按服务支持的音色填。

系统依赖

合成产物要编码成飞书语音气泡用的 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.jsonvoice 块也可以:

// 字节租户(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" }
  }
}

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