3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Replitでdiscord.pyのFFmpegPCMAudioを使う

Last updated at Posted at 2023-12-17

はじめに

Replitは手軽で使いやすい開発環境でありながら、一部の上位ディレクトリへのアクセス権が制限されていることがあります。これは、セキュリティや環境の一貫性を保つための措置であり、一般的には安全な開発をサポートしています。しかし、discord.pyで音声を再生する場合、特にFFmpegPCMAudioPCMVolumeTransformerを使用する際には、この制約がいくつかの課題になります。

この記事では、Replit環境でdiscord.pyのFFmpegPCMAudioを利用するために必要な手順について解説します。

この記事の対象者

  • ある程度Pythonの知識があり、replitでdiscord.pyの音声クライアント関連の関数を利用したい

前提知識

  • ReplitのPython、discord.pyテンプレートはLinuxの環境で動作しています(シェルからunameコマンドで確認できます)
  • Windowsではバイナリが自動で読み込まれますが、その他のOSではdiscord.opus.load_opus(name)関数が必要です1

手順

1. システムの依存関係にffmpegを追加する

1. 新しいタブからSystem Dependenciesを開く

画像のように、システムの依存関係を扱うタブがあります。
replitのSystem Dependenciesの項目.png

2. ffmpegを追加する

ffmpegで検索をかけると画像のような項目が見つかるのでインストールします。(画像はインストール後のものです)
ffmpeg@5.1.3.png

2. libopusを扱えるディレクトリ内に配置する

1. 必要なファイルをダウンロードする

本来であれば少し面倒な作業が必要なのですが、今回は私がすぐ使えるようにしたものをGitHub上に公開しているのでそれを利用します。

libopus.tar.gzをダウンロードしてreplにアップロードします。
https://github.com/t3tra-dev/discordpy-ffmpeg-replit/blob/main/libopus.tar.gz

2. ファイルを展開する

アップロードした.tar.gzファイルをtarコマンドで展開します。

tar -zxvf libopus.tar.gz

3. libopusを読み込ませる

botを動かしているPythonファイルの任意の位置でdiscord.opus.load_opus('libopus/lib/libopus.so')を実行します。FFmpegPCMAudioPCMVolumeTransformerを使用する前であればどこでも構いませんが、お勧めはdiscord.Clientdiscord.ext.commands.Botのインスタンスを作成した直後です。

例:

main.py
import os

import discord
from discord.ext import commands

intents = discord.Intents.all()
bot = commands.Bot(command_prefix='!', intents=intents)
tree = bot.tree
discord.opus.load_opus('libopus/lib/libopus.so')


@commands.command()
async def play(ctx: commands.Context, url: str, volume=1):
    if ctx.guild.voice_client is None:
        vc = await ctx.author.voice.channel.connect(self_deaf=True)
      else:
        vc = ctx.guild.voice_client
    try:
        source = discord.FFmpegPCMAudio(url)
        source = discord.PCMVolumeTransformer(source, volume=float(volume))
        vc.play(source)
    except Exeption as e:
        await ctx.send(f"再生の過程でエラーが発生しました: {str(e)}")


bot.run(os.environ['TOKEN'])

この例では、入力されたURLをソースに音声を再生し、オプションの引数で音量が指定できるようになっています。

終わりに

最後まで読んで頂きありがとうございます。今回初めてQiitaの記事を書いたのでいくらか不備があると思います。その際は是非コメントで指摘して下さい。

追記

discord.pyの音声関連の機能がインストールされていないと正常に動作しません。その場合は

pip install discord.py[voice]

を実行して音声関連の機能をインストールして下さい。

  1. https://discordpy.readthedocs.io/ja/latest/api.html#opus-library

3
2
1

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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?