Error [No module named 'aifc']

ModuleNotFoundError: No module named 'aifc' の直し方(Python 3.13 で SpeechRecognition の import が止まる)

FIX SUMMARY verified
Applies when
python@sha256:9662417aace5ae7b8e2609cce472b72a8958e134ba372808abe9cc1a0c0125e6SpeechRecognition 3.10.0 x CPython 3.13 (aifc removed by PEP 594)importing speech_recognition on Python 3.13: the package does an unconditional 'import aifc' at __init__.py line 11, and 3.13 removed aifc. Upstream 3.12.0 fixes it by declaring standard-aifc (and audioop-lts) for python_version >= 3.13, not by dropping the import

Verified: reproduced in python@sha256:9662417aace5ae7b8e2609cce472b72a8958e134ba372808abe9cc1a0c0125e6, then the No module named 'aifc' signature was gone after the fix (exit 0).

Python を 3.13 に上げると、import speech_recognition の行で止まります。

Traceback (most recent call last):
  File "<string>", line 1, in <module>
    import speech_recognition
  File "/usr/local/lib/python3.13/site-packages/speech_recognition/__init__.py", line 11, in <module>
    import aifc
ModuleNotFoundError: No module named 'aifc'

止まっているのは SpeechRecognition の __init__.py の 11 行目です。マイクを開く前でも、音声ファイルを読む前でもなく、import の途中で終わっています。依存の固定を変えずに Python 3.12 で同じ import を実行すると通ります。

直し方は 2 つあります。SpeechRecognition を 3.12.0 以上へ上げるか、版を動かせないなら standard-aifc を自分で入れるかです。

pip install --upgrade 'SpeechRecognition>=3.12.0'

ただし、上げても import aifc は消えません。3.12.0 でも最新の 3.17.0 でも、SpeechRecognition は aifc を import したままです。上げて動くようになるのは、その版が PyPI の代替パッケージを条件つきの依存として引くようになったからで、import aifc が当たる先が標準ライブラリから第三者の配布物に変わっただけです。この記事の後半は、そこから出てくる「上げたのに直らない」条件を扱います。

なぜ Python 3.13 で出るのか:aifc が標準ライブラリから消えた

aifc は AIFF 形式の音声を読み書きする標準ライブラリのモジュールです。Python 3.11 で非推奨になり、3.13 で削除されました(PEP 594)。SpeechRecognition 3.10.0 は __init__.py の 11 行目で import aifc、13 行目で import audioop を無条件に実行するので、3.13 では読み込みが最初の行で終わります。

予告は 3.11 と 3.12 に出ていて、消える版まで警告文そのものに書かれていました。

$ python -c "import aifc"
<string>:1: DeprecationWarning: 'aifc' is deprecated and slated for removal in Python 3.13

この警告が見えるのは、import aifc を実行したのが自分のトップレベルのスクリプトだったときだけです。 Python の既定フィルタは DeprecationWarning を __main__ の中でしか表示しません。SpeechRecognition 経由では import aifc を実行しているのがライブラリの内部なので、3.11 と 3.12 を通り過ぎるあいだ、この予告は端末に一度も現れません。CI で洗い出すなら -W error::DeprecationWarning を付けます(警告が例外に昇格し、終了コードが 1 になります)。

同じ削除で消えたモジュールは他にもあります。一覧と PEP 594 そのものの説明、警告フィルタの詳しい挙動は ModuleNotFoundError: No module named ‘cgi’ の直し方(Python 3.13 が標準ライブラリから削除した) にまとめてあります。

直し方1:SpeechRecognition を 3.12.0 以上へ上げる

Python 3.13 を固定したまま SpeechRecognition の版だけを動かすと、境界が出ます。

SpeechRecognitionPython 3.13.15 での import speech_recognition
3.10.4ModuleNotFoundError: No module named 'aifc'
3.11.0ModuleNotFoundError: No module named 'aifc'
3.12.0通る
3.14.0通る
3.17.0通る

