はじめに
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を用意).