DEV Community

codemee
codemee

Posted on Edited on

audioop 與 pyaudioop

本文由 Claude 生成

1. 兩者的關係

  • 沒有相依關係,是替代關係。
  • audioop:Python 標準庫中以 C 實作的音訊處理模組。
    • Python 3.11 標記棄用(PEP 594)
    • Python 3.13 正式移除
  • pyaudioop:pydub 套件內附的純 Python 版本,API 與 audioop 相同,用來在沒有 audioop 時頂替,速度較慢。

2. pydub 的匯入邏輯

try:
    import audioop
except ImportError:
    import pyaudioop as audioop
Enter fullscreen mode Exit fullscreen mode

先找標準庫的 audioop,找不到才退回 pyaudioop。

3. Python 3.13+ 的錯誤

ModuleNotFoundError: No module named 'pyaudioop'
Enter fullscreen mode Exit fullscreen mode

原因

  1. 3.13 已移除 audioop,所以會進入 fallback。
  2. import pyaudioop as audioop 是絕對匯入,找不到位於 pydub 套件內的模組。
    正確寫法應為:

    from . import pyaudioop as audioop
    
  3. 就算修正路徑也不夠:內附的 pyaudioop.py 是 Python 2 時代的程式碼(使用 buffer()、.next() 等),實際呼叫時仍會出錯。

4. 為何一直沒修?

  • pydub 在 PyPI 的最後版本是 0.25.1(2021 年 3 月),之後未再發布。
  • 相關修正 PR(例如 #816:為 3.13+ 加入 audioop-lts 相依)尚未合併。
  • 相關 issue:#839、#863、#867。

5. 解決方法

✅ 建議:安裝 audioop-lts

pip install audioop-lts
Enter fullscreen mode Exit fullscreen mode
  • 社群維護的 audioop 回補套件(同樣是 C 實作)。
  • 安裝後 import audioop 可直接成功,pydub 不會走到 pyaudioop fallback。
  • 可在需求檔中只針對 3.13+ 安裝:

    audioop-lts; python_version >= "3.13"
    

替代方案:fork 版 pydub

pip install fitzyracing-pydub
Enter fullscreen mode Exit fullscreen mode
  • 匯入名稱仍為 pydub,不需改程式碼。
  • 修正了匯入路徑、在 3.13+ 自動相依 audioop-lts,並修好 Python 2 程式碼。
  • ⚠️ 注意:
    • 屬第三方維護,使用前請自行評估。
    • 若其他相依套件要求 pydub,pip 仍會安裝原版。
    • 若官方日後發布修正版,建議改回官方版本。

6. 速查

項目 說明
audioop 標準庫 C 模組,3.13 移除
pyaudioop pydub 內附的純 Python 替代品
audioop-lts PyPI 上的 audioop 回補套件
錯誤原因 絕對匯入路徑錯誤 + 內附程式為 Python 2 寫法
最簡解法 pip install audioop-lts

Top comments (0)