狄克克利克

Discord语音通道会议员——实时语音转文本,演讲者日记化,自动生成会议纪要,MCP服务器集成。
dicoclerk加入Discord语音通道,通过Deepgram的STT引擎实时捕获音频并识别说话者,使用四种智能策略消除重复的话语,并生成包含参与者列表、摘要和行动项的结构化会议纪要。专为使用韩语/英语双语会议的团队而设计。
______________________________________________________________________
特性
- 斜杠命令:
/start为了开始记录,/stop结束并自动生成分钟数 - 具有扬声器日记功能的实时STT:Deepgram's nova-2 model identifies speakers in live audio(支持韩语/英语)
- 4种重复数据消除策略:内容指纹识别、说话者身份匹配、时间戳接近度和模糊相似性(Levenshtein距离)
- 结构化会议纪要:带有日期/时间、参与者、摘要、关键讨论点、行动项目和完整成绩单的自动格式化标记
- 自动断开连接:Bot在语音通道变空时离开
- 连接弹性:Deepgram通过指数回退自动重新连接(可配置最大重试次数)
- 连接池:通过可选的多连接池支持5-10个并发扬声器
- MCP服务器模式:10个外部代理集成工具(会话管理、记录/分钟查询、上下文搜索、摘要)
- 会议历史记录搜索:按日期、参与者、关键字、频道名称查找和检索过去的分钟数
- 独立操作:无需Openclaw或外部代理即可运行——可以作为纯Discord机器人运行
- 交互式安装程序:
setup.sh指导您完成Discord机器人程序配置和API密钥设置 - 数据持久层:将成绩单、会议纪要和会议索引本地存储在磁盘上
______________________________________________________________________
建筑
┌─────────────────────────────────────────────────────────────────┐
│ Discord Client │
│ (/start, /stop slash commands + voice state events) │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Session Manager │
│ (Tracks active sessions per guild, voice connection lifecycle) │
└─────────────────────────────────────────────────────────────────┘
│
┌───────────────────┴───────────────────┐
▼ ▼
┌──────────────────────┐ ┌──────────────────────┐
│ Audio Capture & │ │ Deepgram STT │
│ Session Coordinator │◄────────►│ (Connection Pool) │
│ (per voice channel) │ │ (nova-2, diarization)
└──────────────────────┘ └──────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ Deduplication Engine │
│ (Fingerprint, Similarity, Timestamp, Fuzzy Matching) │
└──────────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ Minutes Generator & Formatter │
│ (Markdown formatting, index storage, Discord delivery) │
└──────────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ Data Directory (./data by default) │
│ ├─ transcripts/ (raw STT output) │
│ ├─ minutes/ (formatted meeting minutes) │
│ └─ recordings/ (optional: Discord audio files) │
└──────────────────────────────────────────────────────────────────┘
Optional: MCP Server Mode
┌──────────────────────────────────────────────────────────────────┐
│ MCP Server (npm run mcp) │
│ (10 tools: session control, queries, search, summarization) │
│ (Integrates with Openclaw or other agents) │
└──────────────────────────────────────────────────────────────────┘______________________________________________________________________
先决条件
- Node.js 20.0或更晚
- Discord Bot令牌 (从 Discord开发者门户)
- 所需意向:消息内容、儿童语音状态、儿童成员 - 所需权限:连接到语音、用语音说话、发送消息、附加文件、使用应用程序命令
- Deegram API密钥 (从 Deepgram控制台)
- 免费等级:每月200美元的积分
- Git (用于克隆存储库)
______________________________________________________________________
快速开始
1.克隆存储库
git clone https://github.com/yourusername/dicoclerk.git
cd dicoclerk2.运行交互式安装程序
bash setup.sh安装程序将:
- 提示输入您的Discord机器人令牌和客户端ID
- 要求提供可选的Discord公会/频道ID(建议用于更快的开发)
- 请求您的Deegram API密钥
- 让您选择语言支持(韩语、英语或多语言)
- 创建
.env配置文件 - 安装Node.js依赖项
- 注册
/start和/stop斜杠命令
3.启动Bot
npm start机器人将登录并出现在您的Discord服务器中。您将看到:
✅ dicoclerk is online as YourBotName#1234
Guilds: 14.在Discord中测试
- 加入服务器中的语音频道
- 类型
/start开始录制 - 说话!机器人将实时转录
- 类型
/stop结束会话并生成会议纪要 - 分钟数在1-2分钟内以标记文件的形式出现在文本频道中
______________________________________________________________________
配置
创建一个 .env 文件或运行 setup.sh 以自动填充它。文件遵循以下结构:
# Discord Bot Configuration
DISCORD_TOKEN=your_discord_bot_token_here
DISCORD_CLIENT_ID=your_discord_client_id_here
# Optional: Guild ID for development (faster command registration)
DISCORD_GUILD_ID=your_guild_id
# Optional: Default text channel for posting meeting minutes
MINUTES_CHANNEL_ID=your_text_channel_id
# Deepgram API Configuration
DEEPGRAM_API_KEY=your_deepgram_api_key_here
# Language settings: ko (Korean only), en (English only), or multi (both)
STT_LANGUAGE=multi
# Data storage directory (transcripts, minutes, recordings)
DATA_DIR=./data环境变量
| 变量 | 必填 | 描述 |
|---|---|---|
DISCORD_TOKEN | 是 | 机器人身份验证令牌 |
DISCORD_CLIENT_ID | 是 | OAuth2和命令注册的应用程序ID |
DISCORD_GUILD_ID | 无 | 开发模式的服务器ID(将命令注册从~15分钟加速到~1秒) |
MINUTES_CHANNEL_ID | 否 | 分钟的默认文本频道(可以覆盖每个会话) |
DEEPGRAM_API_KEY | 是 | STT的Deepcram API密钥 |
STT_LANGUAGE | 否 | 语言代码: ko, en,或 multi (默认值: multi) |
DATA_DIR | 否 | 成绩单/分钟的本地目录(默认: ./data) |
______________________________________________________________________
用法
斜杠命令
/start
加入您当前的语音频道并开始录制。
选项:
language(可选):覆盖此会话的默认语言
- ko --仅限韩语 - en --仅限英语 - multi --自动检测韩语和英语
答复:
✅ **Recording started** in #voice-channel
🎙️ Language: **Korean + English**
👤 Started by: **yourname#1234**
🔊 Speech recognition: **Active**
Use `/stop` to end the session and generate meeting minutes.要求:
- 您必须处于语音通道中
- 每台服务器只有一个活动会话
- 机器人必须具有语音通道权限
/stop
结束录制会话,完成记录,并触发分钟生成。
答复:
✅ **Session ended**
⏱️ Duration: **12m 34s**
👥 Participants: **4**
📝 Transcript entries: **156**
Meeting minutes will be generated and posted within 1–2 minutes.实时状态消息
录制时,机器人会向文本通道发送状态更新:
- Deepgram重新连接:
⚠️ Speech recognition connection interrupted. Reconnecting... (attempt 1/5) - 重新连接成功:
✅ Speech recognition reconnected. Transcription continues. - 永久性故障:
❌ **Speech recognition connection lost permanently.** Partial transcript has been saved... - 频道为空:
✅ Recording auto-stopped (channel emptied). Processing...
会议纪要格式
生成的分钟是具有以下结构的markdown文件:
# Meeting Minutes: Project Planning Session
**Date:** 2025-04-03 | **Time:** 14:30–14:42 (12m 34s)
**Channel:** #team-standup
**Language:** Korean, English
## Attendees (4 participants)
- Alice (8 utterances, 2m 15s)
- Bob (6 utterances, 1m 42s)
- Charlie (5 utterances, 1m 08s)
- Diana (4 utterances, 0m 49s)
## Summary
Key topics discussed: Project timeline, resource allocation, Q2 roadmap updates.
## Key Discussion Points
- **Timeline**: Q2 launch target confirmed; engineering team needs 2 additional weeks.
- **Resources**: Budget approval for cloud infrastructure in progress.
- **Dependencies**: Marketing content needs finalization by April 10.
## Action Items
1. **Alice** — Update project charter by 2025-04-08
2. **Bob** — Prepare resource estimates by 2025-04-06
3. **Charlie** — Coordinate with marketing on content timeline
## Full Transcript
**Alice** [00:05–00:12] "Good afternoon everyone. Let's start with the Q2 roadmap."
**Bob** [00:15–00:28] "Yep, we reviewed the timeline yesterday. Engineering needs about two more weeks..."
...分钟数自动:
- 已保存到
./data/minutes/YYYY-MM-DD_HH-MM-SS_GuildName_ChannelName.md - 作为附件发布到文本频道
- 索引在
./data/minutes/index.jsonl搜索
______________________________________________________________________
MCP服务器模式
dicoclerk包括一个MCP(模型上下文协议)服务器,用于与Openclaw等外部代理集成。
启动MCP服务器
npm run mcp服务器监听stdio(代理连接)。
可用工具(共10个)
会话管理
start_session 在语音通道中启动新的录制会话。
参数:
guild_id(字符串,必填):Discord公会IDvoice_channel_id(字符串,必填):要录制的语音通道IDtext_channel_id(字符串,必填):状态/分钟的文本通道language(枚举:'ko'|'en'|'multi',可选):STT语言(默认值:'multi')
退货: { success, session_id, message }
stop_session 停止正在进行的录制会话。
参数:
guild_id(字符串,必填):具有活动会话的公会
退货: { success, duration, transcriptCount, minutesPath }
list_sessions 列出所有公会的所有活动录音会话。
退货: { sessions: [ { guild_id, channel_id, started_at, duration, participants } ] }
会话查询
get_session 获取特定会话的详细信息。
参数:
guild_id(字符串,必填):帮会ID
退货: { session: { guildId, channelId, startedAt, duration, participants, status } }
get_transcript 获取当前或已完成的成绩单。
参数:
guild_id(字符串,必填):帮会IDformat(枚举:“原始”|“格式化”,可选):输出格式(默认:“格式化”)
退货: { transcript: [ { speaker, text, timestamp, confidence, isFinal } ] }
get_minutes 获取会话生成的会议纪要。
参数:
guild_id(字符串,必填):帮会IDsession_id(字符串,可选):特定会话(默认为最新)
退货: { minutes: markdown_content }
存储和搜索
list_recordings 列出磁盘上存储的所有成绩单和会议记录。
参数:
limit(数字,可选):最大结果(默认值:20)guild_id(字符串,可选):按公会ID筛选
退货: { recordings: [ { date, guild_name, channel_name, participants, duration } ] }
search_minutes 按日期、渠道、参与者或自由文本搜索会议纪要。
参数:
query(字符串,可选):自由文本搜索guild_id(字符串,可选):按公会过滤channel_name(字符串,可选):部分通道名称匹配participant(字符串,可选):部分参与者姓名匹配date_from(字符串,可选):开始日期(YYYY-MM-DD)date_to(字符串,可选):结束日期(YYYY-MM-DD)language(字符串,可选):语言代码(KO/EN)limit(数字,可选):最大结果(默认值:20)offset(数字,可选):分页偏移量(默认值:0)
退货: { results: [ { date, guild_name, channel_name, participants, duration } ] }
search_meeting_minutes 搜索并检索包含完整降价内容的前几分钟。
参数:
query(字符串,可选):跨元数据和内容的自由文本搜索guild_id(字符串,可选):按公会过滤channel_name(字符串,可选):部分通道匹配participant(字符串,可选):部分参与者匹配date_from(字符串,可选):开始日期(YYYY-MM-DD)date_to(字符串,可选):结束日期(YYYY-MM-DD)keywords(字符串数组,可选):搜索关键字内容language(字符串,可选):语言代码limit(数字,可选):最大结果(默认值:5)offset(数字,可选):分页偏移include_content(布尔值,可选):包含完整的markdown(默认值:true)
退货: { results: [ { date, guild_name, channel_name, participants, content } ] }
summarize_minutes 根据过去的会议记录生成简明的上下文摘要。
参数:
query(字符串,可选):搜索/筛选条件guild_id(字符串,可选):按公会过滤date_from(字符串,可选):开始日期date_to(字符串,可选):结束日期summarize_count(number,可选):要总结的会议数(默认值:5)context_type(字符串,可选):摘要类型(“执行”、“详细”或“快速”)
退货: { summary: contextual_narrative, references: [ { date, source } ] }
______________________________________________________________________
项目结构
dicoclerk/
├── README.md # This file
├── LICENSE # MIT license
├── package.json # Dependencies & npm scripts
├── .env.example # Configuration template
├── setup.sh # Interactive installer
│
├── src/
│ ├── index.js # Main Discord bot entry point
│ ├── deploy-commands.js # Register /start, /stop commands
│ ├── mcp-server.js # MCP server entry point
│ │
│ ├── commands/
│ │ ├── start.js # /start slash command handler
│ │ └── stop.js # /stop slash command handler
│ │
│ ├── voice/
│ │ ├── session-manager.js # Session lifecycle & voice connection pool
│ │ └── connection-manager.js # Discord voice connection wrapper
│ │
│ ├── audio/
│ │ ├── session-coordinator.js # Orchestrates audio capture & Deepgram
│ │ └── audio-capture-pipeline.js # Subscribes to voice receiver, forwards audio
│ │
│ ├── stt/
│ │ ├── deepgram-client.js # Deepgram streaming client (nova-2 + diarization)
│ │ ├── connection-pool.js # Multi-connection pooling for 5-10 speakers
│ │ ├── connection-resilience.js # Auto-reconnect with exponential backoff
│ │ └── dedup.js # 4 deduplication strategies
│ │
│ ├── minutes/
│ │ ├── generator.js # End-to-end minutes generation pipeline
│ │ ├── formatter.js # Markdown formatting logic
│ │ ├── summarizer.js # Heuristic summary extraction
│ │ └── index-store.js # Meeting index (JSONL file storage)
│ │
│ ├── session/
│ │ └── session-cleanup.js # Shared teardown (Deepgram, transcript, voice)
│ │
│ └── mcp/
│ ├── server.js # MCP server setup & lifecycle
│ ├── tools.js # Tool definitions (10 tools)
│ ├── handlers.js # Tool implementation logic
│ ├── transport.js # Stdio transport for MCP
│ └── index.js # MCP module exports
│
├── tests/
│ ├── *.test.js # Node.js test files (using built-in test runner)
│ └── *.py # Python test utilities
│
└── data/ # (Auto-created by setup.sh)
├── transcripts/ # Raw STT output (JSON)
├── minutes/ # Formatted meeting minutes (Markdown)
│ └── index.jsonl # Meeting index for search
└── recordings/ # Optional: Discord audio files______________________________________________________________________
重复数据消除策略
dicoclerk使用四种互补的重复数据删除方法来清理实时STT输出:
- 内容指纹:标准化文本的SHA-256哈希+说话者ID。快速精确匹配检测。
- 说话者身份匹配:只有来自同一说话者的话语才被视为重复。
- 时间戳接近度:检查可配置时间窗口内的话语;窗外的旧话语是安全的。
- 模糊相似性(Levenshtein):对于近似重复(拼写错误、部分重复),如果高于相似性阈值(默认值:0.75),则计算编辑距离和匹配。
配置(在dedup.js中):
const DEFAULT_DEDUP_CONFIG = {
timeWindow: 5.0, // Seconds
similarityThreshold: 0.75, // 0.0–1.0
windowSize: 100, // Utterances
deduplicateInterim: true, // Treat interim results as replaceable
exactMatchWindow: 10.0, // Seconds for exact-match grace period
};______________________________________________________________________
连接弹性
Deegram连接可能会由于网络问题或API速率限制而失败。dicoclerk自动:
- 发现 连接丢失
- 等待 具有指数回退(1s→ 2s → 4s → 8s、 可配置最大60秒)
- 再连接 最多5次尝试(可配置)
- 通知 尝试与成功/失败的文本频道
- 倒退 如果重新连接重试失败,则转换为部分转录
配置(在connection resilience.js中):
const RECONNECT_DEFAULTS = {
maxAttempts: 5, // Max reconnection attempts
initialDelayMs: 1000, // 1 second
maxDelayMs: 60000, // Cap at 60 seconds
backoffMultiplier: 2.0, // Exponential growth
};______________________________________________________________________
自动断开连接
当语音通道变空(最后一个参与者离开)时,机器人会自动:
- 等待2秒(可配置的宽限期,以防止切换频道时出现误报)
- 检查通道是否仍然为空
- 停止音频捕获和Deepgram连接
- 生成并交付分钟数
- 离开语音通道
- 将清理摘要发布到文本频道
______________________________________________________________________
测试
运行完整的测试套件:
npm test这将执行所有操作 .test.js 文件在 tests/ 使用Node.js内置的测试运行器。
测试覆盖范围包括:
- 音频捕获管道和会话协调
- 连接池管理和弹性
- 重复数据消除策略(所有4种变体)
- 格式化程序输出和markdown结构
- 分钟生成器和文件I/O
- 索引存储(JSONL查询)
- MCP服务器和工具处理程序
- Slash命令验证
- 会话生命周期和清理
______________________________________________________________________
发展
自动重新加载模式
对于快速迭代:
npm run dev使用Node.js --watch 在文件更改时重新启动。
重新注册Slash命令
如果修改命令定义:
npm run deploy-commands命令在全球范围内注册(约15分钟)或立即注册到您的开发公会(如果 DISCORD_GUILD_ID 已设置)。
环境调试
检查您的配置:
cat .env确保所有必需的变量都已设置且非空。
______________________________________________________________________
故障排除
Bot没有响应 /start
- 验证斜线命令是否已注册:
- 在Discord中右键单击机器人→ 检查 /start 和 /stop 命令 - 如果缺失,请运行: npm run deploy-commands
- 检查机器人权限:
- 右键单击服务器→ 服务器设置→ 角色→ 狄克勒克角色 - 确保启用了“连接到语音”、“语音通话”、“发送消息”、“附加文件”
- 确认意图:
- 转到Discord开发者门户→ 您的应用程序→ Bot - 启用:消息内容、GUI语音状态、GUI成员
“未配置Deepcram API密钥”
- 集
DEEPGRAM_API_KEY在.env - 重启机器人程序:
npm start
机器人加入语音,但没有出现文字记录
- 检查Deegram API密钥的有效性:
- 访问https://console.deepgram.com并验证您的密钥是否未过期 - 确保您的帐户有可用的信用额度
- 检查机器人音频权限:
- 服务器设置→ 角色→ 狄克克利克→ 语音权限 - 启用:“连接”、“说话”、“使用语音活动”
- 检查机器人是否可以看到语音频道:
- 服务器设置→ 频道→ 语音频道→ 权限 - 确保dicoclerk角色具有“连接”和“查看频道”权限
未生成分钟数
- 检查
/stop已成功执行:
- 在文本通道中查找清理消息(转录计数、持续时间)
- 检查文件权限:
- 确保 ./data/minutes/ 目录可写: ls -la data/
- 检查日志:
- 寻找 [MinutesGenerator] bot控制台输出中的消息
Deepgram成本高
- 使用
STT_LANGUAGE=ko或STT_LANGUAGE=en而不是multi减少加工 - 更短的会话=更低的成本
- 监控实时使用情况https://console.deepgram.com/usage
______________________________________________________________________
业绩说明
- 典型会话:30名参与者,1小时→ ~2–3 MB转录本,0.5-1 MB分钟,在\<2分钟内生成
- 连接池:默认单连接可轻松处理5-10个扬声器;负载下自动扩展到2-3个连接
- 分钟存储:每分钟会议时间约1 KB(降价)
- 重复数据删除开销:每句话\<50ms(可忽略不计)
______________________________________________________________________
许可证
MIT。看 许可证 了解详情。
______________________________________________________________________
贡献
欢迎投稿!拜托:
- 分叉存储库
- 创建要素分支:
git checkout -b feature/your-feature - 以明确的信息承诺:
git commit -m "Add feature X" - 推:
git push origin feature/your-feature - 打开拉取请求
______________________________________________________________________
支持
- 文档:参见 README.md 以及内联代码注释
- 问题:针对bug或功能请求打开GitHub问题
- Discord帮助:检查 Discord.js 和 深度图 文档
______________________________________________________________________