この import を通す依存宣言が入った最初の版が 3.12.0 です(3.11.0 の次が 3.12.0 で、3.11 系に後から出た修正版はありません)。上流はこのときの変更を experimental と呼んでおり、パッケージの分類子に Python 3.13 が載るのは 3.16.1 からです。「3.13 に完全対応した版」ではなく、「このエラーを避ける依存宣言が入った版」として扱ってください。

pip install --upgrade 'SpeechRecognition>=3.12.0'

上限を書かずに上げると最新(3.17.0)が入ります。3.10.0 からの距離があるので、API が減っている点に注意してください。recognize_whisper_api は 3.14.0 で、recognize_bing は 3.17.0 で無くなっています(前者は recognize_openai へ)。requests も 3.12.0 で必須依存から外れたので、自分のコードで使っているなら requirements に明示が要ります。境界だけ越えたいなら pip install 'SpeechRecognition==3.12.0' と固定する手もあります。

3.12.0 が変えたのは、import ではなく依存の宣言

3.12.0 を Python 3.13 に入れると、指定していないパッケージが 4 つ増えます。

$ pip freeze > /tmp/before
$ pip install 'SpeechRecognition==3.12.0'
$ pip freeze > /tmp/after ; diff /tmp/before /tmp/after
> audioop-lts==0.2.2
> SpeechRecognition==3.12.0
> standard-aifc==3.13.0
> standard-chunk==3.13.0
> typing_extensions==4.16.0

依存の宣言はこうなっています。

standard-aifc; python_version >= "3.13"
audioop-lts; python_version >= "3.13"

そして SpeechRecognition のソースは、3.12.0 でも 3.17.0 でも aifc を import したままです(__init__.py と audio.py)。変わったのは import ではなく依存の宣言のほうで、Python 3.13 以上のときだけ代替パッケージを引き、import aifc と import audioop はそちらに当たります。

配っているのは Python 本体ではありません。standard-aifc は PEP 594 で消えたモジュールを再配布する python-deadlib(個人が保守、PSF-2.0)、audioop-lts は別の個人の配布物です。名前が standard- で始まり、PyPI の作者表記が Python Developers なので公式の受け皿に見えますが、依存の審査がある組織では第三者パッケージとして扱う対象になります。上げる側(直し方 1)を選んでも、同じ 2 つが推移的に入ります。

上げたのに直らないとき:依存の解決を切っていないか

上の依存宣言は、pip が依存を解決したときにだけ効きます。解決を切って入れる手順では、SpeechRecognition だけが新しくなり、代替パッケージが入りません。

$ pip install --no-deps 'SpeechRecognition==3.12.0'
$ python -c 'import speech_recognition'
  File "/usr/local/lib/python3.13/site-packages/speech_recognition/__init__.py", line 7, in <module>
    import aifc
ModuleNotFoundError: No module named 'aifc'

__init__.py の行番号が 11 から 7 に変わるだけで、止まる場所は同じです。同じことは、ロックファイルの内容だけを入れる同期系のツール(pip-sync や uv pip sync など)や、事前に落としたホイールを 1 つずつ入れる手順でも起こります。区別は媒体ではなく、依存の解決をしているかどうかです。素の pip install -r requirements.txt は、requirements に SpeechRecognition==3.12.0 としか書いていなくても代替パッケージまで解決するので、そのまま通ります。

社内ミラーやオフラインのホイール置き場は、症状が別になります。 代替パッケージがミラーに無い場合、止まるのは import ではなくインストールのほうです。

$ pip install --no-index --find-links=/wheels 'SpeechRecognition==3.12.0'
ERROR: Could not find a version that satisfies the requirement standard-aifc; python_version >= "3.13" (from speechrecognition) (from versions: none)
ERROR: No matching distribution found for standard-aifc; python_version >= "3.13"

この場合に取り込むのは standard-aifc・standard-chunk・audioop-lts の 3 つです(standard-aifc が残り 2 つを要求します)。

直し方2:版を動かせないなら代替パッケージを自分で入れる

