日常

Discord音楽BOTを自作して動かしてみた

· 5分で読めます

こんにちは!

一時期、Discordの有名音楽Botたちが相次いでサービスを終了したことを覚えているでしょうか?
日常的に音楽機能を使っていた私たちにとって、それは大きな打撃でした。

「それなら、自分たちが一番使いやすくて、最高にオシャレな音楽Botを自分で作ってしまおう!」

そう思い立ち、ゼロからBotを開発することにしました。この記事では、コンセプト設計からこだわりを詰め込んだ機能の実装、そして直面した技術的な壁を乗り越えるまでの開発プロセスを詳しく書き残します。同じようにBot開発をしてみたい方の参考になれば幸いです!

1. どんなBotを目指したか?

ただ「音楽が流れるだけ」のBotなら既存のオープンソースでも実現できます。今回、自作するにあたって、私は以下の3つのこだわりをテーマに掲げました。

1.チャットが汚れないUI

コマンド連打ではなく、ボタン操作できる「専用コントロールパネル」を常に最新の1枚だけ表示する。

2.無限オートプレイ

曲が途切れたら、最初に流したアーティストのテイストを引き継いで自動選曲し続ける。

3.視覚的な楽しさ

今流れている曲のアートワーク画像をリアルタイムに合成した「再生カード」を表示する。

2. ベースの構築

Discord Bot開発のスタンダードである discord.js と、音楽再生処理を強力にサポートしてくれる discord-player を組み合わせるのが最適と判断。

また、YouTubeなどの音源メタデータを高精度かつ安定して解決するため、バックエンドで yt-dlp と play-dl が動くハイブリッドなカスタム・エクストラクターを自作し、再生の安定性を確保しました。

3.ビジュアルとパネルUIの実装

まず着手したのは、ユーザーが最も目にする「コントロールパネル」と「ビジュアルカード」です。

Jimpによる再生カードの動的生成

「今どんな曲が流れているか」を直感的に伝えるため、画像処理ライブラリ Jimp を導入しました。
曲のアートワーク画像、タイトル、アーティスト名、そして現在の再生位置を示す進捗バーをBot内部で動的にレンダリングし、1枚の美しい「Now Playing カード」として出力する機能を実装しました。

ボタン式コントロールパネル

一時停止、スキップ、音量調整、ループ切り替え、お気に入り登録などを、Discordのボタンで構築しました。
チャット欄には「常に1つだけ」固定で表示され、再生状態に応じてリアルタイムにボタンの有効・無効状態が切り替わるスマートなUIが完成しました。

4. 最大の難所「アーティスト特化型オートプレイ」の自作

次に、Botの知能となる自動再生のロジック挑みました。これが最大の難所でした。

単に関連曲を検索するだけだと、YouTubeの関連動画アルゴリズムに引っ張られ、すぐに「J-POPメドレー」や汎用的な作業用BGM動画に脱線してしまい、アーティストの世界観が壊れてしまいます。そこで、独自の検索・選曲アルゴリズムを設計しました。

Origin Artistの追跡

ユーザーが最初に手動で再生したアーティストの名前を、Botが「Origin Artist」として内部メモリに記憶します。 次の曲を自動選曲する際も、このOrigin Artist名をベースに [アーティスト名] 人気曲 や [アーティスト名] おすすめ といったクエリで検索をかけ続けるようにしました。これにより、アーティストの世界観から大きく逸脱するのを防いでいます。

タイトルの正規化による重複排除

同じ曲のライブ版とMV版が連続して選曲されるのを防ぐため、検索結果の曲名から余計なノイズ文字(【MV】 や [Official Video] )などをトリミングする正規化処理を実装。トリミング後のタイトル類似度を比較し、重複を弾くフィルターを組み込みました。

5.徹底的な安定化とブラッシュアップ

主要な機能が形になった後、実際に自分のサーバーでテスト運用する中で直面した「非同期の罠」や「再起動時の挙動」をクリアしていきました。

非同期の競合の解消

「次の曲を事前にロードする」という処理がミリ秒単位で2重起動し、キューに同じ曲が2つ追加されてしまうバグに直面しました。 これに対しては、キューの追加処理の前に多重起動防止のロックを細かく配置することで解決しました。

セッション復元 & 古いパネル削除

Botがアップデートなどで再起動した際、ボイスチャンネルへの自動再接続はもちろん、「再起動前にチャット欄に残っていた古い操作パネル」を自動で検索して消去し、新しいパネルを再投稿するというセッション復旧処理を実装しました。 これにより、古いボタンパネルがチャット欄に何個も放置されて散らかる問題を完璧に防ぐことができました。

6. 完成させてみて

こうして、自分が理想とする高機能でチャット欄を汚さず好みの曲を無限に流し続けてくれる専用Botが完成しました!

ロジックを組んだオートプレイからお気に入りの曲が流れてきた時の感動は、自作ならではの最高の体験です。

今後はさらに、プレイリストのインポート機能や、音質のイコライザー調整機能などを追加して、さらに使いやすくアップデートしていこうと思います!

最後まで読んでいただき、ありがとうございました!

コメントを書く

メールアドレスが公開されることはありません。 が付いている欄は必須項目です