【非エンジニアが挑む】ついにDiscordの常駐Botが完成|「VPSである意味」にようやく到達した話

「【非エンジニアが挑む】ついにDiscordの常駐Botが完成 シリーズ最終話⑥」の表示

前回の記事:⑤:機能追加1弾目はこちら

ここまで5回にわたって記事を書いてきました。

それでも、正直なところ「VPSである意味がまだ弱い」と、自分自身感じ続けていました。

今回は、VPSならではの機能を追加していく回です。

ブラウザからアクセスしなくても、外部サービスを介してチャットを繰り返せるようにすることで、その「意味」を見出していく記事になります。

Tomoya

24時間常駐するシステムを、外部サービスから動かしてみる

これには少しわくわくしています。


目次

なぜDiscord Bot化なのか、改めて整理する

Webサイト上での会話継続は、理屈の上ではサーバーレスでも実現できてしまう、という弱さがありました。

実際、自分が運営しているScriptSpeakも、チャットではありませんが、ブラウザから音声を作成して活用できるサービスで、サーバーレスの仕組みで動いています。

つまり、今の段階のシステムだけであれば、同じようにサーバーレスでも十分構築できてしまうのです。

もう少し先をイメージしてAIに相談してみたところ、たどり着いたのがコミュニケーションツールである「Discord」という外部サービスから動かす、という方向でした。

「常時待ち構えていて、いつ呼びかけても即座に応答できる」という性質にこそ、VPSの強みが表れるはずだと、改めて考え直しました。


テキストBotとボイスBot、範囲を決める

VPSと外部サービスを接続すること自体、今回が初めての経験だったので、少し慎重に進めることにしました。

まずは「テキストBot」——メッセージを送ると、テキストと音声ファイルで返信が来る形で、一通りのシステムを構築する方針にしました。

Tomoya

この判断は良かったと思っています。

判断に対して思った事

開発において、あれもこれもと最初から手を広げてしまうと、収拾がつかなくなる心配があったからです。

最初は慎重に、慣れてきたら少しずつ大胆に、というやり方を、これからも大事にしていきたいと思いました。


Discord Developer Portalでの準備

Tomoya

まずは、Discord側の準備をAIにサポートしてもらいながら進めていきました。

STEP
Discord Developer Portalでアプリケーション(Bot)を作成する
  1. Discord Developer Portalにアクセスし、Discordアカウントでログイン
  2. 「New Application」から、新しいアプリケーションを作成(名前は好きなもの、例:「VoiceChatBot」)
  3. 左メニューの「Bot」を開き、「Add Bot」(すでに追加されている場合はそのまま)
  4. 「Reset Token」→「Yes, do it!」で、Botのトークン(今回の【鍵】にあたるもの)を発行し、コピーして保管する

注意:このトークンも、これまでのAPIキーやWebhook URLと同じ扱いです。記事には載せず、.envで管理してください。

STEP
必要な権限(Intents)を有効にする

同じ「Bot」の設定画面の中に、「Privileged Gateway Intents」という項目があります。

ここで「MESSAGE CONTENT INTENT」を必ずONにしてください

これがオフのままだと、Botはメッセージの中身を読み取ることができません(Discord側のセキュリティ強化により、これは明示的にONにする必要があります)。

STEP
Botをサーバーに招待する
  • 左メニューの「OAuth2」→「URL Generator」を開く
  • 「SCOPES(範囲)」で「bot」にチェック 「BOT PERMISSIONS(Bot 権限)」で、最低限として以下にチェック
    • Send Messages(メッセージを送る)
    • Read Message History(メッセージを読む)
    • Attach Files(音声ファイルを添付する)
  • 一番下に生成されたURLをコピーし、ブラウザで開いて、Webhookを設定したのと同じサーバーに招待する
Discord Developer PortalでボットのOAuth2/Bot設定やトークンリセット画面を強調した表示
Discord Developer Portal上で、VoiceChatBotの設定項目やアクセストークンの再発行手順を確認する画面です。

