概要
Bot自体の作り方は以下の記事を参考にどうぞ。
Pythonで簡単なDiscord Botの作り方
タイトル通り、Discordにmp3を流すBotを作っていきます。
ざっくり検索した程度ですが、Discord.pyを用いて任意のチャンネルに音声を流す記事やコードが見当たらなかったので、
実際に動くコードも添えて、動作させるまでに自分が詰まったポイントなどを明記していきます。
環境
今回自分が使用したOSはUbuntu 16.04です。
やろうと思えばMac, Windowsでもおそらく出来るのですが、動かすまでにコストがかかるイメージがあるので個人的にはLinuxをおすすめしておきます。
VirtualBoxとか使って仮想でもいいのでLinux環境を整えましょう。
必要パッケージ
Discord.pyには依存パッケージがあります。
公式に記載されているのは以下の4つ。
- aiohttp
- websockets
- PyNaCl
- libffi-dev
aiohttpとwebsocketに関してはDiscord.pyに依存関係があるためにpipが解決(同時に勝手にインストール)してくれるのですが、
PyNaclとlibffi-devに関しては音声を流すときのみ使用されるために手動でインストールする必要があります。
$ pip3 install pynacl
$ sudo apt install libffi-dev
以上で必要パッケージのインストールは終了です。
とはいかないんですよね。
公式に記載はありませんが、もう1つ追加で必要なパッケージがあります。
- ffmpeg
ffmpegというコマンドが音声を流すために使用されます。これコードの中身を見ないと気づかないからかなり不親切。
Windows,Macで音声botを実行する場合、この「ffmpegコマンドインストール」する手順をそれぞれのOSでのインストール方法に置き換える必要があります。
ubuntuでは以下コマンドでインストール。
$ sudo apt install ffmpeg
そしてDiscord.pyにはYoutubeのURLを指定して、その音声を流す機能も実装されています。
その機能を使用するために以下のパッケージが必要となります。
- youtube_dl
pip3 install youtube_dl
名前の通り一度Youtubeの動画をローカルに落とすライブラリなので、ご利用は計画的に。。。
#コード
import discord
client = discord.Client()
@client.event
async def on_message(message):
if message.author.bot:
return
voice = await client.join_voice_channel(client.get_channel("Discord voice channel ID"))
if message.content == ("lecture"):
player = await voice.create_ytdl_player('https://www.youtube.com/watch?v=aFI1SItR8tg')
player.start()
if message.content == ("bgm"):
player = voice.create_ffmpeg_player('bgm.mp3')
player.start()
client.run("Your discord token")
コード自体はとてもシンプルです。
"Discord voice channel ID" や "Your discord token" は皆さんの環境のIDやトークンに変更してください。
チャット欄にlectureと打てばYoutube上のbot作成のレクチャー動画の音声が流れ、
bgmと打てばローカル上に配置した(bgm.mp3を配置するディレクトリはbot.pyと同じところ)bgm.mp3が流れます。
python3 bot.py
個人的にわからなかったのがボイスチャンネルのID周りだった。
デフォルトではボイスチャンネルIDは表示できなく、Discord側の設定でデベロッパーモードにする必要がある。
あとclient.get_channelに渡すIDの型について、公式ドキュメントに明記されていなかったのでコードを読まなきゃダメだったとか。
静的型付けがない弊害。
#最後に
正直な所使い道はあまりないです。。。
一緒にゲームする人の声を録音して、コマンドでその音声を再生するのが一番楽しいかな。
自分の仲間内だと人工音声で流す音声作ってる人もいたり。
Musicプレイヤーとして楽しむなら既存のものを使用したほうが良いですし。。。
他に何か面白い用途があればコメントで教えてください!