项目简介

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进行部署,以下是基本安装步骤:

  1. 准备环境文件: 通过运行以下脚本,根据 '.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')等必要配置。

  2. 启动服务栈: 在项目根目录下运行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。

信息

分类

通信与社交