Discord自体のアカウントは持っていたものの、開発者向けの高度な機能を使うのは初めてで、恐る恐る進めた部分もありましたが、AIのサポートのおかげでスムーズに進められました。ここで得た知識は、今後もDiscordを何かの開発に組み込むきっかけになりそうで、視野が少し広がった感覚があり、嬉しかったです。

Botのトークンを発行し、.env.localに追加します。後のVPSにもnanoエディタから環境変数にセットする予定です。

DISCORD_BOT_TOKEN="発行したトークン"
DISCORD_BOT_SPEAKER_ID=52

既存の資産をそのまま再利用できた喜び

必要なライブラリを追加し

npm install discord.js

Cursorには、次のような方針で実装を依頼しました。

discord.jsを使って、Discord上でテキストメッセージに応答するBotを
実装してください。

・Botがメッセージを受け取ったら、既存のGemini応答処理にそのまま渡す
・その応答をVOICEVOXの音声合成処理に渡し、音声ファイルを生成する
・テキストと音声ファイルの両方をDiscordのチャンネルに返信する
・会話履歴はチャンネル・ユーザーごとにメモリ上で保持する
・Bot自身のメッセージには反応しないようにする
・既存のGemini・VOICEVOXの関数は書き直さず、そのまま再利用する

ポイントは、Gemini・VOICEVOXの処理を一切書き直さなかったことです。

これまでの記事で作ってきた「音声メッセージ→Gemini→VOICEVOX」という処理を、Discord用に必要な環境変数を追加しただけで、そのまま呼び出せる形にしてもらいました。

ローカルで動かしてみます。Discordの該当サーバーでチャットして確認。

npm run discord-bot
Tomoya

Discordでメッセージを送ってみると、何事もなく、無事に音声付きで返ってきました。

作り直しなしで、これまでの積み重ねがそのまま活きたことに、大きな喜びを感じました。ローカルで動作を確認できたので、次はいよいよVPSに反映していきます。しかし、ここでアクシデントが発生しました。

DiscordでVoiceChatBotが「入力中...」からテキストと音声レスポンスを返答するまでの変化
Discord上でボットが入力中状態から音声付きで応答テキストを返信完了するまでの動作フローを示しています。

以下のリンクから月額プランを契約すると、初月は半額で利用できます。コストが心配な方でも、最初の1か月は最低10ドルから試せるので、気軽に始めやすいと思います(解約も簡単にできます)。


pm2で管理する仕組みは同じ、でも中身は全く違う

Tomoya

これは実装を進める中で驚いたポイントです。

Discord Botも、これまでと同じようにpm2で常駐化していくのですが、今回はポート開放もファイアウォールの設定も一切必要ありませんでした

pm2 start npm --name discord-bot -- run discord-bot
pm2 list
pm2 save
これまでのpm2との役割の違い
これまでのWebサーバー(Next.jsアプリ)

「外部からのアクセスを待つ」仕組み。ブラウザからURL検索でアクセス。

Discord Bot

「自分からDiscordに接続しにいき、その接続を繋ぎっぱなしにする」仕組み。

常駐化はしているのに、ブラウザでアクセスして使うものではない——ここは、最初は少し理解が難しいと感じたポイントでした。

AIのサポートがなければ迷っていたと思いますが、案内された通りに進めることで、次の確認で無事に動作していることが確認でき、ほっとしました。


VPSでのトラブル、そして解決

ローカルでは問題なく動いたので、同じようにVPSへ反映させようとしたところ

git pullができなくなるという壁にぶつかりました。

error: Your local changes to the following files would be overwritten by merge:
        frontend/next-env.d.ts
原因

next-env.d.tsというNext.jsが自動生成するファイルが、VPS側とGitHub側の両方で更新されており、衝突を起こしていたことでした。

「VPS側の(自動生成された)変更を、先に消すか確定するかしないと上書きできません」と、Gitに止められている状態だったのです。

Tomoya

