内容
align="center">
="docs/brand/kassinao-mark-64="72" height="72" alt="Kassinão logo">
# Kassinão
### 将Discord通话转化为可搜索的记忆。
开源、自主托管的Discord机器人,每个发言者一个音轨,命名记录、会议笔记、来源答案。
**🌎 语言:** **中文** · [Português (.pt-BR.md)
[](LICENSE)
[](CONTRIBUT)
[](https://github.com/resolvicomai/kassinao/stargazers)
<br/>
[](https://kassinao.cloud/cn/demo)
the docs](https://img.shields.io/badge/READ_THE_DOCS-313338?style=for-the-badge)](https://docs.kassinao.cloud/cn)
[](https://mcp.kassinao.cloud)
<br/>
<a href="https://kassinao.cloud/cn/demo"><img src="docs/brand/discord-demo-cn.gif" width="900" alt="Kassinão工作流示意图"></a>
<sub>虚构演示,真实命令和产品行为。会议数据从未从区获取。</sub>
</div>
---
官方托管的界面使用每个责任域名: 界面 | | 目的 |
|| 网站和演示kassinao.cloud://kassina/cn) | 公故事和虚构演示 文档 | [docs.kassinao.cloud](https://docs.kassinao) | 设置、命令、安全和MCP指南 |
| 私有应用 | [app.kassinaohttps://app.kassinao.cloud/app) | Discord OAuth、录音、转录和下载 |
| MCP API | [mcp.kassinao.cloud](https://mcp.kassinao.cloud) | `kassinao-mcp`使用的官方API源;根链接到其文档 |
自主托管实例不需要四个域名:设置`BASE_URL`一次,每个界面都会继承它。可选的分域名变量在env.example`](.env.example)中有文档记录。
大多数会议机器人从一个混合录音开始,使用语音识别断谁在说话。Kassinão接收每个人的音频流,因此说话者属性来自生成音轨的帐户,而不是语音模式猜测。
## 目录
- [知道谁在说话](#知道谁在说话)
- [成为记忆之成为记忆之源)
- [查看已完成的会议](#查看已完成的会议)
- [属于你,拥有真正的](#属于你,拥有真正的控制权)
- [](#快速开始 [比较](#比较)
参考](#参考)
- [工作原理](#工作原理)
## 知道谁在说话
- 每个说话者一个单独的音频轨 — 属性来自录音方式,而不是语音模式猜测。
- 自动转录,带有正确的名字在每行,通过AssemblyAI、Groq、OpenAI、Gemini或完全本地的引擎。
- 语音活动检测通常只发送检测到的语音。如果检测失败assinão使用而不是丢弃通话。
- 交叉对话Kassinão交换身份,因为没有为轨分配名称的语音识别步骤。
- 如果提供录过程中限制速率重试和恢复。
记忆之源
- AI生成的会议纪要、决定和行动项所有者和截止当转录支持时)。
- 在Discord中直接` — 按人员、会议日期日期(例如,“Ana今天的行动”)提问。模型选择相关源ID;机器人本身渲染带有授权链接的真实分钟/转录证据。`days`是问题的默认会议窗口。
- 具有全文搜索的Web索引,跨所有转录、分钟文档和您允许看到的笔记。
- 可选的MCP连接器将相同的内存插入Claude Desktop或任何MCP-capable助手。
- Discord频道仅接收通用完成通知;授权参与者通过DM接收私有链接和分钟。
## 查看已完成的会议
[
公共演示使用虚构的和与真实录音渲染器。界面更改;原始会议内容从未被悄悄## 属于你,控制权
- 自主托管:机器人在上运行,文件也存储在您的Docker上。如果您配置了外部转录或分钟提供程序,则会将所需的音频或文本发送到该提供程序;本地处理将数据保留在您的服务器上。
- 访问需要当前Discord服务器成员资格。私人通话仅限于其参与者、启动者和当前管理员 — 泄露的链接对陌生人无法打开。
- 保留期是一个刻度,而不是默认值:按计划过期可搜索的文本,或完全关闭过期。
- 在AGPL-0-or-later — 阅读它,,托管修改后的版本;只需传递源代码。
捆绑的Cloudflare Tunnel配置文件,在没有开放入站端口的情况下运行在HTTPS上。
## 快速开始
您需要一台具有**Docker**和**Discord应用程序**(免费,1分钟设置)的机器。
> **首先创建Discord应用程序** — 如果没有`DISCORD_TOKEN`,机器人将无法启动。
```bash
git clone https://github.com/resolvicomai/kassinao.git && cd kassinao
cp .env.example .env && chmod 600 .env
mkdir -p recordings && chmod 700 recordings
# 填写 DISCORD_TOKEN、APPLICATION_ID、DISCORD_CLIENT_SECRET 和 BASE_URL。
# 提示:设置 GUILD_ID,以便斜线命令立即显示。
docker compose up -d --build
```
保持`.env`归部署用户所有,模式为`0600`。`./scripts/inject-secrets.sh`在不回显屏幕值的情况下接受三个设置秘密;永远不要将填充的值粘贴到问题、聊天、shell命令或日志中。
对于自托管的Linux服务器,在首次部署后安装主机端健康观察守护进程。它可以仅重启`kassinao`容器,并替换基于套接字的自动重启容器:
```bash
sudo install -o root -g root -m 0755 scripts/health-watch.sh /usr/local/sbin/kassinao-health-watch
sudo install -o root -g root -m 0644 deploy/systemd/kassinao-health-watch.* /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now kassinao-health-watch.timer
```
然后**邀请机器人**(以下步骤1)并在Discord语音频道中运行**`/record`**。这就是整个循环。
> ☁️ **一键部署:** [](https://render?repo=https://github.com/resolvic/kassinao) — [`render.yaml`](中的蓝图。在仪表板上设置`Q_API_KEY` + `TRANSCRIBE_PROVIDERq`以启用转录和分钟。
>服务器平台(Vercel/Netlify语音网关需要始终在线的WebSocket。
### 1. 创建
1. <.com/developers/applications> → **新建。
2. **** → 复制 **应用程序ID** → `APPLICATION_ID`。
3. **机器人** → **重置令牌** → `DISCORD_TOKEN`(不需要特权意图)。
4. **OAuth2** → 复制 **客户端密钥** → `DISCORD_CLIENT_SECRET`;重定向** `APP_URL/auth/callback`(APP_URL`未设置时为`BASE_URL/auth/callback`)。
5. 邀请它(替换`APP_ID`):
https://discord.com/oauth2/authorize?client_id=APP_ID&scope=bot%20applications.commands&permissions=682424 权限:查看频道、发送消息、嵌入链接、读取消息历史、连接、更改昵称。
### 2. 使其可访问
- ** Cloudflare隧道** (HTTPS,无开放端口):创建隧道,然后在`.env`中设置`TUNNEL_TOKEN` **和** `COMPOSE_PROFILES=tunnel`,将公共主机名指向`kass:8080`,设置`BASE_URL=https://your-subdomain.your-domain.com`,然后重新运行`docker compose up -d`。捆绑的隧道服务仅在`tunnel`配置文件下启动,因此当您不使用它时,它不会崩溃循环。
- **直接IP(仅开发/测试 -)**:取消注释`docker-compose.yml`ports: ['8080:8080']`BASE_URL=http://YOUR_IP:8080`。Discord OAuth仅接受`https`(或`localhost`)重定向,因此登录/下载页面在纯IP上无法工作 — 为实际使用使用隧道(或任何HTTPS代理)。
### 3. (可选)启用转录 + 分钟
推荐的托管AssemblyAI用于语音Router用于分钟,提供大型上下文模型):
```env
TRANSCRIBEassemblyai
ASSEMBLYAI_API_KEY=... # https://www.assemblyai.com
G_API_KEY=gsk_... # 可引擎(https://console.groq.com)
OPEN_API_KEY=sk-or-... # httpsrouter.ai — 分钟LLM(默认/gemini-2.5-flash)
_ENABLED=auto
Router是一个付费网关(一个密钥,多个模型,其自己的积分)。成本取决于所选模型和转录大小。
对于较轻的设置,使用`TRANSCRIBE_PROVIDER=groq`和`GROQ_API_KEY`;可用配额和定价取决于帐户。
## 比较
Craig录Otter总结ão知道谁。
| |Kassinão** | Craig ter / Fireflies |
| ------------------------------------------------ | :------------------: | :------: | :---------------: |
|(每个说话者一个文件) | | ✅ | ❌ 完美的说话者属性(无AI语音 | ✅ | ✅ ❌ (猜 |
| AI会议纪要(总结、决定、任务) | ✅ | ❌ | ✅| 每个参与者的明细 | ✅ | ❌ | ⚠️ 自主托管 / | ✅ | ⚠️ | ❌ |
| 访问受登录(而非“谁有链接控制 | ✅ | | ✅ |
| 开源(AGPL-3.0) | ✅ | ✅ |❌ |
| 免费 | 免费增值 付费 |
## 参考
已经决定运行Kassinão的人的第二天材料。安装前不需要阅读。
### 配置
所有选项都位于[`.env.example`](.env.example)中:
| 变量 | 默认值 | 描述 |
|---|---|---|
|CORD_TOKEN` · `APPLICATION_ID` · `DISCORD_CLIENT_SECRET` | — | 机器人凭证(开发者门户) |
| `BASE_URL` | `http://8080` | 单一来源的备用继承每个公共界面 |
| `APP_URL` | `BASE_URL` | 私有应用、Discord OAuth、录音、转录和| `PUBLIC | `APP_URL` / `BASE_URL` | 公共登陆页面和演示 |
| `DOCS_URL` | `PUBLIC_URL` | 文档源 |
| `MCP_URL` | `APP_URL` / `BASE_URL` | `kassinao-mcp`使用的API源 |
| `GUILD_ID` | — | 在该服务器中立即注册命令 |
| `TUNNEL_TOKEN` / `COMFILES` | — | Cloudflare隧道令牌 + ``配置文件(推荐路径| `REPO_PUBLIC` | `false `true`在页面中显示源安装链接;页面始终链接到| `RETENTION_DAYS` ·_RECORDING_HOURS` | `7` ·` | 音频保留和最大录音时长(`0`保留 = 无限制:仅) |
|_RETENTION_DAYS` | `90` | 转录/分钟/生命周期(永远不会低于`RETENTION_D;`0` = 永久) |
| `RECORDING_MAX_CONCURRENT` · `RECORDING_PROCESSING` | `2` · `12` | 全局捕获和持久后处理能力会话阶段都计算在内 |
| `RECORDUILD_STARTS_PER_24H` | `12` | 每个公会手动和自动录制的共享滚动配额(包括管理员) |
| `RECORDING_STARTS_GLOBAL_PER_HOUR` · `RECORDING_STARTS_GLOBAL_PER_24H` | `8` · `32` | 公会和来源的全局滚动启动配额 |
| `TRANSCRIBE_PROVIDER` | `none` | `none` / `assemblyai` /ai` /q` / `` / `command` |
| `ASSE_API_KEY` / `GROQ_API_KEY` / `OPENAI_API_KEY` /INI_API_KEY` | — | 所选的密钥(Groq密钥也兼作ASR备用) |
| `TRANSCRIBE_PROMPT `TRANSCRIBE_KEYTERMS` | — | ASR引擎的领域词汇(Whisper提示/AssemblyAI关键术语);自动注入参与者| `MINUTES_ENABLED` | `auto` | AI会议纪要:`auto`(当存在OpenRouter或Groq密钥时启用)/ `true` / `false` |
| `MINUTES_PROVIDER` / `OPENROUTER_API_KEY` | 设置密钥时默认为`open | 会议纪要LLM:`openrouter`(google/gemini-2.5-flash`)或`groq`(默认`-3.3-70b-versatile`) |
| `MINUTES_WEBHOOK_URL` | — | 将JSON.ready`事件发布到您自己的集成中;仅限环境变量(设计上无SSRF via Discord) |
MCP_SECRET` | — | 启用连接器;轮换它会立即吊器 |
| `OWNER_IDS` | — | 允许使用`/mcp`的Discord ID(CSV);普通成员在`/app/conectar-ia`上自行服务 |
| `DEFAULT_LOCALE` | `en` | 当没有用户特定时,DM/回复的语言(服务器成员仍会看到他们自己的Discord客户端语言) |
| `TZ` | `America/Sao_Paulo` | 日期时区(网页默认为访问者的时区) |
更多旋钮 — 磁盘保护、磁盘满警报、通过rclone的异地备份 — 都记录在一个选项一个选项的基础上,位于[`.env.example`](.env.example)中。
### 更改现有实例的域名
1. 在切换到生产环境之前,将新的`APP_URL/auth/callback`添加到Discord OAuth。
2. 在一次维护窗口中更改DNS、隧道路由、``/`MCP_URL`,并在单个维护窗口中进行。浏览器会话不会跨域,因此用户必须重新登录。MCP令牌绑定到发出它们的源。更换完整的配置块并在每个活动客户端中替换它。
4. 验证每个新源,然后删除废弃的OAuthDNS记录和隧道路由。已主机名将不再由应用程序提供服务。
### 命令
| 命令 | 执行操作 |
|---|---|
| `/record [channel]` | 开始录音(您的语音指定的频道) |
| `/stop` | 结束并生成带有音频、转录和分钟的链接 |
| `/text>` | 在当前时间(📝 面板按钮)标记一个笔记 |
| `/status` | 当前录音状态 |
| `/recordings` | 您的最新录音,按访问权限筛选 — 也可以链接到具有全文搜索的网络索引 |
| `/ask <question> [days]` | 按主题、人员、会议日期或截止日期提问 — 只有您可以看到来自您有权访问的会议的服务器渲染证据 |
| `/config minutes-channel` / `/config view` | 管理员:选择通用处理通知的文本频道(详细信息和链接仅发送到授权的DM) |
| `/autorecord on/off/view` | 自动录制每个频道(管理员) |
| `/mcp new` / `/mcp revoke-all` | 所有者专用(`OWNER_IDS`):生成或吊销AI连接器代码 — 普通成员在网页上自行服务 `/app/conectar-ia` |
| `/help` | 交互式引导通过DM回复) |
| `/about` | 作者、许可证和源代码 |
任何成员都可以在他们当前所在的频道中开始录音;具有**管理服务器**权限的人员也可以针对他们可以看到的另一个频道。停止和注释需要继续访问已录制的频道;`/autorecord`和`/config`需要**管理服务器**。`/mcp`仅在连接器启用时存在(设置了`MCP_SECRET`)。删除录音(从其页面)仅限于发起者或管理员。
MCP连接器对每个会议应用与网页相同的访问检查:当前成员仅看到他们已经可以看到的内容。私有频道的历史记录不会因为有人后来获得了频道访问权限而重新打开。只读,无音频,可随时吊销。客户端设置和完整文档:[mcp.kassinao.cloud](https://mcp.kassinao.cloud) 或此存储库中的 [`mcp/`](mcp/)。
### 转录后端
| 提供商 | 定价 | pt-BR 质量 | 隐私 | 注意 |
|---|---|---|---|---|
| **AssemblyAI** (`universal-3-5-pro`) | [当前定价](https://www.assemblyai.com/pricing) | 强大 | 云 | 默认选择;如果设置了 `GROQ_API_KEY`,则自动降级到 Groq |
| **Groq** (`whisper-large-v3`) | [当前定价](https://groq.com/pricing) | 优秀 | 云(启用 ZDR 时) | 快速托管 Whisper |
| **OpenAI** (`whisper-1`) | [当前定价](https://openai.com/api/pricing/) | 优秀 | 云 | 带时间戳的段落 |
| **Gemini** (`gemini-3.5-flash`,默认) | [当前定价](https://ai.google.dev/gemini-api/docs/pricing) | 良好 | 云 | 通过 Gemini API 进行多模态转录 |
| **本地** (`faster-whisper`) | 免费 | 良好(`small`+) | 🔒 从不离开您的服务器 | 无GPU时较慢;参见 [`scripts/transcribe-local.py`](scripts/transcribe-local.py) |
录制是多轨的。VAD通常在上传前修剪沉默;如果检测失败,则使用固定块以避免丢失通话,并且这些块可能包含沉默。实际使用和成本取决于语音时间、备用提供商和配置的模型Router或Groq一次性运行每个会议的AI分钟。
## 工作原理
每个发言者的 Opus 数据包被解码成 PCM 并输入到 **每个发言者一个 ffmpeg**,生成 **连续的 FLAC**(语音之间的沉默压缩到几乎为零,并保持每个轨道同步)。当录音停止时,**混音预先准备好**,以便播放器立即启动;其他下载(MP3/FLAC/Audacity)仍然按需准备并缓存。转录和会议纪要在一个 **串行队列** 中运行,位于通话之后:**语音活动检测(VAD)**(ffmpeg 的 `silencedetect`)通常将语音段发送到 ASR 提供商,并在检测失败时回退到固定块,然后通过 **OpenRouter** 或 **Groq** 运行会议纪要网页。网页会自动刷新,直到它们准备好。网页通过 **Discord OAuth**(`identify`)进行身份验证,后端会与 Discord 重新检查,Discord 可能会打开每个录音。
```mermaid
flowchart LR
subgraph Discord
VC[语音频道]
end
subgraph Kassinão
BOT[机器人<br/>discord.js / 语音]
FF[每个发言者的 ffmpeg<br/>→ FLAC 主混音]
MIX[预先准备的混音<br/>其他下载按需进行]
VAD[语音活动检测 silencedetect<br/>仅语音块]
Q[串行队列:<br/>转录 → AI 会议纪要]
WEB[网页<br/>Express + OAuth]
end
VC -- 每个发言者的 Opus --> BOT --> FF
FF -- 停止时 --> MIX
FF -- 停止时 --> VAD --> Q
Q -- "ASR:AssemblyAI / Groq / OpenAI / Gemini / 本地" --> Q
Q -- "会议纪要:OpenRouter / Groq" --> Q
MIX & Q --> WEB
USER[参与者] -- Discord 登录 --> WEB
WEB -. Cloudflare 隧道 / HTTPS .-> USER
```
**技术栈:** Node.js · TypeScript · discord.js / @discordjs/voice · Express · ffmpeg · Docker · Cloudflare 隧道。
## 安全与隐私
录制语音正在处理个人数据,因此访问控制不是一个功能特性——它是要实际验证的内容:
- 每个页面请求都通过 Discord OAuth 进行身份验证,并通过 Discord REST 确认当前服务器成员身份。录音仅限于其发起者、通话中在场的人员和当前管理员;能够查看当前频道的权限永远不会解锁历史录音。列表重复验证仅在其自己的请求中进行,而破坏性操作始终强制进行单独的检查。完整策略在一个文件中:[`src/web/access.ts`](src/web/access.ts)。
- 除非您配置了云提供商,否则不会将任何数据发送到您的服务器进行转录——即使如此,也只有 VAD 修剪的语音段会被发送,绝不会发送您未打算转录的完整原始音频。
- 优先选择网络上零保留:启用提供商的零数据保留选项(Groq 提供了此选项),或使用本地 `command` 转录后端完全跳过云路径。
- 机密信息(`DISCORD_TOKEN`、`MCP_SECRET`、API 密钥)仅存在于您自己的 `.env` 中,该文件被 git 忽略 - 绝不提交,绝不被机器人本身发送到任何地方。
- 发现了实际漏洞?请参阅 [SECURITY.md](SECURITY.md) 以了解如何私下报告。
## 贡献
欢迎 PR 和问题 - 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 和 [行为准则](CODE_OF_CONDUCT.md)。在打开 PR 之前,请运行 `npm run build`。
## 许可证
[GNU AGPL-3.0-or-later](LICENSE) 2026 Mauro Marques.
免费开源。您可以自由使用、研究、修改和分享 - 但如果您将修改后的版本作为网络服务运行(例如,为他人托管机器人),AGPL 要求您向这些用户提供相应的源代码。机器人的 `/about`(`/sobre`)命令链接到此仓库以满足此要求。
使用 [ffmpeg](https://ffmpeg.org/) 作为单独的外部二进制文件(从 Docker 中的签名 Debian 仓库安装);其自己的 GPL/LGPL 许可证适用。
<div align="center">
<sub>如果 Kassinão 对您有帮助,请给它一个 ⭐ 以帮助其他人发现它。</sub>
</div>
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器