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