VPSを扱っていると、こういうエラーも起きるのかと、正直驚きました。

何となく「新しい方でどんどん上書きされていくもの」だと思い込んでいましたが、自動生成ファイルに関しては、どちらか一方に決めてあげる必要がある

Tomoya

これは今回のテーマを通して、新しく学んだポイントでした。

対処は、以下のコマンドで解決できました。

git checkout -- next-env.d.ts
git pull
git checkoutおよびgit pullを実行し、discord-bot.ts等のファイルを更新したターミナル画面
特定のファイルの変更を取り消した上でgit pullを実行し、最新コードを取得した際のログ画面です。

続けて表示されたMissing script: "discord-bot"というエラー

実はまだgit pullが正しく完了していない状態のまま、pm2 startを実行してしまっていたことが原因でした。

git pullが無事に成功した後は、このエラーも自然と解消されました。

今後同じ問題が起きないよう、.gitignorenext-env.d.tsを追加する対応も、あわせて行っています。

npm install
npm run build
echo $?
pm2 restart discord-bot
pm2 save
「VPS経由の本番テスト」としてDiscord上でVoiceChatBotが料理の提案と音声回答を返す画面
VPS上で稼働するVoiceChatBotが、Discordのチャット内でテキストと音声ファイルを返信しているテスト画面です。

ついに到達した瞬間

こうして、VPS上で音声生成チャットAIを構築し、Discordを介して会話ができる状態に、ついに到達しました!!

これこそが「VPS上である意味」なのだと思うと、大きな達成感を覚えました。

システム完成の感想:

実際に使うかどうかはまだわかりませんが、気が向いた時にふとDiscordから話しかければ、雀松朱司や春歌ナナの声で返事が返ってくる

ローカルPCの電源を切っていても、ブラウザを開いていなくても、です。

これは、気軽に使えて、かつ「常に起きていてくれる」という安心感があり、想像していた以上に良い体験だと感じています。


シリーズを振り返って

今回のテーマは、段階を踏んで少しずつ改良を重ねながら、自分が思い描いていたイメージに近づけていけたと感じています。1本1本の記事は長くなってしまいましたが、その分の密度で書けているので、自分自身の成長にもつながっているのではないかと思います。

Tomoya

VPSを使う以上は、VPSならではのシステムを作ることを、これからも目指していきたいです!

引き続き検証と学習を重ねながら、このブログで共有していこうと思うので、温かい目で見守っていただけると嬉しいです。感想やコメントがあれば、どんな内容でも大歓迎です。

これまでのシリーズ記事の全て

①:テーマ選定

②:基盤構築(土台作り)

③:実装編(MVP)

④:VPSに反映(MVP)

⑤:VPS上である意味の為に機能追加(発展)

Tomoya

これがこのシリーズの元になったサービスです!

※自分が運営しているサービスです


次回予告

正直、まだ次のテーマは決まっていません。またAIと相談しながら、次に検証してみたいテーマを見つけていこうと思います。しばらくお待ちください。

「全6シリーズ完結」の文字とこれまでの記事サムネイル群が並べられたまとめ画像

以下のリンクから月額プランを契約すると、初月は半額で利用できます。コストが心配な方でも、最初の1か月は最低10ドルから試せるので、気軽に始めやすいと思います(解約も簡単にできます)。

他のVPSは「さくらインターネットから!」

前回のおすすめ記事はこちらから

VPSを使った24時間稼働システムを作成した記事はこちら

「【非エンジニアが挑む】ついにDiscordの常駐Botが完成 シリーズ最終話⑥」の表示

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

始めまして。このブログを運営するTomoyaです。
未経験個人開発者。AI×個人開発(Vibe Cording)で学習して参入してくれる人が増えて広がっていくと良いなと思って始めました。

実際に作成→デプロイ(公開)→運営を行ってそれについての問題や疑問を記録していきます。
また行っていく上で内容(セキュリティ・制限など)にもこだわっていきたいなと思っています。

コメント

コメントする


目次