見出し画像

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などは既に使用中の環境内にインストール済みであるから、何の問題もなく動作する。で、「なんでこんな簡単なこともできないの?」みたいな話になりかねない。
 認識にギャップが生じる罠だと思いました(^_^;)。

この記事が気に入ったらサポートをしてみませんか?