LoginSignup
36
37

More than 5 years have passed since last update.

Discord.pyで音声を流すbotを作る

Last updated at Posted at 2018-03-16

概要

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に関しては音声を流すときのみ使用されるために手動でインストールする必要があります。

Ubuntu16.04でのインストールコマンド
$ pip3 install pynacl
$ sudo apt install libffi-dev

以上で必要パッケージのインストールは終了です。

とはいかないんですよね。
公式に記載はありませんが、もう1つ追加で必要なパッケージがあります。
- ffmpeg

ffmpegというコマンドが音声を流すために使用されます。これコードの中身を見ないと気づかないからかなり不親切。
Windows,Macで音声botを実行する場合、この「ffmpegコマンドインストール」する手順をそれぞれのOSでのインストール方法に置き換える必要があります。
ubuntuでは以下コマンドでインストール。

ffmpegのインストール手順
$ sudo apt install ffmpeg

そしてDiscord.pyにはYoutubeのURLを指定して、その音声を流す機能も実装されています。
その機能を使用するために以下のパッケージが必要となります。
- youtube_dl

youtube_dlインストール手順
pip3 install youtube_dl

名前の通り一度Youtubeの動画をローカルに落とすライブラリなので、ご利用は計画的に。。。

コード

bot.py
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プレイヤーとして楽しむなら既存のものを使用したほうが良いですし。。。
他に何か面白い用途があればコメントで教えてください!

36
37
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
37