Python を 3.13 に上げてから、import pydub だけで次のエラーが出て止まります。最後の行は pyaudioop ですが、直す対象は1つ上のトレースバックに出ている audioop のほうです。
Traceback (most recent call last):
File "/usr/local/lib/python3.13/site-packages/pydub/utils.py", line 14, in <module>
import audioop
ModuleNotFoundError: No module named 'audioop'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<string>", line 1, in <module>
import pydub
File "/usr/local/lib/python3.13/site-packages/pydub/__init__.py", line 1, in <module>
from .audio_segment import AudioSegment
File "/usr/local/lib/python3.13/site-packages/pydub/audio_segment.py", line 11, in <module>
from .utils import mediainfo_json, fsdecode
File "/usr/local/lib/python3.13/site-packages/pydub/utils.py", line 16, in <module>
import pyaudioop as audioop
ModuleNotFoundError: No module named 'pyaudioop'
pyaudioop という名前で PyPI を探しても、入れるべきパッケージは見つかりません。標準ライブラリにも、その名前のモジュールはありません。一方で、pydub パッケージの中には pyaudioop.py というファイルが実際に入っています(site-packages/pydub/pyaudioop.py)。在るのにトップレベルの名前としては見つからない——この食い違いが、エラーの結論を原因から引き離しています。
pip install pydub 自体は成功します。止まるのは import の時点だけです。
直し方の要点を先に
pydub はそのままで、audioop-lts を入れます。
pip install audioop-lts
実測では、pydub==0.25.1 を固定したまま audioop-lts==0.2.2 を追加すると、Python 3.13 で import pydub が終了コード 0 で通りました。動かしたのは追加パッケージだけで、pydub の版も Python の版も下げていません。
requirements.txt に書くなら、Python 3.13 以上でだけ入るようにします。audioop-lts は 3.13 以上を対象にしたパッケージなので、3.12 以下も動かす構成では条件を付けます。
pydub==0.25.1
audioop-lts==0.2.2; python_version >= "3.13"
なぜ pyaudioop という名前が出るのか
pydub/utils.py は、先に標準ライブラリの audioop を読もうとし、失敗したときだけ pyaudioop を代わりに読む書き方になっています。上のトレースバックの 14 行目と 16 行目がその2段です。
Python 3.12 までは1段目の import audioop が成功するので、2段目は実行されません。3.13 で audioop が無くなると1段目が失敗し、フォールバックの import pyaudioop as audioop まで進みます。
このフォールバック先のファイルは、pydub の中に実在します。 それでも失敗するのは、import pyaudioop がトップレベルのモジュール名を探す絶対 import だからです。pyaudioop.py は pydub パッケージの中にあるので、この書き方では見つかりません。同じ場所から読むなら from . import pyaudioop という相対 import になります。pydub 0.25.1 のこの2行は、暗黙の相対 import が使えた Python 2 の書き方のまま残っているもので、フォールバック自体が Python 3 では機能しません。
Python が最後に表示するのは2段目の例外です。そのため、実際に消えたモジュール(audioop)ではなく、届かなかったフォールバック先の名前(pyaudioop)がエラーの結論として出ます。 検索してもほとんど情報が出ないのは、pyaudioop が PyPI にも標準ライブラリにも存在しない名前だからです。
During handling of the above exception, another exception occurred: の上を読むと、1段目に No module named 'audioop' が残っています。原因はそちらです。
なぜ Python 3.13 で出るのか
引き金は Python の版です。Python 3.12 では、同じ pydub==0.25.1 を入れても import pydub は通ります(3.12 にはまだ audioop がある)。3.13 に上げた後だけ、同じ依存構成で import が止まります。
audioop は音声データを扱う標準ライブラリでした。公式ドキュメントは、3.11 で非推奨、3.13 で削除と述べています。PEP 594(dead batteries)による一括削除の一部で、同じ 3.13 で他のモジュールも消えています。削除された標準ライブラリの一覧と受け皿パッケージの対応は Python 3.13 で cgi モジュールが削除された にまとめてあります。
pydub を上げる形では直りません。 PyPI に出ている pydub は 0.25.1 が最上位で、版指定なしで入れても同じ 2 段の import 連鎖になります(上流が追随版を出したら、この前提は変わります。pip index versions pydub で最上位が 0.25.1 のままかを確認してください)。直すのは audioop を戻す側です。
同梱の pyaudioop.py を相対 import へ書き換えるパッチは、本記事では扱いません。 site-packages の中を書き換える形になり、再インストールで消えます。その経路が音声処理まで通るかも検証していません(同梱の実装は Python 2 時代のもので、audioop-lts のような CPython 由来の移植ではありません)。
なお、PEP 594 で消えたモジュールの受け皿は多くが standard- を付けた名前ですが、audioop はその規則から外れます。standard-audioop は存在しないので、名前を組み立てて打つと外します(受け皿名の一覧はハブ記事の表にあります)。
切り分け
- エラーが
No module named 'audioop'で終わっていて、pydubが出てこない → pydub 以外のライブラリがaudioopを読んでいます。直し方(audioop-ltsを入れる)は同じです。読んでいるライブラリはトレースバックのFileの行で分かります。 - トレースバックの最後が、消えたモジュール名そのもので終わっている(
No module named 'imghdr'など)→ 同じ PEP 594 の削除ですが、フォールバックを挟まないぶん原因が直接見えている形です。その型は imghdr が依存ライブラリ経由で落ちる と telnetlib が依存ライブラリ経由で落ちる にあります。そちらは依存ライブラリを 3.13 対応版へ上げると直りますが、pydub には追随版がありません。 pip install pydubの時点で失敗している → 別の問題です。この記事の境界では install は成功し、import だけが止まります。audioop-ltsを入れたのにNo module named 'audioop'のまま → その Python が 3.13 以上か確認してください。audioop-ltsは 3.13 以上向けで、複数の Python が入った環境ではpipとpythonが別の実体を指していることがあります。python -m pip install audioop-ltsの形にすると、実行している Python に入ります。- 音を扱う処理そのものがエラーになる → 本記事で確認したのは
import pydubが通るところまでで、pydub の各機能がaudioop-lts上で期待どおり動くかは検証していません。pydub issue #839 にはaudioop-ltsを入れたあとAudioSegment.from_fileまで通ったという報告があります(errfix の実測ではなく、報告です)。 ffmpegが無いという警告が出る → pydub は音声の変換に外部のffmpegを使います。これは標準ライブラリの削除とは別の層で、この記事の境界には含まれません。
検証環境
- image:
python(digest 固定sha256:9662417a...、Python 3.13)、ネットワーク有り(PyPI から取得するため) - 再現:
pydub==0.25.1を入れてimport pydub→ModuleNotFoundError: No module named 'pyaudioop'で終了コード 1 - 修正:同じ
pydub==0.25.1のままaudioop-lts==0.2.2を追加してimport pydub; import audioop→ 終了コード 0 - 版の対照:
python:3.12.12-slimで同じpydub==0.25.1を入れてimport pydub→ 終了コード 0
再現から修正までは errfix の検証ハーネスが機械的に確認しています。reproduce と fix の差は追加した audioop-lts だけで、Python のイメージ・pydub の版・実行する import は同一です。audioop が 3.11 で非推奨・3.13 で削除であることは Python 公式ドキュメントによります。pydub 側で同じ import 連鎖が報告されていることは pydub issue #839 で確認しました。確認したのは import が通るところまでで、pydub の音声処理機能の動作は検証していません。