项目简介
Discord Voice Lab是一个集语音识别(STT)、语言编排器(LLM Orchestrator)和语音合成(TTS)服务于一体的Discord语音助手。其'discord'服务模块实现了一个MCP服务器,负责监听Discord语音活动,并将语音转录内容通知给LLM编排器。同时,它向LLM客户端暴露了一系列MCP工具,允许LLM在Discord中执行发送消息、加入/离开语音频道和播放音频等操作,从而实现LLM对Discord的控制和交互能力。
主要功能点
- Discord语音捕获与处理: 从Discord语音频道捕获用户语音,进行语音活动检测(VAD)、降噪、标准化处理,并将PCM数据传递给语音转文本(STT)服务。
- MCP工具暴露: 通过Model Context Protocol (MCP) 向LLM客户端暴露Discord的交互能力,如:
- 加入/离开语音频道: 控制机器人加入或离开特定的Discord语音频道。
- 发送文本消息: 向Discord文本频道或语音频道聊天发送消息。
- 播放音频: 在连接的语音频道中播放指定的音频URL。
- 转录通知: 当检测到唤醒词并完成语音转文本后,MCP服务器会向LLM客户端发送转录通知,将用户语音内容和相关元数据提供给LLM进行进一步处理。
- 高可用性: 支持Discord语音连接的自动重连机制,确保服务稳定性。
- 可观测性: 提供结构化日志和Prometheus指标,便于监控和故障排除。
- 调试功能: 具备全面的调试保存机制,可记录语音片段、转录结果、工具调用等,便于问题分析。
安装步骤
本项目通过Docker Compose进行部署,以下是基本安装步骤:
-
准备环境文件: 通过运行以下脚本,根据 '.env.sample' 模板生成服务所需的 '.env.common'、'.env.docker' 和 'services/**/.env.service' 文件。
python3 scripts/prepare_env_files.py然后,您需要编辑这些生成的 '.env.service' 文件,特别是 'services/discord/.env.service',填入您的Discord机器人令牌('DISCORD_BOT_TOKEN')、Discord服务器ID('DISCORD_GUILD_ID')和语音频道ID('DISCORD_VOICE_CHANNEL_ID')等必要配置。
-
启动服务栈: 在项目根目录下运行Docker Compose命令来构建并启动整个服务栈:
make run这会启动Discord机器人、语音转文本(STT)、语言编排器(LLM Orchestrator)和语音合成(TTS)等所有组件。您可以使用 'make logs' 查看日志输出,使用 'make stop' 停止服务。
服务器配置
本MCP服务器是Discord服务('discord')的一部分,旨在通过'stdio'传输协议与MCP客户端(例如LLM编排器)进行通信。以下是MCP客户端连接到此Discord MCP服务器的示例配置:
{ "mcpServers": { "discord": { "name": "discord", "command": "python3", "args": [ "-m", "services.discord.main" ], "env": { "DISCORD_MCP_MODE": "true", "DISCORD_BOT_TOKEN": "YOUR_DISCORD_BOT_TOKEN", "DISCORD_GUILD_ID": "YOUR_DISCORD_GUILD_ID", "DISCORD_VOICE_CHANNEL_ID": "YOUR_DISCORD_VOICE_CHANNEL_ID", "STT_BASE_URL": "http://stt:8000", "LOG_LEVEL": "INFO", "LOG_JSON": "true" }, "enabled": true } } }
配置参数注释:
- 'name': MCP服务器的唯一名称,此处为'discord'。
- 'command': 启动MCP服务器进程的命令,此处为'python3'。
- 'args': 传递给'command'的参数列表,'"-m", "services.discord.main"'指示Python以模块形式运行Discord服务的主入口。
- 'env': 进程环境变量,包含MCP服务器运行所需的配置。
- 'DISCORD_MCP_MODE': 必须设置为 '"true"',指示Discord服务以MCP服务器模式运行。
- 'DISCORD_BOT_TOKEN': 您的Discord机器人的API令牌。
- 'DISCORD_GUILD_ID': 您的Discord服务器(公会)的ID。
- 'DISCORD_VOICE_CHANNEL_ID': 机器人默认加入的语音频道的ID。
- 'STT_BASE_URL': 语音转文本(STT)服务的URL,通常在Docker Compose网络中是内部服务名。
- 'LOG_LEVEL': 日志级别(例如'INFO', 'DEBUG')。
- 'LOG_JSON': 日志是否输出为JSON格式。
- 'enabled': 是否启用此MCP服务器连接,此处为'true'。
通过上述配置,MCP客户端可以启动并连接到Discord MCP服务器,并通过JSON-RPC进行通信,调用Discord提供的工具。
基本使用方法
一旦Discord服务以MCP模式运行并连接到LLM编排器(或其他MCP客户端),LLM就可以利用其暴露的工具。
1. LLM调用 'discord.join_voice' 工具将机器人加入语音频道:
- MCP客户端请求(JSON-RPC 'tools/call'):
{ "jsonrpc": "2.0", "id": 1, "method": "mcp/tools/call", "params": { "name": "discord.join_voice", "arguments": { "guild_id": 123456789012345678, // 替换为您的Discord服务器ID "channel_id": 987654321098765432 // 替换为您的Discord语音频道ID } } } - MCP服务器响应示例:
{ "jsonrpc": "2.0", "id": 1, "result": { "content": [ { "type": "application/json", "json": { "status": "connected", "guild_id": 123456789012345678, "channel_id": 987654321098765432 } } ] } }
2. LLM调用 'discord.send_message' 工具发送文本消息:
- MCP客户端请求:
{ "jsonrpc": "2.0", "id": 2, "method": "mcp/tools/call", "params": { "name": "discord.send_message", "arguments": { "channel_id": 987654321098765432, // 替换为您的Discord文本或语音频道ID "content": "您好!我是一个语音助手,很高兴为您服务。" } } } - MCP服务器响应示例:
{ "jsonrpc": "2.0", "id": 2, "result": { "content": [ { "type": "application/json", "json": { "status": "sent", "channel_id": 987654321098765432, "message_id": "..." // 实际消息ID } } ] } }
3. Discord语音转录通知(LLM客户端接收): 当用户在Discord语音频道中发言并触发唤醒词后,Discord MCP服务器会发送通知给LLM客户端:
- MCP服务器通知(JSON-RPC 'discord/transcript')示例:
{ "jsonrpc": "2.0", "method": "discord/transcript", "params": { "text": "你好,Atlas,请播放一首音乐。", "user_id": 112233445566778899, "channel_id": 987654321098765432, "guild_id": 123456789012345678, "correlation_id": "discord-112233445566778899-..." // 其他转录和唤醒词相关元数据 } }
LLM编排器(或其他MCP客户端)在收到此类通知后,可以根据'text'内容调用LLM生成回复,并通过其他MCP工具(如'discord.play_audio'或'discord.send_message')将回复反馈给Discord。
信息
分类
通信与社交