pydubをめぐる試行錯誤(1)
これまでの話
これまで、pythonで音声ファイルを扱うのに、最近メンテナンスされていなさそうなpydubのmoduleを使うのを避ける意図で、再生の機能としては、playsound3やjust_playback、加工には、librosaを使ってきました。
・・などとやってきたわけですが、とうとう堪え切れなくなって(?)pydubもffmpegもインストール状態にしちゃった、というのが前回の話
縛りを外して「もうpydubを使うことにするよ」という前提に立つならば、各場面のコードのお作法はまた随分違ってくるはずで、あらためて見直しておこうと思います。
音声再生方法
playsound3
from playsound3 import playsound
playsound("test.mp3")
playsound3だと、デフォルトでは、制御を返してしまわないよう、ブロックするようになっている。なので、これだけで曲の最後まで鳴る。
(ただし、非同期の手法を覚えた後は、簡易的にチョッとだけ再生したい場合を除き、ブロックは良くないと思っているところです。)
just_playback
playsound3と違ってjust_playbackはブロックしないので、例えばこれではダメ、鳴らない。
from just_playback import Playback
playback = Playback()
playback.load_file("test.mp3")
playback.play()
でも、sleepを入れると鳴らすことができます。
import time
from just_playback import Playback
playback = Playback()
playback.load_file("test.mp3")
playback.play()
while playback.active:
time.sleep(0.1)
このあと、customtkinterと組み合わせたり、非同期にしたり、自作Playerクラスにまとめたり・・(略)・・という感じで落ち着きかけたところです。
pydubの場合
今回、「pydub無しの縛り」を外したので、copilot先生に聞いてみます。
パーミッションエラー
まず、「ブロック再生のサンプルコード」を実行しました。がパーミッションエラーが出ます。そのことをCopilotに伝えると、
一つ一つ試してみます。
管理者権限で実行・・失敗
こんな表示が出ますが無視。
実行するとやはり管理者権限でもパーミッションエラーが出ました。
テンポラリディレクトリの変更・・失敗
このアドバイスもやったけど、同じくパーミッションエラー。
PyAudioを確認・・成功
堂々巡りになりそうだったので、ネット情報検索。すると、まさにその話がありました。
回答の中に
>For windows, installing PyAudio solved the issue of permissions.
というものがあって、どうもズバリっぽい。
pip listやってみると当方の環境に、PyAudioはインストールされていなかった。
pip install PyAudio をやってから
from pydub import AudioSegment
from pydub.playback import play
# オーディオファイルをロード
audio = AudioSegment.from_file("test.mp3")
# オーディオセグメントを再生(ブロック)
play(audio)
で、無事音楽鳴りました。
そもそも、PyAudioインストール以前のエラーでも、「PyAudioが無い」みたいな警告は出ておらず、パーミッションの指摘だけだった。Copilotでも流石にいきなりズバリな正解には至らなかったようです。
初心者はハマりそうだ罠
私のような初心者は、何が悪いのかわからなくてさんざん悩む。
ベテランは、PyAudioなどは既に使用中の環境内にインストール済みであるから、何の問題もなく動作する。で、「なんでこんな簡単なこともできないの?」みたいな話になりかねない。
認識にギャップが生じる罠だと思いました(^_^;)。
この記事が気に入ったらサポートをしてみませんか?