본문 바로가기
블록체인 뉴스

ChatGPT를 활용한 디스코드 음성 봇 제작 방법

by 블록뉴스 2024. 9. 30.

ChatGPT를 활용한 디스코드 음성 봇 제작 방법 이미지

ChatGPT를 통합한 디스코드 음성 봇 개발하기 위한 Node.js, AssemblyAI, ElevenLabs 활용 방법

ChatGPT를 활용한 디스코드 음성 봇 제작 방법

디스코드는 온라인 커뮤니티, 스트리머, 게이머들에게 널리 사랑받는 인기 인스턴트 메시징 및 소셜 미디어 플랫폼입니다. 특히 디스코드의 음성 채널은 사용자들이 음성 및 영상으로 소통할 수 있어 가장 선호되는 기능 중 하나입니다. 또한, 개발자들이 디스코드의 다양한 기능을 활용해 봇을 만들 수 있는 높은 커스터마이징 가능성 역시 매력적인 이점입니다. 이 튜토리얼에서는 AssemblyAI에 따라 디스코드 봇이 음성 채널에 참여하고, 음성을 문자로 변환하고, ChatGPT를 통해 지능적인 응답을 생성하며, 이러한 응답을 다시 음성으로 변환할 수 있는 과정을 안내합니다.

봇 설정하기

디스코드 봇을 제작하기 위해 Node.js와 함께 AssemblyAI를 통한 음성-텍스트 변환, OpenAI를 통한 지능적인 응답 생성, 그리고 ElevenLabs를 통한 텍스트-음성 변환 기능을 활용할 예정입니다. 이 과정에서는 JavaScript와 Node.js에 대한 기본적인 지식과 함께 Node.js 프로젝트 설정, 필요한 종속성 설치, 기본 비동기 코딩 작성 능력이 필요합니다.

먼저, Node.js(버전 18 이상)가 설치되어 있어야 하며, 관리 권한이 있는 디스코드 서버에 접근할 수 있어야 합니다. 프로젝트 디렉토리를 생성하고 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=

디스코드 개발자 계정을 설정하고 애플리케이션을 생성한 후, 필요한 권한을 활성화하고 봇 토큰을 .env 파일에 저장하세요. 생성된 URL을 통해 봇을 서버에 추가합니다.

디스코드 음성 봇 기능 개발하기

봇은 음성 채널에 참여하고, 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(`Joined voice channel: ${channel.name}!`);
listenAndRespond(connection, message);
});
} else {
message.reply("You need to join a voice channel first!");
}
}
});

오디오 녹음 및 전사

음성 채널에서 오디오 스트림을 캡처하고 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를 통한 텍스트-음성 변환

ChatGPT의 응답을 ElevenLabs를 사용해 음성으로 변환합니다:

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;
}