0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

nnsvsのPython 3.13対応

0
Last updated at Posted at 2026-07-16

はじめに

NNSVSが活発に開発されていたのはPython 3.9前後の時代であり、最近のPython環境ではビルドするために一部改変が必要です。以下に問題点と対処法を列挙します。

pyproject.tomlの不要なビルド依存ピン

build-system.requiresにnumpy<1.20.0とあるが、該当バージョンのnumpyはPython 3.13用のwheelが提供されていない。

対処法

単純に削除

古いhydra-core依存

hydra-core 1.1.x系が依存するantlr4-python3-runtime==4.8は内部でtyping.ioをimportしているが、typing.ioはPython 3.13で削除された。

対処法

hydra-coreを1.3.x系に上げる

pkg_resourcesのimport

pyworld・pysptk・nnmnkwiiが実行時にpkg_resourcesをimportしているが、setuptoolsは82.0.0で削除される予定であり、新しいsetuptoolsと組み合わせるとModuleNotFoundErrorとなる。

対処法

setuptools<81にピン。nnsvs内でもパッケージ内リソースのパス解決にpkg_resources.resource_filename()を使用しており、将来の削除に備えて__file__ベースのシンプルなパス解決に変更。

NumPy 1.x→NumPy 2.0への変更に起因する問題

NumPy 2.0では、サイズ1を含む非0次元配列を暗黙にPythonスカラーへ変換する挙動が廃止された。これにより、多次元配列に対して直接組み込みのmin()/max()を適用していた箇所が例外を送出するようになっていた。また同様に、スカラーを渡す際に明示的な変換や型調整が必要になった。

対処法

  • nnsvs/train_util.py: すべてnp.min()/np.max()(明示的なNumPyのreduction関数)に置き換え
  • nnsvs/gen.py, recipes/_common/scaler_joblib2npy_voc.py: サイズ1配列を明示的にスカラーへ変換する.item()の追加
  • nnsvs/dsp.py: scipy.signal.butterへスカラーを渡す箇所の型調整

matplotlib関係

np.Inf(NumPy 2.0で削除された非推奨エイリアス)絡みの非互換を避けるためにmatplotlib<3.6.0のピンが設定されていたが、対象issue(#191)はmatplotlib 3.11.0では再現しない。また、同梱スタイルの命名規則が変更されている。

対処法

matplotlib<3.6.0のピンを削除。nnsvs/train_util.pyのseaborn-whitegridをseaborn-v0_8-whitegridに変更。

typed-ast のビルド失敗

pysenが依存するtyped-astが新しいGCCでビルドできない。typed-astのInclude/asdl.hはtypedef enum {false, true} bool;という定義を持つが、C23ではfalse/trueが予約語となっており、これと衝突してコンパイルエラーになる。black/mypy等自体のバージョンを上げればtyped-astへの依存を回避できる可能性はあるが、それによってlintルールが変わる可能性がある。

対処法

.github/workflows/ci.ymlにPython 3.13のテストジョブを追加し、lint: falseとしてlintステップ(pysen経由のblack/mypy/flake8/isort)を明示的にスキップ。

ParallelWaveGAN

parallel_wavegan/layers/pqmf.pyがscipy.signal.windows.kaiserではなく古いscipy.signal.kaiserをimportしようとしている。またsetup.pyがimport pipしてpipのバージョン確認を行っていたが、ビルド分離環境下のpip install .ではModuleNotFoundErrorとなる。

対処法

  • parallel_wavegan/layers/pqmf.py: from scipy.signal import kaiserをfrom scipy.signal.windows import kaiserに変更
  • setup.pyからimport pip/distutils.version.LooseVersionによるチェックを削除。Pythonバージョンチェックはsetup()の標準的なpython_requires=">=3.7"引数として宣言する形に変更(もしくはpip installする際に--no-build-isolationをつけても良い)。

HN-UnifiedSourceFilterGAN/SiFiGAN

上述のParallelWaveGANと同じく、setup.pyのimport pipによるチェックがビルド分離環境下でModuleNotFoundErrorを引き起こす。

対処法

同上

torch.loadのweights_only関連

PyTorch 2.6でtorch.loadのデフォルトがweights_only=Trueに変更されたが、NNSVSのcheckpointは、optimizer/schedulerのパラメータ(OmegaConfのDictConfig)を**でそのままoptimizerへ渡していたため、Adamのbetasのようなリスト値だけがListConfigのままoptimizer_stateにpickleされ、UnpicklingError: Weights only load failedとなる。

対処法

  • optimizer/scheduler のパラメータを明示的にプリミティブなPython型へ変換してから保存。
  • 修正前に保存された古いcheckpoint用にマイグレーション用のスクリプト(単一ファイルは utils/migrate_checkpoint_weights_only.py、ディレクトリ一括変換用に python utils/migrate_expdir_weights_only.pyを用意).
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?