はじめに
Replitは手軽で使いやすい開発環境でありながら、一部の上位ディレクトリへのアクセス権が制限されていることがあります。これは、セキュリティや環境の一貫性を保つための措置であり、一般的には安全な開発をサポートしています。しかし、discord.pyで音声を再生する場合、特にFFmpegPCMAudio
やPCMVolumeTransformer
を使用する際には、この制約がいくつかの課題になります。
この記事では、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を開く
2. ffmpegを追加する
ffmpeg
で検索をかけると画像のような項目が見つかるのでインストールします。(画像はインストール後のものです)
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')
を実行します。FFmpegPCMAudio
やPCMVolumeTransformer
を使用する前であればどこでも構いませんが、お勧めはdiscord.Client
やdiscord.ext.commands.Bot
のインスタンスを作成した直後です。
例:
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]
を実行して音声関連の機能をインストールして下さい。