Discord语音转录与合成机器人

一个基于MCP协议的Discord机器人,提供语音转录(使用Google Gemini)和文本转语音(使用ElevenLabs)功能,适用于语音和文本频道的交流协作场景。

  • by mrrustybutter
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 mrrustybutter/discord-mcp

使用说明

Discord Bot MCP

一种模型上下文协议(MCP)服务器,提供Discord机器人功能,包括语音转录(使用Google Gemini)和文本转语音(使用ElevenLabs)。

特性

  • 🤖 通过MCP实现完整的Discord机器人功能
  • 🎤 使用Google Gemini进行语音通道转录
  • 🔊 使用ElevenLabs在语音通道中实现文本转语音
  • 💬 短信频道消息
  • 📝 成绩单记录
  • 🔄 实时语音活动检测

先决条件

  1. Discord机器人

    • 在上创建机器人 Discord开发者门户
    • 启用以下意图:
      • GUILD_消息
      • 消息内容
      • GUILD_VOICE_STATES
    • 获取您的机器人令牌和客户端ID
  2. Google Gemini API

  3. ElevenLabs API

    • 从获取API密钥 ElevenLabs
    • 记下您的首选语音ID

安装

npm install

配置

  1. 复制 .env.example 向 .env:

    cp .env.example .env
    
  2. 填写您的凭据:

    # Discord Bot Configuration
    DISCORD_BOT_TOKEN=your_discord_bot_token_here
    DISCORD_CLIENT_ID=your_discord_client_id_here
    
    # Google Gemini API Configuration
    GEMINI_API_KEY=your_gemini_api_key_here
    GEMINI_MODEL=gemini-1.5-flash-002
    
    # ElevenLabs Configuration  
    ELEVENLABS_API_KEY=your_elevenlabs_api_key_here
    ELEVENLABS_VOICE_ID=Au8OOcCmvsCaQpmULvvQ
    

用法

发展模式

npm run dev

生产模式

npm run build
npm start

SSE模式(用于HTTP传输)

npm run dev:sse    # Development
npm run start:sse  # Production

MCP工具

机器人管理

  • bot_connect -连接Discord机器人
  • bot_disconnect -断开Discord机器人的连接
  • bot_status -获取机器人状态和连接信息

语音通道

  • join_voice_channel -加入语音频道
  • leave_voice_channel -离开当前语音频道
  • speak_in_voice -使用TTS在语音通道中讲话
  • start_transcription -开始转录语音
  • stop_transcription -停止转录语音

文本频道

  • send_message -向文本频道发送消息

帮会管理

  • list_guilds -列出机器人所在的所有公会
  • list_channels -列出公会中的所有频道

语音转录

机器人使用:

  • 语音活动检测(VAD) 检测用户何时讲话
  • 谷歌双子座 用于精确的语音到文本转录
  • 自动静音检测 分割语音

成绩单保存到 ./transcripts JSON格式的目录。

文本转语音

机器人可以通过以下方式在语音通道中说话:

  • ElevenLabs API 用于听起来自然的语音
  • 可配置的语音选择
  • 流媒体音频播放

建筑

discord-bot-mcp/
├── src/
│   ├── index.ts          # MCP server entry point
│   ├── config.ts         # Configuration management
│   ├── services/
│   │   ├── discord-bot.ts    # Discord bot service
│   │   ├── transcription.ts  # Voice transcription service
│   │   └── elevenlabs.ts     # TTS service
│   └── utils/
│       ├── logger.ts          # Logging utility
│       └── transcript-logger.ts # Transcript file management

环境变量

变量 描述 默认值
DISCORD_BOT_TOKEN Discord机器人令牌 必填
DISCORD_CLIENT_ID 应用程序客户端ID不一致 必填
GEMINI_API_KEY Google Gemini API密钥 必需
ELEVENLABS_API_KEY ElevenLabs API密钥 必需
ELEVENLABS_VOICE_ID TTS的语音ID Au8OOcCmvsCaQpmULvvQ
GEMINI_MODEL 使用Gemini模型 gemini-1.5-flash-002
LOG_LEVEL 日志记录级别 info
ENABLE_TRANSCRIPT_LOGGING 将成绩单保存到文件 true
TRANSCRIPT_DIR 成绩单目录 ./transcripts

测试

卷曲快速测试(无状态)

# Start the server
pnpm dev:sse

# Test with curl (no session needed)
curl -X POST http://localhost:3003/message \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "bot_status",
      "arguments": {}
    },
    "id": 1
  }'

# List available tools
curl -X POST http://localhost:3003/message \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc": "2.0", "method": "tools/list", "params": {}, "id": 1}'

# Check server status
curl http://localhost:3003/status

会话状态操作

对于有状态的操作(如设置当前服务器/通道),创建一个会话:

# Create a session
SESSION_ID=$(curl -s http://localhost:3003/session | python3 -c "import sys, json; print(json.load(sys.stdin)['sessionId'])")

# Use the session for stateful operations
curl -X POST "http://localhost:3003/message?sessionId=$SESSION_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "view_server",
      "arguments": {"server_name": "RustyButter"}
    },
    "id": 1
  }'

# Now list channels will show channels from the current server
curl -X POST "http://localhost:3003/message?sessionId=$SESSION_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "list_channels",
      "arguments": {}
    },
    "id": 2
  }'

会话在服务器端保持30分钟的不活动状态。

许可证

麻省理工学院