概要
Discord の BOT でボイスチャンネル (以下 VC) に接続して音楽を流す.言語は Ruby.
当記事で BOT の作り方には触れないので私の過去の記事を,Discordrb に関する詳しい内容は Discordrb の GitHub を参照されたい.
環境
- OS: Rocky Linux 9.3
- 言語: Ruby 3.0.4
ライブラリの準備
Discord の BOT が VC に接続するには,以下のライブラリが必要.
- libsodium: 暗号処理ライブラリ
- libopus (Opus): 音声圧縮ライブラリ (FFmpeg が使用)
- FFmpeg: メディア処理ライブラリ
以下にライブラリのインストール手順を記載するが,環境によって異なるので注意されたい.
libsodium をインストール
# EPEL をインストールして,拡張パッケージを利用可能にする
sudo dnf config-manager --set-enabled crb
sudo dnf install epel-release
# libsodium をインストールする
sudo yum install libsodium
libopus をインストール
# パッケージ名を確認する
yum list available | grep opus
# Opus をインストールする
sudo yum install opus
sudo yum install opus-devel
sudo gem install opus-ruby
FFmpeg をインストール
# パッケージ名を確認する
yum list available | grep ffmpeg
# FFmpeg をインストールする
sudo yum install ffmpeg-free
音声ファイルの準備
再生したい音声ファイルを設置する.
今回は BOT 本体のファイル名を run.rb
とし,同階層にディレクトリ music/
を作成する.再生する音楽のファイル名を test.mp3
とし,music/
配下に置く.
.
├── music
│ └── test.mp3
└── run.rb
実装
require 'discordrb'
client_id = ... # 用意したクライアント ID を添付
token = '...' # 用意したトークンを添付
bot = Discordrb::Commands::CommandBot.new(client_id: client_id, token: token, prefix: '/')
# 音楽を再生する
bot.command :play do |event|
# イベントを発火させたユーザーが接続している VC (Discordrb::Channel) を取得する
channel = event.user.voice_channel
# VC に接続する
event.bot.voice_connect(channel)
# Voice Bot (Discordrb::Voice::VoiceBot) を取得する
voice_bot = event.bot.voice(event.channel)
# 音量を設定する (0 以上の実数,1 で 100%)
voice_bot.volume = 1
# 音楽を再生する
voice_bot.play_file("music/test.mp3")
end
# 音楽を停止する
bot.command :stop do |event|
# Voice Bot (Discordrb::Voice::VoiceBot) を取得する
voice_bot = event.bot.voice(event.channel)
# 音楽の再生を停止する
voice_bot.stop_playing()
# VC から切断する
event.bot.voice_destroy(event.server)
end
使用
- Discord の任意の Server に BOT を招待
- VC に接続する
- テキストチャンネルで
/play
と送信すると,音楽が再生される - テキストチャンネルで
/stop
と送信すると,音楽が停止する