如何使用ChatGPT创建Discord语音机器人 - Blockchain.News

如何使用ChatGPT创建Discord语音机器人

realtime news Sep 06, 2024 07:15

学习构建一个集成了ChatGPT的Discord语音机器人,利用Node.js、AssemblyAI和ElevenLabs进行智能响应。

如何使用ChatGPT创建Discord语音机器人

Discord是一款流行的即时通讯和社交媒体平台,深受在线社区、主播和玩家的喜爱。其最受欢迎的功能之一是语音频道,允许成员通过语音和视频进行连接。对于开发者来说,Discord的另一个显著优势是其可定制性,可以创建机器人添加新功能。根据AssemblyAI的说法,本教程将指导你开发一个Discord机器人,该机器人可以加入语音频道,转录音频,通过ChatGPT生成智能响应,并将这些响应转换回语音。

设置机器人

要构建这个Discord机器人,你将使用Node.js以及AssemblyAI作为语音转文字服务、OpenAI作为智能响应服务、ElevenLabs作为文字转语音服务。假设你熟悉JavaScript和Node.js,以及设置Node.js项目、安装依赖和编写基本的异步代码。

首先,确保你安装了Node.js(版本18或更高),并具有管理员权限访问Discord服务器。创建一个项目目录并初始化Node.js项目:

mkdir discord-voice-bot && cd discord-voice-bot
npm init -y

安装所需的依赖包:

npm install discord.js libsodium-wrappers ffmpeg-static @discordjs/opus @discordjs/voice dotenv assemblyai elevenlabs-node openai

将API密钥存储在.env文件中以确保安全:

OPENAI_API_KEY=
ASSEMBLYAI_API_KEY=
ELEVENLABS_API_KEY=
DISCORD_TOKEN=

设置Discord开发者账户,创建应用程序,启用必要的权限,并将机器人令牌保存在.env文件中。使用生成的URL将机器人添加到你的服务器。

开发Discord语音机器人功能

该机器人将加入语音频道,记录音频,并使用AssemblyAI进行转录,通过ChatGPT生成响应,并使用ElevenLabs将这些响应转换为语音。

加入语音频道

让机器人响应!join命令并进入语音频道,更新index.js文件:

const { joinVoiceChannel, VoiceConnectionStatus } = require("@discordjs/voice");

client.on(Events.MessageCreate, async (message) => {
  if (message.content.toLowerCase() === "!join") {
    channel = message.member.voice.channel;
    if (channel) {
      const connection = joinVoiceChannel({
        channelId: channel.id,
        guildId: message.guild.id,
        adapterCreator: message.guild.voiceAdapterCreator,
      });

      connection.on(VoiceConnectionStatus.Ready, () => {
        message.reply(`已加入语音频道: ${channel.name}!`);
        listenAndRespond(connection, message);
      });
    } else {
      message.reply("你需要先加入语音频道!");
    }
  }
});

记录和转录音频

从语音频道捕获音频流,并使用AssemblyAI进行转录:

const { AssemblyAI } = require("assemblyai");
const assemblyAI = new AssemblyAI({ apiKey: process.env.ASSEMBLYAI_API_KEY });

const transcriber = assemblyAI.realtime.transcriber({ sampleRate: 48000 });

transcriber.on("transcript", (transcript) => {
  if (transcript.message_type === "FinalTranscript") {
    transcription += transcript.text + " ";
  }
});

async function listenAndRespond(connection, message) {
  const audioStream = connection.receiver.subscribe(message.author.id);
  const prism = require("prism-media");
  const opusDecoder = new prism.opus.Decoder({ rate: 48000, channels: 1 });
  audioStream.pipe(opusDecoder).on("data", (chunk) => {
    transcriber.sendAudio(chunk);
  });

  audioStream.on("end", async () => {
    await transcriber.close();
    const chatGPTResponse = await getChatGPTResponse(transcription);
    const audioPath = await convertTextToSpeech(chatGPTResponse);
    playAudio(connection, audioPath);
  });
}

使用ChatGPT生成响应

使用OpenAI的GPT-3.5 Turbo模型生成智能响应:

const { OpenAI } = require("openai");
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

async function getChatGPTResponse(text) {
  const response = await openai.completions.create({
    model: "gpt-3.5-turbo",
    prompt: text,
    max_tokens: 100,
  });
  return response.choices[0].text.trim();
}

使用ElevenLabs将文字转换为语音

使用ElevenLabs将ChatGPT响应转换为语音:

const ElevenLabs = require("elevenlabs-node");
const voice = new ElevenLabs({ apiKey: process.env.ELEVENLABS_API_KEY });

async function convertTextToSpeech(text) {
  const fileName = `${Date.now()}.mp3`;
  const response = await voice.textToSpeech({ fileName, textInput: text });
  return response.status === "ok" ? fileName : null;
}

结论

本教程展示了如何创建一个集成了AssemblyAI用于语音转录、OpenAI的GPT-3.5 Turbo模型用于智能响应、以及ElevenLabs用于语音合成的高级Discord语音机器人。本项目展示了现代AI和语音技术在创建互动、可访问和引人入胜的应用程序方面的潜力。

Image source: Shutterstock