SpeechRecognition の版を動かせない事情があるときは、消えたモジュールを PyPI から入れ直します。

pip install 'standard-aifc==3.13.0'

この 1 行で standard-chunk と audioop-lts も一緒に入ります。SpeechRecognition は aifc の 2 行あとで audioop も import するので、2 つの穴がこれで同時に埋まります(aifc だけを埋めれば足りるわけではありません)。

requirements に書くなら、マーカーと外す条件を添えてください。

standard-aifc==3.13.0; python_version >= "3.13"  # PEP 594 で消えた aifc の再配布。SpeechRecognition を 3.12.0 以上へ上げたら外す

これは版を動かせない間の手当てです。3.10.0 はこのエラーを避ける依存宣言を持っていないので、固定を外せる時期が来たら直し方 1 に寄せてください。

代替パッケージの名前(standard- が付かないものがある)

消えたモジュールPyPI で引く名前
aifcstandard-aifc
chunkstandard-chunk
audioopaudioop-lts

standard-audioop は存在しません(No matching distribution found for standard-audioop)。audioop が絡む側の詳細は ModuleNotFoundError: No module named ‘pyaudioop’ の直し方(Python 3.13 で pydub が止まる) にあります。

切り分け(うまくいかないとき)

  • SpeechRecognition を上げたのに、同じ import で止まる:依存が解決されていません。pip list に standard-aifc が無ければ、--no-deps やロック同期系のツールを疑ってください。インストール自体が No matching distribution found で落ちているなら、原因はミラー側です。
  • standard-aifc だけを --no-deps で入れて、次に No module named 'audioop' が出る:audioop も 3.13 で消えたモジュールです。入れる名前は audioop-lts で、standard- は付きません。依存を解決して入れているなら、standard-aifc が連れてくるので出ません。
  • 自分は SpeechRecognition を import していないのに落ちる:音声認識を組み込んだ別のライブラリが内部で読んでいます。トレースバックの一番下ではなく、site-packages から始まる行を上から読むと、どのパッケージが読んでいるかが分かります。
  • Python 3.12 に戻せば通る:通りますが、3.13 の削除は元に戻りません。3.12 のサポート期間の内に、依存側を 3.13 で動く版へ寄せておくほうが手数は少なくなります。

検証環境

  • python@sha256:9662417aace5ae7b8e2609cce472b72a8958e134ba372808abe9cc1a0c0125e6(Python 3.13.14)、ネットワーク有り
  • 再現:pip install 'SpeechRecognition==3.10.0' の後、python -c 'import speech_recognition' が ModuleNotFoundError: No module named 'aifc' を出して終了コード 1
  • 修正:pip install 'SpeechRecognition==3.10.0' 'standard-aifc==3.13.0' の後、同じ import が終了コード 0
  • 対照:Python 3.12.13 では同じ依存固定で import が通る。版の表と --no-deps・ミラー・警告の対照は Python 3.13.15/3.12/3.11 のイメージで別に測った

再現から修正までは errfix の検証ハーネスが機械的に確認しています。版の表・依存宣言・パッケージの出所は、同じイメージ系列と PyPI のメタデータで個別に測ったものです。

検証(machine-verified)

この修正は python@sha256:9662417aace5ae7b8e2609cce472b72a8958e134ba372808abe9cc1a0c0125e6 のバージョン固定コンテナ内で再現し、修正後に No module named 'aifc' のシグネチャが消えることを機械で確認しています。

verify — run-case.mjs
$ node run-case.mjs python/aifc-removed-speechrecognition-python-313
● reproduce No module named 'aifc' present ✓
● apply fix exit 0
● re-run No module named 'aifc' gone ✓
PASS verified · python@sha256:9662417aace5ae7b8e2609cce472b72a8958e134ba372808abe9cc1a0c0125e6 · signature gone

確認したのは上のイメージの中だけです。別の環境で直らなかった、記述が違う、という場合は 報告してください(対象と検証イメージは件名・本文に入ります)。