From a468975c29d83562ae1eb0922ffa031ef2d0e0fd Mon Sep 17 00:00:00 2001 From: Paul Sajna Date: Tue, 2 May 2023 02:29:10 -0700 Subject: [PATCH] so-vits-svc-paul-v2 --- .../so-vits-svc-paul-v2/.all-contributorsrc | 361 ++ .../so-vits-svc-paul-v2/.editorconfig | 21 + voice_conversion/so-vits-svc-paul-v2/.flake8 | 4 + .../so-vits-svc-paul-v2/.gitignore | 158 + .../so-vits-svc-paul-v2/.gitpod.yml | 8 + .../.pre-commit-config.yaml | 78 + .../so-vits-svc-paul-v2/.readthedocs.yml | 24 + .../so-vits-svc-paul-v2/CHANGELOG.md | 552 ++ .../so-vits-svc-paul-v2/CONTRIBUTING.md | 117 + .../so-vits-svc-paul-v2/Dockerfile | 37 + voice_conversion/so-vits-svc-paul-v2/LICENSE | 223 + .../so-vits-svc-paul-v2/README.md | 49 + .../so-vits-svc-paul-v2/README_ORIGINAL.md | 293 + .../so-vits-svc-paul-v2/README_zh_CN.md | 295 + .../so-vits-svc-paul-v2/commitlint.config.js | 8 + .../so-vits-svc-paul-v2/docs/Makefile | 20 + .../so-vits-svc-paul-v2/docs/_static/.gitkeep | 0 .../so-vits-svc-paul-v2/docs/_static/gui.png | Bin 0 -> 85387 bytes .../so-vits-svc-paul-v2/docs/changelog.md | 3 + .../so-vits-svc-paul-v2/docs/conf.py | 78 + .../so-vits-svc-paul-v2/docs/contributing.md | 3 + .../so-vits-svc-paul-v2/docs/index.md | 28 + .../so-vits-svc-paul-v2/docs/installation.md | 7 + .../so-vits-svc-paul-v2/docs/make.bat | 35 + .../so-vits-svc-paul-v2/docs/usage.md | 9 + .../easy-installation/install-cn.bat | 101 + .../easy-installation/install.bat | 70 + .../notebooks/so-vits-svc-fork-4.0.ipynb | 315 + .../so-vits-svc-paul-v2/poetry.lock | 5209 +++++++++++++++++ .../so-vits-svc-paul-v2/pyproject.toml | 130 + .../so-vits-svc-paul-v2/renovate.json | 3 + .../so-vits-svc-paul-v2/requirements.txt | 24 + voice_conversion/so-vits-svc-paul-v2/setup.py | 9 + .../src/so_vits_svc_fork/__init__.py | 5 + .../src/so_vits_svc_fork/__main__.py | 863 +++ .../src/so_vits_svc_fork/cluster/__init__.py | 48 + .../so_vits_svc_fork/cluster/train_cluster.py | 91 + .../src/so_vits_svc_fork/dataset.py | 87 + .../so_vits_svc_fork/default_gui_presets.json | 87 + .../src/so_vits_svc_fork/f0.py | 239 + .../src/so_vits_svc_fork/fakeyou_infer.py | 612 ++ .../src/so_vits_svc_fork/gui.py | 746 +++ .../src/so_vits_svc_fork/hparams.py | 38 + .../so_vits_svc_fork/inference/__init__.py | 0 .../src/so_vits_svc_fork/inference/core.py | 686 +++ .../src/so_vits_svc_fork/inference/main.py | 226 + .../src/so_vits_svc_fork/logger.py | 54 + .../src/so_vits_svc_fork/modules/__init__.py | 0 .../so_vits_svc_fork/modules/attentions.py | 488 ++ .../src/so_vits_svc_fork/modules/commons.py | 132 + .../modules/decoders/__init__.py | 0 .../so_vits_svc_fork/modules/decoders/f0.py | 46 + .../modules/decoders/hifigan/__init__.py | 3 + .../modules/decoders/hifigan/_models.py | 311 + .../modules/decoders/hifigan/_utils.py | 15 + .../modules/decoders/mb_istft/__init__.py | 15 + .../modules/decoders/mb_istft/_generators.py | 376 ++ .../modules/decoders/mb_istft/_loss.py | 11 + .../modules/decoders/mb_istft/_pqmf.py | 128 + .../modules/decoders/mb_istft/_stft.py | 244 + .../modules/decoders/mb_istft/_stft_loss.py | 142 + .../modules/descriminators.py | 177 + .../src/so_vits_svc_fork/modules/encoders.py | 136 + .../src/so_vits_svc_fork/modules/flows.py | 48 + .../src/so_vits_svc_fork/modules/losses.py | 58 + .../modules/mel_processing.py | 205 + .../src/so_vits_svc_fork/modules/modules.py | 452 ++ .../so_vits_svc_fork/modules/synthesizers.py | 233 + .../preprocessing/__init__.py | 0 .../config_templates/quickvc.json | 74 + .../so-vits-svc-4.0v1-legacy.json | 65 + .../config_templates/so-vits-svc-4.0v1.json | 67 + .../preprocessing/preprocess_classify.py | 95 + .../preprocessing/preprocess_flist_config.py | 85 + .../preprocessing/preprocess_hubert_f0.py | 157 + .../preprocessing/preprocess_resample.py | 143 + .../preprocess_speaker_diarization.py | 93 + .../preprocessing/preprocess_split.py | 70 + .../preprocessing/preprocess_utils.py | 5 + .../src/so_vits_svc_fork/py.typed | 0 .../src/so_vits_svc_fork/train.py | 560 ++ .../src/so_vits_svc_fork/utils.py | 430 ++ 82 files changed, 17118 insertions(+) create mode 100644 voice_conversion/so-vits-svc-paul-v2/.all-contributorsrc create mode 100644 voice_conversion/so-vits-svc-paul-v2/.editorconfig create mode 100644 voice_conversion/so-vits-svc-paul-v2/.flake8 create mode 100644 voice_conversion/so-vits-svc-paul-v2/.gitignore create mode 100644 voice_conversion/so-vits-svc-paul-v2/.gitpod.yml create mode 100644 voice_conversion/so-vits-svc-paul-v2/.pre-commit-config.yaml create mode 100644 voice_conversion/so-vits-svc-paul-v2/.readthedocs.yml create mode 100644 voice_conversion/so-vits-svc-paul-v2/CHANGELOG.md create mode 100644 voice_conversion/so-vits-svc-paul-v2/CONTRIBUTING.md create mode 100644 voice_conversion/so-vits-svc-paul-v2/Dockerfile create mode 100644 voice_conversion/so-vits-svc-paul-v2/LICENSE create mode 100644 voice_conversion/so-vits-svc-paul-v2/README.md create mode 100644 voice_conversion/so-vits-svc-paul-v2/README_ORIGINAL.md create mode 100644 voice_conversion/so-vits-svc-paul-v2/README_zh_CN.md create mode 100644 voice_conversion/so-vits-svc-paul-v2/commitlint.config.js create mode 100644 voice_conversion/so-vits-svc-paul-v2/docs/Makefile create mode 100644 voice_conversion/so-vits-svc-paul-v2/docs/_static/.gitkeep create mode 100644 voice_conversion/so-vits-svc-paul-v2/docs/_static/gui.png create mode 100644 voice_conversion/so-vits-svc-paul-v2/docs/changelog.md create mode 100644 voice_conversion/so-vits-svc-paul-v2/docs/conf.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/docs/contributing.md create mode 100644 voice_conversion/so-vits-svc-paul-v2/docs/index.md create mode 100644 voice_conversion/so-vits-svc-paul-v2/docs/installation.md create mode 100644 voice_conversion/so-vits-svc-paul-v2/docs/make.bat create mode 100644 voice_conversion/so-vits-svc-paul-v2/docs/usage.md create mode 100644 voice_conversion/so-vits-svc-paul-v2/easy-installation/install-cn.bat create mode 100644 voice_conversion/so-vits-svc-paul-v2/easy-installation/install.bat create mode 100644 voice_conversion/so-vits-svc-paul-v2/notebooks/so-vits-svc-fork-4.0.ipynb create mode 100644 voice_conversion/so-vits-svc-paul-v2/poetry.lock create mode 100644 voice_conversion/so-vits-svc-paul-v2/pyproject.toml create mode 100644 voice_conversion/so-vits-svc-paul-v2/renovate.json create mode 100644 voice_conversion/so-vits-svc-paul-v2/requirements.txt create mode 100644 voice_conversion/so-vits-svc-paul-v2/setup.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/__init__.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/__main__.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/cluster/__init__.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/cluster/train_cluster.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/dataset.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/default_gui_presets.json create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/f0.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/fakeyou_infer.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/gui.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/hparams.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/inference/__init__.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/inference/core.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/inference/main.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/logger.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/__init__.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/attentions.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/commons.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/__init__.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/f0.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/hifigan/__init__.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/hifigan/_models.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/hifigan/_utils.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/__init__.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_generators.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_loss.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_pqmf.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_stft.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_stft_loss.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/descriminators.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/encoders.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/flows.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/losses.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/mel_processing.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/modules.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/synthesizers.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/__init__.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/config_templates/quickvc.json create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/config_templates/so-vits-svc-4.0v1-legacy.json create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/config_templates/so-vits-svc-4.0v1.json create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_classify.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_flist_config.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_hubert_f0.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_resample.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_speaker_diarization.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_split.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_utils.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/py.typed create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/train.py create mode 100644 voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/utils.py diff --git a/voice_conversion/so-vits-svc-paul-v2/.all-contributorsrc b/voice_conversion/so-vits-svc-paul-v2/.all-contributorsrc new file mode 100644 index 0000000..c63c65f --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/.all-contributorsrc @@ -0,0 +1,361 @@ +{ + "projectName": "so-vits-svc-fork", + "projectOwner": "voicepaw", + "repoType": "github", + "repoHost": "https://github.com", + "files": [ + "README.md" + ], + "imageSize": 80, + "commit": true, + "commitConvention": "angular", + "contributors": [ + { + "login": "34j", + "name": "34j", + "avatar_url": "https://avatars.githubusercontent.com/u/55338215?v=4", + "profile": "https://github.com/34j", + "contributions": [ + "code", + "ideas", + "doc", + "example", + "infra", + "maintenance", + "review", + "test", + "tutorial", + "promotion", + "bug" + ] + }, + { + "login": "GarrettConway", + "name": "GarrettConway", + "avatar_url": "https://avatars.githubusercontent.com/u/22782004?v=4", + "profile": "https://github.com/GarrettConway", + "contributions": [ + "code", + "bug", + "doc", + "review" + ] + }, + { + "login": "BlueAmulet", + "name": "BlueAmulet", + "avatar_url": "https://avatars.githubusercontent.com/u/43395286?v=4", + "profile": "https://github.com/BlueAmulet", + "contributions": [ + "ideas", + "question", + "code", + "maintenance" + ] + }, + { + "login": "ThrowawayAccount01", + "name": "ThrowawayAccount01", + "avatar_url": "https://avatars.githubusercontent.com/u/125531852?v=4", + "profile": "https://github.com/ThrowawayAccount01", + "contributions": [ + "bug" + ] + }, + { + "login": "MashiroSA", + "name": "緋", + "avatar_url": "https://avatars.githubusercontent.com/u/40637516?v=4", + "profile": "https://github.com/MashiroSA", + "contributions": [ + "doc", + "bug" + ] + }, + { + "login": "Lordmau5", + "name": "Lordmau5", + "avatar_url": "https://avatars.githubusercontent.com/u/1345036?v=4", + "profile": "https://github.com/Lordmau5", + "contributions": [ + "bug", + "code", + "ideas", + "maintenance", + "question", + "userTesting" + ] + }, + { + "login": "DL909", + "name": "DL909", + "avatar_url": "https://avatars.githubusercontent.com/u/71912115?v=4", + "profile": "https://github.com/DL909", + "contributions": [ + "bug" + ] + }, + { + "login": "Satisfy256", + "name": "Satisfy256", + "avatar_url": "https://avatars.githubusercontent.com/u/101394399?v=4", + "profile": "https://github.com/Satisfy256", + "contributions": [ + "bug" + ] + }, + { + "login": "pierluigizagaria", + "name": "Pierluigi Zagaria", + "avatar_url": "https://avatars.githubusercontent.com/u/57801386?v=4", + "profile": "https://github.com/pierluigizagaria", + "contributions": [ + "userTesting" + ] + }, + { + "login": "ruckusmattster", + "name": "ruckusmattster", + "avatar_url": "https://avatars.githubusercontent.com/u/77196088?v=4", + "profile": "https://github.com/ruckusmattster", + "contributions": [ + "bug" + ] + }, + { + "login": "Desuka-art", + "name": "Desuka-art", + "avatar_url": "https://avatars.githubusercontent.com/u/111822082?v=4", + "profile": "https://github.com/Desuka-art", + "contributions": [ + "bug" + ] + }, + { + "login": "heyfixit", + "name": "heyfixit", + "avatar_url": "https://avatars.githubusercontent.com/u/41658450?v=4", + "profile": "https://github.com/heyfixit", + "contributions": [ + "doc" + ] + }, + { + "login": "nerdyrodent", + "name": "Nerdy Rodent", + "avatar_url": "https://avatars.githubusercontent.com/u/74688049?v=4", + "profile": "https://www.youtube.com/c/NerdyRodent", + "contributions": [ + "video" + ] + }, + { + "login": "xieyumc", + "name": "谢宇", + "avatar_url": "https://avatars.githubusercontent.com/u/47858007?v=4", + "profile": "https://github.com/xieyumc", + "contributions": [ + "doc" + ] + }, + { + "login": "ColdCawfee", + "name": "ColdCawfee", + "avatar_url": "https://avatars.githubusercontent.com/u/79474598?v=4", + "profile": "https://github.com/ColdCawfee", + "contributions": [ + "bug" + ] + }, + { + "login": "sbersier", + "name": "sbersier", + "avatar_url": "https://avatars.githubusercontent.com/u/34165937?v=4", + "profile": "https://github.com/sbersier", + "contributions": [ + "ideas", + "userTesting", + "bug" + ] + }, + { + "login": "Meldoner", + "name": "Meldoner", + "avatar_url": "https://avatars.githubusercontent.com/u/43951115?v=4", + "profile": "https://github.com/Meldoner", + "contributions": [ + "bug" + ] + }, + { + "login": "mmodeusher", + "name": "mmodeusher", + "avatar_url": "https://avatars.githubusercontent.com/u/46575920?v=4", + "profile": "https://github.com/mmodeusher", + "contributions": [ + "bug" + ] + }, + { + "login": "AlonDan", + "name": "AlonDan", + "avatar_url": "https://avatars.githubusercontent.com/u/21152334?v=4", + "profile": "https://github.com/AlonDan", + "contributions": [ + "bug" + ] + }, + { + "login": "Likkkez", + "name": "Likkkez", + "avatar_url": "https://avatars.githubusercontent.com/u/44336181?v=4", + "profile": "https://github.com/Likkkez", + "contributions": [ + "bug" + ] + }, + { + "login": "DuctTapeGames", + "name": "Duct Tape Games", + "avatar_url": "https://avatars.githubusercontent.com/u/84365142?v=4", + "profile": "https://github.com/DuctTapeGames", + "contributions": [ + "bug" + ] + }, + { + "login": "hxl9654", + "name": "Xianglong He", + "avatar_url": "https://avatars.githubusercontent.com/u/6624983?v=4", + "profile": "https://tec.hxlxz.com/", + "contributions": [ + "bug" + ] + }, + { + "login": "75aosu", + "name": "75aosu", + "avatar_url": "https://avatars.githubusercontent.com/u/79185331?v=4", + "profile": "https://github.com/75aosu", + "contributions": [ + "bug" + ] + }, + { + "login": "tonyco82", + "name": "tonyco82", + "avatar_url": "https://avatars.githubusercontent.com/u/56610534?v=4", + "profile": "https://github.com/tonyco82", + "contributions": [ + "bug" + ] + }, + { + "login": "yxlllc", + "name": "yxlllc", + "avatar_url": "https://avatars.githubusercontent.com/u/33565655?v=4", + "profile": "https://github.com/yxlllc", + "contributions": [ + "ideas", + "code" + ] + }, + { + "login": "outhipped", + "name": "outhipped", + "avatar_url": "https://avatars.githubusercontent.com/u/116147475?v=4", + "profile": "https://github.com/outhipped", + "contributions": [ + "bug" + ] + }, + { + "login": "escoolioinglesias", + "name": "escoolioinglesias", + "avatar_url": "https://avatars.githubusercontent.com/u/73505402?v=4", + "profile": "https://github.com/escoolioinglesias", + "contributions": [ + "bug", + "userTesting", + "video" + ] + }, + { + "login": "Blacksingh", + "name": "Blacksingh", + "avatar_url": "https://avatars.githubusercontent.com/u/130872856?v=4", + "profile": "https://github.com/Blacksingh", + "contributions": [ + "bug" + ] + }, + { + "login": "tybantarnusa", + "name": "Mgs. M. Thoyib Antarnusa", + "avatar_url": "https://avatars.githubusercontent.com/u/9532857?v=4", + "profile": "http://tybantarnusa.com", + "contributions": [ + "bug" + ] + }, + { + "login": "ZeroHackz", + "name": "Exosfeer", + "avatar_url": "https://avatars.githubusercontent.com/u/15729496?v=4", + "profile": "https://github.com/ZeroHackz", + "contributions": [ + "bug", + "code" + ] + }, + { + "login": "guranon", + "name": "guranon", + "avatar_url": "https://avatars.githubusercontent.com/u/130421189?v=4", + "profile": "https://github.com/guranon", + "contributions": [ + "bug", + "ideas", + "code" + ] + }, + { + "login": "alexanderkoumis", + "name": "Alexander Koumis", + "avatar_url": "https://avatars.githubusercontent.com/u/5108856?v=4", + "profile": "https://github.com/alexanderkoumis", + "contributions": [ + "code" + ] + }, + { + "login": "acekagami", + "name": "acekagami", + "avatar_url": "https://avatars.githubusercontent.com/u/127201056?v=4", + "profile": "https://github.com/acekagami", + "contributions": [ + "translation" + ] + }, + { + "login": "Highupech", + "name": "Highupech", + "avatar_url": "https://avatars.githubusercontent.com/u/114140670?v=4", + "profile": "https://github.com/Highupech", + "contributions": [ + "bug" + ] + }, + { + "login": "Scorpi", + "name": "Scorpi", + "avatar_url": "https://avatars.githubusercontent.com/u/969654?v=4", + "profile": "https://github.com/Scorpi", + "contributions": [ + "code" + ] + } + ], + "contributorsPerLine": 7, + "skipCi": true +} diff --git a/voice_conversion/so-vits-svc-paul-v2/.editorconfig b/voice_conversion/so-vits-svc-paul-v2/.editorconfig new file mode 100644 index 0000000..d4a2c44 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/.editorconfig @@ -0,0 +1,21 @@ +# http://editorconfig.org + +root = true + +[*] +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 +end_of_line = lf + +[*.bat] +indent_style = tab +end_of_line = crlf + +[LICENSE] +insert_final_newline = false + +[Makefile] +indent_style = tab diff --git a/voice_conversion/so-vits-svc-paul-v2/.flake8 b/voice_conversion/so-vits-svc-paul-v2/.flake8 new file mode 100644 index 0000000..9d9694a --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/.flake8 @@ -0,0 +1,4 @@ +[flake8] +exclude = docs +max-line-length = 88 +ignore = E203, E501, E741, E402, E712, W503, E731, E711 diff --git a/voice_conversion/so-vits-svc-paul-v2/.gitignore b/voice_conversion/so-vits-svc-paul-v2/.gitignore new file mode 100644 index 0000000..e4283a4 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/.gitignore @@ -0,0 +1,158 @@ +# Created by .ignore support plugin (hsz.mobi) +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder {{package_name}} settings +.spyderproject +.spyproject + +# Rope {{package_name}} settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# additional files +tests/**/*.wav +!tests/dataset_raw/test/**/*.wav +tests/**/*.npy +tests/**/*.pt +tests/**/*.txt +tests/**/*.json +tests/**/*.pth +tests/**/*.download +tests/**/*.lab +tests/**/*.pdf +tests/**/*.csv +tests/**/*.ckpt +tests/**/*.yaml +*.tfevents.* +*.pt +user_gui_presets.json diff --git a/voice_conversion/so-vits-svc-paul-v2/.gitpod.yml b/voice_conversion/so-vits-svc-paul-v2/.gitpod.yml new file mode 100644 index 0000000..450add9 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/.gitpod.yml @@ -0,0 +1,8 @@ +tasks: + - command: | + pip install poetry + PIP_USER=false poetry install + - command: | + pip install pre-commit + pre-commit install + PIP_USER=false pre-commit install-hooks diff --git a/voice_conversion/so-vits-svc-paul-v2/.pre-commit-config.yaml b/voice_conversion/so-vits-svc-paul-v2/.pre-commit-config.yaml new file mode 100644 index 0000000..c60523b --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/.pre-commit-config.yaml @@ -0,0 +1,78 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +exclude: "CHANGELOG.md|.copier-answers.yml" +default_stages: [commit] + +ci: + autofix_commit_msg: "chore(pre-commit.ci): auto fixes" + autoupdate_commit_msg: "chore(pre-commit.ci): pre-commit autoupdate" + +repos: + - repo: https://github.com/commitizen-tools/commitizen + rev: v2.42.1 + hooks: + - id: commitizen + stages: [commit-msg] + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: debug-statements + - id: check-builtin-literals + - id: check-case-conflict + - id: check-docstring-first + - id: check-json + - id: check-toml + - id: check-xml + - id: check-yaml + - id: detect-private-key + - id: end-of-file-fixer + - id: trailing-whitespace + - repo: https://github.com/python-poetry/poetry + rev: 1.4.2 + hooks: + - id: poetry-check + - repo: https://github.com/pre-commit/mirrors-prettier + rev: v2.7.1 + hooks: + - id: prettier + args: ["--tab-width", "2"] + - repo: https://github.com/asottile/pyupgrade + rev: v3.3.2 + hooks: + - id: pyupgrade + args: [--py38-plus] + - repo: https://github.com/PyCQA/autoflake + rev: v2.1.1 + hooks: + - id: autoflake + - repo: https://github.com/PyCQA/isort + rev: 5.12.0 + hooks: + - id: isort + - repo: https://github.com/psf/black + rev: 23.3.0 + hooks: + - id: black + - repo: https://github.com/codespell-project/codespell + rev: v2.2.4 + hooks: + - id: codespell + args: [-w] + - repo: https://github.com/PyCQA/flake8 + rev: 6.0.0 + hooks: + - id: flake8 + #- repo: https://github.com/pre-commit/mirrors-mypy + # rev: v0.931 + # hooks: + # - id: mypy + # additional_dependencies: [] + # - repo: https://github.com/PyCQA/bandit + # rev: 1.7.4 + # hooks: + # - id: bandit + # args: [-x, tests] + - repo: https://github.com/srstevenson/nb-clean + rev: "2.4.0" + hooks: + - id: nb-clean diff --git a/voice_conversion/so-vits-svc-paul-v2/.readthedocs.yml b/voice_conversion/so-vits-svc-paul-v2/.readthedocs.yml new file mode 100644 index 0000000..53891ad --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/.readthedocs.yml @@ -0,0 +1,24 @@ +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the version of Python and other tools you might need +build: + os: ubuntu-20.04 + tools: + python: "3.9" + jobs: + post_create_environment: + # Install poetry + - pip install poetry + # Tell poetry to not use a virtual environment + - poetry config virtualenvs.create false + post_install: + # Install dependencies + - poetry install --with docs + +# Build documentation in the docs directory with Sphinx +sphinx: + configuration: docs/conf.py diff --git a/voice_conversion/so-vits-svc-paul-v2/CHANGELOG.md b/voice_conversion/so-vits-svc-paul-v2/CHANGELOG.md new file mode 100644 index 0000000..f12f1c5 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/CHANGELOG.md @@ -0,0 +1,552 @@ +# Changelog + + + +## v3.12.1 (2023-04-30) +### Fix +* **utils:** Fix epoch variable name to log in checkpoint save/load functions ([#519](https://github.com/voicepaw/so-vits-svc-fork/issues/519)) ([`0530ea3`](https://github.com/voicepaw/so-vits-svc-fork/commit/0530ea34fa42d9af51c73872b02d6453427c5a00)) + +### Documentation +* Add Scorpi as a contributor for code ([#532](https://github.com/voicepaw/so-vits-svc-fork/issues/532)) ([`542d3a8`](https://github.com/voicepaw/so-vits-svc-fork/commit/542d3a8382d97064f13c1dcc4ba11107614dec3f)) + +## v3.12.0 (2023-04-30) +### Feature +* **preprocessing:** Add pre-classify command to manually classify files ([#527](https://github.com/voicepaw/so-vits-svc-fork/issues/527)) ([`7a0319c`](https://github.com/voicepaw/so-vits-svc-fork/commit/7a0319c65f42b0cc54d1d86ae5945d4a356b507a)) + +## v3.11.2 (2023-04-30) +### Fix +* **train:** Decouple lf0 predictor from speaker embeddings ([#528](https://github.com/voicepaw/so-vits-svc-fork/issues/528)) ([`7ab47f4`](https://github.com/voicepaw/so-vits-svc-fork/commit/7ab47f44e2ec77aa8c9e36b2e322d2dca0f94fb0)) + +## v3.11.1 (2023-04-30) +### Fix +* Specify encoding to utf-8 in read_text() and write_text() ([#524](https://github.com/voicepaw/so-vits-svc-fork/issues/524)) ([`e947336`](https://github.com/voicepaw/so-vits-svc-fork/commit/e94733678955430f4e0c8ee5a26627077c0ffad9)) + +### Documentation +* Add Highupech as a contributor for bug ([#526](https://github.com/voicepaw/so-vits-svc-fork/issues/526)) ([`8eedc24`](https://github.com/voicepaw/so-vits-svc-fork/commit/8eedc2439b6987f70c94033c3f375ea330498a64)) +* **readme:** Fix typo in README.md ([`1773940`](https://github.com/voicepaw/so-vits-svc-fork/commit/1773940ae4a17a522ebc9fe6c1c70c3e02728341)) +* Add acekagami as a contributor for translation ([#486](https://github.com/voicepaw/so-vits-svc-fork/issues/486)) ([`958b9fd`](https://github.com/voicepaw/so-vits-svc-fork/commit/958b9fdf5fd1d527b63ac488ad21db2ce90539aa)) +* **readme_zh_cn:** Update README_zh_CN.md ([#477](https://github.com/voicepaw/so-vits-svc-fork/issues/477)) ([`1ccd594`](https://github.com/voicepaw/so-vits-svc-fork/commit/1ccd5941e5f17a273dad681301a287aafb7973d9)) + +## v3.11.0 (2023-04-23) +### Feature +* **gui:** Configurable output file (#452) ([#453](https://github.com/voicepaw/so-vits-svc-fork/issues/453)) ([`d2e3596`](https://github.com/voicepaw/so-vits-svc-fork/commit/d2e3596d5c0874918712488765e068f4010d62b9)) + +### Documentation +* Add alexanderkoumis as a contributor for code ([#468](https://github.com/voicepaw/so-vits-svc-fork/issues/468)) ([`5e032a3`](https://github.com/voicepaw/so-vits-svc-fork/commit/5e032a3e1eb36b0a7f99fd440b3e2a82f2345747)) + +## v3.10.5 (2023-04-22) +### Fix +* **utils:** Fix so-vits-svc style contentvec usage ([#455](https://github.com/voicepaw/so-vits-svc-fork/issues/455)) ([`6d35139`](https://github.com/voicepaw/so-vits-svc-fork/commit/6d351390354b17a2cd004bc9572d7dc1202f236c)) + +## v3.10.4 (2023-04-21) +### Fix +* **train:** Only save checkpoints on main device ([`1aaaac6`](https://github.com/voicepaw/so-vits-svc-fork/commit/1aaaac6328476249371799b92ced3edcbaac8d18)) + +### Documentation +* Add sbersier as a contributor for bug ([#437](https://github.com/voicepaw/so-vits-svc-fork/issues/437)) ([`58b936d`](https://github.com/voicepaw/so-vits-svc-fork/commit/58b936d669fbf5156f1ae1381393762994dd7414)) +* Add escoolioinglesias as a contributor for video ([#436](https://github.com/voicepaw/so-vits-svc-fork/issues/436)) ([`69f097f`](https://github.com/voicepaw/so-vits-svc-fork/commit/69f097f388447d64b7807cf554a5c310c34b7ef0)) +* Add GarrettConway as a contributor for review ([#435](https://github.com/voicepaw/so-vits-svc-fork/issues/435)) ([`c1e4ada`](https://github.com/voicepaw/so-vits-svc-fork/commit/c1e4ada97739bf0b360295335475fef7029fbe49)) +* Add BlueAmulet as a contributor for maintenance ([#434](https://github.com/voicepaw/so-vits-svc-fork/issues/434)) ([`514ed84`](https://github.com/voicepaw/so-vits-svc-fork/commit/514ed84ffda901243c1bd6f39677eb020257f11f)) +* Add guranon as a contributor for bug, ideas, and code ([#433](https://github.com/voicepaw/so-vits-svc-fork/issues/433)) ([`b9eb3fd`](https://github.com/voicepaw/so-vits-svc-fork/commit/b9eb3fdc350588b9528a74d5b7be8e80b2bfbd51)) +* Add ZeroHackz as a contributor for bug, and code ([#432](https://github.com/voicepaw/so-vits-svc-fork/issues/432)) ([`66d5adc`](https://github.com/voicepaw/so-vits-svc-fork/commit/66d5adcf6dbb60fd6b6800162e3e16570a8dac1c)) +* Add tybantarnusa as a contributor for bug ([#431](https://github.com/voicepaw/so-vits-svc-fork/issues/431)) ([`e6e57b3`](https://github.com/voicepaw/so-vits-svc-fork/commit/e6e57b3e0d97ac91cadde45d5f080ced873df959)) +* Add Blacksingh as a contributor for bug ([#430](https://github.com/voicepaw/so-vits-svc-fork/issues/430)) ([`7bc76ba`](https://github.com/voicepaw/so-vits-svc-fork/commit/7bc76ba9355089ab94fce9231f5dbbdd54e849ee)) +* Add escoolioinglesias as a contributor for bug, and userTesting ([#429](https://github.com/voicepaw/so-vits-svc-fork/issues/429)) ([`f00fe6e`](https://github.com/voicepaw/so-vits-svc-fork/commit/f00fe6e15cd12085cd01ae3c2676c195e7924429)) +* Add outhipped as a contributor for bug ([#428](https://github.com/voicepaw/so-vits-svc-fork/issues/428)) ([`7497175`](https://github.com/voicepaw/so-vits-svc-fork/commit/74971752821a852154bbfc35c318bb05e7b1169c)) +* Add yxlllc as a contributor for ideas, and code ([#427](https://github.com/voicepaw/so-vits-svc-fork/issues/427)) ([`42e35d2`](https://github.com/voicepaw/so-vits-svc-fork/commit/42e35d2a1f83be25e3fb0318e694163b0e936c59)) +* Add Lordmau5 as a contributor for ideas, maintenance, and 2 more ([#426](https://github.com/voicepaw/so-vits-svc-fork/issues/426)) ([`352451c`](https://github.com/voicepaw/so-vits-svc-fork/commit/352451ccc9c1e1f800dc7697d5c705c0b9707c96)) +* Add tonyco82 as a contributor for bug ([#425](https://github.com/voicepaw/so-vits-svc-fork/issues/425)) ([`036ce90`](https://github.com/voicepaw/so-vits-svc-fork/commit/036ce9052f145cf047434d472f775b563e503946)) +* Add 75aosu as a contributor for bug ([#424](https://github.com/voicepaw/so-vits-svc-fork/issues/424)) ([`5afc28b`](https://github.com/voicepaw/so-vits-svc-fork/commit/5afc28bf918e1a62343f445a72487c1d932dc7b4)) +* Add hxl9654 as a contributor for bug ([#423](https://github.com/voicepaw/so-vits-svc-fork/issues/423)) ([`0953f1f`](https://github.com/voicepaw/so-vits-svc-fork/commit/0953f1fd0dfbfa557f639eb8d917805f8891d7b0)) +* Add DuctTapeGames as a contributor for bug ([#422](https://github.com/voicepaw/so-vits-svc-fork/issues/422)) ([`b0f4d39`](https://github.com/voicepaw/so-vits-svc-fork/commit/b0f4d39371ed2913ad792a46754469eb68c8c72d)) +* Add Likkkez as a contributor for bug ([#421](https://github.com/voicepaw/so-vits-svc-fork/issues/421)) ([`4a12109`](https://github.com/voicepaw/so-vits-svc-fork/commit/4a12109b6a0b3cd2741f10d6e9027204603b0f27)) +* Add AlonDan as a contributor for bug ([#420](https://github.com/voicepaw/so-vits-svc-fork/issues/420)) ([`662ec4b`](https://github.com/voicepaw/so-vits-svc-fork/commit/662ec4b39816b1a1311d56e3edaca31fb442bb8d)) +* Add mmodeusher as a contributor for bug ([#419](https://github.com/voicepaw/so-vits-svc-fork/issues/419)) ([`6a78df9`](https://github.com/voicepaw/so-vits-svc-fork/commit/6a78df97d8191b62a04c9ec48b74cf1f00e47c30)) +* Add Meldoner as a contributor for bug ([#418](https://github.com/voicepaw/so-vits-svc-fork/issues/418)) ([`5586bec`](https://github.com/voicepaw/so-vits-svc-fork/commit/5586becd35b456523cec1e1aa8c601cd1039dd1c)) + +## v3.10.3 (2023-04-19) +### Fix +* **train:** Don't save model when tuning for auto batch size ([`2311a35`](https://github.com/voicepaw/so-vits-svc-fork/commit/2311a35c36315123c87b7f20dde3c4dda723bea3)) + +## v3.10.2 (2023-04-19) +### Fix +* **train:** Properly stop training after `epochs` has been reached ([`f9bb3d8`](https://github.com/voicepaw/so-vits-svc-fork/commit/f9bb3d86605321288f11387bc853143378c3284e)) + +## v3.10.1 (2023-04-19) +### Fix +* **train:** Support ddp in Windows (gloo backend) ([#394](https://github.com/34j/so-vits-svc-fork/issues/394)) ([`bcb0507`](https://github.com/34j/so-vits-svc-fork/commit/bcb05078d8ca7a6ac681de919552b3a190b2cd9b)) + +## v3.10.0 (2023-04-18) +### Feature +* Replace `fairseq` with `transformers` ([#385](https://github.com/34j/so-vits-svc-fork/issues/385)) ([`a2fe0f3`](https://github.com/34j/so-vits-svc-fork/commit/a2fe0f376d33f02987c91a57bd90a794de90a0e1)) + +## v3.9.5 (2023-04-18) +### Fix +* **train:** Set persistent_workers = True in DataLoader for performance, do not save checkpoints, fix logging issue and multiple warning issues, do not do validation when global_step == 0 ([#384](https://github.com/34j/so-vits-svc-fork/issues/384)) ([`6cab9af`](https://github.com/34j/so-vits-svc-fork/commit/6cab9af86e3a96e79243fa890eb1c6c51fae4476)) + +## v3.9.4 (2023-04-18) +### Fix +* **gui:** Always use "spawn" context in ProcessPool ([#383](https://github.com/34j/so-vits-svc-fork/issues/383)) ([`5d7fb77`](https://github.com/34j/so-vits-svc-fork/commit/5d7fb774e8d5e97a9a31dbc891892e9f934f3884)) + +## v3.9.3 (2023-04-16) +### Fix +* **gui:** Fix subprocess errors in linux and fix wrong error logging ([#358](https://github.com/34j/so-vits-svc-fork/issues/358)) ([`fd67db6`](https://github.com/34j/so-vits-svc-fork/commit/fd67db6312944557c09afd7b1ccbb97987a03489)) + +## v3.9.2 (2023-04-16) +### Fix +* **train:** Fix y_mel length ([#356](https://github.com/34j/so-vits-svc-fork/issues/356)) ([`2d71992`](https://github.com/34j/so-vits-svc-fork/commit/2d71992d80ba4142d2d5a5df17c69c2f2ac553fd)) + +## v3.9.1 (2023-04-16) +### Fix +* **train:** Allow higher segment size ([#351](https://github.com/34j/so-vits-svc-fork/issues/351)) ([`09d5a52`](https://github.com/34j/so-vits-svc-fork/commit/09d5a52b9bfc8eba8857f2b6c804ecdb39b4b38b)) +* **cluster:** Do not use weights_only in get_cluster_model() ([#354](https://github.com/34j/so-vits-svc-fork/issues/354)) ([`24c05d1`](https://github.com/34j/so-vits-svc-fork/commit/24c05d16c3b55f664699400496a7e0fd2fd84353)) + +## v3.9.0 (2023-04-16) +### Feature +* **train:** Add option to name ckpts by epochs ([#353](https://github.com/34j/so-vits-svc-fork/issues/353)) ([`bba24c4`](https://github.com/34j/so-vits-svc-fork/commit/bba24c4a62b935ed29572aa2c2c437d1b54aa2e2)) + +## v3.8.1 (2023-04-16) +### Fix +* Patch stft and add mps to get_optimal_device() ([#352](https://github.com/34j/so-vits-svc-fork/issues/352)) ([`da928aa`](https://github.com/34j/so-vits-svc-fork/commit/da928aa0bb1399bf5780526f8a7e9b674476a000)) + +## v3.8.0 (2023-04-15) +### Feature +* **train:** Automatically decide batch_size ([#342](https://github.com/34j/so-vits-svc-fork/issues/342)) ([`8ffa128`](https://github.com/34j/so-vits-svc-fork/commit/8ffa128aa209787fde8fb1f0e4ae5c96dfe31217)) + +## v3.7.3 (2023-04-15) +### Fix +* **gui:** Show errors raised in inference ([#341](https://github.com/34j/so-vits-svc-fork/issues/341)) ([`99833c5`](https://github.com/34j/so-vits-svc-fork/commit/99833c55045647b9a766042765b454cb3d7d18ce)) + +## v3.7.2 (2023-04-15) +### Fix +* **train:** Suppress pytorch logs for deprecated TypedStorage ([#336](https://github.com/34j/so-vits-svc-fork/issues/336)) ([`e67ac62`](https://github.com/34j/so-vits-svc-fork/commit/e67ac621296cf6667d05b51f23ce8cb9ef8a0855)) + +## v3.7.1 (2023-04-15) +### Fix +* **train:** Fix check for notebook / Colab ([#335](https://github.com/34j/so-vits-svc-fork/issues/335)) ([`7f69814`](https://github.com/34j/so-vits-svc-fork/commit/7f698141e1b65e901579a5dbbabf28bfae5cc91f)) + +## v3.7.0 (2023-04-14) +### Feature +* **train:** Add option to specify TensorBoardLogger version parameter support ([#331](https://github.com/34j/so-vits-svc-fork/issues/331)) ([`a685123`](https://github.com/34j/so-vits-svc-fork/commit/a685123a4063e08e0b021a1ad51098d3154b75de)) + +## v3.6.2 (2023-04-14) +### Fix +* Fix torch.load and save to use file objects and weights_only and remove unidecode ([#327](https://github.com/34j/so-vits-svc-fork/issues/327)) ([`4aad701`](https://github.com/34j/so-vits-svc-fork/commit/4aad701badc1eae5195e874dec40f9ed8dd40ee6)) + +## v3.6.1 (2023-04-14) +### Fix +* **train:** Fix gradient logging ([#320](https://github.com/34j/so-vits-svc-fork/issues/320)) ([`73ef3dc`](https://github.com/34j/so-vits-svc-fork/commit/73ef3dc94ccd4c0514ab33b0c5a65edf8b356484)) + +## v3.6.0 (2023-04-13) +### Feature +* **realtime:** Support sola algorithm ([#316](https://github.com/34j/so-vits-svc-fork/issues/316)) ([`0fcbf99`](https://github.com/34j/so-vits-svc-fork/commit/0fcbf9979862e945ca2427612a92549db2d627d0)) + +## v3.5.1 (2023-04-13) +### Fix +* **logger:** Do not use rich in notebook ([#317](https://github.com/34j/so-vits-svc-fork/issues/317)) ([`03c8240`](https://github.com/34j/so-vits-svc-fork/commit/03c824015872e3d7e4e5795b9d65fad4116d54e4)) + +## v3.5.0 (2023-04-13) +### Feature +* **gui:** Run inference in thread and disable button ([#279](https://github.com/34j/so-vits-svc-fork/issues/279)) ([`c55caa8`](https://github.com/34j/so-vits-svc-fork/commit/c55caa8019cc06fc6bd8851b0fd895b73cf926a4)) + +## v3.4.0 (2023-04-13) +### Feature +* **train:** Make num_workers configurable ([#315](https://github.com/34j/so-vits-svc-fork/issues/315)) ([`e8df714`](https://github.com/34j/so-vits-svc-fork/commit/e8df7146b0d1d3ee32af576c251f47d8fdd80bb3)) + +## v3.3.1 (2023-04-13) +### Performance +* **train:** Specify num_workers in DataLoader ([#313](https://github.com/34j/so-vits-svc-fork/issues/313)) ([`6042164`](https://github.com/34j/so-vits-svc-fork/commit/6042164a60f9990eb0636e37dd650bb0cdff032b)) + +## v3.3.0 (2023-04-13) +### Feature +* **train:** Use RichProgressBar ([#311](https://github.com/34j/so-vits-svc-fork/issues/311)) ([`17e937a`](https://github.com/34j/so-vits-svc-fork/commit/17e937aae9c90b513e4b7674f442a60161c84e83)) + +## v3.2.0 (2023-04-13) +### Feature +* **train:** Add optional `accumulate_grad_batches` config param ([#306](https://github.com/34j/so-vits-svc-fork/issues/306)) ([`1172b23`](https://github.com/34j/so-vits-svc-fork/commit/1172b2385cfe5239da3222cf93916436395e0f1a)) + +## v3.1.13 (2023-04-12) +### Fix +* **logger:** Fix too noisy logger ([#300](https://github.com/34j/so-vits-svc-fork/issues/300)) ([`bd0eb33`](https://github.com/34j/so-vits-svc-fork/commit/bd0eb33a66d77afff8328d08008f2643651c712a)) +* **__main__:** Fix cli() not called in __main__ ([#299](https://github.com/34j/so-vits-svc-fork/issues/299)) ([`11f2d24`](https://github.com/34j/so-vits-svc-fork/commit/11f2d245137da240f5e8214e4b6ce4330d726143)) + +## v3.1.12 (2023-04-12) +### Fix +* **train:** Fix ddp not working ([#297](https://github.com/34j/so-vits-svc-fork/issues/297)) ([`bec43fc`](https://github.com/34j/so-vits-svc-fork/commit/bec43fcbedf6b16260411655b19cf780ddbafe8e)) + +## v3.1.11 (2023-04-12) +### Fix +* **logger:** Fix init_logger not showing debug messages in certain conditions as intended ([#296](https://github.com/34j/so-vits-svc-fork/issues/296)) ([`d3ab7d6`](https://github.com/34j/so-vits-svc-fork/commit/d3ab7d667c391ba1d8d1b34e2b66992256b3989d)) + +## v3.1.10 (2023-04-11) +### Fix +* **notebooks:** Improves inference ([#286](https://github.com/34j/so-vits-svc-fork/issues/286)) ([`d3228df`](https://github.com/34j/so-vits-svc-fork/commit/d3228df704b2e6a0746b3f842ca5f2240890d829)) +* **train:** Step lr schedulers at end of epoch ([#291](https://github.com/34j/so-vits-svc-fork/issues/291)) ([`3af223e`](https://github.com/34j/so-vits-svc-fork/commit/3af223eeb5146abcbb8198d4c11e2c1895ece130)) + +## v3.1.9 (2023-04-10) +### Fix +* **train:** Fix fp16_run not being mix precision and fix bf16 errors ([#283](https://github.com/34j/so-vits-svc-fork/issues/283)) ([`b0dd0ed`](https://github.com/34j/so-vits-svc-fork/commit/b0dd0ed4014d32e9f19e335ec603bdab92c52039)) + +## v3.1.8 (2023-04-10) +### Fix +* **readme:** Fix wrong commands in "Before training" ([#280](https://github.com/34j/so-vits-svc-fork/issues/280)) ([`e056ad9`](https://github.com/34j/so-vits-svc-fork/commit/e056ad9ec22cbaa119f7c93cb60b5b8851e80a7e)) + +## v3.1.7 (2023-04-09) +### Fix +* **train:** Improve quality of training ([#274](https://github.com/34j/so-vits-svc-fork/issues/274)) ([`7ed71d6`](https://github.com/34j/so-vits-svc-fork/commit/7ed71d6fd89ca8bf2c4aefbb280e705b1d7ae6b8)) + +## v3.1.6 (2023-04-09) +### Fix +* **train:** Fix checkpoint not properly loaded ([#271](https://github.com/34j/so-vits-svc-fork/issues/271)) ([`0979147`](https://github.com/34j/so-vits-svc-fork/commit/0979147a234e08999a19dba4988a53886f61dade)) + +## v3.1.5 (2023-04-09) +### Fix +* **train:** Fix optim_d functions called in wrong order ([#269](https://github.com/34j/so-vits-svc-fork/issues/269)) ([`13d6346`](https://github.com/34j/so-vits-svc-fork/commit/13d63469b0a84ace0dc8848df47dc20538b98770)) + +## v3.1.4 (2023-04-09) +### Fix +* **train:** Add bf16 and fp16 support ([#268](https://github.com/34j/so-vits-svc-fork/issues/268)) ([`4229fd8`](https://github.com/34j/so-vits-svc-fork/commit/4229fd8ead64cf03caad9acd3d8f7f0fec3a7fee)) + +## v3.1.3 (2023-04-09) +### Fix +* **deps:** Update dependency starlette to v0.26.1 ([#256](https://github.com/34j/so-vits-svc-fork/issues/256)) ([`5eb574b`](https://github.com/34j/so-vits-svc-fork/commit/5eb574bec01430399df48e90e6112cef85e21945)) + +## v3.1.2 (2023-04-09) +### Fix +* Remove wrong test and trigger release ([#266](https://github.com/34j/so-vits-svc-fork/issues/266)) ([`9ea77e4`](https://github.com/34j/so-vits-svc-fork/commit/9ea77e4c5c6575844685998e237994d54be84bb9)) +* **deps:** Remove pydantic constraints ([#263](https://github.com/34j/so-vits-svc-fork/issues/263)) ([`f446e3b`](https://github.com/34j/so-vits-svc-fork/commit/f446e3bbd62205b9c847e9ecdc46f519417b572a)) +* Fix fastapi version to 0.88 ([#261](https://github.com/34j/so-vits-svc-fork/issues/261)) ([`a26f387`](https://github.com/34j/so-vits-svc-fork/commit/a26f387abea585c300cd1ed0c36c6b9afc731764)) +* **utils:** Fix get_optimal_device ([#262](https://github.com/34j/so-vits-svc-fork/issues/262)) ([`79e4b5a`](https://github.com/34j/so-vits-svc-fork/commit/79e4b5a0abe20789335eaaf4a359880c099aaa35)) + +## v3.1.1 (2023-04-08) +### Fix +* **deps:** Update dependency fastapi to <0.96 ([#255](https://github.com/34j/so-vits-svc-fork/issues/255)) ([`29c8cc0`](https://github.com/34j/so-vits-svc-fork/commit/29c8cc05b7e5180058e03f2dc1f681e58cc67f09)) + +## v3.1.0 (2023-04-08) +### Feature +* Migrate to lightning ([#246](https://github.com/34j/so-vits-svc-fork/issues/246)) ([`824ecbd`](https://github.com/34j/so-vits-svc-fork/commit/824ecbd7222b9b9ada77c4fbbd7ae7f491049f21)) + +## v3.0.5 (2023-04-08) +### Fix +* **cluster:** Fix train_cluster ([#250](https://github.com/34j/so-vits-svc-fork/issues/250)) ([`b0c93e4`](https://github.com/34j/so-vits-svc-fork/commit/b0c93e49f9cdfdcd714575fc27011bf56ce4493d)) + +## v3.0.4 (2023-04-06) +### Fix +* **__main__:** Fix default config type to revert breaking changes ([#243](https://github.com/34j/so-vits-svc-fork/issues/243)) ([`e05c0b5`](https://github.com/34j/so-vits-svc-fork/commit/e05c0b52b6affac5e4483c0938e04584e1bd8d98)) + +## v3.0.3 (2023-04-05) +### Fix +* Fix issues when loading legacy checkpoint and fix pre-hubert n_jobs ([#236](https://github.com/34j/so-vits-svc-fork/issues/236)) ([`15f1e7f`](https://github.com/34j/so-vits-svc-fork/commit/15f1e7ffca80cb551316affae546ea72e8cccb34)) + +## v3.0.2 (2023-04-04) +### Performance +* Move methods from dataloader to pre-hubert ([#218](https://github.com/34j/so-vits-svc-fork/issues/218)) ([`d5a4456`](https://github.com/34j/so-vits-svc-fork/commit/d5a4456ebd5b6659ca037ee2f43480a00d7915f6)) + +## v3.0.1 (2023-04-03) +### Fix +* Remove possible leak in unused code ([#203](https://github.com/34j/so-vits-svc-fork/issues/203)) ([`e921c3d`](https://github.com/34j/so-vits-svc-fork/commit/e921c3dc018ea783b4c26375a04f499a45ad9df0)) + +### Performance +* **utils:** Better implementation of repeat_expand_2d ([#216](https://github.com/34j/so-vits-svc-fork/issues/216)) ([`ef30a9d`](https://github.com/34j/so-vits-svc-fork/commit/ef30a9d5ae60fdde5f6b44d6cea8cee0a40dd3e9)) + +## v3.0.0 (2023-04-03) +### Feature +* Add quickvc, fix usage of ContentVec, remove onnx support ([#197](https://github.com/34j/so-vits-svc-fork/issues/197)) ([`1a6c021`](https://github.com/34j/so-vits-svc-fork/commit/1a6c021cd102b48b44e006decebc165062df8a95)) + +### Breaking +* The module structure has been completely changed, and some of the default values for configurations have also been changed. ([`1a6c021`](https://github.com/34j/so-vits-svc-fork/commit/1a6c021cd102b48b44e006decebc165062df8a95)) + +### Documentation +* **readme:** Update allcontributors link for @MashiroSA ([#210](https://github.com/34j/so-vits-svc-fork/issues/210)) ([`650524b`](https://github.com/34j/so-vits-svc-fork/commit/650524bb37997326e924814632c6202b76660f77)) +* **readme:** Add paperspace referral ([#209](https://github.com/34j/so-vits-svc-fork/issues/209)) ([`7280012`](https://github.com/34j/so-vits-svc-fork/commit/7280012df66b5ea71291e5a80bb22451f0ca236e)) +* **readme:** Add paperspace link and add more description, add a link for zh-CN docs ([#208](https://github.com/34j/so-vits-svc-fork/issues/208)) ([`bc4b122`](https://github.com/34j/so-vits-svc-fork/commit/bc4b1229e4ad9c046fda38334c4c6d22548356c2)) + +## v2.1.5 (2023-04-01) +### Fix +* **deps:** Update dependency tensorboard to v2.12.1 ([#199](https://github.com/34j/so-vits-svc-fork/issues/199)) ([`0ccda1c`](https://github.com/34j/so-vits-svc-fork/commit/0ccda1ccb34b8125abe369f738b06de7b77c8efc)) + +## v2.1.4 (2023-03-31) +### Fix +* **deps:** Update dependency gradio to v3.24.1 ([#196](https://github.com/34j/so-vits-svc-fork/issues/196)) ([`4fa141b`](https://github.com/34j/so-vits-svc-fork/commit/4fa141b210cb9b80bc7f75176fb01b18352c91cd)) + +## v2.1.3 (2023-03-31) +### Fix +* **deps:** Update dependency gradio to v3.24.0 ([#192](https://github.com/34j/so-vits-svc-fork/issues/192)) ([`4e441cb`](https://github.com/34j/so-vits-svc-fork/commit/4e441cb30429e4a47afd261d69e32ec5f86564c9)) + +### Documentation +* Add sbersier as a contributor for ideas, and userTesting ([#185](https://github.com/34j/so-vits-svc-fork/issues/185)) ([`a655bf4`](https://github.com/34j/so-vits-svc-fork/commit/a655bf47dde4ad2506283997987bce3a09229c57)) +* Add ColdCawfee as a contributor for bug ([#177](https://github.com/34j/so-vits-svc-fork/issues/177)) ([`87a09e6`](https://github.com/34j/so-vits-svc-fork/commit/87a09e654a0e8f064293750779b743abf2897ebb)) + +## v2.1.2 (2023-03-28) +### Fix +* **gui:** Fix wrong devices set as default ([#176](https://github.com/34j/so-vits-svc-fork/issues/176)) ([`6265f8f`](https://github.com/34j/so-vits-svc-fork/commit/6265f8f93e8facd4f58aab906bfcb23e05d4032b)) +* **__main__:** Fix -h option overridden ([#175](https://github.com/34j/so-vits-svc-fork/issues/175)) ([`52f1cfe`](https://github.com/34j/so-vits-svc-fork/commit/52f1cfe1f08bd63966b0d1d7c025abed17cb36a6)) + +### Documentation +* Add xieyumc as a contributor for doc ([#174](https://github.com/34j/so-vits-svc-fork/issues/174)) ([`29474d9`](https://github.com/34j/so-vits-svc-fork/commit/29474d9dc77555fe5a55427278d44dfea7ece5ef)) +* **readme_zh_cn:** Update README_zh_CN.md ([#173](https://github.com/34j/so-vits-svc-fork/issues/173)) ([`f94a14c`](https://github.com/34j/so-vits-svc-fork/commit/f94a14cb63e2afd40cba3e94f84077643d9a7560)) + +## v2.1.1 (2023-03-27) +### Fix +* **deps:** Update dependency rich to v13.3.3 ([#171](https://github.com/34j/so-vits-svc-fork/issues/171)) ([`8bdefa9`](https://github.com/34j/so-vits-svc-fork/commit/8bdefa9636e13fb0a24058a589675a20655357f4)) + +### Documentation +* Add nerdyrodent as a contributor for video ([#168](https://github.com/34j/so-vits-svc-fork/issues/168)) ([`78ab661`](https://github.com/34j/so-vits-svc-fork/commit/78ab661af198d87ce2ca5525fa262c639ed03cdc)) +* Add heyfixit as a contributor for doc ([#167](https://github.com/34j/so-vits-svc-fork/issues/167)) ([`32a2a63`](https://github.com/34j/so-vits-svc-fork/commit/32a2a63b375300be6d67be56035005956003bdfd)) +* Add Desuka-art as a contributor for bug ([#165](https://github.com/34j/so-vits-svc-fork/issues/165)) ([`fe3c6bf`](https://github.com/34j/so-vits-svc-fork/commit/fe3c6bf8270fc219cdaeef05b7deacdbfc4df313)) +* Add ruckusmattster as a contributor for bug ([#163](https://github.com/34j/so-vits-svc-fork/issues/163)) ([`2b971db`](https://github.com/34j/so-vits-svc-fork/commit/2b971db5c7a332c8321e99bd77bb956a0ee3ec88)) +* Add pierluigizagaria as a contributor for userTesting ([#160](https://github.com/34j/so-vits-svc-fork/issues/160)) ([`6fabe8d`](https://github.com/34j/so-vits-svc-fork/commit/6fabe8d10b684caa236331a157455db1da686f8f)) +* Add Satisfy256 as a contributor for bug ([#158](https://github.com/34j/so-vits-svc-fork/issues/158)) ([`ee72aee`](https://github.com/34j/so-vits-svc-fork/commit/ee72aee12f23fee458599b8b7fa4f0ed27d33b1c)) +* Add DL909 as a contributor for bug ([#152](https://github.com/34j/so-vits-svc-fork/issues/152)) ([`a5e6651`](https://github.com/34j/so-vits-svc-fork/commit/a5e6651a8f537961caf53adbb8bc52c1412c0762)) + +## v2.1.0 (2023-03-27) +### Feature +* **__main__:** Add an option to launch tensorboard in `train` command ([#149](https://github.com/34j/so-vits-svc-fork/issues/149)) ([`ef22cce`](https://github.com/34j/so-vits-svc-fork/commit/ef22cceaeb7f06ea53b2151ef9c962d1040de20d)) + +## v2.0.0 (2023-03-27) +### Fix +* Fix preprocessing and convert bool options to flags, use `unidecode` to decode non-ASCII filenames in `pre-resample` ([#147](https://github.com/34j/so-vits-svc-fork/issues/147)) ([`98d7ee2`](https://github.com/34j/so-vits-svc-fork/commit/98d7ee22a40104468285324cc6ec21c707c30d54)) + +### Breaking +* Preprocessing default parameters changed and some options became flags. ([`98d7ee2`](https://github.com/34j/so-vits-svc-fork/commit/98d7ee22a40104468285324cc6ec21c707c30d54)) + +### Documentation +* **readme:** Add yt tutorial vid link ([#143](https://github.com/34j/so-vits-svc-fork/issues/143)) ([`1694f44`](https://github.com/34j/so-vits-svc-fork/commit/1694f449e5a9f7b9da71e9a4c2764830c5268de3)) + +## v1.4.3 (2023-03-26) +### Performance +* **preprocess:** Specify samplerate to reduce memory usage ([#137](https://github.com/34j/so-vits-svc-fork/issues/137)) ([`6217eda`](https://github.com/34j/so-vits-svc-fork/commit/6217eda0ec3bac27e408fcd0466a6b658cf718c5)) + +## v1.4.2 (2023-03-26) +### Fix +* **logging:** Initialize logging in logger file and move version log ([#131](https://github.com/34j/so-vits-svc-fork/issues/131)) ([`441d51f`](https://github.com/34j/so-vits-svc-fork/commit/441d51f8efa84144d8a9f8fa02f2adaaf15295c0)) +* **preprocess:** Fix dtype in sf.read() to save memory and fix preprocess_resample ([#132](https://github.com/34j/so-vits-svc-fork/issues/132)) ([`0af1e13`](https://github.com/34j/so-vits-svc-fork/commit/0af1e13a468ad282266a595b8d3c77d62aa938dc)) +* Fix audio resampled to 22kHz ([#130](https://github.com/34j/so-vits-svc-fork/issues/130)) ([`4203f37`](https://github.com/34j/so-vits-svc-fork/commit/4203f374c5625369518063888e1ca70d1af4f694)) + +### Documentation +* Update notebook and README.md ([#128](https://github.com/34j/so-vits-svc-fork/issues/128)) ([`38d9744`](https://github.com/34j/so-vits-svc-fork/commit/38d97449d5b443167926f409f904f4b40c6e0f03)) + +## v1.4.1 (2023-03-26) +### Fix +* **__main__,gui:** Fix some parameters not passed ([#124](https://github.com/34j/so-vits-svc-fork/issues/124)) ([`6cfe3d3`](https://github.com/34j/so-vits-svc-fork/commit/6cfe3d3f567c03e1c59065ff827f564a13a7aaaf)) + +## v1.4.0 (2023-03-26) +### Feature +* **preprocessing:** Add 2 more preprocessing commands ([#123](https://github.com/34j/so-vits-svc-fork/issues/123)) ([`45eba0f`](https://github.com/34j/so-vits-svc-fork/commit/45eba0f25db1346757fcd9134ccb3a62125a05a9)) + +### Documentation +* Add BlueAmulet as a contributor for code ([#119](https://github.com/34j/so-vits-svc-fork/issues/119)) ([`6a7e8ba`](https://github.com/34j/so-vits-svc-fork/commit/6a7e8ba827ee69f1ceca60b83dfbae437bbe6667)) + +## v1.3.5 (2023-03-26) +### Fix +* **data_utils:** Allow float32 audio to be processed properly ([#115](https://github.com/34j/so-vits-svc-fork/issues/115)) ([`13943b6`](https://github.com/34j/so-vits-svc-fork/commit/13943b693d177cf5417127647a3280a9e5ff9ca5)) + +## v1.3.4 (2023-03-25) +### Fix +* Change default f0 method from crepe to dio ([#100](https://github.com/34j/so-vits-svc-fork/issues/100)) ([`baf58d2`](https://github.com/34j/so-vits-svc-fork/commit/baf58d286c286c0064fd015e0e8f0b9e690021f7)) + +## v1.3.3 (2023-03-25) +### Fix +* Fix old checkpoint deletion by sorting the models properly (#65) ([#89](https://github.com/34j/so-vits-svc-fork/issues/89)) ([`287dc94`](https://github.com/34j/so-vits-svc-fork/commit/287dc94be719147023af0ecfe7e92b16a8e98fc5)) + +### Documentation +* Add Lordmau5 as a contributor for bug, and code ([#102](https://github.com/34j/so-vits-svc-fork/issues/102)) ([`4df46ee`](https://github.com/34j/so-vits-svc-fork/commit/4df46eed47378f41d76c7637f540779db3bb54a3)) + +## v1.3.2 (2023-03-24) +### Fix +* **gui:** Fix devices list and fix tqdm error in gui ([#99](https://github.com/34j/so-vits-svc-fork/issues/99)) ([`59724cd`](https://github.com/34j/so-vits-svc-fork/commit/59724cd2afc6a8d5ef6ea4b7fa8c012e21fc4af6)) + +### Documentation +* Add MashiroSA as a contributor for doc, and bug ([#98](https://github.com/34j/so-vits-svc-fork/issues/98)) ([`495b7cb`](https://github.com/34j/so-vits-svc-fork/commit/495b7cbfc9f9468d49bc3f57efe6c5c076dcb0d3)) +* **notebook:** Fix cluster inference command and improve cluster training command ([#93](https://github.com/34j/so-vits-svc-fork/issues/93)) ([`7642594`](https://github.com/34j/so-vits-svc-fork/commit/7642594472bd660fe046c45909f0475398af199e)) + +## v1.3.1 (2023-03-24) +### Fix +* **gui:** Fix defaut for auto_play ([#97](https://github.com/34j/so-vits-svc-fork/issues/97)) ([`07920a4`](https://github.com/34j/so-vits-svc-fork/commit/07920a4954e1a14d47fcb2687f050d49d03da415)) +* **infer_tool:** Fix speaker not automaticlly set to the first one if not found in cluster inference ([#96](https://github.com/34j/so-vits-svc-fork/issues/96)) ([`a643e4f`](https://github.com/34j/so-vits-svc-fork/commit/a643e4f26b59f12f00b316467edad876467dad49)) + +### Documentation +* **notebook:** Add cluster training and inference ([#84](https://github.com/34j/so-vits-svc-fork/issues/84)) ([`9ffb621`](https://github.com/34j/so-vits-svc-fork/commit/9ffb6216f418d8c5a4a9f1bdd79fc2cebb885db1)) + +## v1.3.0 (2023-03-23) +### Feature +* **gui:** Better error handling ([#85](https://github.com/34j/so-vits-svc-fork/issues/85)) ([`985704b`](https://github.com/34j/so-vits-svc-fork/commit/985704b1afa8af15fe8eab5e3fc838465f5162c8)) + +## v1.2.11 (2023-03-23) +### Fix +* **gui,onnx:** Fix onnx export and fix gui ([#83](https://github.com/34j/so-vits-svc-fork/issues/83)) ([`3e9a47d`](https://github.com/34j/so-vits-svc-fork/commit/3e9a47dd4faa938a6aaebf2d7c1c0b9d68cc97d3)) + +## v1.2.10 (2023-03-23) +### Fix +* **cluster:** Fix cluster not working ([#82](https://github.com/34j/so-vits-svc-fork/issues/82)) ([`29b209c`](https://github.com/34j/so-vits-svc-fork/commit/29b209cf7060deb7f15ae28fe2e520bb20a236f4)) + +## v1.2.9 (2023-03-23) +### Fix +* **gui:** Fix speakers and devices not updated and fix default presets ([#80](https://github.com/34j/so-vits-svc-fork/issues/80)) ([`a851150`](https://github.com/34j/so-vits-svc-fork/commit/a8511508b0d2b3a62e7b77833280e4264997d9ed)) + +## v1.2.8 (2023-03-22) +### Fix +* **deps:** Update dependency torchcrepe to v0.0.18 ([#76](https://github.com/34j/so-vits-svc-fork/issues/76)) ([`4fda479`](https://github.com/34j/so-vits-svc-fork/commit/4fda4799f017e7de57de36c95cd8d64ab6f9b446)) + +### Documentation +* **readme:** Shorten docs ([#75](https://github.com/34j/so-vits-svc-fork/issues/75)) ([`e0c1572`](https://github.com/34j/so-vits-svc-fork/commit/e0c1572d057032735c3118e9137be8e4399c6251)) + +## v1.2.7 (2023-03-22) +### Fix +* Fix clean_checkpoints ([#66](https://github.com/34j/so-vits-svc-fork/issues/66)) ([`e5169bf`](https://github.com/34j/so-vits-svc-fork/commit/e5169bf8121578a6cc3ed1bccd1b47a6281cafe4)) + +## v1.2.6 (2023-03-22) +### Fix +* **gui:** Disable checkbox if CUDA is not available and show errors for VC ([#71](https://github.com/34j/so-vits-svc-fork/issues/71)) ([`3fdd983`](https://github.com/34j/so-vits-svc-fork/commit/3fdd9836c3b60d2e737fc7e40efe42a9cc84888e)) + +### Documentation +* Add BlueAmulet as a contributor for question ([#74](https://github.com/34j/so-vits-svc-fork/issues/74)) ([`8d073e3`](https://github.com/34j/so-vits-svc-fork/commit/8d073e3e0798a0739cea5b979cf6cfd361f3e6d3)) +* Add GarrettConway as a contributor for doc ([#73](https://github.com/34j/so-vits-svc-fork/issues/73)) ([`6c6cbc6`](https://github.com/34j/so-vits-svc-fork/commit/6c6cbc6ac8a97ecb71d789a5782bb8db2c4c52f8)) +* **readme:** Update README.md regarding installation, update. WSL audio support ([#72](https://github.com/34j/so-vits-svc-fork/issues/72)) ([`4f1323b`](https://github.com/34j/so-vits-svc-fork/commit/4f1323b3d12a080f38a195bf494db7086dbfa7e4)) + +## v1.2.5 (2023-03-22) +### Fix +* Fix RTF calculation ([#70](https://github.com/34j/so-vits-svc-fork/issues/70)) ([`fb25500`](https://github.com/34j/so-vits-svc-fork/commit/fb25500f4e3e70e5d71462715b83fb3bedcf8bd5)) + +## v1.2.4 (2023-03-22) +### Fix +* **utils:** Fix latest_checkpoint_path ([#64](https://github.com/34j/so-vits-svc-fork/issues/64)) ([`00b9f4a`](https://github.com/34j/so-vits-svc-fork/commit/00b9f4acd005cdb801b3f41df6e25b0b8799d631)) + +## v1.2.3 (2023-03-21) +### Fix +* **deps:** Update dependency onnxsim to v0.4.19 ([#62](https://github.com/34j/so-vits-svc-fork/issues/62)) ([`f8a4cf6`](https://github.com/34j/so-vits-svc-fork/commit/f8a4cf61bad5d0d55a7334af8f022114605e7038)) + +## v1.2.2 (2023-03-21) +### Fix +* **deps:** Update dependency onnxoptimizer to v0.3.10 ([#61](https://github.com/34j/so-vits-svc-fork/issues/61)) ([`d0137f9`](https://github.com/34j/so-vits-svc-fork/commit/d0137f920083a08173d58e35492b9b9fb925e41f)) + +### Documentation +* **readme:** Add links for pretrained models and fix GUI pic height ([#60](https://github.com/34j/so-vits-svc-fork/issues/60)) ([`34ac39f`](https://github.com/34j/so-vits-svc-fork/commit/34ac39f0c9ce89f2effdd18f3fc4ab91e72b3f82)) +* **notebook:** Add more explanation to notebook ([#59](https://github.com/34j/so-vits-svc-fork/issues/59)) ([`9b3c483`](https://github.com/34j/so-vits-svc-fork/commit/9b3c4835e063d26d1e66d172cf592e69e30d59b8)) + +## v1.2.1 (2023-03-21) +### Fix +* Use librosa.load() instead of soundfile.read() ([#58](https://github.com/34j/so-vits-svc-fork/issues/58)) ([`b343106`](https://github.com/34j/so-vits-svc-fork/commit/b34310662b2bac53884df396932f72366132ea01)) +* **gui:** Fix window too big to show in a FHD environment ([#57](https://github.com/34j/so-vits-svc-fork/issues/57)) ([`259e6e6`](https://github.com/34j/so-vits-svc-fork/commit/259e6e6eb6ebfd9027b1813756d67d1a516e0214)) + +## v1.2.0 (2023-03-21) +### Feature +* Add presets ([#55](https://github.com/34j/so-vits-svc-fork/issues/55)) ([`e8adcc6`](https://github.com/34j/so-vits-svc-fork/commit/e8adcc621f6caf5f4b20846575b3559c032ed47f)) + +## v1.1.1 (2023-03-21) +### Fix +* **deps:** Update dependency gradio to v3.23.0 ([#54](https://github.com/34j/so-vits-svc-fork/issues/54)) ([`a2bdb48`](https://github.com/34j/so-vits-svc-fork/commit/a2bdb48b436d206b30bb72409852c0b30d6811e9)) + +## v1.1.0 (2023-03-21) +### Feature +* Enhance RealtimeVC ([#52](https://github.com/34j/so-vits-svc-fork/issues/52)) ([`81551ce`](https://github.com/34j/so-vits-svc-fork/commit/81551ce9c6fb7924d184c3c5a4cf9035168b28d2)) + +### Documentation +* Update gui screenshot ([#53](https://github.com/34j/so-vits-svc-fork/issues/53)) ([`58d06aa`](https://github.com/34j/so-vits-svc-fork/commit/58d06aa7460dd75ef793da295bf7651ae9940814)) + +## v1.0.2 (2023-03-21) +### Fix +* **deps:** Update dependency scipy to v1.10.1 ([#35](https://github.com/34j/so-vits-svc-fork/issues/35)) ([`e0253bf`](https://github.com/34j/so-vits-svc-fork/commit/e0253bf1e655f86be605395a18f343763d975101)) + +## v1.0.1 (2023-03-20) +### Documentation +* Add ThrowawayAccount01 as a contributor for bug ([#47](https://github.com/34j/so-vits-svc-fork/issues/47)) ([`15e31fa`](https://github.com/34j/so-vits-svc-fork/commit/15e31fa806249d45235918fa62a48a86c43538cb)) +* Add BlueAmulet as a contributor for ideas ([#46](https://github.com/34j/so-vits-svc-fork/issues/46)) ([`a3bcb2b`](https://github.com/34j/so-vits-svc-fork/commit/a3bcb2be2992c98bcc2485082c19009c74cb3194)) + +### Performance +* **inference_main:** Do dummy inference before running vc ([#45](https://github.com/34j/so-vits-svc-fork/issues/45)) ([`4066c43`](https://github.com/34j/so-vits-svc-fork/commit/4066c4334b107062d2daa7c9dc00600a56c6e553)) + +## v1.0.0 (2023-03-20) +### Fix +* Fix default dataset path ([#43](https://github.com/34j/so-vits-svc-fork/issues/43)) ([`ac47fed`](https://github.com/34j/so-vits-svc-fork/commit/ac47fede2581d375c2be9c28102961f19f5a9aa1)) + +### Breaking +* the behaviour of preprocess_resample changes when there is a folder ./dataset_raw/44k and "44k" is no longer allowed as a speaker name in some conditions ([`ac47fed`](https://github.com/34j/so-vits-svc-fork/commit/ac47fede2581d375c2be9c28102961f19f5a9aa1)) + +## v0.8.2 (2023-03-20) +### Fix +* Fix compute_f0_crepe returning wrong length ([#42](https://github.com/34j/so-vits-svc-fork/issues/42)) ([`afb42b0`](https://github.com/34j/so-vits-svc-fork/commit/afb42b019ccd133876a2c55cf01007950a733d8c)) + +## v0.8.1 (2023-03-20) +### Fix +* **deps:** Update dependency librosa to v0.10.0 ([#40](https://github.com/34j/so-vits-svc-fork/issues/40)) ([`8e92f71`](https://github.com/34j/so-vits-svc-fork/commit/8e92f71b2820628f0f8583e6bc455d8f753f4302)) + +## v0.8.0 (2023-03-20) +### Feature +* Add more f0 calculation methods ([#39](https://github.com/34j/so-vits-svc-fork/issues/39)) ([`6b3b20d`](https://github.com/34j/so-vits-svc-fork/commit/6b3b20dfd609d81cb1184b7c8e8865a58f8d45f9)) + +## v0.7.1 (2023-03-20) +### Fix +* **deps:** Update dependency gradio to v3.22.1 ([#33](https://github.com/34j/so-vits-svc-fork/issues/33)) ([`f09fc23`](https://github.com/34j/so-vits-svc-fork/commit/f09fc23ca82519cc095509d4d4760561424a17ec)) + +## v0.7.0 (2023-03-20) +### Feature +* **preprocessing:** Allow nested dataset ([#19](https://github.com/34j/so-vits-svc-fork/issues/19)) ([`0433151`](https://github.com/34j/so-vits-svc-fork/commit/0433151d94c4da8e84a0183bdd47f1e08ea3c462)) + +## v0.6.3 (2023-03-20) +### Fix +* **deps:** Update dependency torch to v1.13.1 ([#27](https://github.com/34j/so-vits-svc-fork/issues/27)) ([`8826d68`](https://github.com/34j/so-vits-svc-fork/commit/8826d6870e223e7969baa069bf12235e0deec0b7)) +* **deps:** Update dependency torchaudio to v0.13.1 ([#28](https://github.com/34j/so-vits-svc-fork/issues/28)) ([`989f5d9`](https://github.com/34j/so-vits-svc-fork/commit/989f5d903b47ba9b0ea1d0fe37cbfe76edf0a811)) + +### Documentation +* **readme:** Update notes about VRAM caps ([#18](https://github.com/34j/so-vits-svc-fork/issues/18)) ([`0a245f4`](https://github.com/34j/so-vits-svc-fork/commit/0a245f4ee69bd0d4371836367becf0fe409431e2)) + +## v0.6.2 (2023-03-19) +### Fix +* Use hubert preprocess force_rebuild argument ([#15](https://github.com/34j/so-vits-svc-fork/issues/15)) ([`87cf807`](https://github.com/34j/so-vits-svc-fork/commit/87cf807496248e2c7b859069f81aa040e86aec59)) + +### Documentation +* Add GarrettConway as a contributor for bug ([#17](https://github.com/34j/so-vits-svc-fork/issues/17)) ([`31d9671`](https://github.com/34j/so-vits-svc-fork/commit/31d9671207143fd06b8db148802d1e27874151ce)) +* **notebook:** Launch tensorboard ([#16](https://github.com/34j/so-vits-svc-fork/issues/16)) ([`52229ba`](https://github.com/34j/so-vits-svc-fork/commit/52229ba0fe9458e37b45287c0a716c7cd36adbd6)) +* Add 34j as a contributor for example, infra, and 6 more ([#14](https://github.com/34j/so-vits-svc-fork/issues/14)) ([`1b90378`](https://github.com/34j/so-vits-svc-fork/commit/1b903783b4b89f2f5a4fc2e1b47f3eade0c0402f)) +* Add GarrettConway as a contributor for code ([#13](https://github.com/34j/so-vits-svc-fork/issues/13)) ([`716813f`](https://github.com/34j/so-vits-svc-fork/commit/716813fbff85ab4609d8ec3f374b78c6551877e5)) + +## v0.6.1 (2023-03-19) +### Performance +* **preprocessing:** Better performance ([#12](https://github.com/34j/so-vits-svc-fork/issues/12)) ([`668c8e1`](https://github.com/34j/so-vits-svc-fork/commit/668c8e1f18cefb0ebd2fb2f1d6572ce4d37d1102)) + +## v0.6.0 (2023-03-18) +### Feature +* Configurable input and output devices ([#11](https://github.com/34j/so-vits-svc-fork/issues/11)) ([`a822a60`](https://github.com/34j/so-vits-svc-fork/commit/a822a6098d322ff37725eee19d17758f72a6db49)) + +### Documentation +* **notebook:** Fix notebook ([#9](https://github.com/34j/so-vits-svc-fork/issues/9)) ([`427b4c1`](https://github.com/34j/so-vits-svc-fork/commit/427b4c1c6e0482345b17fedb018f7a18db68ccc5)) +* Update notebook ([#8](https://github.com/34j/so-vits-svc-fork/issues/8)) ([`ae3e471`](https://github.com/34j/so-vits-svc-fork/commit/ae3e4710aac41555f00ddcdfbcf5a5e925afb718)) + +## v0.5.0 (2023-03-18) +### Feature +* **gui:** Remember last directory (misc) ([`92558da`](https://github.com/34j/so-vits-svc-fork/commit/92558da2f0e4eb24a8de412fb7e22dc3530b648a)) +* **__main__:** Show defaults ([`3d298df`](https://github.com/34j/so-vits-svc-fork/commit/3d298df91bdfca230959603da74331b5eef4d487)) + +### Fix +* **__main__:** Fix option names ([`7ff34fe`](https://github.com/34j/so-vits-svc-fork/commit/7ff34fe623dde6b0a684c45cf33dc54118f9a800)) + +### Documentation +* **readme:** Update README.md ([#6](https://github.com/34j/so-vits-svc-fork/issues/6)) ([`b988101`](https://github.com/34j/so-vits-svc-fork/commit/b98810194703b6bb0ede03a00c460eeecdab5131)) + +## v0.4.1 (2023-03-18) +### Fix +* Call init_logger() ([#5](https://github.com/34j/so-vits-svc-fork/issues/5)) ([`e6378f1`](https://github.com/34j/so-vits-svc-fork/commit/e6378f12e747e618ff90ece1552d09c0d0714d41)) + +## v0.4.0 (2023-03-18) +### Feature +* Enhance realtime algorythm ([#4](https://github.com/34j/so-vits-svc-fork/issues/4)) ([`d789a12`](https://github.com/34j/so-vits-svc-fork/commit/d789a12308784473ae5d09e0b73fa15bf7554de1)) + +## v0.3.0 (2023-03-17) +### Feature +* Add gui ([#3](https://github.com/34j/so-vits-svc-fork/issues/3)) ([`34aec2b`](https://github.com/34j/so-vits-svc-fork/commit/34aec2b98ee4ef82ef488129b61a7952af5226a3)) + +### Documentation +* Update notebook ([`7b74606`](https://github.com/34j/so-vits-svc-fork/commit/7b74606508cfb7e45224cbd76f3de9c43c8b4309)) + +## v0.2.1 (2023-03-17) +### Fix +* **notebook:** Fix notebook ([`3ed00cc`](https://github.com/34j/so-vits-svc-fork/commit/3ed00cc66d4f66e045f61fc14937cb9160eee556)) + +## v0.2.0 (2023-03-17) +### Feature +* Realtime inference ([#2](https://github.com/34j/so-vits-svc-fork/issues/2)) ([`4dea1ae`](https://github.com/34j/so-vits-svc-fork/commit/4dea1ae51fe2e47a3f41556bdbe3fefd033d729a)) + +## v0.1.0 (2023-03-17) +### Feature +* Main feat ([#1](https://github.com/34j/so-vits-svc-fork/issues/1)) ([`faa990c`](https://github.com/34j/so-vits-svc-fork/commit/faa990ce6411d8b4e8b3d2d48c4b532b76ff7800)) diff --git a/voice_conversion/so-vits-svc-paul-v2/CONTRIBUTING.md b/voice_conversion/so-vits-svc-paul-v2/CONTRIBUTING.md new file mode 100644 index 0000000..c91cc57 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/CONTRIBUTING.md @@ -0,0 +1,117 @@ +# Contributing + +Contributions are welcome, and they are greatly appreciated! Every little helps, and credit will always be given. + +You can contribute in many ways: + +## Types of Contributions + +### Report Bugs + +Report bugs to [our issue page][gh-issues]. If you are reporting a bug, please include: + +- Your operating system name and version. +- Any details about your local setup that might be helpful in troubleshooting. +- Detailed steps to reproduce the bug. + +### Fix Bugs + +Look through the GitHub issues for bugs. Anything tagged with "bug" and "help wanted" is open to whoever wants to implement it. + +### Implement Features + +Look through the GitHub issues for features. Anything tagged with "enhancement" and "help wanted" is open to whoever wants to implement it. + +### Write Documentation + +SoftVC VITS Singing Voice Conversion Fork could always use more documentation, whether as part of the official SoftVC VITS Singing Voice Conversion Fork docs, in docstrings, or even on the web in blog posts, articles, and such. + +### Submit Feedback + +The best way to send feedback [our issue page][gh-issues] on GitHub. If you are proposing a feature: + +- Explain in detail how it would work. +- Keep the scope as narrow as possible, to make it easier to implement. +- Remember that this is a volunteer-driven project, and that contributions are welcome 😊 + +## Get Started! + +Ready to contribute? Here's how to set yourself up for local development. + +1. Fork the repo on GitHub. + +2. Clone your fork locally: + + ```shell + $ git clone git@github.com:your_name_here/so-vits-svc-fork.git + ``` + +3. Install the project dependencies with [Poetry](https://python-poetry.org): + + ```shell + $ poetry install + ``` + +4. Create a branch for local development: + + ```shell + $ git checkout -b name-of-your-bugfix-or-feature + ``` + + Now you can make your changes locally. + +5. When you're done making changes, check that your changes pass our tests: + + ```shell + $ poetry run pytest + ``` + +6. Linting is done through [pre-commit](https://pre-commit.com). Provided you have the tool installed globally, you can run them all as one-off: + + ```shell + $ pre-commit run -a + ``` + + Or better, install the hooks once and have them run automatically each time you commit: + + ```shell + $ pre-commit install + ``` + +7. Commit your changes and push your branch to GitHub: + + ```shell + $ git add . + $ git commit -m "feat(something): your detailed description of your changes" + $ git push origin name-of-your-bugfix-or-feature + ``` + + Note: the commit message should follow [the conventional commits](https://www.conventionalcommits.org). We run [`commitlint` on CI](https://github.com/marketplace/actions/commit-linter) to validate it, and if you've installed pre-commit hooks at the previous step, the message will be checked at commit time. + +8. Submit a pull request through the GitHub website or using the GitHub CLI (if you have it installed): + + ```shell + $ gh pr create --fill + ``` + +## Pull Request Guidelines + +We like to have the pull request open as soon as possible, that's a great place to discuss any piece of work, even unfinished. You can use draft pull request if it's still a work in progress. Here are a few guidelines to follow: + +1. Include tests for feature or bug fixes. +2. Update the documentation for significant features. +3. Ensure tests are passing on CI. + +## Tips + +To run a subset of tests: + +```shell +$ pytest tests +``` + +## Making a new release + +The deployment should be automated and can be triggered from the Semantic Release workflow in GitHub. The next version will be based on [the commit logs](https://python-semantic-release.readthedocs.io/en/latest/commit-log-parsing.html#commit-log-parsing). This is done by [python-semantic-release](https://python-semantic-release.readthedocs.io/en/latest/index.html) via a GitHub action. + +[gh-issues]: https://github.com/34j/so-vits-svc-fork/issues diff --git a/voice_conversion/so-vits-svc-paul-v2/Dockerfile b/voice_conversion/so-vits-svc-paul-v2/Dockerfile new file mode 100644 index 0000000..d1ed230 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/Dockerfile @@ -0,0 +1,37 @@ +FROM nvidia/cuda:12.0.1-runtime-ubuntu22.04 + +ENV DEBIAN_FRONTEND=noninteractive + +# NB: ffmpeg for transcoding opus -> wav +RUN apt-get update && apt-get install -y \ + build-essential \ + curl \ + ffmpeg \ + htop \ + libsndfile1 \ + nvidia-driver-515 \ + python3-pip \ + python3.10 \ + python3.10-dev \ + python3.10-venv \ + vim \ + wget \ + --no-install-recommends \ + && apt-get clean autoclean && apt-get autoremove -y && rm -rf /var/lib/{apt,dpkg,cache,log}/ + + +RUN mkdir /install +WORKDIR /install + +COPY requirements.txt . + +#RUN pip install -r requirements-without-poetry.txt + +RUN python3 -m venv python \ + && . python/bin/activate \ + && pip install -r requirements.txt + +WORKDIR / + +COPY . /models/voice_conversion/so-vits-svc + diff --git a/voice_conversion/so-vits-svc-paul-v2/LICENSE b/voice_conversion/so-vits-svc-paul-v2/LICENSE new file mode 100644 index 0000000..0bcb3ed --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/LICENSE @@ -0,0 +1,223 @@ +MIT License + +Copyright (c) 2023 34j and contributors +Copyright (c) 2021 Jingyi Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/voice_conversion/so-vits-svc-paul-v2/README.md b/voice_conversion/so-vits-svc-paul-v2/README.md new file mode 100644 index 0000000..f7d520c --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/README.md @@ -0,0 +1,49 @@ +so-vits-svc +=========== + +Original docs are in [README\_ORIGINAL.md](./README_ORIGINAL.md). + +This is a snapshot of `f9f16d67e44c127b9cf6d02d6eb5a235d28b70d2` (branch `tag v3.12.1`). It was taken +from voicepaw's fork at https://github.com/voicepaw/so-vits-svc-fork + + +Dev Installation +---------------- + +`pip install -e .` + +There is also a Dockerfile available so if you prefer: +```sh +docker build -t so-vits-svc .` +docker run -it --privileged --gpus 0 so-vits-svc +``` + +Usage +----- +``` +Usage: svc infer [OPTIONS] INPUT_PATH + + Inference + +Options: + -o, --output-path PATH path to output dir + -s, --speaker TEXT speaker name + -m, --model-path PATH path to model [default: logs/44k] + -c, --config-path PATH path to config [default: configs/44k/config.json] + -k, --cluster-model-path PATH path to cluster model + -t, --transpose INTEGER transpose [default: 0] + -db, --db-thresh INTEGER threshold (DB) (RELATIVE) [default: -20] + -fm, --f0-method [crepe|crepe-tiny|parselmouth|dio|harvest] + f0 prediction method [default: dio] + -a, --auto-predict-f0 / -na, --no-auto-predict-f0 + auto predict f0 [default: na] + -r, --cluster-infer-ratio FLOAT + cluster infer ratio [default: 0] + -n, --noise-scale FLOAT noise scale [default: 0.4] + -p, --pad-seconds FLOAT pad seconds [default: 0.5] + -d, --device TEXT device [default: cuda:0] + -ch, --chunk-seconds FLOAT chunk seconds [default: 0.5] + -ab, --absolute-thresh / -nab, --no-absolute-thresh + absolute thresh [default: nab] + -h, --help Show this message and exit.``` +``` diff --git a/voice_conversion/so-vits-svc-paul-v2/README_ORIGINAL.md b/voice_conversion/so-vits-svc-paul-v2/README_ORIGINAL.md new file mode 100644 index 0000000..865bd0b --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/README_ORIGINAL.md @@ -0,0 +1,293 @@ +# SoftVC VITS Singing Voice Conversion Fork + +[简体中文](README_zh_CN.md) + +

+ + CI Status + + + Documentation Status + + + Test coverage percentage + +

+

+ + Poetry + + + black + + + pre-commit + +

+

+ + PyPI Version + + Supported Python versions + License +

+ +A fork of [`so-vits-svc`](https://github.com/svc-develop-team/so-vits-svc) with **realtime support** and **greatly improved interface**. Based on branch `4.0` (v1) and the models are compatible. + +## Features not available in the original repo + +- **Realtime voice conversion** (enhanced in v1.1.0) +- Integrates [`QuickVC`](https://github.com/quickvc/QuickVC-VoiceConversion) +- Fixed misuse of [`ContentVec`](https://github.com/auspicious3000/contentvec) in the original repository.[^c] +- More accurate pitch estimation using [`CREPE`](https://github.com/marl/crepe/). +- GUI and unified CLI available +- ~2x faster training +- Ready to use just by installing with `pip`. +- Automatically download pretrained models. No need to install `fairseq`. +- Code completely formatted with black, isort, autoflake etc. + +[^c]: [#206](https://github.com/34j/so-vits-svc-fork/issues/206) + +## Installation + +### One click easy installation + + + Download .bat + + +### Manual installation + +
+ Creating a virtual environment + +Windows: + +```shell +py -3.10 -m venv venv +venv\Scripts\activate +``` + +Linux/MacOS: + +```shell +python3.10 -m venv venv +source venv/bin/activate +``` + +Anaconda: + +```shell +conda create -n so-vits-svc-fork python=3.10 pip +conda activate so-vits-svc-fork +``` + +Installing without creating a virtual environment may cause a `PermissionError` if Python is installed in Program Files, etc. + +
+ +Install this via pip (or your favourite package manager that uses pip): + +```shell +python -m pip install -U pip setuptools wheel +pip install -U torch torchaudio --index-url https://download.pytorch.org/whl/cu118 +pip install -U so-vits-svc-fork +``` + +
+ Notes + +- If no GPU is available or using MacOS, simply remove `pip install -U torch torchaudio --index-url https://download.pytorch.org/whl/cu118`. MPS is probably supported. +- If you are using an AMD GPU on Linux, replace `--index-url https://download.pytorch.org/whl/cu118` with `--index-url https://download.pytorch.org/whl/rocm5.4.2`. AMD GPUs are not supported on Windows ([#120](https://github.com/34j/so-vits-svc-fork/issues/120)). +
+ +### Update + +Please update this package regularly to get the latest features and bug fixes. + +```shell +pip install -U so-vits-svc-fork +``` + +## Usage + +### Inference + +#### GUI + +![GUI](https://raw.githubusercontent.com/34j/so-vits-svc-fork/main/docs/_static/gui.png) + +GUI launches with the following command: + +```shell +svcg +``` + +#### CLI + +- Realtime (from microphone) + +```shell +svc vc +``` + +- File + +```shell +svc infer source.wav +``` + +[Pretrained models](https://huggingface.co/models?search=so-vits-svc-4.0) are available on Hugging Face. + +#### Notes + +- If using WSL, please note that WSL requires additional setup to handle audio and the GUI will not work without finding an audio device. +- In real-time inference, if there is noise on the inputs, the HuBERT model will react to those as well. Consider using realtime noise reduction applications such as [RTX Voice](https://www.nvidia.com/en-us/geforce/guides/nvidia-rtx-voice-setup-guide/) in this case. + +### Training + +#### Before training + +- If your dataset has BGM, please remove the BGM using software such as [Ultimate Vocal Remover](https://ultimatevocalremover.com/). `3_HP-Vocal-UVR.pth` or `UVR-MDX-NET Main` is recommended. [^1] +- If your dataset is a long audio file with a single speaker, use `svc pre-split` to split the dataset into multiple files (using `librosa`). +- If your dataset is a long audio file with multiple speakers, use `svc pre-sd` to split the dataset into multiple files (using `pyannote.audio`). Further manual classification may be necessary due to accuracy issues. If speakers speak with a variety of speech styles, set --min-speakers larger than the actual number of speakers. Due to unresolved dependencies, please install `pyannote.audio` manually: `pip install pyannote-audio`. +- To manually classify audio files, `svc pre-classify` is available. Up and down arrow keys can be used to change the playback speed. + +[^1]: https://ytpmv.info/how-to-use-uvr/ + +#### Cloud + +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/34j/so-vits-svc-fork/blob/main/notebooks/so-vits-svc-fork-4.0.ipynb) +[![Open In Paperspace](https://img.shields.io/badge/Open%20in-Paperspace-blue?style=flat-square&logo=paperspace)](https://console.paperspace.com/github/34j/so-vits-svc-fork-paperspace/blob/main/so-vits-svc-fork-4.0-paperspace.ipynb) +[![Paperspace Referral]()](https://www.paperspace.com/?r=9VJN74I)[^p] + +If you do not have access to a GPU with more than 10 GB of VRAM, the free plan of Google Colab is recommended for light users and the Pro/Growth plan of Paperspace is recommended for heavy users. Conversely, if you have access to a high-end GPU, the use of cloud services is not recommended. + +[^p]: If you register a referral code and then add a payment method, you may save about $5 on your first month's monthly billing. Note that both referral rewards are Paperspace credits and not cash. It was a tough decision but inserted because debugging and training the initial model requires a large amount of computing power and the developer is a student. + +#### Local + +Place your dataset like `dataset_raw/{speaker_id}/**/{wav_file}.{any_format}` (subfolders and non-ASCII filenames are acceptable) and run: + +```shell +svc pre-resample +svc pre-config +svc pre-hubert +svc train -t +``` + +#### Notes + +- Dataset audio duration per file should be <~ 10s. +- It is recommended to increase the `batch_size` as much as possible in `config.json` before the `train` command to match the VRAM capacity. Setting `batch_size` to `auto-{init_batch_size}-{max_n_trials}` (or simply `auto`) will automatically increase `batch_size` until OOM error occurs, but may not be useful in some cases. +- To use `CREPE`, replace `svc pre-hubert` with `svc pre-hubert -fm crepe`. +- To use `ContentVec` correctly, replace `svc pre-config` with `-t so-vits-svc-4.0v1`. Training may take slightly longer because some weights are reset due to reusing legacy initial generator weights. +- To use `MS-iSTFT Decoder`, replace `svc pre-config` with `svc pre-config -t quickvc`. +- Silence removal and volume normalization are automatically performed (as in the upstream repo) and are not required. +- If you have trained on a large, copyright-free dataset, consider releasing it as an initial model. +- For further details (e.g. parameters, etc.), you can see the [Wiki](https://github.com/34j/so-vits-svc-fork/wiki) or [Discussions](https://github.com/34j/so-vits-svc-fork/discussions). + +### Further help + +For more details, run `svc -h` or `svc -h`. + +```shell +> svc -h +Usage: svc [OPTIONS] COMMAND [ARGS]... + + so-vits-svc allows any folder structure for training data. + However, the following folder structure is recommended. + When training: dataset_raw/{speaker_name}/**/{wav_name}.{any_format} + When inference: configs/44k/config.json, logs/44k/G_XXXX.pth + If the folder structure is followed, you DO NOT NEED TO SPECIFY model path, config path, etc. + (The latest model will be automatically loaded.) + To train a model, run pre-resample, pre-config, pre-hubert, train. + To infer a model, run infer. + +Options: + -h, --help Show this message and exit. + +Commands: + clean Clean up files, only useful if you are using the default file structure + infer Inference + onnx Export model to onnx (currently not working) + pre-classify Classify multiple audio files into multiple files + pre-config Preprocessing part 2: config + pre-hubert Preprocessing part 3: hubert If the HuBERT model is not found, it will be... + pre-resample Preprocessing part 1: resample + pre-sd Speech diarization using pyannote.audio + pre-split Split audio files into multiple files + train Train model If D_0.pth or G_0.pth not found, automatically download from hub. + train-cluster Train k-means clustering + vc Realtime inference from microphone +``` + +#### External Links + +[Video Tutorial](https://www.youtube.com/watch?v=tZn0lcGO5OQ) + +## Contributors ✨ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
34j
34j

💻 🤔 📖 💡 🚇 🚧 👀 ⚠️ ✅ 📣 🐛
GarrettConway
GarrettConway

💻 🐛 📖 👀
BlueAmulet
BlueAmulet

🤔 💬 💻 🚧
ThrowawayAccount01
ThrowawayAccount01

🐛
緋
緋

📖 🐛
Lordmau5
Lordmau5

🐛 💻 🤔 🚧 💬 📓
DL909
DL909

🐛
Satisfy256
Satisfy256

🐛
Pierluigi Zagaria
Pierluigi Zagaria

📓
ruckusmattster
ruckusmattster

🐛
Desuka-art
Desuka-art

🐛
heyfixit
heyfixit

📖
Nerdy Rodent
Nerdy Rodent

📹
谢宇
谢宇

📖
ColdCawfee
ColdCawfee

🐛
sbersier
sbersier

🤔 📓 🐛
Meldoner
Meldoner

🐛
mmodeusher
mmodeusher

🐛
AlonDan
AlonDan

🐛
Likkkez
Likkkez

🐛
Duct Tape Games
Duct Tape Games

🐛
Xianglong He
Xianglong He

🐛
75aosu
75aosu

🐛
tonyco82
tonyco82

🐛
yxlllc
yxlllc

🤔 💻
outhipped
outhipped

🐛
escoolioinglesias
escoolioinglesias

🐛 📓 📹
Blacksingh
Blacksingh

🐛
Mgs. M. Thoyib Antarnusa
Mgs. M. Thoyib Antarnusa

🐛
Exosfeer
Exosfeer

🐛 💻
guranon
guranon

🐛 🤔 💻
Alexander Koumis
Alexander Koumis

💻
acekagami
acekagami

🌍
Highupech
Highupech

🐛
Scorpi
Scorpi

💻
+ + + + + + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! diff --git a/voice_conversion/so-vits-svc-paul-v2/README_zh_CN.md b/voice_conversion/so-vits-svc-paul-v2/README_zh_CN.md new file mode 100644 index 0000000..2440682 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/README_zh_CN.md @@ -0,0 +1,295 @@ +# SoftVC VITS Singing Voice Conversion + +

+ + CI Status + + + Documentation Status + + + Test coverage percentage + +

+

+ + Poetry + + + black + + + pre-commit + +

+

+ + PyPI Version + + Supported Python versions + License +

+ +基于 [`so-vits-svc4.0(V1)`](https://github.com/svc-develop-team/so-vits-svc)的一个分支,支持实时推理和图形化推理界面,且兼容其模型。 + +## 新功能 + +- **实时语音转换** (增强版本 v1.1.0) +- 与[`QuickVC`](https://github.com/quickvc/QuickVC-VoiceConversion)相结合 +- 修复了原始版本中对 [`ContentVec`](https://github.com/auspicious3000/contentvec) 的误用[^c] +- 使用 CREPE 进行更准确的音高推测 +- 图形化界面和统一命令行界面 +- 相比之前双倍的训练速度 +- 只需使用 `pip` 安装即可使用,不需要安装 `fairseq` +- 自动下载预训练模型和 HuBERT 模型 +- 使用 black、isort、autoflake 等完全格式化的代码 + +[^c]: [#206](https://github.com/34j/so-vits-svc-fork/issues/206) + +## 安装教程 + +### 可以使用 bat 一键安装 + + + Download .bat + + +### 本 bat 汉化基于英文版,对原版进行了一些本地工作和优化,如安装过程有问题,可以尝试安装原版 + + + Download .bat + + +### 手动安装 + +
+ 创建一个虚拟环境 + +Windows: + +```shell +py -3.10 -m venv venv +venv\Scripts\activate +``` + +Linux/MacOS: + +```shell +python3.10 -m venv venv +source venv/bin/activate +``` + +Anaconda: + +```shell +conda create -n so-vits-svc-fork python=3.10 pip +conda activate so-vits-svc-fork +``` + +如果 Python 安装在 Program Files,在安装时未创造虚拟环境可能会导致`PermissionError` + +
+ +### 安装 + +通过 pip 安装 (或者通过包管理器使用 pip 安装): + +```shell +python -m pip install -U pip setuptools wheel +pip install -U torch torchaudio --index-url https://download.pytorch.org/whl/cu118 +pip install -U so-vits-svc-fork +``` + +- 如果没有可用 GPU 或使用 MacOS, 不需要执行 `pip install -U torch torchaudio --index-url https://download.pytorch.org/whl/cu118`. MPS 可能已经安装了. +- 如果在 Linux 下使用 AMD GPU, 请使用此命令 `--index-url https://download.pytorch.org/whl/rocm5.4.2` + 替换掉 `--index-url https://download.pytorch.org/whl/cu118` . Windows 下不支持 AMD GPUs (#120). + +### 更新 + +请经常更新以获取最新功能和修复错误: + +```shell +pip install -U so-vits-svc-fork +``` + +## 使用教程 + +### 推理 + +#### 图形化界面 + +![GUI](https://raw.githubusercontent.com/34j/so-vits-svc-fork/main/docs/_static/gui.png) + +请使用以下命令运行图形化界面: + +```shell +svcg +``` + +#### 命令行界面 + +- 实时转换 (输入源为麦克风) + +```shell +svc vc +``` + +- 从文件转换 + +```shell +svc infer source.wav +``` + +[预训练模型](https://huggingface.co/models?search=so-vits-svc-4.0) 可以在 HuggingFace 获得。 + +#### 注意 + +- 如果使用 WSL, 请注意 WSL 需要额外设置来处理音频,如果 GUI 找不到音频设备将不能正常工作。 +- 在实时语音转换中, 如果输入源有杂音, HuBERT + 模型依然会把杂音进行推理.可以考虑使用实时噪音减弱程序比如 [RTX Voice](https://www.nvidia.com/en-us/geforce/guides/nvidia-rtx-voice-setup-guide/) + 来解决. + +### 训练 + +#### 预处理 + +- 如果数据集有 BGM,请用例如[Ultimate Vocal Remover](https://ultimatevocalremover.com/)等软件去除 BGM. + 推荐使用`3_HP-Vocal-UVR.pth` 或者 `UVR-MDX-NET Main` . [^1] +- 如果数据集是包含单个歌手的长音频文件, 使用 `svc pre-split` 将数据集拆分为多个文件 (使用 `librosa`). +- 如果数据集是包含多个歌手的长音频文件, 使用 `svc pre-sd` 将数据集拆分为多个文件 (使用 `pyannote.audio`) + 。为了提高准确率,可能需要手动进行分类。如果歌手的声线多样,请把 --min-speakers 设置为大于实际说话者数量. 如果出现依赖未安装, + 请通过 `pip install pyannote-audio`来安装 `pyannote.audio`。 + +[^1]: https://ytpmv.info/how-to-use-uvr/ + +#### 云端 + +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/34j/so-vits-svc-fork/blob/main/notebooks/so-vits-svc-fork-4.0.ipynb) +[![Open In Paperspace](https://img.shields.io/badge/Open%20in-Paperspace-blue?style=flat-square&logo=paperspace)](https://console.paperspace.com/github/34j/so-vits-svc-fork-paperspace/blob/main/so-vits-svc-fork-4.0-paperspace.ipynb) +[![Paperspace Referral]()](https://www.paperspace.com/?r=9VJN74I)[^p] + +如果你无法获取 10GB 显存以上的显卡,对于轻量用户,推荐使用 Google Colab 的免费方案;而重度用户,则建议使用 Paperspace 的 Pro/Growth Plan。当然,如果你有高端的显卡,就没必要使用云服务了。 + +[^p]: If you register a referral code and then add a payment method, you may save about $5 on your first month's monthly billing. Note that both referral rewards are Paperspace credits and not cash. It was a tough decision but inserted because debugging and training the initial model requires a large amount of computing power and the developer is a student. + +#### 本地 + +将数据集处理成 `dataset_raw/{speaker_id}/**/{wav_file}.{any_format}` 的格式(可以使用子文件夹和非 ASCII 文件名)然后运行: + +```shell +svc pre-resample +svc pre-config +svc pre-hubert +svc train -t +``` + +#### 注意 + +- 数据集的每个文件应该小于 10s,不然显存会爆。 +- 建议在执行 `train` 命令之前提高 `config.json` 中的 `batch_size` 以匹配显存容量。 将`batch_size`设为`auto-{init_batch_size}-{max_n_trials}`(或者只需设为`auto`)就会自动提高`batch_size`,直到爆显存为止(不过自动调高 batch_size 有概率失效) +- 如果想要 f0 的推理方式为 `CREPE`, 用 `svc pre-hubert -fm crepe` 替换 `svc pre-hubert`. +- 若想正确使用`ContentVec`,用 `-t so-vits-svc-4.0v1`替换`svc pre-config`。由于复用 generator weights,一些 weights 会被重置而导致训练时间稍微延长. +- 若要使用`MS-iSTFT Decoder`,用 `svc pre-config -t quickvc`替换 `svc pre-config`. +- 在原始仓库中,会自动移除静音和进行音量平衡,且这个操作并不是必须要处理的。 +- 倘若你已经大规模训练了一个免费公开版权的数据集,可以考虑将其作为底模发布。 +- 对于更多细节(比如参数等),详见[Wiki](https://github.com/34j/so-vits-svc-fork/wiki) 或 [Discussions](https://github.com/34j/so-vits-svc-fork/discussions). + +### 帮助 + +更多命令, 运行 `svc -h` 或者 `svc -h` + +```shell +> svc -h +用法: svc [OPTIONS] COMMAND [ARGS]... + + so-vits-svc 允许任何文件夹结构用于训练数据 + 但是, 建议使用以下文件夹结构 + 训练: dataset_raw/{speaker_name}/**/{wav_name}.{any_format} + 推理: configs/44k/config.json, logs/44k/G_XXXX.pth + 如果遵循文件夹结构,则无需指定模型路径,配置路径等,将自动加载最新模型 + 若要要训练模型, 运行 pre-resample, pre-config, pre-hubert, train. + 若要要推理模型, 运行 infer. + +可选: + -h, --help 显示信息并退出 + +命令: + clean 清理文件,仅在使用默认文件结构时有用 + infer 推理 + onnx 导出模型到onnx + pre-config 预处理第 2 部分: config + pre-hubert 预处理第 3 部分: 如果没有找到 HuBERT 模型,则会... + pre-resample 预处理第 1 部分: resample + pre-sd Speech diarization 使用 pyannote.audio + pre-split 将音频文件拆分为多个文件 + train 训练模型 如果 D_0.pth 或 G_0.pth 没有找到,自动从集线器下载. + train-cluster 训练 k-means 聚类模型 + vc 麦克风实时推理 +``` + +#### 补充链接 + +[视频教程](https://www.youtube.com/watch?v=tZn0lcGO5OQ) + +## Contributors ✨ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
34j
34j

💻 🤔 📖 💡 🚇 🚧 👀 ⚠️ ✅ 📣 🐛
GarrettConway
GarrettConway

💻 🐛 📖 👀
BlueAmulet
BlueAmulet

🤔 💬 💻 🚧
ThrowawayAccount01
ThrowawayAccount01

🐛
緋
緋

📖 🐛
Lordmau5
Lordmau5

🐛 💻 🤔 🚧 💬 📓
DL909
DL909

🐛
Satisfy256
Satisfy256

🐛
Pierluigi Zagaria
Pierluigi Zagaria

📓
ruckusmattster
ruckusmattster

🐛
Desuka-art
Desuka-art

🐛
heyfixit
heyfixit

📖
Nerdy Rodent
Nerdy Rodent

📹
谢宇
谢宇

📖
ColdCawfee
ColdCawfee

🐛
sbersier
sbersier

🤔 📓 🐛
Meldoner
Meldoner

🐛
mmodeusher
mmodeusher

🐛
AlonDan
AlonDan

🐛
Likkkez
Likkkez

🐛
Duct Tape Games
Duct Tape Games

🐛
Xianglong He
Xianglong He

🐛
75aosu
75aosu

🐛
tonyco82
tonyco82

🐛
yxlllc
yxlllc

🤔 💻
outhipped
outhipped

🐛
escoolioinglesias
escoolioinglesias

🐛 📓 📹
Blacksingh
Blacksingh

🐛
Mgs. M. Thoyib Antarnusa
Mgs. M. Thoyib Antarnusa

🐛
Exosfeer
Exosfeer

🐛 💻
guranon
guranon

🐛 🤔 💻
Alexander Koumis
Alexander Koumis

💻
+ + + + + + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! diff --git a/voice_conversion/so-vits-svc-paul-v2/commitlint.config.js b/voice_conversion/so-vits-svc-paul-v2/commitlint.config.js new file mode 100644 index 0000000..8b82768 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/commitlint.config.js @@ -0,0 +1,8 @@ +module.exports = { + extends: ["@commitlint/config-conventional"], + rules: { + "header-max-length": [0, "always", Infinity], + "body-max-line-length": [0, "always", Infinity], + "footer-max-line-length": [0, "always", Infinity], + }, +}; diff --git a/voice_conversion/so-vits-svc-paul-v2/docs/Makefile b/voice_conversion/so-vits-svc-paul-v2/docs/Makefile new file mode 100644 index 0000000..d4bb2cb --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/voice_conversion/so-vits-svc-paul-v2/docs/_static/.gitkeep b/voice_conversion/so-vits-svc-paul-v2/docs/_static/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/voice_conversion/so-vits-svc-paul-v2/docs/_static/gui.png b/voice_conversion/so-vits-svc-paul-v2/docs/_static/gui.png new file mode 100644 index 0000000000000000000000000000000000000000..4417f1b83611ac6e6be6e7084a05a9242b2d2111 GIT binary patch literal 85387 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ê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

e6pJ1 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%0D`p2QV~5ptTDi57VEJJ$!BCOiHE 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 $_vJcTIS`Aabn8}%1b39Zi2G} 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 Uwlk<1DVM!V62cb$$L^p111U{lA^-pY literal 0 HcmV?d00001 diff --git a/voice_conversion/so-vits-svc-paul-v2/docs/changelog.md b/voice_conversion/so-vits-svc-paul-v2/docs/changelog.md new file mode 100644 index 0000000..d9e79ba --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/docs/changelog.md @@ -0,0 +1,3 @@ +```{include} ../CHANGELOG.md + +``` diff --git a/voice_conversion/so-vits-svc-paul-v2/docs/conf.py b/voice_conversion/so-vits-svc-paul-v2/docs/conf.py new file mode 100644 index 0000000..97d057f --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/docs/conf.py @@ -0,0 +1,78 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html +from pathlib import Path +from typing import Any + +from sphinx.application import Sphinx +from sphinx.ext import apidoc + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = "SoftVC VITS Singing Voice Conversion Fork" +copyright = "2023, 34j" +author = "34j" +release = "0.0.0" + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + "myst_parser", + "sphinx.ext.napoleon", + "sphinx.ext.autodoc", + "sphinx.ext.viewcode", +] +napoleon_google_docstring = False + +# The suffix of source filenames. +source_suffix = [".rst", ".md"] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns: list[str] = [] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "sphinx_rtd_theme" + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ["_static"] + + +# -- Automatically run sphinx-apidoc ----------------------------------------- + + +def run_apidoc(_: Any) -> None: + docs_path = Path(__file__).parent + module_path = docs_path.parent / "src" / "so_vits_svc_fork" + + apidoc.main( + [ + "--force", + "--module-first", + "-o", + docs_path.as_posix(), + module_path.as_posix(), + ] + ) + + +def setup(app: Sphinx) -> None: + app.connect("builder-inited", run_apidoc) diff --git a/voice_conversion/so-vits-svc-paul-v2/docs/contributing.md b/voice_conversion/so-vits-svc-paul-v2/docs/contributing.md new file mode 100644 index 0000000..66c1f98 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/docs/contributing.md @@ -0,0 +1,3 @@ +```{include} ../CONTRIBUTING.md + +``` diff --git a/voice_conversion/so-vits-svc-paul-v2/docs/index.md b/voice_conversion/so-vits-svc-paul-v2/docs/index.md new file mode 100644 index 0000000..610cebc --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/docs/index.md @@ -0,0 +1,28 @@ +# Welcome to SoftVC VITS Singing Voice Conversion Fork documentation! + +```{toctree} +:caption: Installation & Usage +:maxdepth: 2 + +installation +usage +``` + +```{toctree} +:caption: Project Info +:maxdepth: 2 + +changelog +contributing +``` + +```{toctree} +:caption: API Reference +:maxdepth: 2 + +so_vits_svc_fork +``` + +```{include} ../README.md + +``` diff --git a/voice_conversion/so-vits-svc-paul-v2/docs/installation.md b/voice_conversion/so-vits-svc-paul-v2/docs/installation.md new file mode 100644 index 0000000..512a87f --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/docs/installation.md @@ -0,0 +1,7 @@ +# Installation + +The package is published on [PyPI](https://pypi.org/project/so-vits-svc-fork/) and can be installed with `pip` (or any equivalent): + +```bash +pip install so-vits-svc-fork +``` diff --git a/voice_conversion/so-vits-svc-paul-v2/docs/make.bat b/voice_conversion/so-vits-svc-paul-v2/docs/make.bat new file mode 100644 index 0000000..954237b --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/voice_conversion/so-vits-svc-paul-v2/docs/usage.md b/voice_conversion/so-vits-svc-paul-v2/docs/usage.md new file mode 100644 index 0000000..0caf891 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/docs/usage.md @@ -0,0 +1,9 @@ +# Usage + +To use this package, import it: + +```python +import so_vits_svc_fork +``` + +TODO: Document usage diff --git a/voice_conversion/so-vits-svc-paul-v2/easy-installation/install-cn.bat b/voice_conversion/so-vits-svc-paul-v2/easy-installation/install-cn.bat new file mode 100644 index 0000000..abac777 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/easy-installation/install-cn.bat @@ -0,0 +1,101 @@ +@echo off + +echo ±¾batºº»¯»ùÓÚӢÎİ棬¶Ôԭ°æ½øÐÐÁËһЩ±¾µع¤×÷ºÍÓŻ¯£¬È簲װ¹ý³ÌÓÐÎÊÌ⣬¿ÉÒԳ¢Ê԰²װԭ°æ +echo. + +echo. +echo ¼ì²é Python °汾 3.10... +echo. + +py -3.10 --version >nul 2>&1 +if %errorlevel%==0 ( + echo Python 3.10 ÒѾ­°²װ + echo. +) else ( + echo Python 3.10 δ°²װ£¬¿ªʼÏÂÔØ... + echo. + curl https://www.python.org/ftp/python/3.10.10/python-3.10.10-amd64.exe -o python-3.10.10-amd64.exe + + echo °²װ Python 3.10... + echo. + python-3.10.10-amd64.exe /quiet InstallAllUsers=1 PrependPath=1 + + echo ÇåÀí°²װÆ÷... + echo. + del python-3.10.10-amd64.exe +) +echo. +echo ¼ì²é GPU... +echo. +nvidia-smi >nul 2>&1 +if %errorlevel%==0 ( + echo Õҵ½¿ÉÓÃGPU + echo. +) else ( + echo δÕҵ½¿ÉÓÃfound + echo. +) + +nvidia-smi >nul 2>&1 +if %errorlevel%==0 ( + + echo. + echo ¼ì²éCUDA... + echo. + + if %errorlevel%==0 ( + echo CUDA ÒѾ­°²װ + echo. + ) else ( + echo δ¼ì²⵽CUDA£¬Çë´ÓÏÂÃæÁ´½ÓÊֶ¯°²װCUDA£¬°²װºóÔÙÖØÐÂÔËÐб¾³ÌÐò + echo https://developer.nvidia.com/cuda-11-8-0-download-archive?target_os=Windows + echo. + echo Èç¹ûÄãÒѾ­ȷ¶¨°²װÁËCUDA£¬¿ÉÄÜÊdzÌÐò¼ì²â³ö´í£¬¿ÉÒ԰´ÈÎÒâ¼üǿÖƼÌÐøִÐУ¬·ñÔòÇë¹رձ¾³ÌÐ򣬰²װºÃCUDAºóÔÙÖØÐÂÔËÐÐ + echo. + Pause + ) + + echo ¼ì²é cuDNN... + if exist "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin\cudnn64_8.dll" ( + echo cuDNN ÒѾ­°²װ + echo. + ) else ( + echo δ¼ì²⵽cuDNN£¬Çë´ÓÏÂÃæÁ´½ÓÊֶ¯°²װCUDA£¬°²װºóÔÙÖØÐÂÔËÐб¾³ÌÐò + echo https://developer.nvidia.com/cudnn (https://developer.nvidia.com/downloads/compute/cudnn/secure/8.8.1/local_installers/11.8/cudnn-windows-x86_64-8.8.1.3_cuda11-archive.zip/) + echo. + echo Èç¹ûÄãÒѾ­ȷ¶¨°²װÁËcuDNN£¬¿ÉÄÜÊdzÌÐò¼ì²â³ö´í£¬¿ÉÒ԰´ÈÎÒâ¼üǿÖƼÌÐøִÐУ¬·ñÔòÇë¹رձ¾³ÌÐ򣬰²װºÃCUDAºóÔÙÖØÐÂÔËÐÐ + echo. + Pause + ) +) +echo. +echo ÕýÔڴ´½¨ÐéÄ⻷¾³£¨ÐèҪһµãʱ¼䣬ÇëÄÍÐĵȴý£©... +echo. +py -3.10 -m venv venv +echo. +echo Éý¼¶ pip ºÍ wheel... +echo. +venv\Scripts\python.exe -m pip install --upgrade pip wheel +echo. +nvidia-smi >nul 2>&1 +if %errorlevel%==0 ( +echo °²װ PyTorch £¨GPU°汾£©... +echo. +venv\Scripts\pip.exe install torch torchvision torchaudio --index-url https://mirror.sjtu.edu.cn/pytorch-wheels + echo °²װ PyTorch £¨CPU°汾£©... + echo. + venv\Scripts\pip.exe install torch torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple pyspider +) +echo. +echo Çë¼ì²éÒÔÉϰüÊǷ񶼳ɹ¦°²װ£¬ȷ¶¨³ɹ¦°²װº󣬰´ÈÎÒâ¼ü¿ªʼ°²װso-vits-svc-fork +echo. +Pause +echo °²װ so-vits-svc-fork... +echo. +venv\Scripts\pip.exe install so-vits-svc-fork +echo. +echo Æô¶¯ so-vits-svc-fork ͼÐλ¯½çÃæ... +echo. +venv\Scripts\svcg.exe + +Pause diff --git a/voice_conversion/so-vits-svc-paul-v2/easy-installation/install.bat b/voice_conversion/so-vits-svc-paul-v2/easy-installation/install.bat new file mode 100644 index 0000000..3ed0f96 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/easy-installation/install.bat @@ -0,0 +1,70 @@ +@echo off + +echo Checking for Python 3.10... + +py -3.10 --version >nul 2>&1 +if %errorlevel%==0 ( + echo Python 3.10 is already installed. +) else ( + echo Python 3.10 is not installed. Downloading installer... + curl https://www.python.org/ftp/python/3.10.10/python-3.10.10-amd64.exe -o python-3.10.10-amd64.exe + + echo Installing Python 3.10... + python-3.10.10-amd64.exe /quiet InstallAllUsers=1 PrependPath=1 + + echo Cleaning up installer... + del python-3.10.10-amd64.exe +) + +echo Checking GPU... +nvidia-smi >nul 2>&1 +if %errorlevel%==0 ( + echo found a GPU +) else ( + echo no GPU found +) + +nvidia-smi >nul 2>&1 +if %errorlevel%==0 ( + echo Checking CUDA... + nvcc --version + if %errorlevel%==0 ( + echo CUDA is already installed. + ) else ( + echo CUDA is not installed. + echo Please install CUDA 11.7 from https://developer.nvidia.com/cuda-11-8-0-download-archive?target_os=Windows + echo If you are sure it is already installed and added to path, press any key to force the installation to continue + Pause + ) + + echo Checking cuDNN... + if exist "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin\cudnn64_8.dll" ( + echo cuDNN is already installed. + ) else ( + echo cuDNN is not installed. + echo Please install cuDNN 11.8 from https://developer.nvidia.com/cudnn (https://developer.nvidia.com/downloads/compute/cudnn/secure/8.8.1/local_installers/11.8/cudnn-windows-x86_64-8.8.1.3_cuda11-archive.zip/) + echo If you are sure it is already installed and added to path, press any key to force the installation to continue + Pause + ) +) + +echo Creating virtual environment... +py -3.10 -m venv venv + +echo Updating pip and wheel... +venv\Scripts\python.exe -m pip install --upgrade pip wheel + +nvidia-smi >nul 2>&1 +if %errorlevel%==0 ( +echo Installing PyTorch with GPU support... +venv\Scripts\pip.exe install torch torchaudio --index-url https://download.pytorch.org/whl/cu118 +) else ( + echo Installing PyTorch without GPU support... + venv\Scripts\pip.exe install torch torchaudio +) + +echo Installing so-vits-svc-fork... +venv\Scripts\pip.exe install so-vits-svc-fork + +echo Launching so-vits-svc-fork GUI... +venv\Scripts\svcg.exe diff --git a/voice_conversion/so-vits-svc-paul-v2/notebooks/so-vits-svc-fork-4.0.ipynb b/voice_conversion/so-vits-svc-paul-v2/notebooks/so-vits-svc-fork-4.0.ipynb new file mode 100644 index 0000000..aeb7552 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/notebooks/so-vits-svc-fork-4.0.ipynb @@ -0,0 +1,315 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Before training\n", + "\n", + "This program saves the last 3 generations of models to Google Drive. Since 1 generation of models is >1GB, you should have at least 3GB of free space in Google Drive. If you do not have such free space, it is recommended to create another Google Account.\n", + "\n", + "Training requires >10GB VRAM. (T4 should be enough) Inference does not require such a lot of VRAM." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Installation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#@title Check GPU\n", + "!nvidia-smi" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#@title Mount Google Drive\n", + "from google.colab import drive\n", + "drive.mount('/content/drive')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#@title Install dependencies\n", + "#@markdown pip may fail to resolve dependencies and raise ERROR, but it can be ignored.\n", + "!python -m pip install -U pip wheel\n", + "%pip install -U ipython \n", + "\n", + "#@markdown Branch (for development)\n", + "BRANCH = \"none\" #@param {\"type\": \"string\"}\n", + "if BRANCH == \"none\":\n", + " %pip install -U so-vits-svc-fork\n", + "else:\n", + " %pip install -U git+https://github.com/34j/so-vits-svc-fork.git@{BRANCH}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Training" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#@title Make dataset directory\n", + "!mkdir -p \"dataset_raw\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#!rm -r \"dataset_raw\"\n", + "#!rm -r \"dataset/44k\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#@title Copy your dataset\n", + "#@markdown **We assume that your dataset is in your Google Drive's `so-vits-svc-fork/dataset/(speaker_name)` directory.**\n", + "DATASET_NAME = \"kiritan\" #@param {type: \"string\"}\n", + "!cp -R /content/drive/MyDrive/so-vits-svc-fork/dataset/{DATASET_NAME}/ -t \"dataset_raw/\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#@title Download dataset (Tsukuyomi-chan JVS)\n", + "#@markdown You can download this dataset if you don't have your own dataset.\n", + "#@markdown Make sure you agree to the license when using this dataset.\n", + "#@markdown https://tyc.rei-yumesaki.net/material/corpus/#toc6\n", + "# !wget https://tyc.rei-yumesaki.net/files/sozai-tyc-corpus1.zip\n", + "# !unzip sozai-tyc-corpus1.zip\n", + "# !mv \"/content/つくよみちゃんコーパス Vol.1 声優統計コーパス(JVSコーパス準拠)/おまけ:WAV(+12dB増幅&高音域削減)/WAV(+12dB増幅&高音域削減)\" \"dataset_raw/tsukuyomi\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#@title Automatic preprocessing\n", + "!svc pre-resample" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!svc pre-config" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#@title Copy configs file\n", + "!cp configs/44k/config.json drive/MyDrive/so-vits-svc-fork" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "F0_METHOD = \"dio\" #@param [\"crepe\", \"crepe-tiny\", \"parselmouth\", \"dio\", \"harvest\"]\n", + "!svc pre-hubert -fm {F0_METHOD}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#@title Train\n", + "%load_ext tensorboard\n", + "%tensorboard --logdir drive/MyDrive/so-vits-svc-fork/logs/44k\n", + "!svc train --model-path drive/MyDrive/so-vits-svc-fork/logs/44k" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Training Cluster model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!svc train-cluster --output-path drive/MyDrive/so-vits-svc-fork/logs/44k/kmeans.pt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inference" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#@title Get the author's voice as a source\n", + "import random\n", + "NAME = str(random.randint(1, 49))\n", + "TYPE = \"fsd50k\" #@param [\"\", \"digit\", \"dog\", \"fsd50k\"]\n", + "CUSTOM_FILEPATH = \"\" #@param {type: \"string\"}\n", + "if CUSTOM_FILEPATH != \"\":\n", + " NAME = CUSTOM_FILEPATH\n", + "else:\n", + " # it is extremely difficult to find a voice that can download from the internet directly\n", + " if TYPE == \"dog\":\n", + " !wget -N f\"https://huggingface.co/datasets/437aewuh/dog-dataset/resolve/main/dogs/dogs_{NAME:.0000}.wav\" -O {NAME}.wav\n", + " elif TYPE == \"digit\":\n", + " # george, jackson, lucas, nicolas, ...\n", + " !wget -N f\"https://github.com/Jakobovski/free-spoken-digit-dataset/raw/master/recordings/0_george_{NAME}.wav\" -O {NAME}.wav\n", + " elif TYPE == \"fsd50k\":\n", + " !wget -N f\"https://huggingface.co/datasets/Fhrozen/FSD50k/blob/main/clips/dev/{10000+int(NAME)}.wav\" -O {NAME}.wav\n", + " else:\n", + " !wget -N f\"https://zunko.jp/sozai/utau/voice_{\"kiritan\" if NAME < 25 else \"itako\"}{NAME % 5 + 1}.wav\" -O {NAME}.wav\n", + "from IPython.display import Audio, display\n", + "display(Audio(f\"{NAME}.wav\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#@title Use trained model\n", + "#@markdown **Put your .wav file in `so-vits-svc-fork/audio` directory**\n", + "from IPython.display import Audio, display\n", + "!svc infer drive/MyDrive/so-vits-svc-fork/audio/{NAME}.wav -m drive/MyDrive/so-vits-svc-fork/logs/44k/ -c drive/MyDrive/so-vits-svc-fork/logs/44k/config.json\n", + "display(Audio(f\"drive/MyDrive/so-vits-svc-fork/audio/{NAME}.out.wav\", autoplay=True))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "##@title Use trained model (with cluster)\n", + "!svc infer {NAME}.wav -s speaker -r 0.1 -m drive/MyDrive/so-vits-svc-fork/logs/44k/ -c drive/MyDrive/so-vits-svc-fork/logs/44k/config.json -k drive/MyDrive/so-vits-svc-fork/logs/44k/kmeans.pt\n", + "display(Audio(f\"{NAME}.out.wav\", autoplay=True))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Pretrained models" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#@title https://huggingface.co/TachibanaKimika/so-vits-svc-4.0-models/tree/main\n", + "!wget -N \"https://huggingface.co/TachibanaKimika/so-vits-svc-4.0-models/resolve/main/riri/G_riri_220.pth\"\n", + "!wget -N \"https://huggingface.co/TachibanaKimika/so-vits-svc-4.0-models/resolve/main/riri/config.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!svc infer {NAME}.wav -c config.json -m G_riri_220.pth\n", + "display(Audio(f\"{NAME}.out.wav\", autoplay=True))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#@title https://huggingface.co/therealvul/so-vits-svc-4.0/tree/main\n", + "!wget -N \"https://huggingface.co/therealvul/so-vits-svc-4.0/resolve/main/Pinkie%20(speaking%20sep)/G_166400.pth\"\n", + "!wget -N \"https://huggingface.co/therealvul/so-vits-svc-4.0/resolve/main/Pinkie%20(speaking%20sep)/config.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!svc infer {NAME}.wav --speaker \"Pinkie {neutral}\" -c config.json -m G_166400.pth\n", + "display(Audio(f\"{NAME}.out.wav\", autoplay=True))" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "provenance": [] + }, + "gpuClass": "standard", + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/voice_conversion/so-vits-svc-paul-v2/poetry.lock b/voice_conversion/so-vits-svc-paul-v2/poetry.lock new file mode 100644 index 0000000..9e2d1d1 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/poetry.lock @@ -0,0 +1,5209 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "absl-py" +version = "1.4.0" +description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "absl-py-1.4.0.tar.gz", hash = "sha256:d2c244d01048ba476e7c080bd2c6df5e141d211de80223460d5b3b8a2a58433d"}, + {file = "absl_py-1.4.0-py3-none-any.whl", hash = "sha256:0d3fe606adfa4f7db64792dd4c7aee4ee0c38ab75dfd353b7a83ed3e957fcb47"}, +] + +[[package]] +name = "aiofiles" +version = "23.1.0" +description = "File support for asyncio." +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "aiofiles-23.1.0-py3-none-any.whl", hash = "sha256:9312414ae06472eb6f1d163f555e466a23aed1c8f60c30cccf7121dba2e53eb2"}, + {file = "aiofiles-23.1.0.tar.gz", hash = "sha256:edd247df9a19e0db16534d4baaf536d6609a43e1de5401d7a4c1c148753a1635"}, +] + +[[package]] +name = "aiohttp" +version = "3.8.4" +description = "Async http client/server framework (asyncio)" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, + {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, + {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, + {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, + {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, + {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, + {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, + {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, + {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, + {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, + {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, + {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, + {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, + {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, + {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, + {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, + {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, + {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<4.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "cchardet"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "alabaster" +version = "0.7.13" +description = "A configurable sidebar-enabled Sphinx theme" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, + {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, +] + +[[package]] +name = "altair" +version = "4.2.2" +description = "Altair: A declarative statistical visualization library for Python." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "altair-4.2.2-py3-none-any.whl", hash = "sha256:8b45ebeaf8557f2d760c5c77b79f02ae12aee7c46c27c06014febab6f849bc87"}, + {file = "altair-4.2.2.tar.gz", hash = "sha256:39399a267c49b30d102c10411e67ab26374156a84b1aeb9fcd15140429ba49c5"}, +] + +[package.dependencies] +entrypoints = "*" +jinja2 = "*" +jsonschema = ">=3.0" +numpy = "*" +pandas = ">=0.18" +toolz = "*" + +[package.extras] +dev = ["black", "docutils", "flake8", "ipython", "m2r", "mistune (<2.0.0)", "pytest", "recommonmark", "sphinx", "vega-datasets"] + +[[package]] +name = "ansicon" +version = "1.89.0" +description = "Python wrapper for loading Jason Hood's ANSICON" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "ansicon-1.89.0-py2.py3-none-any.whl", hash = "sha256:f1def52d17f65c2c9682cf8370c03f541f410c1752d6a14029f97318e4b9dfec"}, + {file = "ansicon-1.89.0.tar.gz", hash = "sha256:e4d039def5768a47e4afec8e89e83ec3ae5a26bf00ad851f914d1240b444d2b1"}, +] + +[[package]] +name = "anyio" +version = "3.6.2" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "main" +optional = false +python-versions = ">=3.6.2" +files = [ + {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"}, + {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"] +trio = ["trio (>=0.16,<0.22)"] + +[[package]] +name = "arrow" +version = "1.2.3" +description = "Better dates & times for Python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "arrow-1.2.3-py3-none-any.whl", hash = "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2"}, + {file = "arrow-1.2.3.tar.gz", hash = "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" + +[[package]] +name = "async-timeout" +version = "4.0.2" +description = "Timeout context manager for asyncio programs" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] + +[[package]] +name = "attrs" +version = "22.2.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, + {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] +tests = ["attrs[tests-no-zope]", "zope.interface"] +tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] + +[[package]] +name = "audioread" +version = "3.0.0" +description = "multi-library, cross-platform audio decoding" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "audioread-3.0.0.tar.gz", hash = "sha256:121995bd207eb1fda3d566beb851d3534275925bc35a4fb6da0cb11de0f7251a"}, +] + +[[package]] +name = "babel" +version = "2.12.1" +description = "Internationalization utilities" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, + {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, +] + +[package.dependencies] +pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} + +[[package]] +name = "beautifulsoup4" +version = "4.12.2" +description = "Screen-scraping library" +category = "main" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "blessed" +version = "1.20.0" +description = "Easy, practical library for making terminal apps, by providing an elegant, well-documented interface to Colors, Keyboard input, and screen Positioning capabilities." +category = "main" +optional = false +python-versions = ">=2.7" +files = [ + {file = "blessed-1.20.0-py2.py3-none-any.whl", hash = "sha256:0c542922586a265e699188e52d5f5ac5ec0dd517e5a1041d90d2bbf23f906058"}, + {file = "blessed-1.20.0.tar.gz", hash = "sha256:2cdd67f8746e048f00df47a2880f4d6acbcdb399031b604e34ba8f71d5787680"}, +] + +[package.dependencies] +jinxed = {version = ">=1.1.0", markers = "platform_system == \"Windows\""} +six = ">=1.9.0" +wcwidth = ">=0.1.4" + +[[package]] +name = "blinker" +version = "1.6.2" +description = "Fast, simple object-to-object and broadcast signaling" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "blinker-1.6.2-py3-none-any.whl", hash = "sha256:c3d739772abb7bc2860abf5f2ec284223d9ad5c76da018234f6f50d6f31ab1f0"}, + {file = "blinker-1.6.2.tar.gz", hash = "sha256:4afd3de66ef3a9f8067559fb7a1cbe555c17dcbe15971b05d1b625c3e7abe213"}, +] + +[[package]] +name = "cachetools" +version = "5.3.0" +description = "Extensible memoizing collections and decorators" +category = "main" +optional = false +python-versions = "~=3.7" +files = [ + {file = "cachetools-5.3.0-py3-none-any.whl", hash = "sha256:429e1a1e845c008ea6c85aa35d4b98b65d6a9763eeef3e37e92728a12d1de9d4"}, + {file = "cachetools-5.3.0.tar.gz", hash = "sha256:13dfddc7b8df938c21a940dfa6557ce6e94a2f1cdfa58eb90c805721d58f2c14"}, +] + +[[package]] +name = "certifi" +version = "2022.12.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, + {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, +] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "cfgv" +version = "3.3.1" +description = "Validate configuration and produce human readable error messages." +category = "dev" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, + {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "cm-time" +version = "0.1.2" +description = "A simple context manager that measures time using perf_counter()" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "cm_time-0.1.2-py3-none-any.whl", hash = "sha256:8dfd172916a7b23f508fbca046157067ab9374fc38791d408278ce7288077cfa"}, + {file = "cm_time-0.1.2.tar.gz", hash = "sha256:e2848efc5868884d0a7795408ec9b2c21d2d3e2cf399241e8e4531a29128b638"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.4.0,<5.0.0", markers = "python_version < \"3.10\""} + +[[package]] +name = "cmake" +version = "3.26.1" +description = "CMake is an open-source, cross-platform family of tools designed to build, test and package software" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "cmake-3.26.1-py2.py3-none-macosx_10_10_universal2.macosx_10_10_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:d8a7e0cc8677677a732aff3e3fd0ad64eeff43cac772614b03c436912247d0d8"}, + {file = "cmake-3.26.1-py2.py3-none-manylinux2010_i686.manylinux_2_12_i686.whl", hash = "sha256:f2f721f5aebe304c281ee4b1d2dfbf7f4a52fca003834b2b4a3ba838aeded63c"}, + {file = "cmake-3.26.1-py2.py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:63a012b72836702eadfe4fba9642aeb17337f26861f4768e837053f40e98cb46"}, + {file = "cmake-3.26.1-py2.py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2b72be88b7bfaa6ae59566cbb9d6a5553f19b2a8d14efa6ac0cf019a29860a1b"}, + {file = "cmake-3.26.1-py2.py3-none-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1278354f7210e22458aa9137d46a56da1f115a7b76ad2733f0bf6041fb40f1dc"}, + {file = "cmake-3.26.1-py2.py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:de96a5522917fba0ab0da2d01d9dd9462fa80f365218bf27162d539c2335758f"}, + {file = "cmake-3.26.1-py2.py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:449928ad7dfcd41e4dcff64c7d44f86557883c70577666a19e79e22d783bbbd0"}, + {file = "cmake-3.26.1-py2.py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19fa3e457afecf2803265f71652ef17c3f1d317173c330ba46767a0853d38fa0"}, + {file = "cmake-3.26.1-py2.py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:43360650d60d177d979e4ad0a5f31afa286e6d88f5350f7a38c29d94514900eb"}, + {file = "cmake-3.26.1-py2.py3-none-musllinux_1_1_i686.whl", hash = "sha256:16aac10363bc926da5109a59ef8fe46ddcd7e3d421de61f871b35524eef2f1ae"}, + {file = "cmake-3.26.1-py2.py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:e460ba5070be4dcac9613cb526a46db4e5fa19d8b909a8d8d5244c6cc3c777e1"}, + {file = "cmake-3.26.1-py2.py3-none-musllinux_1_1_s390x.whl", hash = "sha256:fd2ecc0899f7939a014bd906df85e8681bd63ce457de3ab0b5d9e369fa3bdf79"}, + {file = "cmake-3.26.1-py2.py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:22781a23e274ba9bf380b970649654851c1b4b9d83b65fec12ee2e2e03b6ffc4"}, + {file = "cmake-3.26.1-py2.py3-none-win32.whl", hash = "sha256:7b4e81de30ac1fb2f1eb5287063e140b53f376fd9ed7e2060c1c7b5917bd5f83"}, + {file = "cmake-3.26.1-py2.py3-none-win_amd64.whl", hash = "sha256:90845b6c87a25be07e9220f67dd7f6c891c6ec14d764d37335218d97f9ea4520"}, + {file = "cmake-3.26.1-py2.py3-none-win_arm64.whl", hash = "sha256:43bd96327e2631183bb4829ba20cb810e20b4b0c68f852fcd7082fbb5359d57c"}, + {file = "cmake-3.26.1.tar.gz", hash = "sha256:4e0eb3c03dcf2d459f78d96cc85f7482476aeb1ae5ada65150b1db35c0f70cc7"}, +] + +[package.extras] +test = ["codecov (>=2.0.5)", "coverage (>=4.2)", "flake8 (>=3.0.4)", "path.py (>=11.5.0)", "pytest (>=3.0.3)", "pytest-cov (>=2.4.0)", "pytest-runner (>=2.9)", "pytest-virtualenv (>=1.7.0)", "scikit-build (>=0.10.0)", "setuptools (>=28.0.0)", "virtualenv (>=15.0.3)", "wheel"] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "contourpy" +version = "1.0.7" +description = "Python library for calculating contours of 2D quadrilateral grids" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d"}, + {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab"}, + {file = "contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69"}, + {file = "contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3"}, + {file = "contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566"}, + {file = "contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0"}, + {file = "contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc"}, + {file = "contourpy-1.0.7-cp38-cp38-win32.whl", hash = "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66"}, + {file = "contourpy-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967"}, + {file = "contourpy-1.0.7-cp39-cp39-win32.whl", hash = "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693"}, + {file = "contourpy-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd"}, + {file = "contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e"}, +] + +[package.dependencies] +numpy = ">=1.16" + +[package.extras] +bokeh = ["bokeh", "chromedriver", "selenium"] +docs = ["furo", "sphinx-copybutton"] +mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"] +test = ["Pillow", "matplotlib", "pytest"] +test-no-images = ["pytest"] + +[[package]] +name = "coverage" +version = "7.2.3" +description = "Code coverage measurement for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "coverage-7.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e58c0d41d336569d63d1b113bd573db8363bc4146f39444125b7f8060e4e04f5"}, + {file = "coverage-7.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:344e714bd0fe921fc72d97404ebbdbf9127bac0ca1ff66d7b79efc143cf7c0c4"}, + {file = "coverage-7.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:974bc90d6f6c1e59ceb1516ab00cf1cdfbb2e555795d49fa9571d611f449bcb2"}, + {file = "coverage-7.2.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0743b0035d4b0e32bc1df5de70fba3059662ace5b9a2a86a9f894cfe66569013"}, + {file = "coverage-7.2.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d0391fb4cfc171ce40437f67eb050a340fdbd0f9f49d6353a387f1b7f9dd4fa"}, + {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a42e1eff0ca9a7cb7dc9ecda41dfc7cbc17cb1d02117214be0561bd1134772b"}, + {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:be19931a8dcbe6ab464f3339966856996b12a00f9fe53f346ab3be872d03e257"}, + {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:72fcae5bcac3333a4cf3b8f34eec99cea1187acd55af723bcbd559adfdcb5535"}, + {file = "coverage-7.2.3-cp310-cp310-win32.whl", hash = "sha256:aeae2aa38395b18106e552833f2a50c27ea0000122bde421c31d11ed7e6f9c91"}, + {file = "coverage-7.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:83957d349838a636e768251c7e9979e899a569794b44c3728eaebd11d848e58e"}, + {file = "coverage-7.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfd393094cd82ceb9b40df4c77976015a314b267d498268a076e940fe7be6b79"}, + {file = "coverage-7.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:182eb9ac3f2b4874a1f41b78b87db20b66da6b9cdc32737fbbf4fea0c35b23fc"}, + {file = "coverage-7.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bb1e77a9a311346294621be905ea8a2c30d3ad371fc15bb72e98bfcfae532df"}, + {file = "coverage-7.2.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca0f34363e2634deffd390a0fef1aa99168ae9ed2af01af4a1f5865e362f8623"}, + {file = "coverage-7.2.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55416d7385774285b6e2a5feca0af9652f7f444a4fa3d29d8ab052fafef9d00d"}, + {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:06ddd9c0249a0546997fdda5a30fbcb40f23926df0a874a60a8a185bc3a87d93"}, + {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fff5aaa6becf2c6a1699ae6a39e2e6fb0672c2d42eca8eb0cafa91cf2e9bd312"}, + {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ea53151d87c52e98133eb8ac78f1206498c015849662ca8dc246255265d9c3c4"}, + {file = "coverage-7.2.3-cp311-cp311-win32.whl", hash = "sha256:8f6c930fd70d91ddee53194e93029e3ef2aabe26725aa3c2753df057e296b925"}, + {file = "coverage-7.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:fa546d66639d69aa967bf08156eb8c9d0cd6f6de84be9e8c9819f52ad499c910"}, + {file = "coverage-7.2.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2317d5ed777bf5a033e83d4f1389fd4ef045763141d8f10eb09a7035cee774c"}, + {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be9824c1c874b73b96288c6d3de793bf7f3a597770205068c6163ea1f326e8b9"}, + {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3b2803e730dc2797a017335827e9da6da0e84c745ce0f552e66400abdfb9a1"}, + {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f69770f5ca1994cb32c38965e95f57504d3aea96b6c024624fdd5bb1aa494a1"}, + {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1127b16220f7bfb3f1049ed4a62d26d81970a723544e8252db0efde853268e21"}, + {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:aa784405f0c640940595fa0f14064d8e84aff0b0f762fa18393e2760a2cf5841"}, + {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3146b8e16fa60427e03884301bf8209221f5761ac754ee6b267642a2fd354c48"}, + {file = "coverage-7.2.3-cp37-cp37m-win32.whl", hash = "sha256:1fd78b911aea9cec3b7e1e2622c8018d51c0d2bbcf8faaf53c2497eb114911c1"}, + {file = "coverage-7.2.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f3736a5d34e091b0a611964c6262fd68ca4363df56185902528f0b75dbb9c1f"}, + {file = "coverage-7.2.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:981b4df72c93e3bc04478153df516d385317628bd9c10be699c93c26ddcca8ab"}, + {file = "coverage-7.2.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0045f8f23a5fb30b2eb3b8a83664d8dc4fb58faddf8155d7109166adb9f2040"}, + {file = "coverage-7.2.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f760073fcf8f3d6933178d67754f4f2d4e924e321f4bb0dcef0424ca0215eba1"}, + {file = "coverage-7.2.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c86bd45d1659b1ae3d0ba1909326b03598affbc9ed71520e0ff8c31a993ad911"}, + {file = "coverage-7.2.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:172db976ae6327ed4728e2507daf8a4de73c7cc89796483e0a9198fd2e47b462"}, + {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d2a3a6146fe9319926e1d477842ca2a63fe99af5ae690b1f5c11e6af074a6b5c"}, + {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f649dd53833b495c3ebd04d6eec58479454a1784987af8afb77540d6c1767abd"}, + {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c4ed4e9f3b123aa403ab424430b426a1992e6f4c8fd3cb56ea520446e04d152"}, + {file = "coverage-7.2.3-cp38-cp38-win32.whl", hash = "sha256:eb0edc3ce9760d2f21637766c3aa04822030e7451981ce569a1b3456b7053f22"}, + {file = "coverage-7.2.3-cp38-cp38-win_amd64.whl", hash = "sha256:63cdeaac4ae85a179a8d6bc09b77b564c096250d759eed343a89d91bce8b6367"}, + {file = "coverage-7.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:20d1a2a76bb4eb00e4d36b9699f9b7aba93271c9c29220ad4c6a9581a0320235"}, + {file = "coverage-7.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ea748802cc0de4de92ef8244dd84ffd793bd2e7be784cd8394d557a3c751e21"}, + {file = "coverage-7.2.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21b154aba06df42e4b96fc915512ab39595105f6c483991287021ed95776d934"}, + {file = "coverage-7.2.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd214917cabdd6f673a29d708574e9fbdb892cb77eb426d0eae3490d95ca7859"}, + {file = "coverage-7.2.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2e58e45fe53fab81f85474e5d4d226eeab0f27b45aa062856c89389da2f0d9"}, + {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:87ecc7c9a1a9f912e306997ffee020297ccb5ea388421fe62a2a02747e4d5539"}, + {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:387065e420aed3c71b61af7e82c7b6bc1c592f7e3c7a66e9f78dd178699da4fe"}, + {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ea3f5bc91d7d457da7d48c7a732beaf79d0c8131df3ab278e6bba6297e23c6c4"}, + {file = "coverage-7.2.3-cp39-cp39-win32.whl", hash = "sha256:ae7863a1d8db6a014b6f2ff9c1582ab1aad55a6d25bac19710a8df68921b6e30"}, + {file = "coverage-7.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:3f04becd4fcda03c0160d0da9c8f0c246bc78f2f7af0feea1ec0930e7c93fa4a"}, + {file = "coverage-7.2.3-pp37.pp38.pp39-none-any.whl", hash = "sha256:965ee3e782c7892befc25575fa171b521d33798132692df428a09efacaffe8d0"}, + {file = "coverage-7.2.3.tar.gz", hash = "sha256:d298c2815fa4891edd9abe5ad6e6cb4207104c7dd9fd13aea3fdebf6f9b91259"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "croniter" +version = "1.3.10" +description = "croniter provides iteration for datetime object with cron like format" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "croniter-1.3.10-py2.py3-none-any.whl", hash = "sha256:362bbba72cbd3d3ffa34218414762c81e48001ba6bf7f32164b6e22aa597cbb3"}, + {file = "croniter-1.3.10.tar.gz", hash = "sha256:bb9550b4761509b813d5397aaf4c15b800b29d002500e0c5f29e20d87558aae1"}, +] + +[package.dependencies] +python-dateutil = "*" + +[[package]] +name = "cycler" +version = "0.11.0" +description = "Composable style cycles" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, + {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, +] + +[[package]] +name = "cython" +version = "0.29.34" +description = "The Cython compiler for writing C extensions for the Python language." +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "Cython-0.29.34-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:742544024ddb74314e2d597accdb747ed76bd126e61fcf49940a5b5be0a8f381"}, + {file = "Cython-0.29.34-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:03daae07f8cbf797506446adae512c3dd86e7f27a62a541fa1ee254baf43e32c"}, + {file = "Cython-0.29.34-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5a8de3e793a576e40ca9b4f5518610cd416273c7dc5e254115656b6e4ec70663"}, + {file = "Cython-0.29.34-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:60969d38e6a456a67e7ef8ae20668eff54e32ba439d4068ccf2854a44275a30f"}, + {file = "Cython-0.29.34-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:21b88200620d80cfe193d199b259cdad2b9af56f916f0f7f474b5a3631ca0caa"}, + {file = "Cython-0.29.34-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:308c8f1e58bf5e6e8a1c4dcf8abbd2d13d0f9b1e582f4d9ae8b89857342d8bb5"}, + {file = "Cython-0.29.34-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:d8f822fb6ecd5d88c42136561f82960612421154fc5bf23c57103a367bb91356"}, + {file = "Cython-0.29.34-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56866323f1660cecb4d5ff3a1fba92a56b91b7cfae0a8253777aa4bdb3bdf9a8"}, + {file = "Cython-0.29.34-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e971db8aeb12e7c0697cefafe65eefcc33ff1224ae3d8c7f83346cbc42c6c270"}, + {file = "Cython-0.29.34-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4401270b0dc464c23671e2e9d52a60985f988318febaf51b047190e855bbe7d"}, + {file = "Cython-0.29.34-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:dce0a36d163c05ae8b21200059511217d79b47baf2b7b0f926e8367bd7a3cc24"}, + {file = "Cython-0.29.34-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dbd79221869ee9a6ccc4953b2c8838bb6ae08ab4d50ea4b60d7894f03739417b"}, + {file = "Cython-0.29.34-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a0f4229df10bc4545ebbeaaf96ebb706011d8b333e54ed202beb03f2bee0a50e"}, + {file = "Cython-0.29.34-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fd1ea21f1cebf33ae288caa0f3e9b5563a709f4df8925d53bad99be693fc0d9b"}, + {file = "Cython-0.29.34-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:d7ef5f68f4c5baa93349ea54a352f8716d18bee9a37f3e93eff38a5d4e9b7262"}, + {file = "Cython-0.29.34-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:459994d1de0f99bb18fad9f2325f760c4b392b1324aef37bcc1cd94922dfce41"}, + {file = "Cython-0.29.34-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:1d6c809e2f9ce5950bbc52a1d2352ef3d4fc56186b64cb0d50c8c5a3c1d17661"}, + {file = "Cython-0.29.34-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f674ceb5f722d364395f180fbac273072fc1a266aab924acc9cfd5afc645aae1"}, + {file = "Cython-0.29.34-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9489de5b2044dcdfd9d6ca8242a02d560137b3c41b1f5ae1c4f6707d66d6e44d"}, + {file = "Cython-0.29.34-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:5c121dc185040f4333bfded68963b4529698e1b6d994da56be32c97a90c896b6"}, + {file = "Cython-0.29.34-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:b6149f7cc5b31bccb158c5b968e5a8d374fdc629792e7b928a9b66e08b03fca5"}, + {file = "Cython-0.29.34-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0ab3cbf3d62b0354631a45dc93cfcdf79098663b1c65a6033af4a452b52217a7"}, + {file = "Cython-0.29.34-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:4a2723447d1334484681d5aede34184f2da66317891f94b80e693a2f96a8f1a7"}, + {file = "Cython-0.29.34-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e40cf86aadc29ecd1cb6de67b0d9488705865deea4fc185c7ad56d7a6fc78703"}, + {file = "Cython-0.29.34-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8c3cd8bb8e880a3346f5685601004d96e0a2221e73edcaeea57ea848618b4ac6"}, + {file = "Cython-0.29.34-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0e9032cd650b0cb1d2c2ef2623f5714c14d14c28d7647d589c3eeed0baf7428e"}, + {file = "Cython-0.29.34-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:bdb3285660e3068438791ace7dd7b1efd6b442a10b5c8d7a4f0c9d184d08c8ed"}, + {file = "Cython-0.29.34-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a8ad755f9364e720f10a36734a1c7a5ced5c679446718b589259261438a517c9"}, + {file = "Cython-0.29.34-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:7595d29eaee95633dd8060f50f0e54b27472d01587659557ebcfe39da3ea946b"}, + {file = "Cython-0.29.34-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e6ef7879668214d80ea3914c17e7d4e1ebf4242e0dd4dabe95ca5ccbe75589a5"}, + {file = "Cython-0.29.34-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ccb223b5f0fd95d8d27561efc0c14502c0945f1a32274835831efa5d5baddfc1"}, + {file = "Cython-0.29.34-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:11b1b278b8edef215caaa5250ad65a10023bfa0b5a93c776552248fc6f60098d"}, + {file = "Cython-0.29.34-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:5718319a01489688fdd22ddebb8e2fcbbd60be5f30de4336ea7063c3ae29fbe5"}, + {file = "Cython-0.29.34-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:cfb2302ef617d647ee590a4c0a00ba3c2da05f301dcefe7721125565d2e51351"}, + {file = "Cython-0.29.34-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:67b850cf46b861bc27226d31e1d87c0e69869a02f8d3cc5d5bef549764029879"}, + {file = "Cython-0.29.34-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0963266dad685812c1dbb758fcd4de78290e3adc7db271c8664dcde27380b13e"}, + {file = "Cython-0.29.34-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7879992487d9060a61393eeefe00d299210256928dce44d887b6be313d342bac"}, + {file = "Cython-0.29.34-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:44733366f1604b0c327613b6918469284878d2f5084297d10d26072fc6948d51"}, + {file = "Cython-0.29.34-py2.py3-none-any.whl", hash = "sha256:be4f6b7be75a201c290c8611c0978549c60353890204573078e865423dbe3c83"}, + {file = "Cython-0.29.34.tar.gz", hash = "sha256:1909688f5d7b521a60c396d20bba9e47a1b2d2784bfb085401e1e1e7d29a29a8"}, +] + +[[package]] +name = "dateutils" +version = "0.6.12" +description = "Various utilities for working with date and datetime objects" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "dateutils-0.6.12-py2.py3-none-any.whl", hash = "sha256:f33b6ab430fa4166e7e9cb8b21ee9f6c9843c48df1a964466f52c79b2a8d53b3"}, + {file = "dateutils-0.6.12.tar.gz", hash = "sha256:03dd90bcb21541bd4eb4b013637e4f1b5f944881c46cc6e4b67a6059e370e3f1"}, +] + +[package.dependencies] +python-dateutil = "*" +pytz = "*" + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "deepdiff" +version = "6.3.0" +description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "deepdiff-6.3.0-py3-none-any.whl", hash = "sha256:15838bd1cbd046ce15ed0c41e837cd04aff6b3e169c5e06fca69d7aa11615ceb"}, + {file = "deepdiff-6.3.0.tar.gz", hash = "sha256:6a3bf1e7228ac5c71ca2ec43505ca0a743ff54ec77aa08d7db22de6bc7b2b644"}, +] + +[package.dependencies] +ordered-set = ">=4.0.2,<4.2.0" + +[package.extras] +cli = ["click (==8.1.3)", "pyyaml (==6.0)"] +optimize = ["orjson"] + +[[package]] +name = "distlib" +version = "0.3.6" +description = "Distribution utilities" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, + {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, +] + +[[package]] +name = "docutils" +version = "0.18.1" +description = "Docutils -- Python Documentation Utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, + {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, +] + +[[package]] +name = "entrypoints" +version = "0.4" +description = "Discover and load entry points from installed packages." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, + {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "fastapi" +version = "0.88.0" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "fastapi-0.88.0-py3-none-any.whl", hash = "sha256:263b718bb384422fe3d042ffc9a0c8dece5e034ab6586ff034f6b4b1667c3eee"}, + {file = "fastapi-0.88.0.tar.gz", hash = "sha256:915bf304180a0e7c5605ec81097b7d4cd8826ff87a02bb198e336fb9f3b5ff02"}, +] + +[package.dependencies] +pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" +starlette = "0.22.0" + +[package.extras] +all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +dev = ["pre-commit (>=2.17.0,<3.0.0)", "ruff (==0.0.138)", "uvicorn[standard] (>=0.12.0,<0.19.0)"] +doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer[all] (>=0.6.1,<0.7.0)"] +test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==22.10.0)", "coverage[toml] (>=6.5.0,<7.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "pyyaml (>=5.3.1,<7.0.0)", "ruff (==0.0.138)", "sqlalchemy (>=1.3.18,<=1.4.41)", "types-orjson (==3.6.2)", "types-ujson (==5.5.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] + +[[package]] +name = "ffmpy" +version = "0.3.0" +description = "A simple Python wrapper for ffmpeg" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "ffmpy-0.3.0.tar.gz", hash = "sha256:757591581eee25b4a50ac9ffb9b58035a2794533db47e0512f53fb2d7b6f9adc"}, +] + +[[package]] +name = "filelock" +version = "3.11.0" +description = "A platform independent file lock." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "filelock-3.11.0-py3-none-any.whl", hash = "sha256:f08a52314748335c6460fc8fe40cd5638b85001225db78c2aa01c8c0db83b318"}, + {file = "filelock-3.11.0.tar.gz", hash = "sha256:3618c0da67adcc0506b015fd11ef7faf1b493f0b40d87728e19986b536890c37"}, +] + +[package.extras] +docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.2)", "diff-cover (>=7.5)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] + +[[package]] +name = "flask" +version = "2.3.1" +description = "A simple framework for building complex web applications." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Flask-2.3.1-py3-none-any.whl", hash = "sha256:8ba2a854608fdd603b67dccd4514a46450132227fb9df40127a8d0c1de8769ec"}, + {file = "Flask-2.3.1.tar.gz", hash = "sha256:a6059db4297106e5a64b3215fa16ae641822c1cb97ecb498573549b2478602cb"}, +] + +[package.dependencies] +blinker = ">=1.6.2" +click = ">=8.1.3" +importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} +itsdangerous = ">=2.1.2" +Jinja2 = ">=3.1.2" +Werkzeug = ">=2.3.0" + +[package.extras] +async = ["asgiref (>=3.2)"] +dotenv = ["python-dotenv"] + +[[package]] +name = "flask-cors" +version = "3.0.10" +description = "A Flask extension adding a decorator for CORS support" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "Flask-Cors-3.0.10.tar.gz", hash = "sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de"}, + {file = "Flask_Cors-3.0.10-py2.py3-none-any.whl", hash = "sha256:74efc975af1194fc7891ff5cd85b0f7478be4f7f59fe158102e91abb72bb4438"}, +] + +[package.dependencies] +Flask = ">=0.9" +Six = "*" + +[[package]] +name = "fonttools" +version = "4.39.3" +description = "Tools to manipulate font files" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.39.3-py3-none-any.whl", hash = "sha256:64c0c05c337f826183637570ac5ab49ee220eec66cf50248e8df527edfa95aeb"}, + {file = "fonttools-4.39.3.zip", hash = "sha256:9234b9f57b74e31b192c3fc32ef1a40750a8fbc1cd9837a7b7bfc4ca4a5c51d7"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "scipy"] +lxml = ["lxml (>=4.0,<5)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.0.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "frozenlist" +version = "1.3.3" +description = "A list-like structure which implements collections.abc.MutableSequence" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, + {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, + {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, + {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, + {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, + {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, + {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, + {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, + {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, + {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, + {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, + {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, + {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, + {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, + {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, +] + +[[package]] +name = "fsspec" +version = "2023.4.0" +description = "File-system specification" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2023.4.0-py3-none-any.whl", hash = "sha256:f398de9b49b14e9d84d2c2d11b7b67121bc072fe97b930c4e5668ac3917d8307"}, + {file = "fsspec-2023.4.0.tar.gz", hash = "sha256:bf064186cd8808f0b2f6517273339ba0a0c8fb1b7048991c28bc67f58b8b67cd"}, +] + +[package.dependencies] +aiohttp = {version = "<4.0.0a0 || >4.0.0a0,<4.0.0a1 || >4.0.0a1", optional = true, markers = "extra == \"http\""} +requests = {version = "*", optional = true, markers = "extra == \"http\""} + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + +[[package]] +name = "google-auth" +version = "2.17.2" +description = "Google Authentication Library" +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +files = [ + {file = "google-auth-2.17.2.tar.gz", hash = "sha256:295c80ebb95eac74003c07a696cf3ef6b414e9230ae8894f3843f8215fd2aa56"}, + {file = "google_auth-2.17.2-py2.py3-none-any.whl", hash = "sha256:544536a43d44dff0f64222e4d027d124989fcb9c10979687e589e1694fba9c94"}, +] + +[package.dependencies] +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} +six = ">=1.9.0" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] +enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0dev)"] + +[[package]] +name = "google-auth-oauthlib" +version = "1.0.0" +description = "Google Authentication Library" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "google-auth-oauthlib-1.0.0.tar.gz", hash = "sha256:e375064964820b47221a7e1b7ee1fd77051b6323c3f9e3e19785f78ab67ecfc5"}, + {file = "google_auth_oauthlib-1.0.0-py2.py3-none-any.whl", hash = "sha256:95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb"}, +] + +[package.dependencies] +google-auth = ">=2.15.0" +requests-oauthlib = ">=0.7.0" + +[package.extras] +tool = ["click (>=6.0.0)"] + +[[package]] +name = "gradio" +version = "3.18.0" +description = "Python library for easily interacting with trained machine learning models" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gradio-3.18.0-py3-none-any.whl", hash = "sha256:de608f310584d1b16c9554015352adfa4804e6319d20a6b66e271377d2bbb31d"}, + {file = "gradio-3.18.0.tar.gz", hash = "sha256:f66d19c651c740da6cfa2b411b0e19942579532e0ffc5c41f71a2adbf0bc5c30"}, +] + +[package.dependencies] +aiofiles = "*" +aiohttp = "*" +altair = ">=4.2.0" +fastapi = "*" +ffmpy = "*" +fsspec = "*" +httpx = "*" +jinja2 = "*" +markdown-it-py = {version = ">=2.0.0", extras = ["linkify", "plugins"]} +markupsafe = "*" +matplotlib = "*" +numpy = "*" +orjson = "*" +pandas = "*" +pillow = "*" +pycryptodome = "*" +pydantic = "*" +pydub = "*" +python-multipart = "*" +pyyaml = "*" +requests = "*" +typing-extensions = "*" +uvicorn = "*" +websockets = ">=10.0" + +[[package]] +name = "grpcio" +version = "1.53.0" +description = "HTTP/2-based RPC framework" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "grpcio-1.53.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:752d2949b40e12e6ad3ed8cc552a65b54d226504f6b1fb67cab2ccee502cc06f"}, + {file = "grpcio-1.53.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:8a48fd3a7222be226bb86b7b413ad248f17f3101a524018cdc4562eeae1eb2a3"}, + {file = "grpcio-1.53.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:f3e837d29f0e1b9d6e7b29d569e2e9b0da61889e41879832ea15569c251c303a"}, + {file = "grpcio-1.53.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aef7d30242409c3aa5839b501e877e453a2c8d3759ca8230dd5a21cda029f046"}, + {file = "grpcio-1.53.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6f90698b5d1c5dd7b3236cd1fa959d7b80e17923f918d5be020b65f1c78b173"}, + {file = "grpcio-1.53.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a96c3c7f564b263c5d7c0e49a337166c8611e89c4c919f66dba7b9a84abad137"}, + {file = "grpcio-1.53.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ee81349411648d1abc94095c68cd25e3c2812e4e0367f9a9355be1e804a5135c"}, + {file = "grpcio-1.53.0-cp310-cp310-win32.whl", hash = "sha256:fdc6191587de410a184550d4143e2b24a14df495c86ca15e59508710681690ac"}, + {file = "grpcio-1.53.0-cp310-cp310-win_amd64.whl", hash = "sha256:658ffe1e39171be00490db5bd3b966f79634ac4215a1eb9a85c6cd6783bf7f6e"}, + {file = "grpcio-1.53.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:1b172e6d497191940c4b8d75b53de82dc252e15b61de2951d577ec5b43316b29"}, + {file = "grpcio-1.53.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:82434ba3a5935e47908bc861ce1ebc43c2edfc1001d235d6e31e5d3ed55815f7"}, + {file = "grpcio-1.53.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:1c734a2d4843e4e14ececf5600c3c4750990ec319e1299db7e4f0d02c25c1467"}, + {file = "grpcio-1.53.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6a2ead3de3b2d53119d473aa2f224030257ef33af1e4ddabd4afee1dea5f04c"}, + {file = "grpcio-1.53.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a34d6e905f071f9b945cabbcc776e2055de1fdb59cd13683d9aa0a8f265b5bf9"}, + {file = "grpcio-1.53.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eaf8e3b97caaf9415227a3c6ca5aa8d800fecadd526538d2bf8f11af783f1550"}, + {file = "grpcio-1.53.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:da95778d37be8e4e9afca771a83424f892296f5dfb2a100eda2571a1d8bbc0dc"}, + {file = "grpcio-1.53.0-cp311-cp311-win32.whl", hash = "sha256:e4f513d63df6336fd84b74b701f17d1bb3b64e9d78a6ed5b5e8a198bbbe8bbfa"}, + {file = "grpcio-1.53.0-cp311-cp311-win_amd64.whl", hash = "sha256:ddb2511fbbb440ed9e5c9a4b9b870f2ed649b7715859fd6f2ebc585ee85c0364"}, + {file = "grpcio-1.53.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:2a912397eb8d23c177d6d64e3c8bc46b8a1c7680b090d9f13a640b104aaec77c"}, + {file = "grpcio-1.53.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:55930c56b8f5b347d6c8c609cc341949a97e176c90f5cbb01d148d778f3bbd23"}, + {file = "grpcio-1.53.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:6601d812105583948ab9c6e403a7e2dba6e387cc678c010e74f2d6d589d1d1b3"}, + {file = "grpcio-1.53.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c705e0c21acb0e8478a00e7e773ad0ecdb34bd0e4adc282d3d2f51ba3961aac7"}, + {file = "grpcio-1.53.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba074af9ca268ad7b05d3fc2b920b5fb3c083da94ab63637aaf67f4f71ecb755"}, + {file = "grpcio-1.53.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:14817de09317dd7d3fbc8272864288320739973ef0f4b56bf2c0032349da8cdf"}, + {file = "grpcio-1.53.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c7ad9fbedb93f331c2e9054e202e95cf825b885811f1bcbbdfdc301e451442db"}, + {file = "grpcio-1.53.0-cp37-cp37m-win_amd64.whl", hash = "sha256:dad5b302a4c21c604d88a5d441973f320134e6ff6a84ecef9c1139e5ffd466f6"}, + {file = "grpcio-1.53.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:fa8eaac75d3107e3f5465f2c9e3bbd13db21790c6e45b7de1756eba16b050aca"}, + {file = "grpcio-1.53.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:104a2210edd3776c38448b4f76c2f16e527adafbde171fc72a8a32976c20abc7"}, + {file = "grpcio-1.53.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:dbc1ba968639c1d23476f75c356e549e7bbf2d8d6688717dcab5290e88e8482b"}, + {file = "grpcio-1.53.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95952d3fe795b06af29bb8ec7bbf3342cdd867fc17b77cc25e6733d23fa6c519"}, + {file = "grpcio-1.53.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f144a790f14c51b8a8e591eb5af40507ffee45ea6b818c2482f0457fec2e1a2e"}, + {file = "grpcio-1.53.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0698c094688a2dd4c7c2f2c0e3e142cac439a64d1cef6904c97f6cde38ba422f"}, + {file = "grpcio-1.53.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6b6d60b0958be711bab047e9f4df5dbbc40367955f8651232bfdcdd21450b9ab"}, + {file = "grpcio-1.53.0-cp38-cp38-win32.whl", hash = "sha256:1948539ce78805d4e6256ab0e048ec793956d54787dc9d6777df71c1d19c7f81"}, + {file = "grpcio-1.53.0-cp38-cp38-win_amd64.whl", hash = "sha256:df9ba1183b3f649210788cf80c239041dddcb375d6142d8bccafcfdf549522cd"}, + {file = "grpcio-1.53.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:19caa5b7282a89b799e63776ff602bb39604f7ca98db6df27e2de06756ae86c3"}, + {file = "grpcio-1.53.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:b5bd026ac928c96cc23149e6ef79183125542062eb6d1ccec34c0a37e02255e7"}, + {file = "grpcio-1.53.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:7dc8584ca6c015ad82e186e82f4c0fe977394588f66b8ecfc4ec873285314619"}, + {file = "grpcio-1.53.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2eddaae8af625e45b5c8500dcca1043264d751a6872cde2eda5022df8a336959"}, + {file = "grpcio-1.53.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5fb6f3d7824696c1c9f2ad36ddb080ba5a86f2d929ef712d511b4d9972d3d27"}, + {file = "grpcio-1.53.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8270d1dc2c98ab57e6dbf36fa187db8df4c036f04a398e5d5e25b4e01a766d70"}, + {file = "grpcio-1.53.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:976a7f24eb213e8429cab78d5e120500dfcdeb01041f1f5a77b17b9101902615"}, + {file = "grpcio-1.53.0-cp39-cp39-win32.whl", hash = "sha256:9c84a481451e7174f3a764a44150f93b041ab51045aa33d7b5b68b6979114e48"}, + {file = "grpcio-1.53.0-cp39-cp39-win_amd64.whl", hash = "sha256:6beb84f83360ff29a3654f43f251ec11b809dcb5524b698d711550243debd289"}, + {file = "grpcio-1.53.0.tar.gz", hash = "sha256:a4952899b4931a6ba12951f9a141ef3e74ff8a6ec9aa2dc602afa40f63595e33"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.53.0)"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "0.16.3" +description = "A minimal low-level HTTP client." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpcore-0.16.3-py3-none-any.whl", hash = "sha256:da1fb708784a938aa084bde4feb8317056c55037247c787bd7e19eb2c2949dc0"}, + {file = "httpcore-0.16.3.tar.gz", hash = "sha256:c5d6f04e2fc530f39e0c077e6a30caa53f1451096120f1f38b954afd0b17c0cb"}, +] + +[package.dependencies] +anyio = ">=3.0,<5.0" +certifi = "*" +h11 = ">=0.13,<0.15" +sniffio = ">=1.0.0,<2.0.0" + +[package.extras] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "httpx" +version = "0.23.3" +description = "The next generation HTTP client." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpx-0.23.3-py3-none-any.whl", hash = "sha256:a211fcce9b1254ea24f0cd6af9869b3d29aba40154e947d2a07bb499b3e310d6"}, + {file = "httpx-0.23.3.tar.gz", hash = "sha256:9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9"}, +] + +[package.dependencies] +certifi = "*" +httpcore = ">=0.15.0,<0.17.0" +rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<13)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "huggingface-hub" +version = "0.13.4" +description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "huggingface_hub-0.13.4-py3-none-any.whl", hash = "sha256:4d3d40593de6673d624a4baaaf249b9bf5165bfcafd1ad58de361931f0b4fda5"}, + {file = "huggingface_hub-0.13.4.tar.gz", hash = "sha256:db83d9c2f76aed8cf49893ffadd6be24e82074da2f64b1d36b8ba40eb255e115"}, +] + +[package.dependencies] +filelock = "*" +packaging = ">=20.9" +pyyaml = ">=5.1" +requests = "*" +tqdm = ">=4.42.1" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "black (>=23.1,<24.0)", "jedi", "mypy (==0.982)", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] +cli = ["InquirerPy (==0.3.4)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "black (>=23.1,<24.0)", "jedi", "mypy (==0.982)", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] +fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] +quality = ["black (>=23.1,<24.0)", "mypy (==0.982)", "ruff (>=0.0.241)"] +tensorflow = ["graphviz", "pydot", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "jedi", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "soundfile"] +torch = ["torch"] +typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] + +[[package]] +name = "identify" +version = "2.5.22" +description = "File identification library for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "identify-2.5.22-py2.py3-none-any.whl", hash = "sha256:f0faad595a4687053669c112004178149f6c326db71ee999ae4636685753ad2f"}, + {file = "identify-2.5.22.tar.gz", hash = "sha256:f7a93d6cf98e29bd07663c60728e7a4057615068d7a639d132dc883b2d54d31e"}, +] + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "imageio" +version = "2.27.0" +description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "imageio-2.27.0-py3-none-any.whl", hash = "sha256:24c6ad7d000e64eacc2861c402b6fb128f370cb0a6623cf796d83bca0d0d14d3"}, + {file = "imageio-2.27.0.tar.gz", hash = "sha256:ee269c957785ef0373cc7a7323185956d83ec05e6cdf20b42a03ba7b74ac58c6"}, +] + +[package.dependencies] +numpy = "*" +pillow = ">=8.3.2" + +[package.extras] +all-plugins = ["astropy", "av", "imageio-ffmpeg", "psutil", "tifffile"] +all-plugins-pypy = ["av", "imageio-ffmpeg", "psutil", "tifffile"] +build = ["wheel"] +dev = ["black", "flake8", "fsspec[github]", "invoke", "pytest", "pytest-cov"] +docs = ["numpydoc", "pydata-sphinx-theme", "sphinx (<6)"] +ffmpeg = ["imageio-ffmpeg", "psutil"] +fits = ["astropy"] +full = ["astropy", "av", "black", "flake8", "fsspec[github]", "gdal", "imageio-ffmpeg", "invoke", "itk", "numpydoc", "psutil", "pydata-sphinx-theme", "pytest", "pytest-cov", "sphinx (<6)", "tifffile", "wheel"] +gdal = ["gdal"] +itk = ["itk"] +linting = ["black", "flake8"] +pyav = ["av"] +test = ["fsspec[github]", "invoke", "pytest", "pytest-cov"] +tifffile = ["tifffile"] + +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] + +[[package]] +name = "importlib-metadata" +version = "6.2.0" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-6.2.0-py3-none-any.whl", hash = "sha256:8388b74023a138c605fddd0d47cb81dd706232569f56c9aca7d9c7fdb54caeba"}, + {file = "importlib_metadata-6.2.0.tar.gz", hash = "sha256:9127aad2f49d7203e7112098c12b92e4fd1061ccd18548cdfdc49171a8c073cc"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] + +[[package]] +name = "importlib-resources" +version = "5.12.0" +description = "Read resources from Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, + {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "inquirer" +version = "3.1.3" +description = "Collection of common interactive command line user interfaces, based on Inquirer.js" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "inquirer-3.1.3-py3-none-any.whl", hash = "sha256:a7441fd74d06fcac4385218a1f5e8703f7a113f7944e01af47b8c58e84f95ce5"}, + {file = "inquirer-3.1.3.tar.gz", hash = "sha256:aac309406f5b49d4b8ab7c6872117f43bf082a552dc256aa16bc95e16bb58bec"}, +] + +[package.dependencies] +blessed = ">=1.19.0" +python-editor = ">=1.0.4" +readchar = ">=3.0.6" + +[[package]] +name = "itsdangerous" +version = "2.1.2" +description = "Safely pass data to untrusted environments and back." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, + {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, +] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jinxed" +version = "1.2.0" +description = "Jinxed Terminal Library" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "jinxed-1.2.0-py2.py3-none-any.whl", hash = "sha256:cfc2b2e4e3b4326954d546ba6d6b9a7a796ddcb0aef8d03161d005177eb0d48b"}, + {file = "jinxed-1.2.0.tar.gz", hash = "sha256:032acda92d5c57cd216033cbbd53de731e6ed50deb63eb4781336ca55f72cda5"}, +] + +[package.dependencies] +ansicon = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "joblib" +version = "1.2.0" +description = "Lightweight pipelining with Python functions" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "joblib-1.2.0-py3-none-any.whl", hash = "sha256:091138ed78f800342968c523bdde947e7a305b8594b910a0fea2ab83c3c6d385"}, + {file = "joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"}, +] + +[[package]] +name = "jsonschema" +version = "4.17.3" +description = "An implementation of JSON Schema validation for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, + {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, +] + +[package.dependencies] +attrs = ">=17.4.0" +importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "kiwisolver" +version = "1.4.4" +description = "A fast implementation of the Cassowary constraint solver" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, + {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, + {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, + {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, + {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, + {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, + {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, + {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, +] + +[[package]] +name = "lazy-loader" +version = "0.2" +description = "lazy_loader" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "lazy_loader-0.2-py3-none-any.whl", hash = "sha256:c35875f815c340f823ce3271ed645045397213f961b40ad0c0d395c3f5218eeb"}, + {file = "lazy_loader-0.2.tar.gz", hash = "sha256:0edc7a5175c400acb108f283749951fefdadedeb00adcec6e88b974a9254f18a"}, +] + +[package.extras] +lint = ["pre-commit (>=3.1)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "librosa" +version = "0.9.1" +description = "Python module for audio and music processing" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "librosa-0.9.1-py3-none-any.whl", hash = "sha256:c2bb61a8008367cca89a3f1dad352d8e55fe5ca5f7414fb5d5258eb52765db33"}, + {file = "librosa-0.9.1.tar.gz", hash = "sha256:7ed5d6e3f4546e5e3c2840691f9ddc56878f914a35a50060df5fca2b26d4b614"}, +] + +[package.dependencies] +audioread = ">=2.1.5" +decorator = ">=4.0.10" +joblib = ">=0.14" +numba = ">=0.45.1" +numpy = ">=1.17.0" +packaging = ">=20.0" +pooch = ">=1.0" +resampy = ">=0.2.2" +scikit-learn = ">=0.19.1" +scipy = ">=1.2.0" +soundfile = ">=0.10.2" + +[package.extras] +display = ["matplotlib (>=3.3.0)"] +docs = ["ipython (>=7.0)", "matplotlib (>=3.3.0)", "mir-eval (>=0.5)", "numba (<0.50)", "numpydoc", "presets", "sphinx (!=1.3.1)", "sphinx-gallery (>=0.7)", "sphinx-multiversion (>=0.2.3)", "sphinx-rtd-theme (>=0.5.0,<0.6.0)", "sphinxcontrib-svg2pdfconverter"] +tests = ["contextlib2", "matplotlib (>=3.3.0)", "pytest", "pytest-cov", "pytest-mpl", "samplerate", "soxr"] + +[[package]] +name = "lightning" +version = "2.0.2" +description = "Use Lightning Apps to build everything from production-ready, multi-cloud ML systems to simple research demos." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "lightning-2.0.2-py3-none-any.whl", hash = "sha256:fcdc2f6fe43543e0d1eb2058c49c7920b89b02184ecead138955e915e2ad3982"}, + {file = "lightning-2.0.2.tar.gz", hash = "sha256:fa32d671850a5be2d961c6705c927f6f48d1cf9696f61f7d865244142e684430"}, +] + +[package.dependencies] +arrow = ">=1.2.0,<3.0" +beautifulsoup4 = ">=4.8.0,<6.0" +click = "<10.0" +croniter = ">=1.3.0,<1.4.0" +dateutils = "<2.0" +deepdiff = ">=5.7.0,<8.0" +fastapi = ">=0.69.0,<0.89.0" +fsspec = [ + {version = ">=2022.5.0,<2024.0"}, + {version = ">2021.06.0,<2025.0", extras = ["http"]}, +] +inquirer = ">=2.10.0,<5.0" +Jinja2 = "<5.0" +lightning-cloud = ">=0.5.34" +lightning-utilities = ">=0.7.0,<2.0" +numpy = ">=1.17.2,<3.0" +packaging = ">=17.1,<25.0" +psutil = "<7.0" +pydantic = ">=1.7.4,<4.0" +pytorch-lightning = "*" +PyYAML = ">=5.4,<8.0" +requests = "<4.0" +rich = ">=12.3.0,<15.0" +starlette = "*" +starsessions = ">=1.2.1,<2.0" +torch = ">=1.11.0,<4.0" +torchmetrics = ">=0.7.0,<2.0" +tqdm = ">=4.57.0,<6.0" +traitlets = ">=5.3.0,<7.0" +typing-extensions = ">=4.0.0,<6.0" +urllib3 = "<3.0" +uvicorn = "<2.0" +websocket-client = "<3.0" +websockets = "<12.0" + +[package.extras] +all = ["aiohttp (>=3.8.0,<4.0)", "docker (>=5.0.0,<7.0)", "hydra-core (>=1.0.5,<2.0)", "jsonargparse[signatures] (>=4.18.0,<5.0)", "lightning-api-access (>=0.0.3)", "lightning-fabric (>=1.9.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "panel (>=0.12.7,<1.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<5.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2023.0)", "streamlit (>=1.13.0,<2.0)", "tensorboardX (>=2.2,<3.0)"] +app-cloud = ["docker (>=5.0.0,<7.0)", "redis (>=4.0.1,<5.0)", "s3fs (>=2022.5.0,<2023.0)"] +app-components = ["aiohttp (>=3.8.0,<4.0)", "lightning-api-access (>=0.0.3)", "lightning-fabric (>=1.9.0)", "pytorch-lightning (>=1.9.0)"] +app-test = ["coverage (==6.5.0)", "httpx", "playwright (==1.30.0)", "psutil", "pympler", "pytest (==7.2.0)", "pytest-asyncio (==0.20.3)", "pytest-cov (==4.0.0)", "pytest-doctestplus (>=0.9.0)", "pytest-timeout (==2.1.0)", "requests-mock", "setuptools (<68.0)", "trio (<0.22.0)"] +app-ui = ["panel (>=0.12.7,<1.0)", "streamlit (>=1.13.0,<2.0)"] +cloud = ["docker (>=5.0.0,<7.0)", "redis (>=4.0.1,<5.0)", "s3fs (>=2022.5.0,<2023.0)"] +components = ["aiohttp (>=3.8.0,<4.0)", "lightning-api-access (>=0.0.3)", "lightning-fabric (>=1.9.0)", "pytorch-lightning (>=1.9.0)"] +dev = ["aiohttp (>=3.8.0,<4.0)", "click (==8.1.3)", "cloudpickle (>=1.3,<3.0)", "coverage (==6.5.0)", "docker (>=5.0.0,<7.0)", "fastapi (<1.0)", "httpx", "hydra-core (>=1.0.5,<2.0)", "jsonargparse[signatures] (>=4.18.0,<5.0)", "lightning-api-access (>=0.0.3)", "lightning-fabric (>=1.9.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "onnx (<2.0)", "onnxruntime (<2.0)", "pandas (>1.0,<2.0)", "panel (>=0.12.7,<1.0)", "playwright (==1.30.0)", "protobuf (<=3.20.1)", "psutil", "psutil (<6.0)", "pympler", "pytest (==7.2.0)", "pytest-asyncio (==0.20.3)", "pytest-cov (==4.0.0)", "pytest-doctestplus (>=0.9.0)", "pytest-forked (==1.4.0)", "pytest-rerunfailures (==10.3)", "pytest-timeout (==2.1.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<5.0)", "requests-mock", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2023.0)", "scikit-learn (>0.22.1,<2.0)", "setuptools (<68.0)", "streamlit (>=1.13.0,<2.0)", "tensorboard (>=2.9.1,<3.0)", "tensorboardX (>=2.2,<3.0)", "trio (<0.22.0)", "uvicorn (<1.0)"] +examples = ["gym[classic-control] (>=0.17.0,<1.0)", "ipython[all] (<9.0)", "lightning-utilities (>=0.7.0,<1.0)", "lightning-utilities (>=0.8.0,<1.0)", "torchmetrics (>=0.10.0,<1.0)", "torchvision (>=0.10.0,<1.0)", "torchvision (>=0.11.1,<1.0)"] +extra = ["aiohttp (>=3.8.0,<4.0)", "docker (>=5.0.0,<7.0)", "hydra-core (>=1.0.5,<2.0)", "jsonargparse[signatures] (>=4.18.0,<5.0)", "lightning-api-access (>=0.0.3)", "lightning-fabric (>=1.9.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "panel (>=0.12.7,<1.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<5.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2023.0)", "streamlit (>=1.13.0,<2.0)", "tensorboardX (>=2.2,<3.0)"] +fabric-examples = ["lightning-utilities (>=0.8.0,<1.0)", "torchmetrics (>=0.10.0,<1.0)", "torchvision (>=0.10.0,<1.0)"] +fabric-strategies = ["deepspeed (>=0.6.0,<1.0)"] +fabric-test = ["click (==8.1.3)", "coverage (==6.5.0)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-rerunfailures (==10.3)", "tensorboardX (>=2.2,<3.0)"] +pytorch-examples = ["gym[classic-control] (>=0.17.0,<1.0)", "ipython[all] (<9.0)", "lightning-utilities (>=0.7.0,<1.0)", "torchmetrics (>=0.10.0,<1.0)", "torchvision (>=0.11.1,<1.0)"] +pytorch-extra = ["hydra-core (>=1.0.5,<2.0)", "jsonargparse[signatures] (>=4.18.0,<5.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "rich (>=12.3.0,<14.0)", "tensorboardX (>=2.2,<3.0)"] +pytorch-strategies = ["deepspeed (>=0.6.0,<1.0)"] +pytorch-test = ["cloudpickle (>=1.3,<3.0)", "coverage (==6.5.0)", "fastapi (<1.0)", "onnx (<2.0)", "onnxruntime (<2.0)", "pandas (>1.0,<2.0)", "protobuf (<=3.20.1)", "psutil (<6.0)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-forked (==1.4.0)", "pytest-rerunfailures (==10.3)", "scikit-learn (>0.22.1,<2.0)", "tensorboard (>=2.9.1,<3.0)", "uvicorn (<1.0)"] +strategies = ["deepspeed (>=0.6.0,<1.0)", "deepspeed (>=0.6.0,<1.0)"] +test = ["click (==8.1.3)", "cloudpickle (>=1.3,<3.0)", "coverage (==6.5.0)", "fastapi (<1.0)", "httpx", "onnx (<2.0)", "onnxruntime (<2.0)", "pandas (>1.0,<2.0)", "playwright (==1.30.0)", "protobuf (<=3.20.1)", "psutil", "psutil (<6.0)", "pympler", "pytest (==7.2.0)", "pytest-asyncio (==0.20.3)", "pytest-cov (==4.0.0)", "pytest-doctestplus (>=0.9.0)", "pytest-forked (==1.4.0)", "pytest-rerunfailures (==10.3)", "pytest-timeout (==2.1.0)", "requests-mock", "scikit-learn (>0.22.1,<2.0)", "setuptools (<68.0)", "tensorboard (>=2.9.1,<3.0)", "tensorboardX (>=2.2,<3.0)", "trio (<0.22.0)", "uvicorn (<1.0)"] +ui = ["panel (>=0.12.7,<1.0)", "streamlit (>=1.13.0,<2.0)"] + +[[package]] +name = "lightning-cloud" +version = "0.5.34" +description = "Lightning Cloud" +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "lightning_cloud-0.5.34-py3-none-any.whl", hash = "sha256:978d2f14bec9cfb0a565d9a1324190929d087b83eaaaa0ea6627270028f38535"}, + {file = "lightning_cloud-0.5.34.tar.gz", hash = "sha256:fa37940ec0289d5beb05de26082ebdaf0d0bf50de960108945b60ea107861957"}, +] + +[package.dependencies] +click = "*" +fastapi = "*" +pyjwt = "*" +python-multipart = "*" +requests = "*" +rich = "*" +six = "*" +urllib3 = "*" +uvicorn = "*" +websocket-client = "*" + +[[package]] +name = "lightning-utilities" +version = "0.8.0" +description = "PyTorch Lightning Sample project." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "lightning-utilities-0.8.0.tar.gz", hash = "sha256:8e5d95c7c57f026cdfed7c154303e88c93a7a5e868c9944cb02cf71f1db29720"}, + {file = "lightning_utilities-0.8.0-py3-none-any.whl", hash = "sha256:22aa107b51c8f50ccef54d08885eb370903eb04148cddb2891b9c65c59de2a6e"}, +] + +[package.dependencies] +packaging = ">=17.1" +typing-extensions = "*" + +[package.extras] +cli = ["fire"] +docs = ["sphinx (>=4.0,<5.0)"] +test = ["coverage (==6.5.0)"] +typing = ["mypy (>=1.0.0)"] + +[[package]] +name = "linkify-it-py" +version = "2.0.0" +description = "Links recognition library with FULL unicode support." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "linkify-it-py-2.0.0.tar.gz", hash = "sha256:476464480906bed8b2fa3813bf55566282e55214ad7e41b7d1c2b564666caf2f"}, + {file = "linkify_it_py-2.0.0-py3-none-any.whl", hash = "sha256:1bff43823e24e507a099e328fc54696124423dd6320c75a9da45b4b754b748ad"}, +] + +[package.dependencies] +uc-micro-py = "*" + +[package.extras] +benchmark = ["pytest", "pytest-benchmark"] +dev = ["black", "flake8", "isort", "pre-commit"] +doc = ["myst-parser", "sphinx", "sphinx-book-theme"] +test = ["coverage", "pytest", "pytest-cov"] + +[[package]] +name = "lit" +version = "16.0.0" +description = "A Software Testing Tool" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "lit-16.0.0.tar.gz", hash = "sha256:3c4ac372122a1de4a88deb277b956f91b7209420a0bef683b1ab2d2b16dabe11"}, +] + +[[package]] +name = "llvmlite" +version = "0.39.1" +description = "lightweight wrapper around basic LLVM functionality" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "llvmlite-0.39.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6717c7a6e93c9d2c3d07c07113ec80ae24af45cde536b34363d4bcd9188091d9"}, + {file = "llvmlite-0.39.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ddab526c5a2c4ccb8c9ec4821fcea7606933dc53f510e2a6eebb45a418d3488a"}, + {file = "llvmlite-0.39.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3f331a323d0f0ada6b10d60182ef06c20a2f01be21699999d204c5750ffd0b4"}, + {file = "llvmlite-0.39.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c00ff204afa721b0bb9835b5bf1ba7fba210eefcec5552a9e05a63219ba0dc"}, + {file = "llvmlite-0.39.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16f56eb1eec3cda3a5c526bc3f63594fc24e0c8d219375afeb336f289764c6c7"}, + {file = "llvmlite-0.39.1-cp310-cp310-win32.whl", hash = "sha256:d0bfd18c324549c0fec2c5dc610fd024689de6f27c6cc67e4e24a07541d6e49b"}, + {file = "llvmlite-0.39.1-cp310-cp310-win_amd64.whl", hash = "sha256:7ebf1eb9badc2a397d4f6a6c8717447c81ac011db00064a00408bc83c923c0e4"}, + {file = "llvmlite-0.39.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6546bed4e02a1c3d53a22a0bced254b3b6894693318b16c16c8e43e29d6befb6"}, + {file = "llvmlite-0.39.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1578f5000fdce513712e99543c50e93758a954297575610f48cb1fd71b27c08a"}, + {file = "llvmlite-0.39.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3803f11ad5f6f6c3d2b545a303d68d9fabb1d50e06a8d6418e6fcd2d0df00959"}, + {file = "llvmlite-0.39.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50aea09a2b933dab7c9df92361b1844ad3145bfb8dd2deb9cd8b8917d59306fb"}, + {file = "llvmlite-0.39.1-cp37-cp37m-win32.whl", hash = "sha256:b1a0bbdb274fb683f993198775b957d29a6f07b45d184c571ef2a721ce4388cf"}, + {file = "llvmlite-0.39.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e172c73fccf7d6db4bd6f7de963dedded900d1a5c6778733241d878ba613980e"}, + {file = "llvmlite-0.39.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e31f4b799d530255aaf0566e3da2df5bfc35d3cd9d6d5a3dcc251663656c27b1"}, + {file = "llvmlite-0.39.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:62c0ea22e0b9dffb020601bb65cb11dd967a095a488be73f07d8867f4e327ca5"}, + {file = "llvmlite-0.39.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ffc84ade195abd4abcf0bd3b827b9140ae9ef90999429b9ea84d5df69c9058c"}, + {file = "llvmlite-0.39.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0f158e4708dda6367d21cf15afc58de4ebce979c7a1aa2f6b977aae737e2a54"}, + {file = "llvmlite-0.39.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22d36591cd5d02038912321d9ab8e4668e53ae2211da5523f454e992b5e13c36"}, + {file = "llvmlite-0.39.1-cp38-cp38-win32.whl", hash = "sha256:4c6ebace910410daf0bebda09c1859504fc2f33d122e9a971c4c349c89cca630"}, + {file = "llvmlite-0.39.1-cp38-cp38-win_amd64.whl", hash = "sha256:fb62fc7016b592435d3e3a8f680e3ea8897c3c9e62e6e6cc58011e7a4801439e"}, + {file = "llvmlite-0.39.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa9b26939ae553bf30a9f5c4c754db0fb2d2677327f2511e674aa2f5df941789"}, + {file = "llvmlite-0.39.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e4f212c018db951da3e1dc25c2651abc688221934739721f2dad5ff1dd5f90e7"}, + {file = "llvmlite-0.39.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39dc2160aed36e989610fc403487f11b8764b6650017ff367e45384dff88ffbf"}, + {file = "llvmlite-0.39.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ec3d70b3e507515936e475d9811305f52d049281eaa6c8273448a61c9b5b7e2"}, + {file = "llvmlite-0.39.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60f8dd1e76f47b3dbdee4b38d9189f3e020d22a173c00f930b52131001d801f9"}, + {file = "llvmlite-0.39.1-cp39-cp39-win32.whl", hash = "sha256:03aee0ccd81735696474dc4f8b6be60774892a2929d6c05d093d17392c237f32"}, + {file = "llvmlite-0.39.1-cp39-cp39-win_amd64.whl", hash = "sha256:3fc14e757bc07a919221f0cbaacb512704ce5774d7fcada793f1996d6bc75f2a"}, + {file = "llvmlite-0.39.1.tar.gz", hash = "sha256:b43abd7c82e805261c425d50335be9a6c4f84264e34d6d6e475207300005d572"}, +] + +[[package]] +name = "markdown" +version = "3.4.3" +description = "Python implementation of John Gruber's Markdown." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Markdown-3.4.3-py3-none-any.whl", hash = "sha256:065fd4df22da73a625f14890dd77eb8040edcbd68794bcd35943be14490608b2"}, + {file = "Markdown-3.4.3.tar.gz", hash = "sha256:8bf101198e004dc93e84a12a7395e31aac6a9c9942848ae1d99b9d72cf9b3520"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} + +[package.extras] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markdown-it-py" +version = "2.2.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, + {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, +] + +[package.dependencies] +linkify-it-py = {version = ">=1,<3", optional = true, markers = "extra == \"linkify\""} +mdit-py-plugins = {version = "*", optional = true, markers = "extra == \"plugins\""} +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.2" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, + {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, +] + +[[package]] +name = "matplotlib" +version = "3.7.1" +description = "Python plotting package" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:95cbc13c1fc6844ab8812a525bbc237fa1470863ff3dace7352e910519e194b1"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:08308bae9e91aca1ec6fd6dda66237eef9f6294ddb17f0d0b3c863169bf82353"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:544764ba51900da4639c0f983b323d288f94f65f4024dc40ecb1542d74dc0500"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d94989191de3fcc4e002f93f7f1be5da476385dde410ddafbb70686acf00ea"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99bc9e65901bb9a7ce5e7bb24af03675cbd7c70b30ac670aa263240635999a4"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb7d248c34a341cd4c31a06fd34d64306624c8cd8d0def7abb08792a5abfd556"}, + {file = "matplotlib-3.7.1-cp310-cp310-win32.whl", hash = "sha256:ce463ce590f3825b52e9fe5c19a3c6a69fd7675a39d589e8b5fbe772272b3a24"}, + {file = "matplotlib-3.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:3d7bc90727351fb841e4d8ae620d2d86d8ed92b50473cd2b42ce9186104ecbba"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:770a205966d641627fd5cf9d3cb4b6280a716522cd36b8b284a8eb1581310f61"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f67bfdb83a8232cb7a92b869f9355d677bce24485c460b19d01970b64b2ed476"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2bf092f9210e105f414a043b92af583c98f50050559616930d884387d0772aba"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89768d84187f31717349c6bfadc0e0d8c321e8eb34522acec8a67b1236a66332"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83111e6388dec67822e2534e13b243cc644c7494a4bb60584edbff91585a83c6"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a867bf73a7eb808ef2afbca03bcdb785dae09595fbe550e1bab0cd023eba3de0"}, + {file = "matplotlib-3.7.1-cp311-cp311-win32.whl", hash = "sha256:fbdeeb58c0cf0595efe89c05c224e0a502d1aa6a8696e68a73c3efc6bc354304"}, + {file = "matplotlib-3.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c0bd19c72ae53e6ab979f0ac6a3fafceb02d2ecafa023c5cca47acd934d10be7"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:6eb88d87cb2c49af00d3bbc33a003f89fd9f78d318848da029383bfc08ecfbfb"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:cf0e4f727534b7b1457898c4f4ae838af1ef87c359b76dcd5330fa31893a3ac7"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:46a561d23b91f30bccfd25429c3c706afe7d73a5cc64ef2dfaf2b2ac47c1a5dc"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8704726d33e9aa8a6d5215044b8d00804561971163563e6e6591f9dcf64340cc"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4cf327e98ecf08fcbb82685acaf1939d3338548620ab8dfa02828706402c34de"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:617f14ae9d53292ece33f45cba8503494ee199a75b44de7717964f70637a36aa"}, + {file = "matplotlib-3.7.1-cp38-cp38-win32.whl", hash = "sha256:7c9a4b2da6fac77bcc41b1ea95fadb314e92508bf5493ceff058e727e7ecf5b0"}, + {file = "matplotlib-3.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:14645aad967684e92fc349493fa10c08a6da514b3d03a5931a1bac26e6792bd1"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:81a6b377ea444336538638d31fdb39af6be1a043ca5e343fe18d0f17e098770b"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:28506a03bd7f3fe59cd3cd4ceb2a8d8a2b1db41afede01f66c42561b9be7b4b7"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c587963b85ce41e0a8af53b9b2de8dddbf5ece4c34553f7bd9d066148dc719c"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8bf26ade3ff0f27668989d98c8435ce9327d24cffb7f07d24ef609e33d582439"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:def58098f96a05f90af7e92fd127d21a287068202aa43b2a93476170ebd99e87"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f883a22a56a84dba3b588696a2b8a1ab0d2c3d41be53264115c71b0a942d8fdb"}, + {file = "matplotlib-3.7.1-cp39-cp39-win32.whl", hash = "sha256:4f99e1b234c30c1e9714610eb0c6d2f11809c9c78c984a613ae539ea2ad2eb4b"}, + {file = "matplotlib-3.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:3ba2af245e36990facf67fde840a760128ddd71210b2ab6406e640188d69d136"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3032884084f541163f295db8a6536e0abb0db464008fadca6c98aaf84ccf4717"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a2cb34336110e0ed8bb4f650e817eed61fa064acbefeb3591f1b33e3a84fd96"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b867e2f952ed592237a1828f027d332d8ee219ad722345b79a001f49df0936eb"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:57bfb8c8ea253be947ccb2bc2d1bb3862c2bccc662ad1b4626e1f5e004557042"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:438196cdf5dc8d39b50a45cb6e3f6274edbcf2254f85fa9b895bf85851c3a613"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21e9cff1a58d42e74d01153360de92b326708fb205250150018a52c70f43c290"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75d4725d70b7c03e082bbb8a34639ede17f333d7247f56caceb3801cb6ff703d"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:97cc368a7268141afb5690760921765ed34867ffb9655dd325ed207af85c7529"}, + {file = "matplotlib-3.7.1.tar.gz", hash = "sha256:7b73305f25eab4541bd7ee0b96d87e53ae9c9f1823be5659b806cd85786fe882"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} +kiwisolver = ">=1.0.1" +numpy = ">=1.20" +packaging = ">=20.0" +pillow = ">=6.2.0" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[[package]] +name = "mdit-py-plugins" +version = "0.3.5" +description = "Collection of plugins for markdown-it-py" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdit-py-plugins-0.3.5.tar.gz", hash = "sha256:eee0adc7195e5827e17e02d2a258a2ba159944a0748f59c5099a4a27f78fcf6a"}, + {file = "mdit_py_plugins-0.3.5-py3-none-any.whl", hash = "sha256:ca9a0714ea59a24b2b044a1831f48d817dd0c817e84339f20e7889f392d77c4e"}, +] + +[package.dependencies] +markdown-it-py = ">=1.0.0,<3.0.0" + +[package.extras] +code-style = ["pre-commit"] +rtd = ["attrs", "myst-parser (>=0.16.1,<0.17.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + +[[package]] +name = "multidict" +version = "6.0.4" +description = "multidict implementation" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] + +[[package]] +name = "myst-parser" +version = "1.0.0" +description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "myst-parser-1.0.0.tar.gz", hash = "sha256:502845659313099542bd38a2ae62f01360e7dd4b1310f025dd014dfc0439cdae"}, + {file = "myst_parser-1.0.0-py3-none-any.whl", hash = "sha256:69fb40a586c6fa68995e6521ac0a525793935db7e724ca9bac1d33be51be9a4c"}, +] + +[package.dependencies] +docutils = ">=0.15,<0.20" +jinja2 = "*" +markdown-it-py = ">=1.0.0,<3.0.0" +mdit-py-plugins = ">=0.3.4,<0.4.0" +pyyaml = "*" +sphinx = ">=5,<7" + +[package.extras] +code-style = ["pre-commit (>=3.0,<4.0)"] +linkify = ["linkify-it-py (>=1.0,<2.0)"] +rtd = ["ipython", "pydata-sphinx-theme (==v0.13.0rc4)", "sphinx-autodoc2 (>=0.4.2,<0.5.0)", "sphinx-book-theme (==1.0.0rc2)", "sphinx-copybutton", "sphinx-design2", "sphinx-pyscript", "sphinx-tippy (>=0.3.1)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.7.5,<0.8.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] +testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=7,<8)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions", "sphinx-pytest"] +testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4,<0.4.0)"] + +[[package]] +name = "networkx" +version = "3.1" +description = "Python package for creating and manipulating graphs and networks" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36"}, + {file = "networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61"}, +] + +[package.extras] +default = ["matplotlib (>=3.4)", "numpy (>=1.20)", "pandas (>=1.3)", "scipy (>=1.8)"] +developer = ["mypy (>=1.1)", "pre-commit (>=3.2)"] +doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.13)", "sphinx (>=6.1)", "sphinx-gallery (>=0.12)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.10)", "sympy (>=1.10)"] +test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "nodeenv" +version = "1.7.0" +description = "Node.js virtual environment builder" +category = "dev" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, + {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "numba" +version = "0.56.4" +description = "compiling Python code using LLVM" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "numba-0.56.4-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:9f62672145f8669ec08762895fe85f4cf0ead08ce3164667f2b94b2f62ab23c3"}, + {file = "numba-0.56.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c602d015478b7958408d788ba00a50272649c5186ea8baa6cf71d4a1c761bba1"}, + {file = "numba-0.56.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:85dbaed7a05ff96492b69a8900c5ba605551afb9b27774f7f10511095451137c"}, + {file = "numba-0.56.4-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f4cfc3a19d1e26448032049c79fc60331b104f694cf570a9e94f4e2c9d0932bb"}, + {file = "numba-0.56.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4e08e203b163ace08bad500b0c16f6092b1eb34fd1fce4feaf31a67a3a5ecf3b"}, + {file = "numba-0.56.4-cp310-cp310-win32.whl", hash = "sha256:0611e6d3eebe4cb903f1a836ffdb2bda8d18482bcd0a0dcc56e79e2aa3fefef5"}, + {file = "numba-0.56.4-cp310-cp310-win_amd64.whl", hash = "sha256:fbfb45e7b297749029cb28694abf437a78695a100e7c2033983d69f0ba2698d4"}, + {file = "numba-0.56.4-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:3cb1a07a082a61df80a468f232e452d818f5ae254b40c26390054e4e868556e0"}, + {file = "numba-0.56.4-cp37-cp37m-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d69ad934e13c15684e7887100a8f5f0f61d7a8e57e0fd29d9993210089a5b531"}, + {file = "numba-0.56.4-cp37-cp37m-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:dbcc847bac2d225265d054993a7f910fda66e73d6662fe7156452cac0325b073"}, + {file = "numba-0.56.4-cp37-cp37m-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8a95ca9cc77ea4571081f6594e08bd272b66060634b8324e99cd1843020364f9"}, + {file = "numba-0.56.4-cp37-cp37m-win32.whl", hash = "sha256:fcdf84ba3ed8124eb7234adfbb8792f311991cbf8aed1cad4b1b1a7ee08380c1"}, + {file = "numba-0.56.4-cp37-cp37m-win_amd64.whl", hash = "sha256:42f9e1be942b215df7e6cc9948cf9c15bb8170acc8286c063a9e57994ef82fd1"}, + {file = "numba-0.56.4-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:553da2ce74e8862e18a72a209ed3b6d2924403bdd0fb341fa891c6455545ba7c"}, + {file = "numba-0.56.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4373da9757049db7c90591e9ec55a2e97b2b36ba7ae3bf9c956a513374077470"}, + {file = "numba-0.56.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3a993349b90569518739009d8f4b523dfedd7e0049e6838c0e17435c3e70dcc4"}, + {file = "numba-0.56.4-cp38-cp38-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:720886b852a2d62619ae3900fe71f1852c62db4f287d0c275a60219e1643fc04"}, + {file = "numba-0.56.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e64d338b504c9394a4a34942df4627e1e6cb07396ee3b49fe7b8d6420aa5104f"}, + {file = "numba-0.56.4-cp38-cp38-win32.whl", hash = "sha256:03fe94cd31e96185cce2fae005334a8cc712fc2ba7756e52dff8c9400718173f"}, + {file = "numba-0.56.4-cp38-cp38-win_amd64.whl", hash = "sha256:91f021145a8081f881996818474ef737800bcc613ffb1e618a655725a0f9e246"}, + {file = "numba-0.56.4-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:d0ae9270a7a5cc0ede63cd234b4ff1ce166c7a749b91dbbf45e0000c56d3eade"}, + {file = "numba-0.56.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c75e8a5f810ce80a0cfad6e74ee94f9fde9b40c81312949bf356b7304ef20740"}, + {file = "numba-0.56.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a12ef323c0f2101529d455cfde7f4135eaa147bad17afe10b48634f796d96abd"}, + {file = "numba-0.56.4-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:03634579d10a6129181129de293dd6b5eaabee86881369d24d63f8fe352dd6cb"}, + {file = "numba-0.56.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0240f9026b015e336069329839208ebd70ec34ae5bfbf402e4fcc8e06197528e"}, + {file = "numba-0.56.4-cp39-cp39-win32.whl", hash = "sha256:14dbbabf6ffcd96ee2ac827389afa59a70ffa9f089576500434c34abf9b054a4"}, + {file = "numba-0.56.4-cp39-cp39-win_amd64.whl", hash = "sha256:0da583c532cd72feefd8e551435747e0e0fbb3c0530357e6845fcc11e38d6aea"}, + {file = "numba-0.56.4.tar.gz", hash = "sha256:32d9fef412c81483d7efe0ceb6cf4d3310fde8b624a9cecca00f790573ac96ee"}, +] + +[package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.9\""} +llvmlite = ">=0.39.0dev0,<0.40" +numpy = ">=1.18,<1.24" +setuptools = "*" + +[[package]] +name = "numpy" +version = "1.23.5" +description = "NumPy is the fundamental package for array computing with Python." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63"}, + {file = "numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d"}, + {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43"}, + {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1"}, + {file = "numpy-1.23.5-cp310-cp310-win32.whl", hash = "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280"}, + {file = "numpy-1.23.5-cp310-cp310-win_amd64.whl", hash = "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6"}, + {file = "numpy-1.23.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96"}, + {file = "numpy-1.23.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa"}, + {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2"}, + {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387"}, + {file = "numpy-1.23.5-cp311-cp311-win32.whl", hash = "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0"}, + {file = "numpy-1.23.5-cp311-cp311-win_amd64.whl", hash = "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d"}, + {file = "numpy-1.23.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a"}, + {file = "numpy-1.23.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9"}, + {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398"}, + {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb"}, + {file = "numpy-1.23.5-cp38-cp38-win32.whl", hash = "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07"}, + {file = "numpy-1.23.5-cp38-cp38-win_amd64.whl", hash = "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e"}, + {file = "numpy-1.23.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f"}, + {file = "numpy-1.23.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de"}, + {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d"}, + {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719"}, + {file = "numpy-1.23.5-cp39-cp39-win32.whl", hash = "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481"}, + {file = "numpy-1.23.5-cp39-cp39-win_amd64.whl", hash = "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df"}, + {file = "numpy-1.23.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8"}, + {file = "numpy-1.23.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135"}, + {file = "numpy-1.23.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d"}, + {file = "numpy-1.23.5.tar.gz", hash = "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a"}, +] + +[[package]] +name = "nvidia-cublas-cu11" +version = "11.10.3.66" +description = "CUBLAS native runtime libraries" +category = "main" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cublas_cu11-11.10.3.66-py3-none-manylinux1_x86_64.whl", hash = "sha256:d32e4d75f94ddfb93ea0a5dda08389bcc65d8916a25cb9f37ac89edaeed3bded"}, + {file = "nvidia_cublas_cu11-11.10.3.66-py3-none-win_amd64.whl", hash = "sha256:8ac17ba6ade3ed56ab898a036f9ae0756f1e81052a317bf98f8c6d18dc3ae49e"}, +] + +[package.dependencies] +setuptools = "*" +wheel = "*" + +[[package]] +name = "nvidia-cuda-cupti-cu11" +version = "11.7.101" +description = "CUDA profiling tools runtime libs." +category = "main" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_cupti_cu11-11.7.101-py3-none-manylinux1_x86_64.whl", hash = "sha256:e0cfd9854e1f2edaa36ca20d21cd0bdd5dcfca4e3b9e130a082e05b33b6c5895"}, + {file = "nvidia_cuda_cupti_cu11-11.7.101-py3-none-win_amd64.whl", hash = "sha256:7cc5b8f91ae5e1389c3c0ad8866b3b016a175e827ea8f162a672990a402ab2b0"}, +] + +[package.dependencies] +setuptools = "*" +wheel = "*" + +[[package]] +name = "nvidia-cuda-nvrtc-cu11" +version = "11.7.99" +description = "NVRTC native runtime libraries" +category = "main" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_nvrtc_cu11-11.7.99-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:9f1562822ea264b7e34ed5930567e89242d266448e936b85bc97a3370feabb03"}, + {file = "nvidia_cuda_nvrtc_cu11-11.7.99-py3-none-manylinux1_x86_64.whl", hash = "sha256:f7d9610d9b7c331fa0da2d1b2858a4a8315e6d49765091d28711c8946e7425e7"}, + {file = "nvidia_cuda_nvrtc_cu11-11.7.99-py3-none-win_amd64.whl", hash = "sha256:f2effeb1309bdd1b3854fc9b17eaf997808f8b25968ce0c7070945c4265d64a3"}, +] + +[package.dependencies] +setuptools = "*" +wheel = "*" + +[[package]] +name = "nvidia-cuda-runtime-cu11" +version = "11.7.99" +description = "CUDA Runtime native Libraries" +category = "main" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_runtime_cu11-11.7.99-py3-none-manylinux1_x86_64.whl", hash = "sha256:cc768314ae58d2641f07eac350f40f99dcb35719c4faff4bc458a7cd2b119e31"}, + {file = "nvidia_cuda_runtime_cu11-11.7.99-py3-none-win_amd64.whl", hash = "sha256:bc77fa59a7679310df9d5c70ab13c4e34c64ae2124dd1efd7e5474b71be125c7"}, +] + +[package.dependencies] +setuptools = "*" +wheel = "*" + +[[package]] +name = "nvidia-cudnn-cu11" +version = "8.5.0.96" +description = "cuDNN runtime libraries" +category = "main" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cudnn_cu11-8.5.0.96-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:402f40adfc6f418f9dae9ab402e773cfed9beae52333f6d86ae3107a1b9527e7"}, + {file = "nvidia_cudnn_cu11-8.5.0.96-py3-none-manylinux1_x86_64.whl", hash = "sha256:71f8111eb830879ff2836db3cccf03bbd735df9b0d17cd93761732ac50a8a108"}, +] + +[package.dependencies] +setuptools = "*" +wheel = "*" + +[[package]] +name = "nvidia-cufft-cu11" +version = "10.9.0.58" +description = "CUFFT native runtime libraries" +category = "main" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cufft_cu11-10.9.0.58-py3-none-manylinux1_x86_64.whl", hash = "sha256:222f9da70c80384632fd6035e4c3f16762d64ea7a843829cb278f98b3cb7dd81"}, + {file = "nvidia_cufft_cu11-10.9.0.58-py3-none-win_amd64.whl", hash = "sha256:c4d316f17c745ec9c728e30409612eaf77a8404c3733cdf6c9c1569634d1ca03"}, +] + +[[package]] +name = "nvidia-curand-cu11" +version = "10.2.10.91" +description = "CURAND native runtime libraries" +category = "main" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_curand_cu11-10.2.10.91-py3-none-manylinux1_x86_64.whl", hash = "sha256:eecb269c970fa599a2660c9232fa46aaccbf90d9170b96c462e13bcb4d129e2c"}, + {file = "nvidia_curand_cu11-10.2.10.91-py3-none-win_amd64.whl", hash = "sha256:f742052af0e1e75523bde18895a9ed016ecf1e5aa0ecddfcc3658fd11a1ff417"}, +] + +[package.dependencies] +setuptools = "*" +wheel = "*" + +[[package]] +name = "nvidia-cusolver-cu11" +version = "11.4.0.1" +description = "CUDA solver native runtime libraries" +category = "main" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusolver_cu11-11.4.0.1-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:72fa7261d755ed55c0074960df5904b65e2326f7adce364cbe4945063c1be412"}, + {file = "nvidia_cusolver_cu11-11.4.0.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:700b781bfefd57d161443aff9ace1878584b93e0b2cfef3d6e9296d96febbf99"}, + {file = "nvidia_cusolver_cu11-11.4.0.1-py3-none-win_amd64.whl", hash = "sha256:00f70b256add65f8c1eb3b6a65308795a93e7740f6df9e273eccbba770d370c4"}, +] + +[package.dependencies] +setuptools = "*" +wheel = "*" + +[[package]] +name = "nvidia-cusparse-cu11" +version = "11.7.4.91" +description = "CUSPARSE native runtime libraries" +category = "main" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusparse_cu11-11.7.4.91-py3-none-manylinux1_x86_64.whl", hash = "sha256:a3389de714db63321aa11fbec3919271f415ef19fda58aed7f2ede488c32733d"}, + {file = "nvidia_cusparse_cu11-11.7.4.91-py3-none-win_amd64.whl", hash = "sha256:304a01599534f5186a8ed1c3756879282c72c118bc77dd890dc1ff868cad25b9"}, +] + +[package.dependencies] +setuptools = "*" +wheel = "*" + +[[package]] +name = "nvidia-nccl-cu11" +version = "2.14.3" +description = "NVIDIA Collective Communication Library (NCCL) Runtime" +category = "main" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nccl_cu11-2.14.3-py3-none-manylinux1_x86_64.whl", hash = "sha256:5e5534257d1284b8e825bc3a182c6f06acd6eb405e9f89d49340e98cd8f136eb"}, +] + +[[package]] +name = "nvidia-nvtx-cu11" +version = "11.7.91" +description = "NVIDIA Tools Extension" +category = "main" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvtx_cu11-11.7.91-py3-none-manylinux1_x86_64.whl", hash = "sha256:b22c64eee426a62fc00952b507d6d29cf62b4c9df7a480fcc417e540e05fd5ac"}, + {file = "nvidia_nvtx_cu11-11.7.91-py3-none-win_amd64.whl", hash = "sha256:dfd7fcb2a91742513027d63a26b757f38dd8b07fecac282c4d132a9d373ff064"}, +] + +[package.dependencies] +setuptools = "*" +wheel = "*" + +[[package]] +name = "oauthlib" +version = "3.2.2" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, +] + +[package.extras] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] + +[[package]] +name = "onnx" +version = "1.13.1" +description = "Open Neural Network Exchange" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "onnx-1.13.1-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:b309adf38ac4ba0402b007c62660a899aae98c9a207afe8c4f4e1fee8c385af8"}, + {file = "onnx-1.13.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:48f28bd276c0f4083f7664ae237f37678db627851963f2e0090635f6be5a4b6f"}, + {file = "onnx-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1d06ab65b3a5ae030e55916aebc26cd02d058cf74b0224676f34bdd2f06501a"}, + {file = "onnx-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1810655a12a470ac2fa978b43fa71e5d8e8d5648ba3b71086da2e51272947fd8"}, + {file = "onnx-1.13.1-cp310-cp310-win32.whl", hash = "sha256:1a62e0e7ba0546e2165c7e269e09be9a76281ed9273568bce08ebc4f86a6e168"}, + {file = "onnx-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:4a91fa57abd05da2a3bb20b3695af62ccde83de0b8b2bac86495383a72fc23c9"}, + {file = "onnx-1.13.1-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:b939dd1a32b728cd5c461b2fedfa53e0d0d2b400d5b714858205adb6f9dea722"}, + {file = "onnx-1.13.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:efa32f2fbdf68324579ab7c50ed08d178b38a2300a31e38856bab8108596200b"}, + {file = "onnx-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade8260e6d42c6258502f534bc5564820442a3775a0e8614f28cdaf1ac07d0f7"}, + {file = "onnx-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb7951ed7c13383223bc57c4aacd2c07f3b35c8e6b3959c0e56b19f4bf22d193"}, + {file = "onnx-1.13.1-cp311-cp311-win32.whl", hash = "sha256:6173c798344ee9c9b6d8f55174627c9e6e95e1e527cdf254b76f2e294e84a2b1"}, + {file = "onnx-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:9af2b1cf28c6fc9ded4292fa844a5687619be231375db9b8e4029c2c66a06299"}, + {file = "onnx-1.13.1-cp37-cp37m-macosx_10_12_universal2.whl", hash = "sha256:39bc23dcea2384423b0ad31267207484bf98ac246e5bf08bd3eb2f67cabf092e"}, + {file = "onnx-1.13.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:826858018694244e9c41cf50f58761f59b947e289e8c1a0e441043e290d101b7"}, + {file = "onnx-1.13.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94ecceedc1625d087a7e398dc30ec6b3f2eb649e7b445b0bfc9632d6013b3acf"}, + {file = "onnx-1.13.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9700d8b368eb385648804ccbd4e06e125560e77293150643040360be9748dbdd"}, + {file = "onnx-1.13.1-cp37-cp37m-win32.whl", hash = "sha256:01e853e3dc90da05f1b985e8ea2db5910128dd0555dc79fef26ef72948be2a32"}, + {file = "onnx-1.13.1-cp37-cp37m-win_amd64.whl", hash = "sha256:fd3bd0e12beee800ac736002ef9b488d69b2ef392444f1d8ae9dfec60629f190"}, + {file = "onnx-1.13.1-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:5e2fe69e51157e7aa00e959059981ce74b5c5bd6edd4512079fc4c10fb95d28a"}, + {file = "onnx-1.13.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:64fb0d5573419f26f3c1b3f6b63850569a8684d360b482c164b75701bfeaae1e"}, + {file = "onnx-1.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15b7a41b21b61c09cf4535a69364ca69e3593f47d09d85752c0f6d07c6b337b4"}, + {file = "onnx-1.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e980706de4dc94ffafc57e4ae7e7f4117dbd4c377882637c28a261a6aed38246"}, + {file = "onnx-1.13.1-cp38-cp38-win32.whl", hash = "sha256:d03e09cb1fa9dbdaf3269cae9c8c186d422ec061ed40f393092b0dc67dd1b43c"}, + {file = "onnx-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:e68ca8e43fa790c1bd772f706282788bd1187ca7d1aadf69af4bab2f4566edc0"}, + {file = "onnx-1.13.1-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:e3ee28611421fc04b5a4804fc0e802d215193308458593497f5d26c164ee52fc"}, + {file = "onnx-1.13.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0325e9c3bf6fcb1369871a1357de1c1f37ad18efdb5a01c8bc9a4b4f1037fa28"}, + {file = "onnx-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc04158a3180c6a713394e0a4cd64abff026be790e06d7522de7d3ec1080611d"}, + {file = "onnx-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c55918281d561edc5a2434b3aa50e827864896ee9e65f3194ea3fda87a1b4281"}, + {file = "onnx-1.13.1-cp39-cp39-win32.whl", hash = "sha256:d07b578589ffdf9d2e0ca6fb7dad5ffa8f2d2d1e4f210aa464fb229c5cf868e1"}, + {file = "onnx-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:cd88a6b51d07ac8b3b88f2398256b4389ca4b84fe45acd1f8a0cb10425ae801d"}, + {file = "onnx-1.13.1.tar.gz", hash = "sha256:0bdcc25c2c1ce4a8750e4ffbd93ae945442e7fac6e51176f38e366b74a97dfd9"}, +] + +[package.dependencies] +numpy = ">=1.16.6" +protobuf = ">=3.20.2,<4" +typing-extensions = ">=3.6.2.1" + +[package.extras] +lint = ["black (>=22.3)", "clang-format (==13.0.0)", "flake8 (>=5.0.2)", "isort[colors] (>=5.10)", "mypy (>=0.971)", "types-protobuf (==3.18.4)"] + +[[package]] +name = "onnxoptimizer" +version = "0.3.13" +description = "Open Neural Network Exchange" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "onnxoptimizer-0.3.13-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:019968dc02b37ab87588b67331f15719a9fcfc5de54de866dd7b02eaad68bdd5"}, + {file = "onnxoptimizer-0.3.13-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:542b43b13c3b1b7b72aae2579a2d75ef68dcf0513231bb1cb2b5f3c8af838d87"}, + {file = "onnxoptimizer-0.3.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98716324135ac5505529423dbba5479273e6f46a0f895ac611a29ed8a6f79690"}, + {file = "onnxoptimizer-0.3.13-cp310-cp310-win_amd64.whl", hash = "sha256:f34db9dc55a682d3e5e60f5e6ff62101410620d2b70bef41f6158481a9a0b5ec"}, + {file = "onnxoptimizer-0.3.13-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:dcd1c529cb3d285f1bc75480ebe198a43f6bcc84ad010386f6e2d7bcd3052501"}, + {file = "onnxoptimizer-0.3.13-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:a65b2ff1d480f966f906fdc3731cd6a844762e0aae1876eeafb7586048d6be96"}, + {file = "onnxoptimizer-0.3.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f985cfef0fa2b7cf9ae64a36ca8dacb3e1861e31fa41fb85645cdbd73ccab6a"}, + {file = "onnxoptimizer-0.3.13-cp311-cp311-win_amd64.whl", hash = "sha256:82e606024a6dce999a8586d1f4b6af2ec454f7c5fd69807672a79067017a4812"}, + {file = "onnxoptimizer-0.3.13-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:feb5fb749cb9b12602fef7bae034aaf9a36baa05d068fb3d991bbb758c0508bb"}, + {file = "onnxoptimizer-0.3.13-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:917363d773f6b517a6edb97b9d1d64cd49dc12ee507d9daef04a443d2d8889a5"}, + {file = "onnxoptimizer-0.3.13-cp37-cp37m-win_amd64.whl", hash = "sha256:f809f7ba336e6569e699b4e6741042ef71e8db30bb60a3380faae87c59d6118f"}, + {file = "onnxoptimizer-0.3.13-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:f6a93aa863e23e040b23822b783b5d9bc1bf3a2153909bcc68dd9cd61c824798"}, + {file = "onnxoptimizer-0.3.13-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:ad02bd61d5731587bcecb4aef3ecde6d22fdb0a36c8a2fb6c9b78b6b3cf30e42"}, + {file = "onnxoptimizer-0.3.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3a08e7d3077830bbc99009442230547cae2e9f74682b4fffa42036b88ac49ea"}, + {file = "onnxoptimizer-0.3.13-cp38-cp38-win_amd64.whl", hash = "sha256:3dc63c930db678d07cdd816618b6d990dadb572691c62576962c2aab995a0ba1"}, + {file = "onnxoptimizer-0.3.13-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:1949c259bc87a92680b1d4ee54813dc712a4328b4d4e140ec44c1739862baccc"}, + {file = "onnxoptimizer-0.3.13-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:9c0516d96da47875e9a36d0c9689e2d3e6f72950d98425ccfeba793b6ba4f55e"}, + {file = "onnxoptimizer-0.3.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cfa79a41d2439c47e6675f19cc6bcd7dce5d5da492f9bcde71dc0eba739dea6"}, + {file = "onnxoptimizer-0.3.13-cp39-cp39-win_amd64.whl", hash = "sha256:f97f454cc2602095e341219f5c1b828d1588351251e4a4108017fd132ac5590c"}, + {file = "onnxoptimizer-0.3.13.tar.gz", hash = "sha256:e08b726e0d4577e51e529f36bc324bf11b7cff12852cf3eee081f05c8b8c6f33"}, +] + +[package.dependencies] +onnx = "*" + +[package.extras] +mypy = ["mypy (==0.600)"] + +[[package]] +name = "onnxsim" +version = "0.4.26" +description = "Simplify your ONNX model" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "onnxsim-0.4.26-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ef23d64ba5d6a1bfec10dd2bbe11db3ab9655037d9c18799d64278d7a756d856"}, + {file = "onnxsim-0.4.26-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46ad68cf1e234dc919b9f4e8cb2a9053ea108d05f93d66a24d07e3a00209c743"}, + {file = "onnxsim-0.4.26-cp310-cp310-win_amd64.whl", hash = "sha256:8657a875a05eac2edbc3a49c0adafef57c87c3c929b24ebaef3f087cb8af4753"}, + {file = "onnxsim-0.4.26-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:c2daf8604f98fd237dc42ac9dc47768a41b1078473afa6947a8a2c7fd3798c1f"}, + {file = "onnxsim-0.4.26-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b6ff129bebeb1ddd82b8115bc1ac3bc58409d38ddf6cde1a7969c38ec4c2a3d"}, + {file = "onnxsim-0.4.26-cp311-cp311-win_amd64.whl", hash = "sha256:7a8178e715c85959e844e70d0c557ec525d2c1070611dfa7172f10595640d85a"}, + {file = "onnxsim-0.4.26-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36fd7cd43be03131d1c5852d9b4eab8851d5765e2e91277afd910f777549958a"}, + {file = "onnxsim-0.4.26-cp37-cp37m-win_amd64.whl", hash = "sha256:dcbf744cc6949052ba885f9418cf85df003c2c2c803c3c52356943eb2dafb760"}, + {file = "onnxsim-0.4.26-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:77ba41e3fa5d98d74b421bc9f10311ab1740b51bf5c18cd947c5b7138820f5cd"}, + {file = "onnxsim-0.4.26-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1204edd8753aa2491190040c95b845623e1291e440eecd107fbefd05255bee14"}, + {file = "onnxsim-0.4.26-cp38-cp38-win_amd64.whl", hash = "sha256:581dccf1a2a20aa81fa88eb3f2db237ae361bfbfca422b3b39ca120863d8129c"}, + {file = "onnxsim-0.4.26-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b89d0f4c6dfa27a8eab7f65934ab3a6561a487494f05ac5cf5d0df915baa26b8"}, + {file = "onnxsim-0.4.26-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c155856281a1f8c6843eda2eed254da6de397d46fe2e77a950ddc5c4929882"}, + {file = "onnxsim-0.4.26-cp39-cp39-win_amd64.whl", hash = "sha256:968395202b0500d68290da610ec88e1a1d2ce90185c00b69b4318362d62c0772"}, + {file = "onnxsim-0.4.26.tar.gz", hash = "sha256:8683d76cc32f374bfa4cb882136eb0d03afd9bdf39c1ee4a45cc989867a841bc"}, +] + +[package.dependencies] +onnx = "*" +rich = "*" + +[[package]] +name = "ordered-set" +version = "4.1.0" +description = "An OrderedSet is a custom MutableSet that remembers its order, so that every" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8"}, + {file = "ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562"}, +] + +[package.extras] +dev = ["black", "mypy", "pytest"] + +[[package]] +name = "orjson" +version = "3.8.9" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "orjson-3.8.9-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:5d029843eae7b6cbd6468b63517b8b61471afed6572162171d8b6471b6dbf41f"}, + {file = "orjson-3.8.9-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:405933c05490efb209d0f940d8ef1403d2932a97e47010a26d2694e9dd49f84d"}, + {file = "orjson-3.8.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:183de66eff4d41c330a3006f210ab0bce7affe398da6f6eda9579b67245a34ff"}, + {file = "orjson-3.8.9-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb4081fe340ed1df42dddfd055e1d50479cb0ccb976d13e6b5e8667a07fec6f4"}, + {file = "orjson-3.8.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d11593a2e736055dd7b9587dbf89cd1cbe4a42a70e70f186e51aee7e1b38902e"}, + {file = "orjson-3.8.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e20649359e28f34d01b2570e4650a076f439a959bae3a8bbe7f5923ad80f54e8"}, + {file = "orjson-3.8.9-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c02ece4f36a160c83efe74adfba5f189c7c7702361f02b809ab73744923ee139"}, + {file = "orjson-3.8.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f0e19801836cf1b30f333d475b05d79051b8ae8639a8e2422fb5f64e82676ae7"}, + {file = "orjson-3.8.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d4850fe5650cead3c0f8822192e381cee9d4c3b8162eb082c86c927124572dc6"}, + {file = "orjson-3.8.9-cp310-none-win_amd64.whl", hash = "sha256:5fd4193f260d9d30112b5e379d0870b54dc88040807c93cbe8d67bfea148ba5a"}, + {file = "orjson-3.8.9-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:70eae063ad8d7405dc63873760567b600fc10728ba0da24a69d49c1a5d318d6d"}, + {file = "orjson-3.8.9-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:251653437632583d02203e6b118b72b99c04425175853f35340f4bac7034a36e"}, + {file = "orjson-3.8.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ea833751f017ba321c277e7425b51c0b1a18a2c60f8c9c0f4c6c4d7e16cbd6c"}, + {file = "orjson-3.8.9-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8563c2cdeb923b82a5cc5bfc76c28c786777428263ee39292d928e9687165fb4"}, + {file = "orjson-3.8.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f33e9ea45b4c9457eedca0c40f38cf5732c91b0fb68f091ac59e6ea68e03eb2"}, + {file = "orjson-3.8.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:855dee152daecb7de7b4cd7069d7854e11aa291687bffe8433156af0a224417e"}, + {file = "orjson-3.8.9-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:74fa9e02589339defc9d3662de9e7eef51d8f9f3a7f6304b43b18b39d7bbf10f"}, + {file = "orjson-3.8.9-cp311-none-win_amd64.whl", hash = "sha256:6c5b10ba1e62df8f96cbc37f6d5ae9acb3f6475926dea8b1b6a1a60f201a64f7"}, + {file = "orjson-3.8.9-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:a651123d01bc399fcd866e56acc2d76512e62aae3673652b13b470ea69faf1f4"}, + {file = "orjson-3.8.9-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:73019b6d2cc998c99556020c6bd8f8bc28420c69583186ca290c66a27916a3b7"}, + {file = "orjson-3.8.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f5c3daa8b02786ad5f0e14ae16a59bbb4e02cbae3a41989a25188e5a6c962ff"}, + {file = "orjson-3.8.9-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:598598b7f81f8fda7c3e09c88165f844152b7be223bc4ea929ec8ad59b00ea17"}, + {file = "orjson-3.8.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:090b10bdb06baae6d5cd3550d772ecbabd833bfceed7592ff167c0a82f5b4c20"}, + {file = "orjson-3.8.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd46f688ddf9c2ea10367446fe9bf3ceba0f7490c15b4f96420491c7f00bb283"}, + {file = "orjson-3.8.9-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:b8ed8d780e9fab01bc404a70d755a8b2b34ea6c0b6604b65de135daaaadaf9a9"}, + {file = "orjson-3.8.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8a32c9fb742868a34346f3c52e12d893a9d27f8e0c0bf3c480db7e6903d8be28"}, + {file = "orjson-3.8.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2ba366009b98ac8899e935eff6fef7672d3ea43d3ce9deb3ee33452134b6cc3a"}, + {file = "orjson-3.8.9-cp37-none-win_amd64.whl", hash = "sha256:236b9313425cb2570626c64dd5cb6caff13882d1717d491da542cff228b96e97"}, + {file = "orjson-3.8.9-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:e8efc7e9ec35336f7cc98b6692536b1262046ff1d2a545295a4d89b8a2495903"}, + {file = "orjson-3.8.9-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:8c7eba3610ae69f4aba4032ecb61b0a6fbd1e4537283d1553eb8c1cb136e9118"}, + {file = "orjson-3.8.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7742649e4c357d4e7ad483a35ff5f55d519e895de56772cc486913614ee7d23b"}, + {file = "orjson-3.8.9-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6566fb8daa538c7848fd6822e2409a7e1c41dae8e65e6536598d505f641a318"}, + {file = "orjson-3.8.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ce8a2a667221e2e5160021e26b09e9c13eeedafb5cda1981340c8c0c0bc8f9d"}, + {file = "orjson-3.8.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c0399631b88fa4868956badef2561fba07dffcaf050bf53959ee50d26edf6f6"}, + {file = "orjson-3.8.9-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:189ccb16ed140a824d133fa1c55175cf0d2207edaade54f1db0456a526cb5fd8"}, + {file = "orjson-3.8.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b707fa4481e1af19b3052ec9352c688bad3f539d7bdd8aa4a451f6dd7e4bae73"}, + {file = "orjson-3.8.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c3d988eb562da1dda7d49e9abd8a64b3cabc632b4299d177fb9e0c0ca9f06b8c"}, + {file = "orjson-3.8.9-cp38-none-win_amd64.whl", hash = "sha256:b30240eb6b22daab604f1595f6aacf92bcdac0d29e2d7ad507dfac68d2b39182"}, + {file = "orjson-3.8.9-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:81869a6de00bc676d10056fa8bb28cbe805b1cf498a45c14cb7b1765eee33fcb"}, + {file = "orjson-3.8.9-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:a25a5a215b19d414de8d416a3c5414f29165843a06f704cc0345ded9eac34ac1"}, + {file = "orjson-3.8.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec0f2bea52e30ea98ce095f1f42da04535791f9a31b2aab2499caa88307bc49"}, + {file = "orjson-3.8.9-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7b91d88fe96b698b28bb1b95b1fce226f72757ab3ab7d8d97551e23bc629c84f"}, + {file = "orjson-3.8.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7629841ccdcccd3c43ebc6a4165abe9844909fcedb2041994c0153470f610801"}, + {file = "orjson-3.8.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d875b304e19f4b2758d233bbf2b9d627c66fac50b3150b8d31a35ba6cda3db67"}, + {file = "orjson-3.8.9-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:723ec880c5290fe4de330febb8030e57c1978fbd624fc5b9399969e7d7d74984"}, + {file = "orjson-3.8.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b11f8a71c82d19fce11ce487efeec2ca0dc3bcf5b4564445fecfc68d9c268744"}, + {file = "orjson-3.8.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b2079bf86dec62731c1b90fdfea3211f993f0c894d9261e0ce9b68ed9c9dfbec"}, + {file = "orjson-3.8.9-cp39-none-win_amd64.whl", hash = "sha256:97d94322a2eaab767ba8d52f6bf9d0ec0f35313fe36287be6e6085dd65d55d37"}, + {file = "orjson-3.8.9.tar.gz", hash = "sha256:c40bece58c11cb09aff17424d21b41f6f767d2b1252b2f745ec3ff29cce6a240"}, +] + +[[package]] +name = "packaging" +version = "23.0" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, + {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, +] + +[[package]] +name = "pandas" +version = "2.0.0" +description = "Powerful data structures for data analysis, time series, and statistics" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pandas-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bbb2c5e94d6aa4e632646a3bacd05c2a871c3aa3e85c9bec9be99cb1267279f2"}, + {file = "pandas-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b5337c87c4e963f97becb1217965b6b75c6fe5f54c4cf09b9a5ac52fc0bd03d3"}, + {file = "pandas-2.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ded51f7e3dd9b4f8b87f2ceb7bd1a8df2491f7ee72f7074c6927a512607199e"}, + {file = "pandas-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52c858de9e9fc422d25e67e1592a6e6135d7bcf9a19fcaf4d0831a0be496bf21"}, + {file = "pandas-2.0.0-cp310-cp310-win32.whl", hash = "sha256:2d1d138848dd71b37e3cbe7cd952ff84e2ab04d8988972166e18567dcc811245"}, + {file = "pandas-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:d08e41d96bc4de6f500afe80936c68fce6099d5a434e2af7c7fd8e7c72a3265d"}, + {file = "pandas-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:24472cfc7ced511ac90608728b88312be56edc8f19b9ed885a7d2e47ffaf69c0"}, + {file = "pandas-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ffb14f50c74ee541610668137830bb93e9dfa319b1bef2cedf2814cd5ac9c70"}, + {file = "pandas-2.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c24c7d12d033a372a9daf9ff2c80f8b0af6f98d14664dbb0a4f6a029094928a7"}, + {file = "pandas-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8318de0f886e4dcb8f9f36e45a3d6a6c3d1cfdc508354da85e739090f0222991"}, + {file = "pandas-2.0.0-cp311-cp311-win32.whl", hash = "sha256:57c34b79c13249505e850d0377b722961b99140f81dafbe6f19ef10239f6284a"}, + {file = "pandas-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:8f987ec26e96a8490909bc5d98c514147236e49830cba7df8690f6087c12bbae"}, + {file = "pandas-2.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b3ba8f5dd470d8bfbc4259829589f4a32881151c49e36384d9eb982b35a12020"}, + {file = "pandas-2.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fcd471c9d9f60926ab2f15c6c29164112f458acb42280365fbefa542d0c2fc74"}, + {file = "pandas-2.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9253edfd015520ce77a9343eb7097429479c039cd3ebe81d7810ea11b4b24695"}, + {file = "pandas-2.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977326039bd1ded620001a1889e2ed4798460a6bc5a24fbaebb5f07a41c32a55"}, + {file = "pandas-2.0.0-cp38-cp38-win32.whl", hash = "sha256:78425ca12314b23356c28b16765639db10ebb7d8983f705d6759ff7fe41357fa"}, + {file = "pandas-2.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:d93b7fcfd9f3328072b250d6d001dcfeec5d3bb66c1b9c8941e109a46c0c01a8"}, + {file = "pandas-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:425705cee8be54db2504e8dd2a730684790b15e5904b750c367611ede49098ab"}, + {file = "pandas-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a4f789b7c012a608c08cda4ff0872fd979cb18907a37982abe884e6f529b8793"}, + {file = "pandas-2.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3bb9d840bf15656805f6a3d87eea9dcb7efdf1314a82adcf7f00b820427c5570"}, + {file = "pandas-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0778ab54c8f399d83d98ffb674d11ec716449956bc6f6821891ab835848687f2"}, + {file = "pandas-2.0.0-cp39-cp39-win32.whl", hash = "sha256:70db5c278bbec0306d32bf78751ff56b9594c05a5098386f6c8a563659124f91"}, + {file = "pandas-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f3320bb55f34af4193020158ef8118ee0fb9aec7cc47d2084dbfdd868a0a24f"}, + {file = "pandas-2.0.0.tar.gz", hash = "sha256:cda9789e61b44463c1c4fe17ef755de77bcd13b09ba31c940d20f193d63a5dc8"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.20.3", markers = "python_version < \"3.10\""}, + {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.1" + +[package.extras] +all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] +aws = ["s3fs (>=2021.08.0)"] +clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] +compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] +computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2021.07.0)"] +gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] +hdf5 = ["tables (>=3.6.1)"] +html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] +mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] +spss = ["pyreadstat (>=1.1.2)"] +sql-other = ["SQLAlchemy (>=1.4.16)"] +test = ["hypothesis (>=6.34.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.6.3)"] + +[[package]] +name = "pebble" +version = "5.0.3" +description = "Threading and multiprocessing eye-candy." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "Pebble-5.0.3-py3-none-any.whl", hash = "sha256:8274aa0959f387b368ede47666129cbe5d123f276a1bd9cafe77e020194b2141"}, + {file = "Pebble-5.0.3.tar.gz", hash = "sha256:bdcfd9ea7e0aedb895b204177c19e6d6543d9962f4e3402ebab2175004863da8"}, +] + +[[package]] +name = "pillow" +version = "9.5.0" +description = "Python Imaging Library (Fork)" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, + {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, + {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, + {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, + {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, + {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, + {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, + {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, + {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, + {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, + {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, + {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, + {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, + {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, + {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, + {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "pkgutil-resolve-name" +version = "1.3.10" +description = "Resolve a name to an object." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, + {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, +] + +[[package]] +name = "platformdirs" +version = "3.2.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.2.0-py3-none-any.whl", hash = "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e"}, + {file = "platformdirs-3.2.0.tar.gz", hash = "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08"}, +] + +[package.extras] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pooch" +version = "1.7.0" +description = "\"Pooch manages your Python library's sample data files: it automatically downloads and stores them in a local directory, with support for versioning and corruption checks.\"" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pooch-1.7.0-py3-none-any.whl", hash = "sha256:74258224fc33d58f53113cf955e8d51bf01386b91492927d0d1b6b341a765ad7"}, + {file = "pooch-1.7.0.tar.gz", hash = "sha256:f174a1041b6447f0eef8860f76d17f60ed2f857dc0efa387a7f08228af05d998"}, +] + +[package.dependencies] +packaging = ">=20.0" +platformdirs = ">=2.5.0" +requests = ">=2.19.0" + +[package.extras] +progress = ["tqdm (>=4.41.0,<5.0.0)"] +sftp = ["paramiko (>=2.7.0)"] +xxhash = ["xxhash (>=1.4.3)"] + +[[package]] +name = "praat-parselmouth" +version = "0.4.3" +description = "Praat in Python, the Pythonic way" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "praat-parselmouth-0.4.3.tar.gz", hash = "sha256:93538d0ba06444b68d18b793efb436b0d645c62c0397c4977c1d27b679aee168"}, + {file = "praat_parselmouth-0.4.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:124925f3e40a6d626d65789d449bdabe43078528efbee6f3a1df6e67db60c971"}, + {file = "praat_parselmouth-0.4.3-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0d3023d9b625c6b0a3cbe8a4f09cc23f666f9b9df40c59e33c4c9ca5b8ea1dac"}, + {file = "praat_parselmouth-0.4.3-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:6841b9d9d2a614382cf186311610d663f0170ba20824296878eb98905b04899a"}, + {file = "praat_parselmouth-0.4.3-cp27-cp27m-win32.whl", hash = "sha256:4fee56603cb57326457c6af779b89f96e7b2745114baa996659e1d52e5f245a3"}, + {file = "praat_parselmouth-0.4.3-cp27-cp27m-win_amd64.whl", hash = "sha256:dc688749a0db4144936d3ed5180996500eb927bbf321192019ddee535fb97f3d"}, + {file = "praat_parselmouth-0.4.3-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:c0ccf73de16c0f69162952b0d1865d4dbc929de0f9b88a9d7aea57f454de3cb8"}, + {file = "praat_parselmouth-0.4.3-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:87fa2dd7f8b5dd5e3127af82e97b229ae2db8e1656525329224df4c0bffa024c"}, + {file = "praat_parselmouth-0.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2bc111055efccf2bb25039a7891ec9ef106b13ddc5680293659ff0b4c5f4353f"}, + {file = "praat_parselmouth-0.4.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cd38542210b1f381086b4a9424832b2330c42712e0fb7ea6c28c9200119c294b"}, + {file = "praat_parselmouth-0.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a536b37411c52171500984c97bfd66dc000701a7dc0807e11061b85a653a600a"}, + {file = "praat_parselmouth-0.4.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6ea1ab0632eff129516f147041aaf7874e50770561a2e9b9c81913b6de243f2a"}, + {file = "praat_parselmouth-0.4.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:543ba3deb32502e93074b76b1cfb3f09e598e5d9f74a0345fa5b3928fedb5a51"}, + {file = "praat_parselmouth-0.4.3-cp310-cp310-win32.whl", hash = "sha256:e0addf774a57d57a54df2b06de04ad0de34e81a3abfda03f744c732776c779ec"}, + {file = "praat_parselmouth-0.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:fc497357aeea2e3cbca2fb308d66b9de9739dc6b320ca2661ca6250f7a7489bd"}, + {file = "praat_parselmouth-0.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:afac52cb7a72cda7fe2ec1d9573d8f402786abcb06bd7a22f2ca240f95e33263"}, + {file = "praat_parselmouth-0.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b2261a79c2dc5387a7a678ec304ef8dd00ed93d9e028148bbb064fd0ac222a3a"}, + {file = "praat_parselmouth-0.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:de31b458d3c1ca7ee45506871a38fdc3aec44526c065552adf8bec2876e816bd"}, + {file = "praat_parselmouth-0.4.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:63ff24e045bed7c44f140fb7bab910d89fd3a45b7e8afe5b5e936aa2eea62904"}, + {file = "praat_parselmouth-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a40c51c628235c54c8956306fc58fd14cd04127d85359134ef73ef35ff19d651"}, + {file = "praat_parselmouth-0.4.3-cp311-cp311-win32.whl", hash = "sha256:f8ad9ee3be60d33f1ad593ec5f99466b1c266e00d29a5ec5787f969c618a7a9a"}, + {file = "praat_parselmouth-0.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:c32b1f3632e69ed67f501c635fff37ad72e1eae4ddd1c2c0827c4690c06ee990"}, + {file = "praat_parselmouth-0.4.3-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:1dcb6f55376f193c83d123953a55de471bcadd756af3b157c13d455b0c052999"}, + {file = "praat_parselmouth-0.4.3-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:0970facd26b771f5799a396a0e54d12a69fbf8904a4f6ae0442f3831175e4508"}, + {file = "praat_parselmouth-0.4.3-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:5c1104f41d9fef48cd44247738b9c8735e10a12ba0a1860e478e0bd69201813e"}, + {file = "praat_parselmouth-0.4.3-cp35-cp35m-win32.whl", hash = "sha256:3d12469e301d9a25f29f6cb5427aa9a1276e7f2f1edf1a3caede69a84c46170f"}, + {file = "praat_parselmouth-0.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c4142faf664dd6c7f1773d04331b278d92e17064eaaef09132954f72a9041ea0"}, + {file = "praat_parselmouth-0.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:5ea2079d519e8d42ed8d2de3c4f68803110060a8ae5d1c56df795c600aa1c3be"}, + {file = "praat_parselmouth-0.4.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2e88f00b740548cf3de5768b2d06e296e525164ea71ccc991920f41f2e277ad2"}, + {file = "praat_parselmouth-0.4.3-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2da226bccd52fd81223eb94a7ea43a1a7588e4384ea65ce0818329b73ef8df6d"}, + {file = "praat_parselmouth-0.4.3-cp36-cp36m-win32.whl", hash = "sha256:0f3af0413992398ac613b0eefdfbcb8cad064c36a28b972300a2bb760523c109"}, + {file = "praat_parselmouth-0.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:e0ed79941b6e37a440860511767eedd85ec003060870d10ff1f98773b2a268ae"}, + {file = "praat_parselmouth-0.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:10f3113ad4f5f6df5fe81d4080ca3ad46de2fe0fdb8ebbcad1ba884b1cae3b9d"}, + {file = "praat_parselmouth-0.4.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6e9338f7a1b304390014bb2eec619e5a306527a4df438e68439c92aa968627dc"}, + {file = "praat_parselmouth-0.4.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3798b2ca8163444662b6ae84a74b1add38b2c04e5af8d07bde55cf0335300a"}, + {file = "praat_parselmouth-0.4.3-cp37-cp37m-win32.whl", hash = "sha256:d947f9d1fb092b91acca1259ce4dd62ff4f456338958fd1fd41ee65efc53ca2c"}, + {file = "praat_parselmouth-0.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f3e026f590aeec8f68921359f56a42efa43076942f271244bee57fd22db8eef"}, + {file = "praat_parselmouth-0.4.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:28844229dab2a9335629b4526188b9540d02208856f48b1a46776279c022f937"}, + {file = "praat_parselmouth-0.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410748af84eb8c2eb69e408e300694a45090ed7c4f31375c4ec75a8c18f87169"}, + {file = "praat_parselmouth-0.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:30ff6f17babad25b9d6ab086465a54494eef9d1b4368b0722230c5282be2bf94"}, + {file = "praat_parselmouth-0.4.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ff7096bc3e87a8f719e66f5e16a90e2f6de445612abd234f86837d390b947421"}, + {file = "praat_parselmouth-0.4.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f41d121c4d2322ff12808bb2c4490609f750f89064170e327dfd74fca13cc212"}, + {file = "praat_parselmouth-0.4.3-cp38-cp38-win32.whl", hash = "sha256:9af9945db11fab0e1ed29ad20f7c97a3e7a8d016328ad6d7237a0d7819db075e"}, + {file = "praat_parselmouth-0.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:ae0c63c432e8216d7c70da44131f51c845fb81d48ac04eb5f39ebcfae34624be"}, + {file = "praat_parselmouth-0.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8e25658af5a87ed502753de6924c51bf3400d4078e67a611b5874ab08b478fdb"}, + {file = "praat_parselmouth-0.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7aa2ffd0c6e47feda35343a9d6722b2558f3677a4a51bf5ec864f27ab80e2f42"}, + {file = "praat_parselmouth-0.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3b245d9457ab39f12142da160cda12c4c2a58d9b916e5bb33e6b3ac267882d46"}, + {file = "praat_parselmouth-0.4.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:da9779a694941074bc5b199dd3cb41ad4af3306552f06af8dbfdea6ab0a87dec"}, + {file = "praat_parselmouth-0.4.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cfa141c04fd8a0477f91c168878112098a25cbac7ac4a20de627bc9293ee4667"}, + {file = "praat_parselmouth-0.4.3-cp39-cp39-win32.whl", hash = "sha256:6941fe602802fd57ecbedecd612b41493b7d1c6bf722ac0cbf3f47f805fbbd43"}, + {file = "praat_parselmouth-0.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:5252496e0391754a642973837670c56ecd39c8e0a1f7ec6e6b60b0cd2cc9f51d"}, + {file = "praat_parselmouth-0.4.3-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:fd7c143c6511807b67c92b3ab94733746c0ae3a7b4ba52d6763585c4d459061d"}, + {file = "praat_parselmouth-0.4.3-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:7ad0739ad6c102817c7d43b67b7270f78cb431eb72b6ecd9a17e354d1b379deb"}, + {file = "praat_parselmouth-0.4.3-pp27-pypy_73-win32.whl", hash = "sha256:f5e98ec1f41efba90bedab358cff8e6a3c6473978e1f42b55d0977e580efe673"}, + {file = "praat_parselmouth-0.4.3-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7b58c1c8fd967446f6d74775b5d9bceadfe35a928fa5f192d4d03d80cb005d92"}, + {file = "praat_parselmouth-0.4.3-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:d217df07c770156fa284aff3e7a5c11eb43e37f0226730d729d6b45be8a7c4d7"}, + {file = "praat_parselmouth-0.4.3-pp36-pypy36_pp73-win32.whl", hash = "sha256:29cb47438989f8155c3b3dca987afd48999dec71e4b79564aa7e922c3c5c1f9a"}, + {file = "praat_parselmouth-0.4.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5f772b4a097654883f4bba41efae419f9ebdd5e83ef7a857e547100d26663e2c"}, + {file = "praat_parselmouth-0.4.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bf9634a6986732dc43a88b3a16a0000cff903da1db6556b7959a6a4897f25570"}, + {file = "praat_parselmouth-0.4.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fab1bbb6a88f47cb5d0db07a4fd6d88b9294d2775a7556aeb459e96ac372e29f"}, + {file = "praat_parselmouth-0.4.3-pp37-pypy37_pp73-win32.whl", hash = "sha256:261f03f95f25943da2cf746599e47acfcf79b7fc823c871571901d6c97bad948"}, + {file = "praat_parselmouth-0.4.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:199b8df2659a1e6f30e9ae3064b0a28a661d834d2bccb56d22051c40cc348817"}, + {file = "praat_parselmouth-0.4.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ef1f3f6bd08cc410d0d595f6a9c7dd72558e30ad3bd7949c94ea4e07a2de2605"}, + {file = "praat_parselmouth-0.4.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:28a61b7a3cf95a53554dd3ebb4f48e991d4b913ae2d2fbc3868a4e864d69794f"}, + {file = "praat_parselmouth-0.4.3-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:488833ee33690fa1a57a3c429d286e42e6882748f5c3d28dc50889abec12b8c2"}, + {file = "praat_parselmouth-0.4.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:10f181e199c47fa90fe7cad065275f7f3ccda2de6febf86394cf96aa48531079"}, + {file = "praat_parselmouth-0.4.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:52702bc5cdf59b2b4db87448fe9042307e5ebce6b67ee5ea55c2b8627ce803e0"}, + {file = "praat_parselmouth-0.4.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7d4f5d7c701517986654365f0a41b8b4a610a2ddc0365da60e48c098774259b"}, + {file = "praat_parselmouth-0.4.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dc013608a536ad74efdc3242421cabfcb8cb2e9cd1259ec9de9aeaa141c2d14"}, + {file = "praat_parselmouth-0.4.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d593065ed1500d305d9cf3d20f5ac7e3671061c3c073ef6e94e97817a664d399"}, +] + +[package.dependencies] +numpy = ">=1.7.0" + +[[package]] +name = "pre-commit" +version = "3.2.2" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pre_commit-3.2.2-py2.py3-none-any.whl", hash = "sha256:0b4210aea813fe81144e87c5a291f09ea66f199f367fa1df41b55e1d26e1e2b4"}, + {file = "pre_commit-3.2.2.tar.gz", hash = "sha256:5b808fcbda4afbccf6d6633a56663fed35b6c2bc08096fd3d47ce197ac351d9d"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + +[[package]] +name = "protobuf" +version = "3.20.3" +description = "Protocol Buffers" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "protobuf-3.20.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99"}, + {file = "protobuf-3.20.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e"}, + {file = "protobuf-3.20.3-cp310-cp310-win32.whl", hash = "sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c"}, + {file = "protobuf-3.20.3-cp310-cp310-win_amd64.whl", hash = "sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7"}, + {file = "protobuf-3.20.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469"}, + {file = "protobuf-3.20.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4"}, + {file = "protobuf-3.20.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4"}, + {file = "protobuf-3.20.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454"}, + {file = "protobuf-3.20.3-cp37-cp37m-win32.whl", hash = "sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905"}, + {file = "protobuf-3.20.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c"}, + {file = "protobuf-3.20.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7"}, + {file = "protobuf-3.20.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee"}, + {file = "protobuf-3.20.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050"}, + {file = "protobuf-3.20.3-cp38-cp38-win32.whl", hash = "sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86"}, + {file = "protobuf-3.20.3-cp38-cp38-win_amd64.whl", hash = "sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9"}, + {file = "protobuf-3.20.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b"}, + {file = "protobuf-3.20.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b"}, + {file = "protobuf-3.20.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402"}, + {file = "protobuf-3.20.3-cp39-cp39-win32.whl", hash = "sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480"}, + {file = "protobuf-3.20.3-cp39-cp39-win_amd64.whl", hash = "sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7"}, + {file = "protobuf-3.20.3-py2.py3-none-any.whl", hash = "sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db"}, + {file = "protobuf-3.20.3.tar.gz", hash = "sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2"}, +] + +[[package]] +name = "psutil" +version = "5.9.4" +description = "Cross-platform lib for process and system monitoring in Python." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "psutil-5.9.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c1ca331af862803a42677c120aff8a814a804e09832f166f226bfd22b56feee8"}, + {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:68908971daf802203f3d37e78d3f8831b6d1014864d7a85937941bb35f09aefe"}, + {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3ff89f9b835100a825b14c2808a106b6fdcc4b15483141482a12c725e7f78549"}, + {file = "psutil-5.9.4-cp27-cp27m-win32.whl", hash = "sha256:852dd5d9f8a47169fe62fd4a971aa07859476c2ba22c2254d4a1baa4e10b95ad"}, + {file = "psutil-5.9.4-cp27-cp27m-win_amd64.whl", hash = "sha256:9120cd39dca5c5e1c54b59a41d205023d436799b1c8c4d3ff71af18535728e94"}, + {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6b92c532979bafc2df23ddc785ed116fced1f492ad90a6830cf24f4d1ea27d24"}, + {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:efeae04f9516907be44904cc7ce08defb6b665128992a56957abc9b61dca94b7"}, + {file = "psutil-5.9.4-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:54d5b184728298f2ca8567bf83c422b706200bcbbfafdc06718264f9393cfeb7"}, + {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16653106f3b59386ffe10e0bad3bb6299e169d5327d3f187614b1cb8f24cf2e1"}, + {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54c0d3d8e0078b7666984e11b12b88af2db11d11249a8ac8920dd5ef68a66e08"}, + {file = "psutil-5.9.4-cp36-abi3-win32.whl", hash = "sha256:149555f59a69b33f056ba1c4eb22bb7bf24332ce631c44a319cec09f876aaeff"}, + {file = "psutil-5.9.4-cp36-abi3-win_amd64.whl", hash = "sha256:fd8522436a6ada7b4aad6638662966de0d61d241cb821239b2ae7013d41a43d4"}, + {file = "psutil-5.9.4-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:6001c809253a29599bc0dfd5179d9f8a5779f9dffea1da0f13c53ee568115e1e"}, + {file = "psutil-5.9.4.tar.gz", hash = "sha256:3d7f9739eb435d4b1338944abe23f49584bde5395f27487d2ee25ad9a8774a62"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "pyasn1" +version = "0.4.8" +description = "ASN.1 types and codecs" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, + {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, +] + +[[package]] +name = "pyasn1-modules" +version = "0.2.8" +description = "A collection of ASN.1-based protocols modules." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, + {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.5.0" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pycryptodome" +version = "3.17" +description = "Cryptographic library for Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodome-3.17-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:2c5631204ebcc7ae33d11c43037b2dafe25e2ab9c1de6448eb6502ac69c19a56"}, + {file = "pycryptodome-3.17-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:04779cc588ad8f13c80a060b0b1c9d1c203d051d8a43879117fe6b8aaf1cd3fa"}, + {file = "pycryptodome-3.17-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:f812d58c5af06d939b2baccdda614a3ffd80531a26e5faca2c9f8b1770b2b7af"}, + {file = "pycryptodome-3.17-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:9453b4e21e752df8737fdffac619e93c9f0ec55ead9a45df782055eb95ef37d9"}, + {file = "pycryptodome-3.17-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:121d61663267f73692e8bde5ec0d23c9146465a0d75cad75c34f75c752527b01"}, + {file = "pycryptodome-3.17-cp27-cp27m-win32.whl", hash = "sha256:ba2d4fcb844c6ba5df4bbfee9352ad5352c5ae939ac450e06cdceff653280450"}, + {file = "pycryptodome-3.17-cp27-cp27m-win_amd64.whl", hash = "sha256:87e2ca3aa557781447428c4b6c8c937f10ff215202ab40ece5c13a82555c10d6"}, + {file = "pycryptodome-3.17-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:f44c0d28716d950135ff21505f2c764498eda9d8806b7c78764165848aa419bc"}, + {file = "pycryptodome-3.17-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:5a790bc045003d89d42e3b9cb3cc938c8561a57a88aaa5691512e8540d1ae79c"}, + {file = "pycryptodome-3.17-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:d086d46774e27b280e4cece8ab3d87299cf0d39063f00f1e9290d096adc5662a"}, + {file = "pycryptodome-3.17-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:5587803d5b66dfd99e7caa31ed91fba0fdee3661c5d93684028ad6653fce725f"}, + {file = "pycryptodome-3.17-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:e7debd9c439e7b84f53be3cf4ba8b75b3d0b6e6015212355d6daf44ac672e210"}, + {file = "pycryptodome-3.17-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ca1ceb6303be1282148f04ac21cebeebdb4152590842159877778f9cf1634f09"}, + {file = "pycryptodome-3.17-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:dc22cc00f804485a3c2a7e2010d9f14a705555f67020eb083e833cabd5bd82e4"}, + {file = "pycryptodome-3.17-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80ea8333b6a5f2d9e856ff2293dba2e3e661197f90bf0f4d5a82a0a6bc83a626"}, + {file = "pycryptodome-3.17-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c133f6721fba313722a018392a91e3c69d3706ae723484841752559e71d69dc6"}, + {file = "pycryptodome-3.17-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:333306eaea01fde50a73c4619e25631e56c4c61bd0fb0a2346479e67e3d3a820"}, + {file = "pycryptodome-3.17-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:1a30f51b990994491cec2d7d237924e5b6bd0d445da9337d77de384ad7f254f9"}, + {file = "pycryptodome-3.17-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:909e36a43fe4a8a3163e9c7fc103867825d14a2ecb852a63d3905250b308a4e5"}, + {file = "pycryptodome-3.17-cp35-abi3-win32.whl", hash = "sha256:a3228728a3808bc9f18c1797ec1179a0efb5068c817b2ffcf6bcd012494dffb2"}, + {file = "pycryptodome-3.17-cp35-abi3-win_amd64.whl", hash = "sha256:9ec565e89a6b400eca814f28d78a9ef3f15aea1df74d95b28b7720739b28f37f"}, + {file = "pycryptodome-3.17-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:e1819b67bcf6ca48341e9b03c2e45b1c891fa8eb1a8458482d14c2805c9616f2"}, + {file = "pycryptodome-3.17-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:f8e550caf52472ae9126953415e4fc554ab53049a5691c45b8816895c632e4d7"}, + {file = "pycryptodome-3.17-pp27-pypy_73-win32.whl", hash = "sha256:afbcdb0eda20a0e1d44e3a1ad6d4ec3c959210f4b48cabc0e387a282f4c7deb8"}, + {file = "pycryptodome-3.17-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a74f45aee8c5cc4d533e585e0e596e9f78521e1543a302870a27b0ae2106381e"}, + {file = "pycryptodome-3.17-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38bbd6717eac084408b4094174c0805bdbaba1f57fc250fd0309ae5ec9ed7e09"}, + {file = "pycryptodome-3.17-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f68d6c8ea2974a571cacb7014dbaada21063a0375318d88ac1f9300bc81e93c3"}, + {file = "pycryptodome-3.17-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8198f2b04c39d817b206ebe0db25a6653bb5f463c2319d6f6d9a80d012ac1e37"}, + {file = "pycryptodome-3.17-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3a232474cd89d3f51e4295abe248a8b95d0332d153bf46444e415409070aae1e"}, + {file = "pycryptodome-3.17-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4992ec965606054e8326e83db1c8654f0549cdb26fce1898dc1a20bc7684ec1c"}, + {file = "pycryptodome-3.17-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53068e33c74f3b93a8158dacaa5d0f82d254a81b1002e0cd342be89fcb3433eb"}, + {file = "pycryptodome-3.17-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:74794a2e2896cd0cf56fdc9db61ef755fa812b4a4900fa46c49045663a92b8d0"}, + {file = "pycryptodome-3.17.tar.gz", hash = "sha256:bce2e2d8e82fcf972005652371a3e8731956a0c1fbb719cc897943b3695ad91b"}, +] + +[[package]] +name = "pydantic" +version = "1.10.7" +description = "Data validation and settings management using python type hints" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d"}, + {file = "pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af"}, + {file = "pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca"}, + {file = "pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d"}, + {file = "pydantic-1.10.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a"}, + {file = "pydantic-1.10.7-cp37-cp37m-win_amd64.whl", hash = "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209"}, + {file = "pydantic-1.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5"}, + {file = "pydantic-1.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e"}, + {file = "pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6"}, + {file = "pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e"}, +] + +[package.dependencies] +typing-extensions = ">=4.2.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pydub" +version = "0.25.1" +description = "Manipulate audio with an simple and easy high level interface" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6"}, + {file = "pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f"}, +] + +[[package]] +name = "pygments" +version = "2.14.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, + {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pyinputplus" +version = "0.2.12" +description = "Provides more featureful versions of input() and raw_input()." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "PyInputPlus-0.2.12.tar.gz", hash = "sha256:3a86b03dc6d003fec7dc627ad175cacaaf6e14a6a3b13b34c8fe6f5d01506231"}, +] + +[package.dependencies] +pysimplevalidate = ">=0.2.7" +stdiomask = ">=0.0.3" + +[[package]] +name = "pyjwt" +version = "2.6.0" +description = "JSON Web Token implementation in Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PyJWT-2.6.0-py3-none-any.whl", hash = "sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14"}, + {file = "PyJWT-2.6.0.tar.gz", hash = "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd"}, +] + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "main" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pyrsistent" +version = "0.19.3" +description = "Persistent/Functional/Immutable data structures" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, + {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, + {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, + {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, + {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, + {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, +] + +[[package]] +name = "pysimplegui" +version = "4.60.4" +description = "Python GUIs for Humans. Launched in 2018. It's 2022 & PySimpleGUI is an ACTIVE & supported project. Super-simple to create custom GUI's. 325+ Demo programs & Cookbook for rapid start. Extensive documentation. Main docs at www.PySimpleGUI.org. Fun & your success are the focus. Examples using Machine Learning (GUI, OpenCV Integration), Rainmeter Style Desktop Widgets, Matplotlib + Pyplot, PIL support, add GUI to command line scripts, PDF & Image Viewers. Great for beginners & advanced GUI programmers." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "PySimpleGUI-4.60.4-py3-none-any.whl", hash = "sha256:e133fbd21779f0f125cebbc2a4e1f5a931a383738661013ff33ad525d5611eda"}, + {file = "PySimpleGUI-4.60.4.tar.gz", hash = "sha256:f88c82c301a51aea35be605dc060bcceb0dcb6682e16280544884701ab4b23ba"}, +] + +[[package]] +name = "pysimplevalidate" +version = "0.2.12" +description = "A collection of string-based validation functions, suitable for use in other Python 2 and 3 applications." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "PySimpleValidate-0.2.12.tar.gz", hash = "sha256:645d24bdca17ad4c40658f3aa0bd5c1aa1688ba0c02ba75c5ed2cb3b8abaaa19"}, +] + +[[package]] +name = "pytest" +version = "7.3.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "4.0.0" +description = "Pytest plugin for measuring coverage." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pytest-cov-4.0.0.tar.gz", hash = "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470"}, + {file = "pytest_cov-4.0.0-py3-none-any.whl", hash = "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-editor" +version = "1.0.4" +description = "Programmatically open an editor, capture the result." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "python-editor-1.0.4.tar.gz", hash = "sha256:51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec7847713882327b"}, + {file = "python_editor-1.0.4-py2-none-any.whl", hash = "sha256:5f98b069316ea1c2ed3f67e7f5df6c0d8f10b689964a4a811ff64f0106819ec8"}, + {file = "python_editor-1.0.4-py3-none-any.whl", hash = "sha256:1bf6e860a8ad52a14c3ee1252d5dc25b2030618ed80c022598f00176adc8367d"}, +] + +[[package]] +name = "python-multipart" +version = "0.0.6" +description = "A streaming multipart parser for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python_multipart-0.0.6-py3-none-any.whl", hash = "sha256:ee698bab5ef148b0a760751c261902cd096e57e10558e11aca17646b74ee1c18"}, + {file = "python_multipart-0.0.6.tar.gz", hash = "sha256:e9925a80bb668529f1b67c7fdb0a5dacdd7cbfc6fb0bff3ea443fe22bdd62132"}, +] + +[package.extras] +dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatch", "invoke (==1.7.3)", "more-itertools (==4.3.0)", "pbr (==4.3.0)", "pluggy (==1.0.0)", "py (==1.11.0)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-timeout (==2.1.0)", "pyyaml (==5.1)"] + +[[package]] +name = "pytorch-lightning" +version = "2.0.1" +description = "PyTorch Lightning is the lightweight PyTorch wrapper for ML researchers. Scale your models. Write less boilerplate." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytorch-lightning-2.0.1.tar.gz", hash = "sha256:34b6579acaaa07af27f1236f40e4bca505b975c3804ee15f4371c03d4f6f72ee"}, + {file = "pytorch_lightning-2.0.1-py3-none-any.whl", hash = "sha256:842aee8bd4b79b7fbb6d5709c10f3c239e7c75284f6b0e775d0047e1dba0c519"}, +] + +[package.dependencies] +fsspec = {version = ">2021.06.0", extras = ["http"]} +lightning-utilities = ">=0.7.0" +numpy = ">=1.17.2" +packaging = ">=17.1" +PyYAML = ">=5.4" +torch = ">=1.11.0" +torchmetrics = ">=0.7.0" +tqdm = ">=4.57.0" +typing-extensions = ">=4.0.0" + +[package.extras] +all = ["deepspeed (>=0.6.0)", "gym[classic-control] (>=0.17.0)", "hydra-core (>=1.0.5)", "ipython[all] (<8.7.1)", "jsonargparse[signatures] (>=4.18.0)", "lightning-utilities (>=0.7.0)", "matplotlib (>3.1)", "omegaconf (>=2.0.5)", "rich (>=12.3.0)", "tensorboardX (>=2.2)", "torchmetrics (>=0.10.0)", "torchvision (>=0.11.1)"] +deepspeed = ["deepspeed (>=0.6.0)"] +dev = ["cloudpickle (>=1.3)", "codecov (==2.1.12)", "coverage (==6.5.0)", "deepspeed (>=0.6.0)", "fastapi (<0.87.0)", "gym[classic-control] (>=0.17.0)", "hydra-core (>=1.0.5)", "ipython[all] (<8.7.1)", "jsonargparse[signatures] (>=4.18.0)", "lightning-utilities (>=0.7.0)", "matplotlib (>3.1)", "omegaconf (>=2.0.5)", "onnx (<1.14.0)", "onnxruntime (<1.14.0)", "pandas (>1.0)", "protobuf (<=3.20.1)", "psutil (<5.9.5)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-forked (==1.4.0)", "pytest-rerunfailures (==10.3)", "rich (>=12.3.0)", "scikit-learn (>0.22.1)", "tensorboard (>=2.9.1)", "tensorboardX (>=2.2)", "torchmetrics (>=0.10.0)", "torchvision (>=0.11.1)", "uvicorn (<0.19.1)"] +examples = ["gym[classic-control] (>=0.17.0)", "ipython[all] (<8.7.1)", "lightning-utilities (>=0.7.0)", "torchmetrics (>=0.10.0)", "torchvision (>=0.11.1)"] +extra = ["hydra-core (>=1.0.5)", "jsonargparse[signatures] (>=4.18.0)", "matplotlib (>3.1)", "omegaconf (>=2.0.5)", "rich (>=12.3.0)", "tensorboardX (>=2.2)"] +strategies = ["deepspeed (>=0.6.0)"] +test = ["cloudpickle (>=1.3)", "codecov (==2.1.12)", "coverage (==6.5.0)", "fastapi (<0.87.0)", "onnx (<1.14.0)", "onnxruntime (<1.14.0)", "pandas (>1.0)", "protobuf (<=3.20.1)", "psutil (<5.9.5)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-forked (==1.4.0)", "pytest-rerunfailures (==10.3)", "scikit-learn (>0.22.1)", "tensorboard (>=2.9.1)", "uvicorn (<0.19.1)"] + +[[package]] +name = "pytz" +version = "2023.3" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, + {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, +] + +[[package]] +name = "pywavelets" +version = "1.4.1" +description = "PyWavelets, wavelet transform module" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyWavelets-1.4.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:d854411eb5ee9cb4bc5d0e66e3634aeb8f594210f6a1bed96dbed57ec70f181c"}, + {file = "PyWavelets-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:231b0e0b1cdc1112f4af3c24eea7bf181c418d37922a67670e9bf6cfa2d544d4"}, + {file = "PyWavelets-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:754fa5085768227c4f4a26c1e0c78bc509a266d9ebd0eb69a278be7e3ece943c"}, + {file = "PyWavelets-1.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da7b9c006171be1f9ddb12cc6e0d3d703b95f7f43cb5e2c6f5f15d3233fcf202"}, + {file = "PyWavelets-1.4.1-cp310-cp310-win32.whl", hash = "sha256:67a0d28a08909f21400cb09ff62ba94c064882ffd9e3a6b27880a111211d59bd"}, + {file = "PyWavelets-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:91d3d393cffa634f0e550d88c0e3f217c96cfb9e32781f2960876f1808d9b45b"}, + {file = "PyWavelets-1.4.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:64c6bac6204327321db30b775060fbe8e8642316e6bff17f06b9f34936f88875"}, + {file = "PyWavelets-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3f19327f2129fb7977bc59b966b4974dfd72879c093e44a7287500a7032695de"}, + {file = "PyWavelets-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad987748f60418d5f4138db89d82ba0cb49b086e0cbb8fd5c3ed4a814cfb705e"}, + {file = "PyWavelets-1.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:875d4d620eee655346e3589a16a73790cf9f8917abba062234439b594e706784"}, + {file = "PyWavelets-1.4.1-cp311-cp311-win32.whl", hash = "sha256:7231461d7a8eb3bdc7aa2d97d9f67ea5a9f8902522818e7e2ead9c2b3408eeb1"}, + {file = "PyWavelets-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:daf0aa79842b571308d7c31a9c43bc99a30b6328e6aea3f50388cd8f69ba7dbc"}, + {file = "PyWavelets-1.4.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:ab7da0a17822cd2f6545626946d3b82d1a8e106afc4b50e3387719ba01c7b966"}, + {file = "PyWavelets-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:578af438a02a86b70f1975b546f68aaaf38f28fb082a61ceb799816049ed18aa"}, + {file = "PyWavelets-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb5ca8d11d3f98e89e65796a2125be98424d22e5ada360a0dbabff659fca0fc"}, + {file = "PyWavelets-1.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:058b46434eac4c04dd89aeef6fa39e4b6496a951d78c500b6641fd5b2cc2f9f4"}, + {file = "PyWavelets-1.4.1-cp38-cp38-win32.whl", hash = "sha256:de7cd61a88a982edfec01ea755b0740e94766e00a1ceceeafef3ed4c85c605cd"}, + {file = "PyWavelets-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:7ab8d9db0fe549ab2ee0bea61f614e658dd2df419d5b75fba47baa761e95f8f2"}, + {file = "PyWavelets-1.4.1-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:23bafd60350b2b868076d976bdd92f950b3944f119b4754b1d7ff22b7acbf6c6"}, + {file = "PyWavelets-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d0e56cd7a53aed3cceca91a04d62feb3a0aca6725b1912d29546c26f6ea90426"}, + {file = "PyWavelets-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:030670a213ee8fefa56f6387b0c8e7d970c7f7ad6850dc048bd7c89364771b9b"}, + {file = "PyWavelets-1.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71ab30f51ee4470741bb55fc6b197b4a2b612232e30f6ac069106f0156342356"}, + {file = "PyWavelets-1.4.1-cp39-cp39-win32.whl", hash = "sha256:47cac4fa25bed76a45bc781a293c26ac63e8eaae9eb8f9be961758d22b58649c"}, + {file = "PyWavelets-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:88aa5449e109d8f5e7f0adef85f7f73b1ab086102865be64421a3a3d02d277f4"}, + {file = "PyWavelets-1.4.1.tar.gz", hash = "sha256:6437af3ddf083118c26d8f97ab43b0724b956c9f958e9ea788659f6a2834ba93"}, +] + +[package.dependencies] +numpy = ">=1.17.3" + +[[package]] +name = "pyworld" +version = "0.3.3" +description = "PyWorld: a Python wrapper for WORLD vocoder" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pyworld-0.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:729a675a7d2d0cde6bf9a02f39c059f0341e1ed1735e739a8c4cedf5043ff374"}, + {file = "pyworld-0.3.3-cp36-cp36m-win32.whl", hash = "sha256:31ae535614a74706269e1994f1a8c74be9d347201717fcba67de334b11d0845e"}, + {file = "pyworld-0.3.3-cp36-cp36m-win_amd64.whl", hash = "sha256:b89df0a7175cab83193cfba73a2790073dc673ac0685d8cfcaec579aba530507"}, + {file = "pyworld-0.3.3-cp37-cp37m-win32.whl", hash = "sha256:de42cc127402cd07025798fd89abf2fb32d304cca139feecd08b9b6206b5fb2f"}, + {file = "pyworld-0.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:be5409b8f93eb8b478507191928d116898f874b3a981714391b71c06dd72bc38"}, + {file = "pyworld-0.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:ebdced4728c690c0e71823da39e8fee094212e9933e95ddbaaa85b4a72d56fa1"}, + {file = "pyworld-0.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:850da60e4c045d5c805c85035c781546ab10e22e990f0d1aa8a09ca8cf5cca47"}, + {file = "pyworld-0.3.3.tar.gz", hash = "sha256:a3a81755983dfa2299a9e2947752582ddcc84a5c277b04f4595ce4406372d1e5"}, +] + +[package.dependencies] +cython = ">=0.24" +numpy = "*" + +[package.extras] +sdist = ["cython", "numpy"] +test = ["nose"] + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] + +[[package]] +name = "readchar" +version = "4.0.5" +description = "Library to easily read single chars and key strokes" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "readchar-4.0.5-py3-none-any.whl", hash = "sha256:76ec784a5dd2afac3b7da8003329834cdd9824294c260027f8c8d2e4d0a78f43"}, + {file = "readchar-4.0.5.tar.gz", hash = "sha256:08a456c2d7c1888cde3f4688b542621b676eb38cd6cfed7eb6cb2e2905ddc826"}, +] + +[package.dependencies] +setuptools = ">=41.0" + +[[package]] +name = "regex" +version = "2023.3.23" +description = "Alternative regular expression module, to replace re." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "regex-2023.3.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:845a5e2d84389c4ddada1a9b95c055320070f18bb76512608374aca00d22eca8"}, + {file = "regex-2023.3.23-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:87d9951f5a538dd1d016bdc0dcae59241d15fa94860964833a54d18197fcd134"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37ae17d3be44c0b3f782c28ae9edd8b47c1f1776d4cabe87edc0b98e1f12b021"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b8eb1e3bca6b48dc721818a60ae83b8264d4089a4a41d62be6d05316ec38e15"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df45fac182ebc3c494460c644e853515cc24f5ad9da05f8ffb91da891bfee879"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7006105b10b59971d3b248ad75acc3651c7e4cf54d81694df5a5130a3c3f7ea"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93f3f1aa608380fe294aa4cb82e2afda07a7598e828d0341e124b8fd9327c715"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787954f541ab95d8195d97b0b8cf1dc304424adb1e07365967e656b92b38a699"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:20abe0bdf03630fe92ccafc45a599bca8b3501f48d1de4f7d121153350a2f77d"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11d00c31aeab9a6e0503bc77e73ed9f4527b3984279d997eb145d7c7be6268fd"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d5bbe0e1511b844794a3be43d6c145001626ba9a6c1db8f84bdc724e91131d9d"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ea3c0cb56eadbf4ab2277e7a095676370b3e46dbfc74d5c383bd87b0d6317910"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d895b4c863059a4934d3e874b90998df774644a41b349ebb330f85f11b4ef2c0"}, + {file = "regex-2023.3.23-cp310-cp310-win32.whl", hash = "sha256:9d764514d19b4edcc75fd8cb1423448ef393e8b6cbd94f38cab983ab1b75855d"}, + {file = "regex-2023.3.23-cp310-cp310-win_amd64.whl", hash = "sha256:11d1f2b7a0696dc0310de0efb51b1f4d813ad4401fe368e83c0c62f344429f98"}, + {file = "regex-2023.3.23-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8a9c63cde0eaa345795c0fdeb19dc62d22e378c50b0bc67bf4667cd5b482d98b"}, + {file = "regex-2023.3.23-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dd7200b4c27b68cf9c9646da01647141c6db09f48cc5b51bc588deaf8e98a797"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22720024b90a6ba673a725dcc62e10fb1111b889305d7c6b887ac7466b74bedb"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b190a339090e6af25f4a5fd9e77591f6d911cc7b96ecbb2114890b061be0ac1"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e76b6fc0d8e9efa39100369a9b3379ce35e20f6c75365653cf58d282ad290f6f"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7868b8f218bf69a2a15402fde08b08712213a1f4b85a156d90473a6fb6b12b09"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2472428efc4127374f494e570e36b30bb5e6b37d9a754f7667f7073e43b0abdd"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c37df2a060cb476d94c047b18572ee2b37c31f831df126c0da3cd9227b39253d"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4479f9e2abc03362df4045b1332d4a2b7885b245a30d4f4b051c4083b97d95d8"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2396e0678167f2d0c197da942b0b3fb48fee2f0b5915a0feb84d11b6686afe6"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75f288c60232a5339e0ff2fa05779a5e9c74e9fc085c81e931d4a264501e745b"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c869260aa62cee21c5eb171a466c0572b5e809213612ef8d495268cd2e34f20d"}, + {file = "regex-2023.3.23-cp311-cp311-win32.whl", hash = "sha256:25f0532fd0c53e96bad84664171969de9673b4131f2297f1db850d3918d58858"}, + {file = "regex-2023.3.23-cp311-cp311-win_amd64.whl", hash = "sha256:5ccfafd98473e007cebf7da10c1411035b7844f0f204015efd050601906dbb53"}, + {file = "regex-2023.3.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6572ff287176c0fb96568adb292674b421fa762153ed074d94b1d939ed92c253"}, + {file = "regex-2023.3.23-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a610e0adfcb0fc84ea25f6ea685e39e74cbcd9245a72a9a7aab85ff755a5ed27"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086afe222d58b88b62847bdbd92079b4699350b4acab892f88a935db5707c790"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79e29fd62fa2f597a6754b247356bda14b866131a22444d67f907d6d341e10f3"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c07ce8e9eee878a48ebeb32ee661b49504b85e164b05bebf25420705709fdd31"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b036f401895e854de9fefe061518e78d506d8a919cc250dc3416bca03f6f9a"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78ac8dd8e18800bb1f97aad0d73f68916592dddf233b99d2b5cabc562088503a"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:539dd010dc35af935b32f248099e38447bbffc10b59c2b542bceead2bed5c325"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9bf4a5626f2a0ea006bf81e8963f498a57a47d58907eaa58f4b3e13be68759d8"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf86b4328c204c3f315074a61bc1c06f8a75a8e102359f18ce99fbcbbf1951f0"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:2848bf76673c83314068241c8d5b7fa9ad9bed866c979875a0e84039349e8fa7"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c125a02d22c555e68f7433bac8449992fa1cead525399f14e47c2d98f2f0e467"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cd1671e9d5ac05ce6aa86874dd8dfa048824d1dbe73060851b310c6c1a201a96"}, + {file = "regex-2023.3.23-cp38-cp38-win32.whl", hash = "sha256:fffe57312a358be6ec6baeb43d253c36e5790e436b7bf5b7a38df360363e88e9"}, + {file = "regex-2023.3.23-cp38-cp38-win_amd64.whl", hash = "sha256:dbb3f87e15d3dd76996d604af8678316ad2d7d20faa394e92d9394dfd621fd0c"}, + {file = "regex-2023.3.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c88e8c226473b5549fe9616980ea7ca09289246cfbdf469241edf4741a620004"}, + {file = "regex-2023.3.23-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6560776ec19c83f3645bbc5db64a7a5816c9d8fb7ed7201c5bcd269323d88072"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b1fc2632c01f42e06173d8dd9bb2e74ab9b0afa1d698058c867288d2c7a31f3"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdf7ad455f1916b8ea5cdbc482d379f6daf93f3867b4232d14699867a5a13af7"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5fc33b27b1d800fc5b78d7f7d0f287e35079ecabe68e83d46930cf45690e1c8c"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c49552dc938e3588f63f8a78c86f3c9c75301e813bca0bef13bdb4b87ccf364"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e152461e9a0aedec7d37fc66ec0fa635eca984777d3d3c3e36f53bf3d3ceb16e"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db034255e72d2995cf581b14bb3fc9c00bdbe6822b49fcd4eef79e1d5f232618"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:55ae114da21b7a790b90255ea52d2aa3a0d121a646deb2d3c6a3194e722fc762"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ef3f528fe1cc3d139508fe1b22523745aa77b9d6cb5b0bf277f48788ee0b993f"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:a81c9ec59ca2303acd1ccd7b9ac409f1e478e40e96f8f79b943be476c5fdb8bb"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cde09c4fdd070772aa2596d97e942eb775a478b32459e042e1be71b739d08b77"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3cd9f5dd7b821f141d3a6ca0d5d9359b9221e4f051ca3139320adea9f1679691"}, + {file = "regex-2023.3.23-cp39-cp39-win32.whl", hash = "sha256:7304863f3a652dab5e68e6fb1725d05ebab36ec0390676d1736e0571ebb713ef"}, + {file = "regex-2023.3.23-cp39-cp39-win_amd64.whl", hash = "sha256:54c3fa855a3f7438149de3211738dd9b5f0c733f48b54ae05aa7fce83d48d858"}, + {file = "regex-2023.3.23.tar.gz", hash = "sha256:dc80df325b43ffea5cdea2e3eaa97a44f3dd298262b1c7fe9dbb2a9522b956a7"}, +] + +[[package]] +name = "requests" +version = "2.29.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.29.0-py3-none-any.whl", hash = "sha256:e8f3c9be120d3333921d213eef078af392fba3933ab7ed2d1cba3b56f2568c3b"}, + {file = "requests-2.29.0.tar.gz", hash = "sha256:f2e34a75f4749019bb0e3effb66683630e4ffeaf75819fb51bebef1bf5aef059"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-oauthlib" +version = "1.3.1" +description = "OAuthlib authentication support for Requests." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, + {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, +] + +[package.dependencies] +oauthlib = ">=3.0.0" +requests = ">=2.0.0" + +[package.extras] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] + +[[package]] +name = "resampy" +version = "0.4.2" +description = "Efficient signal resampling" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "resampy-0.4.2-py3-none-any.whl", hash = "sha256:4340b6c4e685a865621dfcf016e2a3dd49d865446b6025e30fe88567f22e052e"}, + {file = "resampy-0.4.2.tar.gz", hash = "sha256:0a469e6ddb89956f4fd6c88728300e4bbd186fae569dd4fd17dae51a91cbaa15"}, +] + +[package.dependencies] +numba = ">=0.53" +numpy = ">=1.17" + +[package.extras] +design = ["optuna (>=2.10.0)"] +docs = ["numpydoc", "sphinx (!=1.3.1)"] +tests = ["pytest (<8)", "pytest-cov", "scipy (>=1.0)"] + +[[package]] +name = "rfc3986" +version = "1.5.0" +description = "Validating URI References per RFC 3986" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, + {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, +] + +[package.dependencies] +idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} + +[package.extras] +idna2008 = ["idna"] + +[[package]] +name = "rich" +version = "13.3.5" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.3.5-py3-none-any.whl", hash = "sha256:69cdf53799e63f38b95b9bf9c875f8c90e78dd62b2f00c13a911c7a3b9fa4704"}, + {file = "rich-13.3.5.tar.gz", hash = "sha256:2d11b9b8dd03868f09b4fffadc84a6a8cda574e40dc90821bd845720ebb8e89c"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0,<3.0.0" +pygments = ">=2.13.0,<3.0.0" +typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +category = "main" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "scikit-image" +version = "0.19.3" +description = "Image processing in Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "scikit-image-0.19.3.tar.gz", hash = "sha256:24b5367de1762da6ee126dd8f30cc4e7efda474e0d7d70685433f0e3aa2ec450"}, + {file = "scikit_image-0.19.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:3a01372ae4bca223873304b0bff79b9d92446ac6d6177f73d89b45561e2d09d8"}, + {file = "scikit_image-0.19.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:fdf48d9b1f13af69e4e2c78e05067e322e9c8c97463c315cd0ecb47a94e259fc"}, + {file = "scikit_image-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b6a8f98f2ac9bb73706461fd1dec875f6a5141759ed526850a5a49e90003d19"}, + {file = "scikit_image-0.19.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfbb073f23deb48e0e60c47f8741d8089121d89cc78629ea8c5b51096efc5be7"}, + {file = "scikit_image-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:cc24177de3fdceca5d04807ad9c87d665f0bf01032ed94a9055cd1ed2b3f33e9"}, + {file = "scikit_image-0.19.3-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:fd9dd3994bb6f9f7a35f228323f3c4dc44b3cf2ff15fd72d895216e9333550c6"}, + {file = "scikit_image-0.19.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ad5d8000207a264d1a55681a9276e6a739d3f05cf4429004ad00d61d1892235f"}, + {file = "scikit_image-0.19.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:84baa3179f3ae983c3a5d81c1e404bc92dcf7daeb41bfe9369badcda3fb22b92"}, + {file = "scikit_image-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f9f8a1387afc6c70f2bed007c3854a2d7489f9f7713c242f16f32ee05934bc2"}, + {file = "scikit_image-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:9fb0923a3bfa99457c5e17888f27b3b8a83a3600b4fef317992e7b7234764732"}, + {file = "scikit_image-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:ce3d2207f253b8eb2c824e30d145a9f07a34a14212d57f3beca9f7e03c383cbe"}, + {file = "scikit_image-0.19.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:2a02d1bd0e2b53e36b952bd5fd6118d9ccc3ee51de35705d63d8eb1f2e86adef"}, + {file = "scikit_image-0.19.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:03779a7e1736fdf89d83c0ba67d44110496edd736a3bfce61a2b5177a1c8a099"}, + {file = "scikit_image-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19a21a101a20c587a3b611a2cf6f86c35aae9f8d9563279b987e83ee1c9a9790"}, + {file = "scikit_image-0.19.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f50b923f8099c1045fcde7418d86b206c87e333e43da980f41d8577b9605245"}, + {file = "scikit_image-0.19.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e207c6ce5ce121d7d9b9d2b61b9adca57d1abed112c902d8ffbfdc20fb42c12b"}, + {file = "scikit_image-0.19.3-cp38-cp38-win32.whl", hash = "sha256:a7c3985c68bfe05f7571167ee021d14f5b8d1a4a250c91f0b13be7fb07e6af34"}, + {file = "scikit_image-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:651de1c2ce1fbee834753b46b8e7d81cb12a5594898babba63ac82b30ddad49d"}, + {file = "scikit_image-0.19.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:8d8917fcf85b987b1f287f823f3a1a7dac38b70aaca759bc0200f3bc292d5ced"}, + {file = "scikit_image-0.19.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:0b0a199157ce8487c77de4fde0edc0b42d6d42818881c11f459262351d678b2d"}, + {file = "scikit_image-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33dfd463ee6cc509defa279b963829f2230c9e0639ccd3931045be055878eea6"}, + {file = "scikit_image-0.19.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8714348ddd671f819457a797c97d4c672166f093def66d66c3254cbd1d43f83"}, + {file = "scikit_image-0.19.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3b1025356508d41f4fe48528e509d95f9e4015e90cf158cd58c56dc63e0ac5"}, + {file = "scikit_image-0.19.3-cp39-cp39-win32.whl", hash = "sha256:9439e5294de3f18d6e82ec8eee2c46590231cf9c690da80545e83a0733b7a69e"}, + {file = "scikit_image-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:32fb88cc36203b99c9672fb972c9ef98635deaa5fc889fe969f3e11c44f22919"}, +] + +[package.dependencies] +imageio = ">=2.4.1" +networkx = ">=2.2" +numpy = ">=1.17.0" +packaging = ">=20.0" +pillow = ">=6.1.0,<7.1.0 || >7.1.0,<7.1.1 || >7.1.1,<8.3.0 || >8.3.0" +PyWavelets = ">=1.1.1" +scipy = ">=1.4.1" +tifffile = ">=2019.7.26" + +[package.extras] +data = ["pooch (>=1.3.0)"] +docs = ["cloudpickle (>=0.2.1)", "dask[array] (>=0.15.0,!=2.17.0)", "ipywidgets", "kaleido", "matplotlib (>=3.3)", "myst-parser", "numpydoc (>=1.0)", "pandas (>=0.23.0)", "plotly (>=4.14.0)", "pooch (>=1.3.0)", "pytest-runner", "scikit-learn", "seaborn (>=0.7.1)", "sphinx (>=1.8)", "sphinx-copybutton", "sphinx-gallery (>=0.10.1)", "tifffile (>=2020.5.30)"] +optional = ["SimpleITK", "astropy (>=3.1.2)", "cloudpickle (>=0.2.1)", "dask[array] (>=1.0.0,!=2.17.0)", "matplotlib (>=3.0.3)", "pooch (>=1.3.0)", "pyamg", "qtpy"] +test = ["asv", "codecov", "flake8", "matplotlib (>=3.0.3)", "pooch (>=1.3.0)", "pytest (>=5.2.0)", "pytest-cov (>=2.7.0)", "pytest-faulthandler", "pytest-localserver"] + +[[package]] +name = "scikit-image" +version = "0.20.0" +description = "Image processing in Python" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "scikit_image-0.20.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3cec8c5e8412ee19642a916648144186eb6b60c39fb6608ab478b4d1a4575e25"}, + {file = "scikit_image-0.20.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:0ab378822fadc93db7e917a266d489ea33df3b42edfef197caaebbabbc2e4ecc"}, + {file = "scikit_image-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6797e3ef5fc53897bde131cfc3ceba6ce247d89cfe194fc8d3aba7f5c12aaf6"}, + {file = "scikit_image-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f667dcf01737248bc5bd0a99fad58475abeb6b6a8229aecee9fdb96cf988ae85"}, + {file = "scikit_image-0.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:79a400ffe35fc7f64d1d043f3d043e062015689ad5637c35cd5569edae87ae13"}, + {file = "scikit_image-0.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:049d955869620453b9e0568c2da62c8fec47bf3714be48b5d46bbaebb91bdc1f"}, + {file = "scikit_image-0.20.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:a503ee85b444234ee88f34bf8674872dc37c6124ff60b7eb9242813de012ff4e"}, + {file = "scikit_image-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3943d7355d02b40c066fd87cd5fe1b4f6637a16448e62333c4191a65ebf40a1c"}, + {file = "scikit_image-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d719242ea7e7250d49e38d1e33c44c2dd59c3414ae085881d168b98cbb6059a"}, + {file = "scikit_image-0.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:fdd1fd258e78c86e382fd687177431088a40880bd785e0ab40ee5f3794366710"}, + {file = "scikit_image-0.20.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1cd0486cb769d906307a3ec3884630be822d8ec2f41069e197336f904f584a33"}, + {file = "scikit_image-0.20.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:2e9026161d0a698f532352dda6455a0bc13b1c9d831ea9279726b59d064df574"}, + {file = "scikit_image-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c123e6b0677dc1697c04b5bf2efb7110bcca511b4bc6967a38fa395ae5edf44"}, + {file = "scikit_image-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76f2fd12b537daea806a078df9ea76f5cc5a529d5bd7c41d7d0a101e9c5f91c4"}, + {file = "scikit_image-0.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:2118d610096754bca44b5d37328e1382e5fa7c6493803685100c9238e257d848"}, + {file = "scikit_image-0.20.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:13a5c1c81ee5bcb64ee8ca8f1a2cf371b0c4345ea6fb67c3052e1c6d5edbd936"}, + {file = "scikit_image-0.20.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:1794889d2dbb385c7ad5656363371ba0057b7a3335cda093a11415af84bb96e2"}, + {file = "scikit_image-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df14f8a55dae511749b081d9402ea215ea7c641bd6f74f06aa7b623e132817df"}, + {file = "scikit_image-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b856efc75e3051bea6d40a8ffcdaabd5682783ece1aa91c3f6777c3372a98ca1"}, + {file = "scikit_image-0.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:a600374394b76b7fc260cef54e1be21047c4de0ecffb0b7f2f7392cd8ba16ffa"}, + {file = "scikit_image-0.20.0.tar.gz", hash = "sha256:2cd784fce18bd31d71ade62c6221440199ead03acf7544086261ee032264cf61"}, +] + +[package.dependencies] +imageio = ">=2.4.1" +lazy_loader = ">=0.1" +networkx = ">=2.8" +numpy = ">=1.21.1" +packaging = ">=20.0" +pillow = ">=9.0.1" +PyWavelets = ">=1.1.1" +scipy = {version = ">=1.8", markers = "python_version > \"3.9\""} +tifffile = ">=2019.7.26" + +[package.extras] +build = ["Cython (>=0.29.24)", "build", "meson-python (>=0.13.0rc0)", "ninja", "numpy (>=1.21.1)", "packaging (>=20)", "pythran", "setuptools (>=67)", "wheel"] +data = ["pooch (>=1.3.0)"] +default = ["PyWavelets (>=1.1.1)", "imageio (>=2.4.1)", "lazy_loader (>=0.1)", "networkx (>=2.8)", "numpy (>=1.21.1)", "packaging (>=20.0)", "pillow (>=9.0.1)", "scipy (>=1.8)", "scipy (>=1.8,<1.9.2)", "tifffile (>=2019.7.26)"] +developer = ["pre-commit", "rtoml"] +docs = ["dask[array] (>=2022.9.2)", "ipywidgets", "kaleido", "matplotlib (>=3.6)", "myst-parser", "numpydoc (>=1.5)", "pandas (>=1.5)", "plotly (>=5.10)", "pooch (>=1.6)", "pytest-runner", "scikit-learn", "seaborn (>=0.11)", "sphinx (>=5.2)", "sphinx-copybutton", "sphinx-gallery (>=0.11)", "tifffile (>=2022.8.12)"] +optional = ["SimpleITK", "astropy (>=3.1.2)", "cloudpickle (>=0.2.1)", "dask[array] (>=1.0.0,!=2.17.0)", "matplotlib (>=3.3)", "pooch (>=1.3.0)", "pyamg"] +test = ["asv", "codecov", "matplotlib (>=3.3)", "pooch (>=1.3.0)", "pytest (>=5.2.0)", "pytest-cov (>=2.7.0)", "pytest-faulthandler", "pytest-localserver"] + +[[package]] +name = "scikit-learn" +version = "1.2.2" +description = "A set of python modules for machine learning and data mining" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "scikit-learn-1.2.2.tar.gz", hash = "sha256:8429aea30ec24e7a8c7ed8a3fa6213adf3814a6efbea09e16e0a0c71e1a1a3d7"}, + {file = "scikit_learn-1.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99cc01184e347de485bf253d19fcb3b1a3fb0ee4cea5ee3c43ec0cc429b6d29f"}, + {file = "scikit_learn-1.2.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e6e574db9914afcb4e11ade84fab084536a895ca60aadea3041e85b8ac963edb"}, + {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fe83b676f407f00afa388dd1fdd49e5c6612e551ed84f3b1b182858f09e987d"}, + {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2642baa0ad1e8f8188917423dd73994bf25429f8893ddbe115be3ca3183584"}, + {file = "scikit_learn-1.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ad66c3848c0a1ec13464b2a95d0a484fd5b02ce74268eaa7e0c697b904f31d6c"}, + {file = "scikit_learn-1.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfeaf8be72117eb61a164ea6fc8afb6dfe08c6f90365bde2dc16456e4bc8e45f"}, + {file = "scikit_learn-1.2.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:fe0aa1a7029ed3e1dcbf4a5bc675aa3b1bc468d9012ecf6c6f081251ca47f590"}, + {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:065e9673e24e0dc5113e2dd2b4ca30c9d8aa2fa90f4c0597241c93b63130d233"}, + {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf036ea7ef66115e0d49655f16febfa547886deba20149555a41d28f56fd6d3c"}, + {file = "scikit_learn-1.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:8b0670d4224a3c2d596fd572fb4fa673b2a0ccfb07152688ebd2ea0b8c61025c"}, + {file = "scikit_learn-1.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9c710ff9f9936ba8a3b74a455ccf0dcf59b230caa1e9ba0223773c490cab1e51"}, + {file = "scikit_learn-1.2.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:2dd3ffd3950e3d6c0c0ef9033a9b9b32d910c61bd06cb8206303fb4514b88a49"}, + {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44b47a305190c28dd8dd73fc9445f802b6ea716669cfc22ab1eb97b335d238b1"}, + {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:953236889928d104c2ef14027539f5f2609a47ebf716b8cbe4437e85dce42744"}, + {file = "scikit_learn-1.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:7f69313884e8eb311460cc2f28676d5e400bd929841a2c8eb8742ae78ebf7c20"}, + {file = "scikit_learn-1.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8156db41e1c39c69aa2d8599ab7577af53e9e5e7a57b0504e116cc73c39138dd"}, + {file = "scikit_learn-1.2.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fe175ee1dab589d2e1033657c5b6bec92a8a3b69103e3dd361b58014729975c3"}, + {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d5312d9674bed14f73773d2acf15a3272639b981e60b72c9b190a0cffed5bad"}, + {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea061bf0283bf9a9f36ea3c5d3231ba2176221bbd430abd2603b1c3b2ed85c89"}, + {file = "scikit_learn-1.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:6477eed40dbce190f9f9e9d0d37e020815825b300121307942ec2110302b66a3"}, +] + +[package.dependencies] +joblib = ">=1.1.1" +numpy = ">=1.17.3" +scipy = ">=1.3.2" +threadpoolctl = ">=2.0.0" + +[package.extras] +benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=4.0.1)", "sphinx-gallery (>=0.7.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] +tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy (>=0.961)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=5.3.1)", "pytest-cov (>=2.9.0)", "scikit-image (>=0.16.2)"] + +[[package]] +name = "scikit-maad" +version = "1.3.12" +description = "scikit-maad, soundscape analysis in Python" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "scikit-maad-1.3.12.tar.gz", hash = "sha256:9afcc17bd2ce8423ec9c7770c1deed81c5374a243fc1759547d5ea23613e8124"}, + {file = "scikit_maad-1.3.12-py3-none-any.whl", hash = "sha256:2a0c0a392eda2e4ab9f05f183aec0cf632049e2ec2c0809be645fd6c8c22d364"}, +] + +[package.dependencies] +numpy = ">=1.19" +pandas = ">=1.1" +resampy = ">=0.2" +scikit-image = ">=0.17" +scipy = ">=1.5" + +[[package]] +name = "scipy" +version = "1.10.1" +description = "Fundamental algorithms for scientific computing in Python" +category = "main" +optional = false +python-versions = "<3.12,>=3.8" +files = [ + {file = "scipy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7354fd7527a4b0377ce55f286805b34e8c54b91be865bac273f527e1b839019"}, + {file = "scipy-1.10.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4b3f429188c66603a1a5c549fb414e4d3bdc2a24792e061ffbd607d3d75fd84e"}, + {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1553b5dcddd64ba9a0d95355e63fe6c3fc303a8fd77c7bc91e77d61363f7433f"}, + {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c0ff64b06b10e35215abce517252b375e580a6125fd5fdf6421b98efbefb2d2"}, + {file = "scipy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:fae8a7b898c42dffe3f7361c40d5952b6bf32d10c4569098d276b4c547905ee1"}, + {file = "scipy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f1564ea217e82c1bbe75ddf7285ba0709ecd503f048cb1236ae9995f64217bd"}, + {file = "scipy-1.10.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d925fa1c81b772882aa55bcc10bf88324dadb66ff85d548c71515f6689c6dac5"}, + {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaea0a6be54462ec027de54fca511540980d1e9eea68b2d5c1dbfe084797be35"}, + {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15a35c4242ec5f292c3dd364a7c71a61be87a3d4ddcc693372813c0b73c9af1d"}, + {file = "scipy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:43b8e0bcb877faf0abfb613d51026cd5cc78918e9530e375727bf0625c82788f"}, + {file = "scipy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5678f88c68ea866ed9ebe3a989091088553ba12c6090244fdae3e467b1139c35"}, + {file = "scipy-1.10.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:39becb03541f9e58243f4197584286e339029e8908c46f7221abeea4b749fa88"}, + {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bce5869c8d68cf383ce240e44c1d9ae7c06078a9396df68ce88a1230f93a30c1"}, + {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07c3457ce0b3ad5124f98a86533106b643dd811dd61b548e78cf4c8786652f6f"}, + {file = "scipy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:049a8bbf0ad95277ffba9b3b7d23e5369cc39e66406d60422c8cfef40ccc8415"}, + {file = "scipy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd9f1027ff30d90618914a64ca9b1a77a431159df0e2a195d8a9e8a04c78abf9"}, + {file = "scipy-1.10.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:79c8e5a6c6ffaf3a2262ef1be1e108a035cf4f05c14df56057b64acc5bebffb6"}, + {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51af417a000d2dbe1ec6c372dfe688e041a7084da4fdd350aeb139bd3fb55353"}, + {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b4735d6c28aad3cdcf52117e0e91d6b39acd4272f3f5cd9907c24ee931ad601"}, + {file = "scipy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ff7f37b1bf4417baca958d254e8e2875d0cc23aaadbe65b3d5b3077b0eb23ea"}, + {file = "scipy-1.10.1.tar.gz", hash = "sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5"}, +] + +[package.dependencies] +numpy = ">=1.19.5,<1.27.0" + +[package.extras] +dev = ["click", "doit (>=0.36.0)", "flake8", "mypy", "pycodestyle", "pydevtool", "rich-click", "typing_extensions"] +doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "setuptools" +version = "67.6.1" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-67.6.1-py3-none-any.whl", hash = "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078"}, + {file = "setuptools-67.6.1.tar.gz", hash = "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] + +[[package]] +name = "sounddevice" +version = "0.4.6" +description = "Play and Record Sound with Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sounddevice-0.4.6-py3-none-any.whl", hash = "sha256:5de768ba6fe56ad2b5aaa2eea794b76b73e427961c95acad2ee2ed7f866a4b20"}, + {file = "sounddevice-0.4.6-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:8b0b806c205dd3e3cd5a97262b2482624fd21db7d47083b887090148a08051c8"}, + {file = "sounddevice-0.4.6-py3-none-win32.whl", hash = "sha256:e3ba6e674ffa8f79a591d744a1d4ab922fe5bdfd4faf8b25069a08e051010b7b"}, + {file = "sounddevice-0.4.6-py3-none-win_amd64.whl", hash = "sha256:7830d4f8f8570f2e5552942f81d96999c5fcd9a0b682d6fc5d5c5529df23be2c"}, + {file = "sounddevice-0.4.6.tar.gz", hash = "sha256:3236b78f15f0415bdf006a620cef073d0c0522851d66f4a961ed6d8eb1482fe9"}, +] + +[package.dependencies] +CFFI = ">=1.0" + +[package.extras] +numpy = ["NumPy"] + +[[package]] +name = "soundfile" +version = "0.12.1" +description = "An audio library based on libsndfile, CFFI and NumPy" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "soundfile-0.12.1-py2.py3-none-any.whl", hash = "sha256:828a79c2e75abab5359f780c81dccd4953c45a2c4cd4f05ba3e233ddf984b882"}, + {file = "soundfile-0.12.1-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:d922be1563ce17a69582a352a86f28ed8c9f6a8bc951df63476ffc310c064bfa"}, + {file = "soundfile-0.12.1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:bceaab5c4febb11ea0554566784bcf4bc2e3977b53946dda2b12804b4fe524a8"}, + {file = "soundfile-0.12.1-py2.py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:2dc3685bed7187c072a46ab4ffddd38cef7de9ae5eb05c03df2ad569cf4dacbc"}, + {file = "soundfile-0.12.1-py2.py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:074247b771a181859d2bc1f98b5ebf6d5153d2c397b86ee9e29ba602a8dfe2a6"}, + {file = "soundfile-0.12.1-py2.py3-none-win32.whl", hash = "sha256:59dfd88c79b48f441bbf6994142a19ab1de3b9bb7c12863402c2bc621e49091a"}, + {file = "soundfile-0.12.1-py2.py3-none-win_amd64.whl", hash = "sha256:0d86924c00b62552b650ddd28af426e3ff2d4dc2e9047dae5b3d8452e0a49a77"}, + {file = "soundfile-0.12.1.tar.gz", hash = "sha256:e8e1017b2cf1dda767aef19d2fd9ee5ebe07e050d430f77a0a7c66ba08b8cdae"}, +] + +[package.dependencies] +cffi = ">=1.0" + +[package.extras] +numpy = ["numpy"] + +[[package]] +name = "soupsieve" +version = "2.4" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "soupsieve-2.4-py3-none-any.whl", hash = "sha256:49e5368c2cda80ee7e84da9dbe3e110b70a4575f196efb74e51b94549d921955"}, + {file = "soupsieve-2.4.tar.gz", hash = "sha256:e28dba9ca6c7c00173e34e4ba57448f0688bb681b7c5e8bf4971daafc093d69a"}, +] + +[[package]] +name = "sphinx" +version = "6.2.1" +description = "Python documentation generator" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Sphinx-6.2.1.tar.gz", hash = "sha256:6d56a34697bb749ffa0152feafc4b19836c755d90a7c59b72bc7dfd371b9cc6b"}, + {file = "sphinx-6.2.1-py3-none-any.whl", hash = "sha256:97787ff1fa3256a3eef9eda523a63dbf299f7b47e053cfcf684a1c2a8380c912"}, +] + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=2.9" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.18.1,<0.20" +imagesize = ">=1.3" +importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.0" +packaging = ">=21.0" +Pygments = ">=2.13" +requests = ">=2.25.0" +snowballstemmer = ">=2.0" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = ">=1.1.5" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] +test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"] + +[[package]] +name = "sphinx-rtd-theme" +version = "1.2.0" +description = "Read the Docs theme for Sphinx" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "sphinx_rtd_theme-1.2.0-py2.py3-none-any.whl", hash = "sha256:f823f7e71890abe0ac6aaa6013361ea2696fc8d3e1fa798f463e82bdb77eeff2"}, + {file = "sphinx_rtd_theme-1.2.0.tar.gz", hash = "sha256:a0d8bd1a2ed52e0b338cbe19c4b2eef3c5e7a048769753dac6a9f059c7b641b8"}, +] + +[package.dependencies] +docutils = "<0.19" +sphinx = ">=1.6,<7" +sphinxcontrib-jquery = {version = ">=2.0.0,<3.0.0 || >3.0.0", markers = "python_version > \"3\""} + +[package.extras] +dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.4" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, + {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.1" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, + {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["html5lib", "pytest"] + +[[package]] +name = "sphinxcontrib-jquery" +version = "4.1" +description = "Extension to include jQuery on newer Sphinx releases" +category = "dev" +optional = false +python-versions = ">=2.7" +files = [ + {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"}, + {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"}, +] + +[package.dependencies] +Sphinx = ">=1.8" + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] + +[package.extras] +test = ["flake8", "mypy", "pytest"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "starlette" +version = "0.22.0" +description = "The little ASGI library that shines." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "starlette-0.22.0-py3-none-any.whl", hash = "sha256:b5eda991ad5f0ee5d8ce4c4540202a573bb6691ecd0c712262d0bc85cf8f2c50"}, + {file = "starlette-0.22.0.tar.gz", hash = "sha256:b092cbc365bea34dd6840b42861bdabb2f507f8671e642e8272d2442e08ea4ff"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] + +[[package]] +name = "starsessions" +version = "1.3.0" +description = "Pluggable session support for Starlette." +category = "main" +optional = false +python-versions = ">=3.6.2,<4.0.0" +files = [ + {file = "starsessions-1.3.0-py3-none-any.whl", hash = "sha256:c0758f2a1a2438ec7ba88b232e82008f2261a75584f01179c787b3636fae6040"}, + {file = "starsessions-1.3.0.tar.gz", hash = "sha256:8d3b509d4e6d235655f7dd495fcf0afc1bd86da84de3a8d434e6f82137ebcde8"}, +] + +[package.dependencies] +itsdangerous = ">=2.0.1,<3.0.0" +starlette = ">=0,<1" + +[package.extras] +redis = ["aioredis (>=2.0.0,<3.0.0)"] + +[[package]] +name = "stdiomask" +version = "0.0.6" +description = "A cross-platform Python module for entering passwords to a stdio terminal and displaying a **** mask, which getpass cannot do." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "stdiomask-0.0.6.tar.gz", hash = "sha256:c1e47069ead9e10bda150a26f7922ca01d2adc503042a9d7acf64877a2b9a3a6"}, +] + +[[package]] +name = "sympy" +version = "1.11.1" +description = "Computer algebra system (CAS) in Python" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.11.1-py3-none-any.whl", hash = "sha256:938f984ee2b1e8eae8a07b884c8b7a1146010040fccddc6539c54f401c8f6fcf"}, + {file = "sympy-1.11.1.tar.gz", hash = "sha256:e32380dce63cb7c0108ed525570092fd45168bdae2faa17e528221ef72e88658"}, +] + +[package.dependencies] +mpmath = ">=0.19" + +[[package]] +name = "tensorboard" +version = "2.12.2" +description = "TensorBoard lets you watch Tensors Flow" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tensorboard-2.12.2-py3-none-any.whl", hash = "sha256:811ab0d27a139445836db9fd4f974424602c3dce12379364d379bcba7c783a68"}, +] + +[package.dependencies] +absl-py = ">=0.4" +google-auth = ">=1.6.3,<3" +google-auth-oauthlib = ">=0.5,<1.1" +grpcio = ">=1.48.2" +markdown = ">=2.6.8" +numpy = ">=1.12.0" +protobuf = ">=3.19.6" +requests = ">=2.21.0,<3" +setuptools = ">=41.0.0" +tensorboard-data-server = ">=0.7.0,<0.8.0" +tensorboard-plugin-wit = ">=1.6.0" +werkzeug = ">=1.0.1" +wheel = ">=0.26" + +[[package]] +name = "tensorboard-data-server" +version = "0.7.0" +description = "Fast data loading for TensorBoard" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tensorboard_data_server-0.7.0-py3-none-any.whl", hash = "sha256:753d4214799b31da7b6d93837959abebbc6afa86e69eacf1e9a317a48daa31eb"}, + {file = "tensorboard_data_server-0.7.0-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:eb7fa518737944dbf4f0cf83c2e40a7ac346bf91be2e6a0215de98be74e85454"}, + {file = "tensorboard_data_server-0.7.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64aa1be7c23e80b1a42c13b686eb0875bb70f5e755f4d2b8de5c1d880cf2267f"}, +] + +[[package]] +name = "tensorboard-plugin-wit" +version = "1.8.1" +description = "What-If Tool TensorBoard plugin." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "tensorboard_plugin_wit-1.8.1-py3-none-any.whl", hash = "sha256:ff26bdd583d155aa951ee3b152b3d0cffae8005dc697f72b44a8e8c2a77a8cbe"}, +] + +[[package]] +name = "tensorboardx" +version = "2.6" +description = "TensorBoardX lets you watch Tensors Flow without Tensorflow" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "tensorboardX-2.6-py2.py3-none-any.whl", hash = "sha256:24a7cd076488de1e9d15ef25371b8ebf90c4f8f622af2477c611198f03f4a606"}, + {file = "tensorboardX-2.6.tar.gz", hash = "sha256:d4c036964dd2deb075a1909832b276daa383eab3f9db519ad90b99f5aea06b0c"}, +] + +[package.dependencies] +numpy = "*" +packaging = "*" +protobuf = ">=3.8.0,<4" + +[[package]] +name = "threadpoolctl" +version = "3.1.0" +description = "threadpoolctl" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "threadpoolctl-3.1.0-py3-none-any.whl", hash = "sha256:8b99adda265feb6773280df41eece7b2e6561b772d21ffd52e372f999024907b"}, + {file = "threadpoolctl-3.1.0.tar.gz", hash = "sha256:a335baacfaa4400ae1f0d8e3a58d6674d2f8828e3716bb2802c44955ad391380"}, +] + +[[package]] +name = "tifffile" +version = "2023.3.21" +description = "Read and write TIFF files" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tifffile-2023.3.21-py3-none-any.whl", hash = "sha256:b83af3dbe914663aeaf250e9751ae503154f2599dd27ed7a4df1b2dc7c148efa"}, + {file = "tifffile-2023.3.21.tar.gz", hash = "sha256:16027be65e9d5a1b26bf106a98a639345fecf83ebac9004dc7e617647e4dbfeb"}, +] + +[package.dependencies] +numpy = "*" + +[package.extras] +all = ["defusedxml", "fsspec", "imagecodecs (>=2023.1.23)", "lxml", "matplotlib", "zarr"] + +[[package]] +name = "tokenizers" +version = "0.13.3" +description = "Fast and Customizable Tokenizers" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "tokenizers-0.13.3-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:f3835c5be51de8c0a092058a4d4380cb9244fb34681fd0a295fbf0a52a5fdf33"}, + {file = "tokenizers-0.13.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4ef4c3e821730f2692489e926b184321e887f34fb8a6b80b8096b966ba663d07"}, + {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5fd1a6a25353e9aa762e2aae5a1e63883cad9f4e997c447ec39d071020459bc"}, + {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee0b1b311d65beab83d7a41c56a1e46ab732a9eed4460648e8eb0bd69fc2d059"}, + {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ef4215284df1277dadbcc5e17d4882bda19f770d02348e73523f7e7d8b8d396"}, + {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4d53976079cff8a033f778fb9adca2d9d69d009c02fa2d71a878b5f3963ed30"}, + {file = "tokenizers-0.13.3-cp310-cp310-win32.whl", hash = "sha256:1f0e3b4c2ea2cd13238ce43548959c118069db7579e5d40ec270ad77da5833ce"}, + {file = "tokenizers-0.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:89649c00d0d7211e8186f7a75dfa1db6996f65edce4b84821817eadcc2d3c79e"}, + {file = "tokenizers-0.13.3-cp311-cp311-macosx_10_11_universal2.whl", hash = "sha256:56b726e0d2bbc9243872b0144515ba684af5b8d8cd112fb83ee1365e26ec74c8"}, + {file = "tokenizers-0.13.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:cc5c022ce692e1f499d745af293ab9ee6f5d92538ed2faf73f9708c89ee59ce6"}, + {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55c981ac44ba87c93e847c333e58c12abcbb377a0c2f2ef96e1a266e4184ff2"}, + {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f247eae99800ef821a91f47c5280e9e9afaeed9980fc444208d5aa6ba69ff148"}, + {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b3e3215d048e94f40f1c95802e45dcc37c5b05eb46280fc2ccc8cd351bff839"}, + {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ba2b0bf01777c9b9bc94b53764d6684554ce98551fec496f71bc5be3a03e98b"}, + {file = "tokenizers-0.13.3-cp311-cp311-win32.whl", hash = "sha256:cc78d77f597d1c458bf0ea7c2a64b6aa06941c7a99cb135b5969b0278824d808"}, + {file = "tokenizers-0.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:ecf182bf59bd541a8876deccf0360f5ae60496fd50b58510048020751cf1724c"}, + {file = "tokenizers-0.13.3-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:0527dc5436a1f6bf2c0327da3145687d3bcfbeab91fed8458920093de3901b44"}, + {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07cbb2c307627dc99b44b22ef05ff4473aa7c7cc1fec8f0a8b37d8a64b1a16d2"}, + {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4560dbdeaae5b7ee0d4e493027e3de6d53c991b5002d7ff95083c99e11dd5ac0"}, + {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64064bd0322405c9374305ab9b4c07152a1474370327499911937fd4a76d004b"}, + {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8c6e2ab0f2e3d939ca66aa1d596602105fe33b505cd2854a4c1717f704c51de"}, + {file = "tokenizers-0.13.3-cp37-cp37m-win32.whl", hash = "sha256:6cc29d410768f960db8677221e497226e545eaaea01aa3613fa0fdf2cc96cff4"}, + {file = "tokenizers-0.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fc2a7fdf864554a0dacf09d32e17c0caa9afe72baf9dd7ddedc61973bae352d8"}, + {file = "tokenizers-0.13.3-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:8791dedba834c1fc55e5f1521be325ea3dafb381964be20684b92fdac95d79b7"}, + {file = "tokenizers-0.13.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:d607a6a13718aeb20507bdf2b96162ead5145bbbfa26788d6b833f98b31b26e1"}, + {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3791338f809cd1bf8e4fee6b540b36822434d0c6c6bc47162448deee3f77d425"}, + {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2f35f30e39e6aab8716f07790f646bdc6e4a853816cc49a95ef2a9016bf9ce6"}, + {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:310204dfed5aa797128b65d63538a9837cbdd15da2a29a77d67eefa489edda26"}, + {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0f9b92ea052305166559f38498b3b0cae159caea712646648aaa272f7160963"}, + {file = "tokenizers-0.13.3-cp38-cp38-win32.whl", hash = "sha256:9a3fa134896c3c1f0da6e762d15141fbff30d094067c8f1157b9fdca593b5806"}, + {file = "tokenizers-0.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:8e7b0cdeace87fa9e760e6a605e0ae8fc14b7d72e9fc19c578116f7287bb873d"}, + {file = "tokenizers-0.13.3-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:00cee1e0859d55507e693a48fa4aef07060c4bb6bd93d80120e18fea9371c66d"}, + {file = "tokenizers-0.13.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:a23ff602d0797cea1d0506ce69b27523b07e70f6dda982ab8cf82402de839088"}, + {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ce07445050b537d2696022dafb115307abdffd2a5c106f029490f84501ef97"}, + {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:280ffe95f50eaaf655b3a1dc7ff1d9cf4777029dbbc3e63a74e65a056594abc3"}, + {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97acfcec592f7e9de8cadcdcda50a7134423ac8455c0166b28c9ff04d227b371"}, + {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd7730c98a3010cd4f523465867ff95cd9d6430db46676ce79358f65ae39797b"}, + {file = "tokenizers-0.13.3-cp39-cp39-win32.whl", hash = "sha256:48625a108029cb1ddf42e17a81b5a3230ba6888a70c9dc14e81bc319e812652d"}, + {file = "tokenizers-0.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:bc0a6f1ba036e482db6453571c9e3e60ecd5489980ffd95d11dc9f960483d783"}, + {file = "tokenizers-0.13.3.tar.gz", hash = "sha256:2e546dbb68b623008a5442353137fbb0123d311a6d7ba52f2667c8862a75af2e"}, +] + +[package.extras] +dev = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] +docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "toolz" +version = "0.12.0" +description = "List processing tools and functional utilities" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "toolz-0.12.0-py3-none-any.whl", hash = "sha256:2059bd4148deb1884bb0eb770a3cde70e7f954cfbbdc2285f1f2de01fd21eb6f"}, + {file = "toolz-0.12.0.tar.gz", hash = "sha256:88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194"}, +] + +[[package]] +name = "torch" +version = "2.0.0" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +category = "main" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "torch-2.0.0-1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:c9090bda7d2eeeecd74f51b721420dbeb44f838d4536cc1b284e879417e3064a"}, + {file = "torch-2.0.0-1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:bd42db2a48a20574d2c33489e120e9f32789c4dc13c514b0c44272972d14a2d7"}, + {file = "torch-2.0.0-1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8969aa8375bcbc0c2993e7ede0a7f889df9515f18b9b548433f412affed478d9"}, + {file = "torch-2.0.0-1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:ab2da16567cb55b67ae39e32d520d68ec736191d88ac79526ca5874754c32203"}, + {file = "torch-2.0.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:7a9319a67294ef02459a19738bbfa8727bb5307b822dadd708bc2ccf6c901aca"}, + {file = "torch-2.0.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:9f01fe1f6263f31bd04e1757946fd63ad531ae37f28bb2dbf66f5c826ee089f4"}, + {file = "torch-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:527f4ae68df7b8301ee6b1158ca56350282ea633686537b30dbb5d7b4a52622a"}, + {file = "torch-2.0.0-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:ce9b5a49bd513dff7950a5a07d6e26594dd51989cee05ba388b03e8e366fd5d5"}, + {file = "torch-2.0.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:53e1c33c6896583cdb9a583693e22e99266444c4a43392dddc562640d39e542b"}, + {file = "torch-2.0.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:09651bff72e439d004c991f15add0c397c66f98ab36fe60d5514b44e4da722e8"}, + {file = "torch-2.0.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d439aec349c98f12819e8564b8c54008e4613dd4428582af0e6e14c24ca85870"}, + {file = "torch-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:2802f84f021907deee7e9470ed10c0e78af7457ac9a08a6cd7d55adef835fede"}, + {file = "torch-2.0.0-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:01858620f25f25e7a9ec4b547ff38e5e27c92d38ec4ccba9cfbfb31d7071ed9c"}, + {file = "torch-2.0.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:9a2e53b5783ef5896a6af338b36d782f28e83c8ddfc2ac44b67b066d9d76f498"}, + {file = "torch-2.0.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ec5fff2447663e369682838ff0f82187b4d846057ef4d119a8dea7772a0b17dd"}, + {file = "torch-2.0.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:11b0384fe3c18c01b8fc5992e70fc519cde65e44c51cc87be1838c1803daf42f"}, + {file = "torch-2.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:e54846aa63855298cfb1195487f032e413e7ac9cbfa978fda32354cc39551475"}, + {file = "torch-2.0.0-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:cc788cbbbbc6eb4c90e52c550efd067586c2693092cf367c135b34893a64ae78"}, + {file = "torch-2.0.0-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:d292640f0fd72b7a31b2a6e3b635eb5065fcbedd4478f9cad1a1e7a9ec861d35"}, + {file = "torch-2.0.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6befaad784004b7af357e3d87fa0863c1f642866291f12a4c2af2de435e8ac5c"}, + {file = "torch-2.0.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a83b26bd6ae36fbf5fee3d56973d9816e2002e8a3b7d9205531167c28aaa38a7"}, + {file = "torch-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:c7e67195e1c3e33da53954b026e89a8e1ff3bc1aeb9eb32b677172d4a9b5dcbf"}, + {file = "torch-2.0.0-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:6e0b97beb037a165669c312591f242382e9109a240e20054d5a5782d9236cad0"}, + {file = "torch-2.0.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:297a4919aff1c0f98a58ebe969200f71350a1d4d4f986dbfd60c02ffce780e99"}, +] + +[package.dependencies] +filelock = "*" +jinja2 = "*" +networkx = "*" +nvidia-cublas-cu11 = {version = "11.10.3.66", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu11 = {version = "11.7.101", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu11 = {version = "11.7.99", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu11 = {version = "11.7.99", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu11 = {version = "8.5.0.96", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu11 = {version = "10.9.0.58", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu11 = {version = "10.2.10.91", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu11 = {version = "11.4.0.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu11 = {version = "11.7.4.91", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu11 = {version = "2.14.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu11 = {version = "11.7.91", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +sympy = "*" +triton = {version = "2.0.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +typing-extensions = "*" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] + +[[package]] +name = "torchaudio" +version = "2.0.1" +description = "An audio package for PyTorch" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "torchaudio-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5d21ebbb55e7040d418d5062b0e882f9660d68b477b38fd436fa6c92ccbb52a"}, + {file = "torchaudio-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6dbcd93b29d71a2f500f36a34ea5e467f510f773da85322098e6bdd8c9dc9948"}, + {file = "torchaudio-2.0.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:5fdaba10ff06d098d603d9eb8d2ff541c3f3fe28ba178a78787190cec0d5187f"}, + {file = "torchaudio-2.0.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:6419199c773c5045c594ff950d5e5dbbfa6c830892ec09721d4ed8704b702bfd"}, + {file = "torchaudio-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:a5c81e480e5dcdcba065af1e3e31678ac29518991f00260094d37a39e63d76e5"}, + {file = "torchaudio-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e2a047675493c0aa258fec621ef40e8b01abe3d8dbc872152e4b5998418aa3c5"}, + {file = "torchaudio-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:91a28e587f708a03320eddbcc4a7dd1ad7150b3d4846b6c1557d85cc89a8d06c"}, + {file = "torchaudio-2.0.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:ba7740d98f601218ff667598ab3d9dab5f326878374fcb52d656f4ff033b9e96"}, + {file = "torchaudio-2.0.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:f401b192921c8b77cc5e478ede589b256dba463f1cee91172ecb376fea45a288"}, + {file = "torchaudio-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:0ef6754cf75ca5fd5117cb6243a6cf33552d67e9af0075aa6954b2c34bbf1036"}, + {file = "torchaudio-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:022ca1baa4bb819b78343bd47b57ff6dc6f9fc19fa4ef269946aadf7e62db3c0"}, + {file = "torchaudio-2.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a153ad5cdb62de8ec9fd1360a0d080bbaf39d578ae04e788db211571e675b7e0"}, + {file = "torchaudio-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:aa7897774ab4156d0b72f7078b823ebc1371ee24c50df965447782889552367a"}, + {file = "torchaudio-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:48d133593cddfe0424a350b566d54065bf6fe7469654de7add2f11b3ef03c5d9"}, + {file = "torchaudio-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:ac65eb067feee435debba81adfe8337fa007a06de6508c0d80261c5562b6d098"}, + {file = "torchaudio-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e3c6c8f9ea9f0e2df7a0b9375b0dcf955906e38fc12fab542b72a861564af8e7"}, + {file = "torchaudio-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1d0cf0779a334ec1861e9fa28bceb66a633c42e8f6b3322e2e37ff9f20d0ae81"}, + {file = "torchaudio-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:ab7acd2b5d351a2c65e4d935bb90b9256382bed93df57ee177bdbbe31c3cc984"}, + {file = "torchaudio-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:77b953fd7278773269a9477315b8998ae7e5011cc4b2907e0df18162327482f1"}, + {file = "torchaudio-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:c01bcea9d4c4a6616452e6cbd44d55913d8e6dee58191b925f35d46a2bf6e71b"}, +] + +[package.dependencies] +torch = "2.0.0" + +[[package]] +name = "torchcrepe" +version = "0.0.18" +description = "Pytorch implementation of CREPE pitch tracker" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "torchcrepe-0.0.18-py3-none-any.whl", hash = "sha256:c8e4c66450ca94498b3f5300dc7d131e101175b3b57e61be3fb8a5a07a131579"}, + {file = "torchcrepe-0.0.18.tar.gz", hash = "sha256:db57a1e0066e6da07219608aaa05278066a954e173399917bc1895edc22b90ef"}, +] + +[package.dependencies] +librosa = "0.9.1" +resampy = "*" +scipy = "*" +torch = "*" +tqdm = "*" + +[[package]] +name = "torchmetrics" +version = "0.11.4" +description = "PyTorch native Metrics" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "torchmetrics-0.11.4-py3-none-any.whl", hash = "sha256:45f892f3534e91f3ad9e2488d1b05a93b7cb76b7d037969435a41a1f24750d9a"}, + {file = "torchmetrics-0.11.4.tar.gz", hash = "sha256:1fe45a14b44dd65d90199017dd5a4b5a128d56a8a311da7916c402c18c671494"}, +] + +[package.dependencies] +numpy = ">=1.17.2" +packaging = "*" +torch = ">=1.8.1" +typing-extensions = {version = "*", markers = "python_version < \"3.9\""} + +[package.extras] +all = ["lpips (<=0.1.4)", "nltk (>=3.6)", "pycocotools (>2.0.0)", "pystoi (<=0.3.3)", "regex (>=2021.9.24)", "scipy (>1.0.0)", "torch-fidelity (<=0.3.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>=4.10.0)"] +audio = ["pystoi (<=0.3.3)"] +detection = ["pycocotools (>2.0.0)", "torchvision (>=0.8)"] +image = ["lpips (<=0.1.4)", "scipy (>1.0.0)", "torch-fidelity (<=0.3.0)", "torchvision (>=0.8)"] +multimodal = ["transformers (>=4.10.0)"] +test = ["bert-score (==0.3.13)", "cloudpickle (>1.3)", "coverage (>5.2)", "dython (<=0.7.3)", "fast-bss-eval (>=0.1.0)", "fire (<=0.5.0)", "huggingface-hub (<0.7)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "mir-eval (>=0.6)", "mypy (==0.982)", "netcal (>1.0.0)", "pandas (>1.0.0)", "phmdoctest (>=1.1.1)", "psutil (<=5.9.4)", "pypesq (>1.2)", "pytest (>=6.0.0)", "pytest-cov (>2.10)", "pytest-doctestplus (>=0.9.0)", "pytest-rerunfailures (>=10.0)", "pytest-timeout (<=2.1.0)", "pytorch-msssim (==0.2.1)", "requests (<=2.28.2)", "rouge-score (>0.1.0)", "sacrebleu (>=2.0.0)", "scikit-image (>0.17.1)", "scikit-learn (>1.0)", "scipy (>1.0.0)", "torch-complex (<=0.4.3)", "transformers (>4.4.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +text = ["nltk (>=3.6)", "regex (>=2021.9.24)", "tqdm (>=4.41.0)"] + +[[package]] +name = "tqdm" +version = "4.65.0" +description = "Fast, Extensible Progress Meter" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, + {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "tqdm-joblib" +version = "0.0.3" +description = "Tracking progress of joblib.Parallel execution" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "tqdm_joblib-0.0.3.tar.gz", hash = "sha256:77283c359890feac6752c59de838ec5031f8265231d0f9935b03ade3e0d1add5"}, +] + +[package.dependencies] +tqdm = "*" + +[[package]] +name = "traitlets" +version = "5.9.0" +description = "Traitlets Python configuration system" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, + {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] + +[[package]] +name = "transformers" +version = "4.28.1" +description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "transformers-4.28.1-py3-none-any.whl", hash = "sha256:f30a006220d0475789ac0e7c874f51bf5143956797616d89975b637883ce0be6"}, + {file = "transformers-4.28.1.tar.gz", hash = "sha256:7334f8730cff7ac31d9ba5c12f2113fcb7a7a5b61eeb5dbbdb162117c3aaa2d1"}, +] + +[package.dependencies] +filelock = "*" +huggingface-hub = ">=0.11.0,<1.0" +numpy = ">=1.17" +packaging = ">=20.0" +pyyaml = ">=5.1" +regex = "!=2019.12.17" +requests = "*" +tokenizers = ">=0.11.1,<0.11.3 || >0.11.3,<0.14" +tqdm = ">=4.27" + +[package.extras] +accelerate = ["accelerate (>=0.10.0)"] +all = ["Pillow", "accelerate (>=0.10.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8)", "optuna", "phonemizer", "protobuf (<=3.20.2)", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision"] +audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +codecarbon = ["codecarbon (==1.2.0)"] +deepspeed = ["accelerate (>=0.10.0)", "deepspeed (>=0.8.3)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.10.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.8.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf (<=3.20.2)", "psutil", "pytest", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "sentencepiece (>=0.1.91,!=0.1.92)", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow", "accelerate (>=0.10.0)", "av (==9.2.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8)", "optuna", "parameterized", "phonemizer", "protobuf (<=3.20.2)", "psutil", "pyctcdecode (>=0.4.0)", "pytest", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf (<=3.20.2)", "psutil", "pyctcdecode (>=0.4.0)", "pytest", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.11.1,!=0.11.3,<0.14)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf (<=3.20.2)", "psutil", "pyctcdecode (>=0.4.0)", "pytest", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"] +docs = ["Pillow", "accelerate (>=0.10.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1)", "hf-doc-builder", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8)", "optuna", "phonemizer", "protobuf (<=3.20.2)", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision"] +docs-specific = ["hf-doc-builder"] +fairscale = ["fairscale (>0.3)"] +flax = ["flax (>=0.4.1)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "optax (>=0.0.8)"] +flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +ftfy = ["ftfy"] +integrations = ["optuna", "ray[tune]", "sigopt"] +ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "rhoknp (>=1.1.0)", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"] +modelcreation = ["cookiecutter (==1.7.3)"] +natten = ["natten (>=0.14.6)"] +onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] +onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] +optuna = ["optuna"] +quality = ["GitPython (<3.1.19)", "black (>=23.1,<24.0)", "datasets (!=2.5.0)", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "ruff (>=0.0.241,<=0.0.259)"] +ray = ["ray[tune]"] +retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] +sagemaker = ["sagemaker (>=2.31.0)"] +sentencepiece = ["protobuf (<=3.20.2)", "sentencepiece (>=0.1.91,!=0.1.92)"] +serving = ["fastapi", "pydantic", "starlette", "uvicorn"] +sigopt = ["sigopt"] +sklearn = ["scikit-learn"] +speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf (<=3.20.2)", "psutil", "pytest", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "timeout-decorator"] +tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx"] +tf-cpu = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx"] +tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +timm = ["timm"] +tokenizers = ["tokenizers (>=0.11.1,!=0.11.3,<0.14)"] +torch = ["torch (>=1.9,!=1.12.0)"] +torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +torch-vision = ["Pillow", "torchvision"] +torchhub = ["filelock", "huggingface-hub (>=0.11.0,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf (<=3.20.2)", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "tqdm (>=4.27)"] +video = ["av (==9.2.0)", "decord (==0.6.0)"] +vision = ["Pillow"] + +[[package]] +name = "triton" +version = "2.0.0" +description = "A language and compiler for custom Deep Learning operations" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "triton-2.0.0-1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38806ee9663f4b0f7cd64790e96c579374089e58f49aac4a6608121aa55e2505"}, + {file = "triton-2.0.0-1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:226941c7b8595219ddef59a1fdb821e8c744289a132415ddd584facedeb475b1"}, + {file = "triton-2.0.0-1-cp36-cp36m-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4c9fc8c89874bc48eb7e7b2107a9b8d2c0bf139778637be5bfccb09191685cfd"}, + {file = "triton-2.0.0-1-cp37-cp37m-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d2684b6a60b9f174f447f36f933e9a45f31db96cb723723ecd2dcfd1c57b778b"}, + {file = "triton-2.0.0-1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9d4978298b74fcf59a75fe71e535c092b023088933b2f1df933ec32615e4beef"}, + {file = "triton-2.0.0-1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:74f118c12b437fb2ca25e1a04759173b517582fcf4c7be11913316c764213656"}, + {file = "triton-2.0.0-1-pp37-pypy37_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9618815a8da1d9157514f08f855d9e9ff92e329cd81c0305003eb9ec25cc5add"}, + {file = "triton-2.0.0-1-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1aca3303629cd3136375b82cb9921727f804e47ebee27b2677fef23005c3851a"}, + {file = "triton-2.0.0-1-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e3e13aa8b527c9b642e3a9defcc0fbd8ffbe1c80d8ac8c15a01692478dc64d8a"}, + {file = "triton-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f05a7e64e4ca0565535e3d5d3405d7e49f9d308505bb7773d21fb26a4c008c2"}, + {file = "triton-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb4b99ca3c6844066e516658541d876c28a5f6e3a852286bbc97ad57134827fd"}, + {file = "triton-2.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47b4d70dc92fb40af553b4460492c31dc7d3a114a979ffb7a5cdedb7eb546c08"}, + {file = "triton-2.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fedce6a381901b1547e0e7e1f2546e4f65dca6d91e2d8a7305a2d1f5551895be"}, + {file = "triton-2.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75834f27926eab6c7f00ce73aaf1ab5bfb9bec6eb57ab7c0bfc0a23fac803b4c"}, + {file = "triton-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0117722f8c2b579cd429e0bee80f7731ae05f63fe8e9414acd9a679885fcbf42"}, + {file = "triton-2.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcd9be5d0c2e45d2b7e6ddc6da20112b6862d69741576f9c3dbaf941d745ecae"}, + {file = "triton-2.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42a0d2c3fc2eab4ba71384f2e785fbfd47aa41ae05fa58bf12cb31dcbd0aeceb"}, + {file = "triton-2.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52c47b72c72693198163ece9d90a721299e4fb3b8e24fd13141e384ad952724f"}, +] + +[package.dependencies] +cmake = "*" +filelock = "*" +lit = "*" +torch = "*" + +[package.extras] +tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)"] +tutorials = ["matplotlib", "pandas", "tabulate"] + +[[package]] +name = "typing-extensions" +version = "4.5.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, + {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, +] + +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +category = "main" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] + +[[package]] +name = "uc-micro-py" +version = "1.0.1" +description = "Micro subset of unicode data files for linkify-it-py projects." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "uc-micro-py-1.0.1.tar.gz", hash = "sha256:b7cdf4ea79433043ddfe2c82210208f26f7962c0cfbe3bacb05ee879a7fdb596"}, + {file = "uc_micro_py-1.0.1-py3-none-any.whl", hash = "sha256:316cfb8b6862a0f1d03540f0ae6e7b033ff1fa0ddbe60c12cbe0d4cec846a69f"}, +] + +[package.extras] +test = ["coverage", "pytest", "pytest-cov"] + +[[package]] +name = "urllib3" +version = "1.26.15" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, + {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "uvicorn" +version = "0.21.1" +description = "The lightning-fast ASGI server." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uvicorn-0.21.1-py3-none-any.whl", hash = "sha256:e47cac98a6da10cd41e6fd036d472c6f58ede6c5dbee3dbee3ef7a100ed97742"}, + {file = "uvicorn-0.21.1.tar.gz", hash = "sha256:0fac9cb342ba099e0d582966005f3fdba5b0290579fed4a6266dc702ca7bb032"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "virtualenv" +version = "20.21.0" +description = "Virtual Python Environment builder" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.21.0-py3-none-any.whl", hash = "sha256:31712f8f2a17bd06234fa97fdf19609e789dd4e3e4bf108c3da71d710651adbc"}, + {file = "virtualenv-20.21.0.tar.gz", hash = "sha256:f50e3e60f990a0757c9b68333c9fdaa72d7188caa417f96af9e52407831a3b68"}, +] + +[package.dependencies] +distlib = ">=0.3.6,<1" +filelock = ">=3.4.1,<4" +platformdirs = ">=2.4,<4" + +[package.extras] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] +test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23)", "pytest (>=7.2.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"] + +[[package]] +name = "wcwidth" +version = "0.2.6" +description = "Measures the displayed width of unicode strings in a terminal" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, + {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, +] + +[[package]] +name = "websocket-client" +version = "1.5.1" +description = "WebSocket client for Python with low level API options" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "websocket-client-1.5.1.tar.gz", hash = "sha256:3f09e6d8230892547132177f575a4e3e73cfdf06526e20cc02aa1c3b47184d40"}, + {file = "websocket_client-1.5.1-py3-none-any.whl", hash = "sha256:cdf5877568b7e83aa7cf2244ab56a3213de587bbe0ce9d8b9600fc77b455d89e"}, +] + +[package.extras] +docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + +[[package]] +name = "websockets" +version = "11.0.1" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "websockets-11.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d30cc1a90bcbf9e22e1f667c1c5a7428e2d37362288b4ebfd5118eb0b11afa9"}, + {file = "websockets-11.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dc77283a7c7b2b24e00fe8c3c4f7cf36bba4f65125777e906aae4d58d06d0460"}, + {file = "websockets-11.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0929c2ebdf00cedda77bf77685693e38c269011236e7c62182fee5848c29a4fa"}, + {file = "websockets-11.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db234da3aff01e8483cf0015b75486c04d50dbf90004bd3e5b46d384e1bd6c9e"}, + {file = "websockets-11.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7fdfbed727ce6b4b5e6622d15a6efb2098b2d9e22ba4dc54b2e3ce80f982045"}, + {file = "websockets-11.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5f3d0d177b3db3d1d02cce7ba6c0063586499ac28afe0c992be74ffc40d9257"}, + {file = "websockets-11.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:25ea5dbd3b00c56b034639dc6fe4d1dd095b8205bab1782d9a47cb020695fdf4"}, + {file = "websockets-11.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:dbeada3b8f1f6d9497840f761906c4236f912a42da4515520168bc7c525b52b0"}, + {file = "websockets-11.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:892959b627eedcdf98ac7022f9f71f050a59624b380b67862da10c32ea3c221a"}, + {file = "websockets-11.0.1-cp310-cp310-win32.whl", hash = "sha256:fc0a96a6828bfa6f1ccec62b54630bcdcc205d483f5a8806c0a8abb26101c54b"}, + {file = "websockets-11.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:3a88375b648a2c479532943cc19a018df1e5fcea85d5f31963c0b22794d1bdc1"}, + {file = "websockets-11.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3cf18bbd44b36749b7b66f047a30a40b799b8c0bd9a1b9173cba86a234b4306b"}, + {file = "websockets-11.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:deb0dd98ea4e76b833f0bfd7a6042b51115360d5dfcc7c1daa72dfc417b3327a"}, + {file = "websockets-11.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:45a85dc6b3ff76239379feb4355aadebc18d6e587c8deb866d11060755f4d3ea"}, + {file = "websockets-11.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d68bd2a3e9fff6f7043c0a711cb1ebba9f202c196a3943d0c885650cd0b6464"}, + {file = "websockets-11.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfd0b9b18d64c51e5cd322e16b5bf4fe490db65c9f7b18fd5382c824062ead7e"}, + {file = "websockets-11.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef0e6253c36e42f2637cfa3ff9b3903df60d05ec040c718999f6a0644ce1c497"}, + {file = "websockets-11.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:12180bc1d72c6a9247472c1dee9dfd7fc2e23786f25feee7204406972d8dab39"}, + {file = "websockets-11.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a797da96d4127e517a5cb0965cd03fd6ec21e02667c1258fa0579501537fbe5c"}, + {file = "websockets-11.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:07cc20655fb16aeef1a8f03236ba8671c61d332580b996b6396a5b7967ba4b3d"}, + {file = "websockets-11.0.1-cp311-cp311-win32.whl", hash = "sha256:a01c674e0efe0f14aec7e722ed0e0e272fa2f10e8ea8260837e1f4f5dc4b3e53"}, + {file = "websockets-11.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:2796f097841619acf053245f266a4f66cb27c040f0d9097e5f21301aab95ff43"}, + {file = "websockets-11.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:54d084756c50dfc8086dce97b945f210ca43950154e1e04a44a30c6e6a2bcbb1"}, + {file = "websockets-11.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fe2aed5963ca267c40a2d29b1ee4e8ab008ac8d5daa284fdda9275201b8a334"}, + {file = "websockets-11.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84e92dbac318a84fef722f38ca57acef19cbb89527aba5d420b96aa2656970ee"}, + {file = "websockets-11.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec4e87eb9916b481216b1fede7d8913be799915f5216a0c801867cbed8eeb903"}, + {file = "websockets-11.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d4e0990b6a04b07095c969969da659eecf9069cf8e7b8f49c8f5ee1bb50e3352"}, + {file = "websockets-11.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c90343fd0774749d23c1891dd8b3e9210f9afd30986673ce0f9d5857f5cb1562"}, + {file = "websockets-11.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ac042e8ba9d7f2618e84af27927fdce0f3e03528eb74f343977486c093868389"}, + {file = "websockets-11.0.1-cp37-cp37m-win32.whl", hash = "sha256:385c5391becb9b58e0a4f33345e12762fd857ccf9fbf6fee428669929ba45e4c"}, + {file = "websockets-11.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:aef1602db81096ce3d3847865128c8879635bdad7963fb2b7df290edb9e9150a"}, + {file = "websockets-11.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:52ba83ea132390e426f9a7b48848248a2dc0e7120ca8c65d5a8fc1efaa4eb51b"}, + {file = "websockets-11.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:007ed0d62f7e06eeb6e3a848b0d83b9fbd9e14674a59a61326845f27d20d7452"}, + {file = "websockets-11.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f888b9565ca1d1c25ab827d184f57f4772ffbfa6baf5710b873b01936cc335ee"}, + {file = "websockets-11.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db78535b791840a584c48cf3f4215eae38a7e2f43271ecd27ce4ba8a798beaaa"}, + {file = "websockets-11.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa1c23ed3a02732fba906ec337df65d4cc23f9f453635e1a803c285b59c7d987"}, + {file = "websockets-11.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e039f106d48d3c241f1943bccfb383bd38ec39900d6dcaad0c73cc5fe129f346"}, + {file = "websockets-11.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b0ed24a3aa4213029e100257e5e73c5f912e70ca35630081de94b7f9e2cf4a9b"}, + {file = "websockets-11.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5a3022f9291bf2d35ebf65929297d625e68effd3a5647b8eb8b89d51b09394c"}, + {file = "websockets-11.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1cb23597819f68ac6a6d133a002a1b3ef12a22850236b083242c93f81f206d5a"}, + {file = "websockets-11.0.1-cp38-cp38-win32.whl", hash = "sha256:349dd1fa56a30d530555988be98013688de67809f384671883f8bf8b8c9de984"}, + {file = "websockets-11.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:87ae582cf2319e45bc457a57232daded27a3c771263cab42fb8864214bbd74ea"}, + {file = "websockets-11.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a88815a0c6253ad1312ef186620832fb347706c177730efec34e3efe75e0e248"}, + {file = "websockets-11.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d5a6fa353b5ef36970c3bd1cd7cecbc08bb8f2f1a3d008b0691208cf34ebf5b0"}, + {file = "websockets-11.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5ffe6fc5e5fe9f2634cdc59b805e4ba1fcccf3a5622f5f36c3c7c287f606e283"}, + {file = "websockets-11.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b138f4bf8a64c344e12c76283dac279d11adab89ac62ae4a32ac8490d3c94832"}, + {file = "websockets-11.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aedd94422745da60672a901f53de1f50b16e85408b18672b9b210db4a776b5a6"}, + {file = "websockets-11.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4667d4e41fa37fa3d836b2603b8b40d6887fa4838496d48791036394f7ace39"}, + {file = "websockets-11.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:43e0de552be624e5c0323ff4fcc9f0b4a9a6dc6e0116b8aa2cbb6e0d3d2baf09"}, + {file = "websockets-11.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ceeef57b9aec8f27e523de4da73c518ece7721aefe7064f18aa28baabfe61b94"}, + {file = "websockets-11.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9d91279d57f6546eaf43671d1de50621e0578f13c2f17c96c458a72d170698d7"}, + {file = "websockets-11.0.1-cp39-cp39-win32.whl", hash = "sha256:29282631da3bfeb5db497e4d3d94d56ee36222fbebd0b51014e68a2e70736fb1"}, + {file = "websockets-11.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:e2654e94c705ce9b768441d8e3a387a84951ca1056efdc4a26a4a6ee723c01b6"}, + {file = "websockets-11.0.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:60a19d4ff5f451254f8623f6aa4169065f73a50ec7b59ab6b9dcddff4aa00267"}, + {file = "websockets-11.0.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a58e83f82098d062ae5d4cbe7073b8783999c284d6f079f2fefe87cd8957ac8"}, + {file = "websockets-11.0.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b91657b65355954e47f0df874917fa200426b3a7f4e68073326a8cfc2f6deef8"}, + {file = "websockets-11.0.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53b8e1ee01eb5b8be5c8a69ae26b0820dbc198d092ad50b3451adc3cdd55d455"}, + {file = "websockets-11.0.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:5d8d5d17371ed9eb9f0e3a8d326bdf8172700164c2e705bc7f1905a719a189be"}, + {file = "websockets-11.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e53419201c6c1439148feb99de6b307651a88b8defd41348cc23bbe2a290de1d"}, + {file = "websockets-11.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:718d19c494637f28e651031b3df6a791b9e86e0097c65ed5e8ec49b400b1210e"}, + {file = "websockets-11.0.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7b2544eb3e7bc39ce59812371214cd97762080dab90c3afc857890039384753"}, + {file = "websockets-11.0.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec4a887d2236e3878c07033ad5566f6b4d5d954b85f92a219519a1745d0c93e9"}, + {file = "websockets-11.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ae59a9f0a77ecb0cbdedea7d206a547ff136e8bfbc7d2d98772fb02d398797bb"}, + {file = "websockets-11.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ef35cef161f76031f833146f895e7e302196e01c704c00d269c04d8e18f3ac37"}, + {file = "websockets-11.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79b6548e57ab18f071b9bfe3ffe02af7184dd899bc674e2817d8fe7e9e7489ec"}, + {file = "websockets-11.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8d9793f3fb0da16232503df14411dabafed5a81fc9077dc430cfc6f60e71179"}, + {file = "websockets-11.0.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42aa05e890fcf1faed8e535c088a1f0f27675827cbacf62d3024eb1e6d4c9e0c"}, + {file = "websockets-11.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5d4f4b341100d313b08149d7031eb6d12738ac758b0c90d2f9be8675f401b019"}, + {file = "websockets-11.0.1-py3-none-any.whl", hash = "sha256:85b4127f7da332feb932eee833c70e5e1670469e8c9de7ef3874aa2a91a6fbb2"}, + {file = "websockets-11.0.1.tar.gz", hash = "sha256:369410925b240b30ef1c1deadbd6331e9cd865ad0b8966bf31e276cc8e0da159"}, +] + +[[package]] +name = "werkzeug" +version = "2.3.0" +description = "The comprehensive WSGI web application library." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Werkzeug-2.3.0-py3-none-any.whl", hash = "sha256:340335057f72974d9281dbaf52c8090a9f9a59ba304ae814bf0656e6559c0020"}, + {file = "Werkzeug-2.3.0.tar.gz", hash = "sha256:3b6b46926d052b8ebca97c4dc73c12e47bdd07d57ab0600c039c3155450227bc"}, +] + +[package.dependencies] +MarkupSafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog (>=2.3)"] + +[[package]] +name = "wheel" +version = "0.40.0" +description = "A built-package format for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "wheel-0.40.0-py3-none-any.whl", hash = "sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247"}, + {file = "wheel-0.40.0.tar.gz", hash = "sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873"}, +] + +[package.extras] +test = ["pytest (>=6.0.0)"] + +[[package]] +name = "yarl" +version = "1.8.2" +description = "Yet another URL library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bb81f753c815f6b8e2ddd2eef3c855cf7da193b82396ac013c661aaa6cc6b0a5"}, + {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:47d49ac96156f0928f002e2424299b2c91d9db73e08c4cd6742923a086f1c863"}, + {file = "yarl-1.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3fc056e35fa6fba63248d93ff6e672c096f95f7836938241ebc8260e062832fe"}, + {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a3c13d1c3005dbbac5c9f0d3210b60220a65a999b1833aa46bd6677c69b08e"}, + {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10b08293cda921157f1e7c2790999d903b3fd28cd5c208cf8826b3b508026996"}, + {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de986979bbd87272fe557e0a8fcb66fd40ae2ddfe28a8b1ce4eae22681728fef"}, + {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4fcfa71e2c6a3cb568cf81aadc12768b9995323186a10827beccf5fa23d4f8"}, + {file = "yarl-1.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae4d7ff1049f36accde9e1ef7301912a751e5bae0a9d142459646114c70ecba6"}, + {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf071f797aec5b96abfc735ab97da9fd8f8768b43ce2abd85356a3127909d146"}, + {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:74dece2bfc60f0f70907c34b857ee98f2c6dd0f75185db133770cd67300d505f"}, + {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:df60a94d332158b444301c7f569659c926168e4d4aad2cfbf4bce0e8fb8be826"}, + {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:63243b21c6e28ec2375f932a10ce7eda65139b5b854c0f6b82ed945ba526bff3"}, + {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cfa2bbca929aa742b5084fd4663dd4b87c191c844326fcb21c3afd2d11497f80"}, + {file = "yarl-1.8.2-cp310-cp310-win32.whl", hash = "sha256:b05df9ea7496df11b710081bd90ecc3a3db6adb4fee36f6a411e7bc91a18aa42"}, + {file = "yarl-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:24ad1d10c9db1953291f56b5fe76203977f1ed05f82d09ec97acb623a7976574"}, + {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a1fca9588f360036242f379bfea2b8b44cae2721859b1c56d033adfd5893634"}, + {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f37db05c6051eff17bc832914fe46869f8849de5b92dc4a3466cd63095d23dfd"}, + {file = "yarl-1.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77e913b846a6b9c5f767b14dc1e759e5aff05502fe73079f6f4176359d832581"}, + {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0978f29222e649c351b173da2b9b4665ad1feb8d1daa9d971eb90df08702668a"}, + {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388a45dc77198b2460eac0aca1efd6a7c09e976ee768b0d5109173e521a19daf"}, + {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2305517e332a862ef75be8fad3606ea10108662bc6fe08509d5ca99503ac2aee"}, + {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42430ff511571940d51e75cf42f1e4dbdded477e71c1b7a17f4da76c1da8ea76"}, + {file = "yarl-1.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3150078118f62371375e1e69b13b48288e44f6691c1069340081c3fd12c94d5b"}, + {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c15163b6125db87c8f53c98baa5e785782078fbd2dbeaa04c6141935eb6dab7a"}, + {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4d04acba75c72e6eb90745447d69f84e6c9056390f7a9724605ca9c56b4afcc6"}, + {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e7fd20d6576c10306dea2d6a5765f46f0ac5d6f53436217913e952d19237efc4"}, + {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75c16b2a900b3536dfc7014905a128a2bea8fb01f9ee26d2d7d8db0a08e7cb2c"}, + {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6d88056a04860a98341a0cf53e950e3ac9f4e51d1b6f61a53b0609df342cc8b2"}, + {file = "yarl-1.8.2-cp311-cp311-win32.whl", hash = "sha256:fb742dcdd5eec9f26b61224c23baea46c9055cf16f62475e11b9b15dfd5c117b"}, + {file = "yarl-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c46d3d89902c393a1d1e243ac847e0442d0196bbd81aecc94fcebbc2fd5857c"}, + {file = "yarl-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ceff9722e0df2e0a9e8a79c610842004fa54e5b309fe6d218e47cd52f791d7ef"}, + {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f6b4aca43b602ba0f1459de647af954769919c4714706be36af670a5f44c9c1"}, + {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1684a9bd9077e922300ecd48003ddae7a7474e0412bea38d4631443a91d61077"}, + {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebb78745273e51b9832ef90c0898501006670d6e059f2cdb0e999494eb1450c2"}, + {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3adeef150d528ded2a8e734ebf9ae2e658f4c49bf413f5f157a470e17a4a2e89"}, + {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57a7c87927a468e5a1dc60c17caf9597161d66457a34273ab1760219953f7f4c"}, + {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:efff27bd8cbe1f9bd127e7894942ccc20c857aa8b5a0327874f30201e5ce83d0"}, + {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a783cd344113cb88c5ff7ca32f1f16532a6f2142185147822187913eb989f739"}, + {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:705227dccbe96ab02c7cb2c43e1228e2826e7ead880bb19ec94ef279e9555b5b"}, + {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:34c09b43bd538bf6c4b891ecce94b6fa4f1f10663a8d4ca589a079a5018f6ed7"}, + {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a48f4f7fea9a51098b02209d90297ac324241bf37ff6be6d2b0149ab2bd51b37"}, + {file = "yarl-1.8.2-cp37-cp37m-win32.whl", hash = "sha256:0414fd91ce0b763d4eadb4456795b307a71524dbacd015c657bb2a39db2eab89"}, + {file = "yarl-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d881d152ae0007809c2c02e22aa534e702f12071e6b285e90945aa3c376463c5"}, + {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5df5e3d04101c1e5c3b1d69710b0574171cc02fddc4b23d1b2813e75f35a30b1"}, + {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a66c506ec67eb3159eea5096acd05f5e788ceec7b96087d30c7d2865a243918"}, + {file = "yarl-1.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2b4fa2606adf392051d990c3b3877d768771adc3faf2e117b9de7eb977741229"}, + {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e21fb44e1eff06dd6ef971d4bdc611807d6bd3691223d9c01a18cec3677939e"}, + {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93202666046d9edadfe9f2e7bf5e0782ea0d497b6d63da322e541665d65a044e"}, + {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc77086ce244453e074e445104f0ecb27530d6fd3a46698e33f6c38951d5a0f1"}, + {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dd68a92cab699a233641f5929a40f02a4ede8c009068ca8aa1fe87b8c20ae3"}, + {file = "yarl-1.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b372aad2b5f81db66ee7ec085cbad72c4da660d994e8e590c997e9b01e44901"}, + {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e6f3515aafe0209dd17fb9bdd3b4e892963370b3de781f53e1746a521fb39fc0"}, + {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dfef7350ee369197106805e193d420b75467b6cceac646ea5ed3049fcc950a05"}, + {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:728be34f70a190566d20aa13dc1f01dc44b6aa74580e10a3fb159691bc76909d"}, + {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ff205b58dc2929191f68162633d5e10e8044398d7a45265f90a0f1d51f85f72c"}, + {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf211dcad448a87a0d9047dc8282d7de59473ade7d7fdf22150b1d23859f946"}, + {file = "yarl-1.8.2-cp38-cp38-win32.whl", hash = "sha256:272b4f1599f1b621bf2aabe4e5b54f39a933971f4e7c9aa311d6d7dc06965165"}, + {file = "yarl-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:326dd1d3caf910cd26a26ccbfb84c03b608ba32499b5d6eeb09252c920bcbe4f"}, + {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f8ca8ad414c85bbc50f49c0a106f951613dfa5f948ab69c10ce9b128d368baf8"}, + {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:418857f837347e8aaef682679f41e36c24250097f9e2f315d39bae3a99a34cbf"}, + {file = "yarl-1.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae0eec05ab49e91a78700761777f284c2df119376e391db42c38ab46fd662b77"}, + {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:009a028127e0a1755c38b03244c0bea9d5565630db9c4cf9572496e947137a87"}, + {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3edac5d74bb3209c418805bda77f973117836e1de7c000e9755e572c1f7850d0"}, + {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da65c3f263729e47351261351b8679c6429151ef9649bba08ef2528ff2c423b2"}, + {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef8fb25e52663a1c85d608f6dd72e19bd390e2ecaf29c17fb08f730226e3a08"}, + {file = "yarl-1.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcd7bb1e5c45274af9a1dd7494d3c52b2be5e6bd8d7e49c612705fd45420b12d"}, + {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44ceac0450e648de86da8e42674f9b7077d763ea80c8ceb9d1c3e41f0f0a9951"}, + {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:97209cc91189b48e7cfe777237c04af8e7cc51eb369004e061809bcdf4e55220"}, + {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:48dd18adcf98ea9cd721a25313aef49d70d413a999d7d89df44f469edfb38a06"}, + {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e59399dda559688461762800d7fb34d9e8a6a7444fd76ec33220a926c8be1516"}, + {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d617c241c8c3ad5c4e78a08429fa49e4b04bedfc507b34b4d8dceb83b4af3588"}, + {file = "yarl-1.8.2-cp39-cp39-win32.whl", hash = "sha256:cb6d48d80a41f68de41212f3dfd1a9d9898d7841c8f7ce6696cf2fd9cb57ef83"}, + {file = "yarl-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:6604711362f2dbf7160df21c416f81fac0de6dbcf0b5445a2ef25478ecc4c778"}, + {file = "yarl-1.8.2.tar.gz", hash = "sha256:49d43402c6e3013ad0978602bf6bf5328535c48d192304b91b97a3c6790b1562"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[[package]] +name = "zipp" +version = "3.15.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.8,<3.11" +content-hash = "8e64a2b93dabc8575e2b5a3cee4815aee0c2f8dc0ad7a86681cd581b827acae1" diff --git a/voice_conversion/so-vits-svc-paul-v2/pyproject.toml b/voice_conversion/so-vits-svc-paul-v2/pyproject.toml new file mode 100644 index 0000000..e2a2920 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/pyproject.toml @@ -0,0 +1,130 @@ +[tool.poetry] +name = "so-vits-svc-fork" +version = "3.12.1" +description = "A fork of so-vits-svc." +authors = ["34j <34j.95a2p@simplelogin.com>"] +license = "MIT" +#readme = "README.md" +repository = "https://github.com/34j/so-vits-svc-fork" +documentation = "https://so-vits-svc-fork.readthedocs.io" +classifiers = [ + "Development Status :: 2 - Pre-Alpha", + "Intended Audience :: Developers", + "Natural Language :: English", + "Operating System :: OS Independent", + "Topic :: Software Development :: Libraries", +] +packages = [ + { include = "so_vits_svc_fork", from = "src" }, +] + +[tool.poetry.scripts] +so-vits-svc-fork = "so_vits_svc_fork.__main__:cli" +svc = "so_vits_svc_fork.__main__:cli" +svcf = "so_vits_svc_fork.__main__:cli" +svcg = "so_vits_svc_fork.gui:main" +svc-gui = "so_vits_svc_fork.gui:main" +svcf-gui = "so_vits_svc_fork.gui:main" + +[tool.poetry.urls] +"Bug Tracker" = "https://github.com/34j/so-vits-svc-fork/issues" +"Changelog" = "https://github.com/34j/so-vits-svc-fork/blob/main/CHANGELOG.md" + +[tool.poetry.dependencies] +python = ">=3.8,<3.11" +librosa = "0.9.1" +numpy = "1.23.5" +pydub = "0.25.1" +pyworld = "0.2.12" +scipy = "1.8.0" +tqdm = "4.65.0" +scikit-maad = "1.3.12" +onnx = "1.13.1" +onnxsim = "0.4.28" +onnxoptimizer = "0.3.10" +torch = "1.13.1" +torchaudio = "0.13.1" +tensorboard = "2.12.0" +rich = "13.3.5" +tqdm-joblib = "0.0.3" +tensorboardx = "2.6" +pyinputplus = "0.2.12" +cm-time = "0.1.2" +pysimplegui = "4.60.4" +pebble = "5.0.3" +torchcrepe = "0.0.18" +lightning = "2.0.2" +transformers = "^4.28.1" +matplotlib = "3.7.1" + +[tool.poetry.group.dev.dependencies] +pre-commit = ">=3" +pytest = "^7.0" +pytest-cov = "^4.0.0" + +[tool.poetry.group.docs] +optional = true + +[tool.poetry.group.docs.dependencies] +myst-parser = ">=0.16" +sphinx = ">=4.0" +sphinx-rtd-theme = ">=1.0" + +[tool.semantic_release] +branch = "main" +version_toml = "pyproject.toml:tool.poetry.version" +version_variable = "src/so_vits_svc_fork/__init__.py:__version__" +build_command = "pip install poetry && poetry build" + +[tool.pytest.ini_options] +addopts = "-v -Wdefault --cov=so_vits_svc_fork --cov-report=term-missing:skip-covered" +pythonpath = ["src"] + +[tool.coverage.run] +branch = true + +[tool.coverage.report] +exclude_lines = [ + "pragma: no cover", + "@overload", + "if TYPE_CHECKING", + "raise NotImplementedError", + 'if __name__ == "__main__":', +] + +[tool.isort] +profile = "black" +known_first_party = ["so_vits_svc_fork", "tests"] + +[tool.autoflake] +remove_all_unused_imports = true + +[tool.mypy] +check_untyped_defs = true +disallow_any_generics = true +disallow_incomplete_defs = true +disallow_untyped_defs = true +mypy_path = "src/" +no_implicit_optional = true +show_error_codes = true +warn_unreachable = true +warn_unused_ignores = true +exclude = [ + 'docs/.*', + 'setup.py', +] + +[[tool.mypy.overrides]] +module = "tests.*" +allow_untyped_defs = true + +[[tool.mypy.overrides]] +module = "docs.*" +ignore_errors = true + +[tool.bandit] +exclude_dirs = ["src"] + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/voice_conversion/so-vits-svc-paul-v2/renovate.json b/voice_conversion/so-vits-svc-paul-v2/renovate.json new file mode 100644 index 0000000..0200e15 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/renovate.json @@ -0,0 +1,3 @@ +{ + "extends": ["github>browniebroke/renovate-configs:python"] +} diff --git a/voice_conversion/so-vits-svc-paul-v2/requirements.txt b/voice_conversion/so-vits-svc-paul-v2/requirements.txt new file mode 100644 index 0000000..886331a --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/requirements.txt @@ -0,0 +1,24 @@ +librosa = "0.9.1" +numpy = "1.23.5" +pydub = "0.25.1" +pyworld = "0.2.12" +scipy = "1.8.0" +tqdm = "4.65.0" +scikit-maad = "1.3.12" +onnx = "1.13.1" +onnxsim = "0.4.28" +onnxoptimizer = "0.3.10" +torch = "1.13.1" +torchaudio = "0.13.1" +tensorboard = "2.12.0" +rich = "13.3.5" +tqdm-joblib = "0.0.3" +tensorboardx = "2.6" +pyinputplus = "0.2.12" +cm-time = "0.1.2" +pysimplegui = "4.60.4" +pebble = "5.0.3" +torchcrepe = "0.0.18" +lightning = "2.0.2" +transformers = "4.28.1" +matplotlib = "3.7.1" diff --git a/voice_conversion/so-vits-svc-paul-v2/setup.py b/voice_conversion/so-vits-svc-paul-v2/setup.py new file mode 100644 index 0000000..aa05c82 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/setup.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python + +# This is a shim to allow GitHub to detect the package, build is done with poetry +# Taken from https://github.com/Textualize/rich + +import setuptools + +if __name__ == "__main__": + setuptools.setup(name="so-vits-svc-fork") diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/__init__.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/__init__.py new file mode 100644 index 0000000..e1cfd19 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/__init__.py @@ -0,0 +1,5 @@ +__version__ = "3.12.1" + +from .logger import init_logger + +init_logger() diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/__main__.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/__main__.py new file mode 100644 index 0000000..a3e17ab --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/__main__.py @@ -0,0 +1,863 @@ +from __future__ import annotations + +import os +from logging import getLogger +from multiprocessing import freeze_support +from pathlib import Path +from typing import Literal + +import click +import pyinputplus as pyip +import torch + +from so_vits_svc_fork import __version__ +from so_vits_svc_fork.utils import get_optimal_device + +LOG = getLogger(__name__) + +IS_TEST = "test" in Path(__file__).parent.stem +if IS_TEST: + LOG.debug("Test mode is on.") + + +class RichHelpFormatter(click.HelpFormatter): + def __init__( + self, + indent_increment: int = 2, + width: int | None = None, + max_width: int | None = None, + ) -> None: + width = 100 + super().__init__(indent_increment, width, max_width) + LOG.info(f"Version: {__version__}") + + +def patch_wrap_text(): + orig_wrap_text = click.formatting.wrap_text + + def wrap_text( + text, + width=78, + initial_indent="", + subsequent_indent="", + preserve_paragraphs=False, + ): + return orig_wrap_text( + text.replace("\n", "\n\n"), + width=width, + initial_indent=initial_indent, + subsequent_indent=subsequent_indent, + preserve_paragraphs=True, + ).replace("\n\n", "\n") + + click.formatting.wrap_text = wrap_text + + +patch_wrap_text() + +CONTEXT_SETTINGS = dict(help_option_names=["-h", "--help"], show_default=True) +click.Context.formatter_class = RichHelpFormatter + + +@click.group(context_settings=CONTEXT_SETTINGS) +def cli(): + """so-vits-svc allows any folder structure for training data. + However, the following folder structure is recommended.\n + When training: dataset_raw/{speaker_name}/**/{wav_name}.{any_format}\n + When inference: configs/44k/config.json, logs/44k/G_XXXX.pth\n + If the folder structure is followed, you DO NOT NEED TO SPECIFY model path, config path, etc. + (The latest model will be automatically loaded.)\n + To train a model, run pre-resample, pre-config, pre-hubert, train.\n + To infer a model, run infer. + """ + + +@cli.command() +@click.option( + "-c", + "--config-path", + type=click.Path(exists=True), + help="path to config", + default=Path("./configs/44k/config.json"), +) +@click.option( + "-m", + "--model-path", + type=click.Path(), + help="path to output dir", + default=Path("./logs/44k"), +) +@click.option( + "-t/-nt", + "--tensorboard/--no-tensorboard", + default=False, + type=bool, + help="launch tensorboard", +) +@click.option( + "-r", + "--reset-optimizer", + default=False, + type=bool, + help="reset optimizer", + is_flag=True, +) +def train( + config_path: Path, + model_path: Path, + tensorboard: bool = False, + reset_optimizer: bool = False, +): + """Train model + If D_0.pth or G_0.pth not found, automatically download from hub.""" + from .train import train + + config_path = Path(config_path) + model_path = Path(model_path) + + if tensorboard: + import webbrowser + + from tensorboard import program + + getLogger("tensorboard").setLevel(30) + tb = program.TensorBoard() + tb.configure(argv=[None, "--logdir", model_path.as_posix()]) + url = tb.launch() + webbrowser.open(url) + + train( + config_path=config_path, model_path=model_path, reset_optimizer=reset_optimizer + ) + + +@cli.command() +@click.argument( + "input-path", + type=click.Path(exists=True), +) +@click.option( + "-o", + "--output-path", + type=click.Path(), + help="path to output dir", +) +@click.option("-s", "--speaker", type=str, default=None, help="speaker name") +@click.option( + "-m", + "--model-path", + type=click.Path(exists=True), + default=Path("./logs/44k/"), + help="path to model", +) +@click.option( + "-c", + "--config-path", + type=click.Path(exists=True), + default=Path("./configs/44k/config.json"), + help="path to config", +) +@click.option( + "-k", + "--cluster-model-path", + type=click.Path(exists=True), + default=None, + help="path to cluster model", +) +@click.option("-t", "--transpose", type=int, default=0, help="transpose") +@click.option( + "-db", "--db-thresh", type=int, default=-20, help="threshold (DB) (RELATIVE)" +) +@click.option( + "-fm", + "--f0-method", + type=click.Choice(["crepe", "crepe-tiny", "parselmouth", "dio", "harvest"]), + default="dio", + help="f0 prediction method", +) +@click.option( + "-a/-na", + "--auto-predict-f0/--no-auto-predict-f0", + type=bool, + default=False, + help="auto predict f0", +) +@click.option( + "-r", "--cluster-infer-ratio", type=float, default=0, help="cluster infer ratio" +) +@click.option("-n", "--noise-scale", type=float, default=0.4, help="noise scale") +@click.option("-p", "--pad-seconds", type=float, default=0.5, help="pad seconds") +@click.option( + "-d", + "--device", + type=str, + default=get_optimal_device(), + help="device", +) +@click.option("-ch", "--chunk-seconds", type=float, default=0.5, help="chunk seconds") +@click.option( + "-ab/-nab", + "--absolute-thresh/--no-absolute-thresh", + type=bool, + default=False, + help="absolute thresh", +) +def infer( + # paths + input_path: Path, + output_path: Path, + model_path: Path, + config_path: Path, + # svc config + speaker: str, + cluster_model_path: Path | None = None, + transpose: int = 0, + auto_predict_f0: bool = False, + cluster_infer_ratio: float = 0, + noise_scale: float = 0.4, + f0_method: Literal["crepe", "crepe-tiny", "parselmouth", "dio", "harvest"] = "dio", + # slice config + db_thresh: int = -40, + pad_seconds: float = 0.5, + chunk_seconds: float = 0.5, + absolute_thresh: bool = False, + device: str | torch.device = get_optimal_device(), +): + """Inference""" + from so_vits_svc_fork.inference.main import infer + + if not auto_predict_f0: + LOG.warning( + f"auto_predict_f0 = False, transpose = {transpose}. If you want to change the pitch, please set transpose." + "Generally transpose = 0 does not work because your voice pitch and target voice pitch are different." + ) + + input_path = Path(input_path) + if output_path is None: + output_path = input_path.parent / f"{input_path.stem}.out{input_path.suffix}" + output_path = Path(output_path) + model_path = Path(model_path) + if model_path.is_dir(): + model_path = list( + sorted(model_path.glob("G_*.pth"), key=lambda x: x.stat().st_mtime) + )[-1] + LOG.info(f"Since model_path is a directory, use {model_path}") + config_path = Path(config_path) + if cluster_model_path is not None: + cluster_model_path = Path(cluster_model_path) + infer( + # paths + input_path=input_path, + output_path=output_path, + model_path=model_path, + config_path=config_path, + # svc config + speaker=speaker, + cluster_model_path=cluster_model_path, + transpose=transpose, + auto_predict_f0=auto_predict_f0, + cluster_infer_ratio=cluster_infer_ratio, + noise_scale=noise_scale, + f0_method=f0_method, + # slice config + db_thresh=db_thresh, + pad_seconds=pad_seconds, + chunk_seconds=chunk_seconds, + absolute_thresh=absolute_thresh, + device=device, + ) + + +@cli.command() +@click.option( + "-m", + "--model-path", + type=click.Path(exists=True), + default=Path("./logs/44k/"), + help="path to model", +) +@click.option( + "-c", + "--config-path", + type=click.Path(exists=True), + default=Path("./configs/44k/config.json"), + help="path to config", +) +@click.option( + "-k", + "--cluster-model-path", + type=click.Path(exists=True), + default=None, + help="path to cluster model", +) +@click.option("-t", "--transpose", type=int, default=12, help="transpose") +@click.option( + "-a/-na", + "--auto-predict-f0/--no-auto-predict-f0", + type=bool, + default=True, + help="auto predict f0 (not recommended for realtime since voice pitch will not be stable)", +) +@click.option( + "-r", "--cluster-infer-ratio", type=float, default=0, help="cluster infer ratio" +) +@click.option("-n", "--noise-scale", type=float, default=0.4, help="noise scale") +@click.option( + "-db", "--db-thresh", type=int, default=-30, help="threshold (DB) (ABSOLUTE)" +) +@click.option( + "-fm", + "--f0-method", + type=click.Choice(["crepe", "crepe-tiny", "parselmouth", "dio", "harvest"]), + default="dio", + help="f0 prediction method", +) +@click.option("-p", "--pad-seconds", type=float, default=0.02, help="pad seconds") +@click.option("-ch", "--chunk-seconds", type=float, default=0.5, help="chunk seconds") +@click.option( + "-cr", + "--crossfade-seconds", + type=float, + default=0.01, + help="crossfade seconds", +) +@click.option( + "-ab", + "--additional-infer-before-seconds", + type=float, + default=0.2, + help="additional infer before seconds", +) +@click.option( + "-aa", + "--additional-infer-after-seconds", + type=float, + default=0.1, + help="additional infer after seconds", +) +@click.option("-b", "--block-seconds", type=float, default=0.5, help="block seconds") +@click.option( + "-d", + "--device", + type=str, + default=get_optimal_device(), + help="device", +) +@click.option("-s", "--speaker", type=str, default=None, help="speaker name") +@click.option("-v", "--version", type=int, default=2, help="version") +@click.option("-i", "--input-device", type=int, default=None, help="input device") +@click.option("-o", "--output-device", type=int, default=None, help="output device") +@click.option( + "-po", + "--passthrough-original", + type=bool, + default=False, + is_flag=True, + help="passthrough original (for latency check)", +) +def vc( + # paths + model_path: Path, + config_path: Path, + # svc config + speaker: str, + cluster_model_path: Path | None, + transpose: int, + auto_predict_f0: bool, + cluster_infer_ratio: float, + noise_scale: float, + f0_method: Literal["crepe", "crepe-tiny", "parselmouth", "dio", "harvest"], + # slice config + db_thresh: int, + pad_seconds: float, + chunk_seconds: float, + # realtime config + crossfade_seconds: float, + additional_infer_before_seconds: float, + additional_infer_after_seconds: float, + block_seconds: float, + version: int, + input_device: int | str | None, + output_device: int | str | None, + device: torch.device, + passthrough_original: bool = False, +) -> None: + """Realtime inference from microphone""" + from so_vits_svc_fork.inference.main import realtime + + if auto_predict_f0: + LOG.warning( + "auto_predict_f0 = True in realtime inference will cause unstable voice pitch, use with caution" + ) + else: + LOG.warning( + f"auto_predict_f0 = False, transpose = {transpose}. If you want to change the pitch, please change the transpose value." + "Generally transpose = 0 does not work because your voice pitch and target voice pitch are different." + ) + model_path = Path(model_path) + config_path = Path(config_path) + if cluster_model_path is not None: + cluster_model_path = Path(cluster_model_path) + if model_path.is_dir(): + model_path = list( + sorted(model_path.glob("G_*.pth"), key=lambda x: x.stat().st_mtime) + )[-1] + LOG.info(f"Since model_path is a directory, use {model_path}") + + realtime( + # paths + model_path=model_path, + config_path=config_path, + # svc config + speaker=speaker, + cluster_model_path=cluster_model_path, + transpose=transpose, + auto_predict_f0=auto_predict_f0, + cluster_infer_ratio=cluster_infer_ratio, + noise_scale=noise_scale, + f0_method=f0_method, + # slice config + db_thresh=db_thresh, + pad_seconds=pad_seconds, + chunk_seconds=chunk_seconds, + # realtime config + crossfade_seconds=crossfade_seconds, + additional_infer_before_seconds=additional_infer_before_seconds, + additional_infer_after_seconds=additional_infer_after_seconds, + block_seconds=block_seconds, + version=version, + input_device=input_device, + output_device=output_device, + device=device, + passthrough_original=passthrough_original, + ) + + +@cli.command() +@click.option( + "-i", + "--input-dir", + type=click.Path(exists=True), + default=Path("./dataset_raw"), + help="path to source dir", +) +@click.option( + "-o", + "--output-dir", + type=click.Path(), + default=Path("./dataset/44k"), + help="path to output dir", +) +@click.option("-s", "--sampling-rate", type=int, default=44100, help="sampling rate") +@click.option( + "-n", + "--n-jobs", + type=int, + default=-1, + help="number of jobs (optimal value may depend on your RAM capacity and audio duration per file)", +) +@click.option("-d", "--top-db", type=float, default=30, help="top db") +@click.option("-f", "--frame-seconds", type=float, default=1, help="frame seconds") +@click.option( + "-ho", "-hop", "--hop-seconds", type=float, default=0.3, help="hop seconds" +) +def pre_resample( + input_dir: Path, + output_dir: Path, + sampling_rate: int, + n_jobs: int, + top_db: int, + frame_seconds: float, + hop_seconds: float, +) -> None: + """Preprocessing part 1: resample""" + from so_vits_svc_fork.preprocessing.preprocess_resample import preprocess_resample + + input_dir = Path(input_dir) + output_dir = Path(output_dir) + preprocess_resample( + input_dir=input_dir, + output_dir=output_dir, + sampling_rate=sampling_rate, + n_jobs=n_jobs, + top_db=top_db, + frame_seconds=frame_seconds, + hop_seconds=hop_seconds, + ) + + +from so_vits_svc_fork.preprocessing.preprocess_flist_config import CONFIG_TEMPLATE_DIR + + +@cli.command() +@click.option( + "-i", + "--input-dir", + type=click.Path(exists=True), + default=Path("./dataset/44k"), + help="path to source dir", +) +@click.option( + "-f", + "--filelist-path", + type=click.Path(), + default=Path("./filelists/44k"), + help="path to filelist dir", +) +@click.option( + "-c", + "--config-path", + type=click.Path(), + default=Path("./configs/44k/config.json"), + help="path to config", +) +@click.option( + "-t", + "--config-type", + type=click.Choice([x.stem for x in CONFIG_TEMPLATE_DIR.rglob("*.json")]), + default="so-vits-svc-4.0v1-legacy", + help="config type", +) +def pre_config( + input_dir: Path, + filelist_path: Path, + config_path: Path, + config_type: str, +): + """Preprocessing part 2: config""" + from so_vits_svc_fork.preprocessing.preprocess_flist_config import preprocess_config + + input_dir = Path(input_dir) + filelist_path = Path(filelist_path) + config_path = Path(config_path) + preprocess_config( + input_dir=input_dir, + train_list_path=filelist_path / "train.txt", + val_list_path=filelist_path / "val.txt", + test_list_path=filelist_path / "test.txt", + config_path=config_path, + config_name=config_type, + ) + + +@cli.command() +@click.option( + "-i", + "--input-dir", + type=click.Path(exists=True), + default=Path("./dataset/44k"), + help="path to source dir", +) +@click.option( + "-c", + "--config-path", + type=click.Path(exists=True), + help="path to config", + default=Path("./configs/44k/config.json"), +) +@click.option( + "-n", + "--n-jobs", + type=int, + default=None, + help="number of jobs (optimal value may depend on your VRAM capacity and audio duration per file)", +) +@click.option( + "-f/-nf", + "--force-rebuild/--no-force-rebuild", + type=bool, + default=True, + help="force rebuild existing preprocessed files", +) +@click.option( + "-fm", + "--f0-method", + type=click.Choice(["crepe", "crepe-tiny", "parselmouth", "dio", "harvest"]), + default="dio", +) +def pre_hubert( + input_dir: Path, + config_path: Path, + n_jobs: bool, + force_rebuild: bool, + f0_method: Literal["crepe", "crepe-tiny", "parselmouth", "dio", "harvest"], +) -> None: + """Preprocessing part 3: hubert + If the HuBERT model is not found, it will be downloaded automatically.""" + from so_vits_svc_fork.preprocessing.preprocess_hubert_f0 import preprocess_hubert_f0 + + input_dir = Path(input_dir) + config_path = Path(config_path) + preprocess_hubert_f0( + input_dir=input_dir, + config_path=config_path, + n_jobs=n_jobs, + force_rebuild=force_rebuild, + f0_method=f0_method, + ) + + +@cli.command() +@click.option( + "-i", + "--input-dir", + type=click.Path(exists=True), + default=Path("./dataset_raw_raw/"), + help="path to source dir", +) +@click.option( + "-o", + "--output-dir", + type=click.Path(), + default=Path("./dataset_raw/"), + help="path to output dir", +) +@click.option( + "-n", + "--n-jobs", + type=int, + default=-1, + help="number of jobs (optimal value may depend on your VRAM capacity and audio duration per file)", +) +@click.option("-min", "--min-speakers", type=int, default=2, help="min speakers") +@click.option("-max", "--max-speakers", type=int, default=2, help="max speakers") +@click.option( + "-t", "--huggingface-token", type=str, default=None, help="huggingface token" +) +@click.option("-s", "--sr", type=int, default=44100, help="sampling rate") +def pre_sd( + input_dir: Path | str, + output_dir: Path | str, + min_speakers: int, + max_speakers: int, + huggingface_token: str | None, + n_jobs: int, + sr: int, +): + """Speech diarization using pyannote.audio""" + if huggingface_token is None: + huggingface_token = os.environ.get("HUGGINGFACE_TOKEN", None) + if huggingface_token is None: + huggingface_token = click.prompt( + "Please enter your HuggingFace token", hide_input=True + ) + if os.environ.get("HUGGINGFACE_TOKEN", None) is None: + LOG.info("You can also set the HUGGINGFACE_TOKEN environment variable.") + assert huggingface_token is not None + huggingface_token = huggingface_token.rstrip(" \n\r\t\0") + if len(huggingface_token) <= 1: + raise ValueError("HuggingFace token is empty: " + huggingface_token) + + if max_speakers == 1: + LOG.warning("Consider using pre-split if max_speakers == 1") + from so_vits_svc_fork.preprocessing.preprocess_speaker_diarization import ( + preprocess_speaker_diarization, + ) + + preprocess_speaker_diarization( + input_dir=input_dir, + output_dir=output_dir, + min_speakers=min_speakers, + max_speakers=max_speakers, + huggingface_token=huggingface_token, + n_jobs=n_jobs, + sr=sr, + ) + + +@cli.command() +@click.option( + "-i", + "--input-dir", + type=click.Path(exists=True), + default=Path("./dataset_raw_raw/"), + help="path to source dir", +) +@click.option( + "-o", + "--output-dir", + type=click.Path(), + default=Path("./dataset_raw/"), + help="path to output dir", +) +@click.option( + "-n", + "--n-jobs", + type=int, + default=-1, + help="number of jobs (optimal value may depend on your RAM capacity and audio duration per file)", +) +@click.option("-d", "--top-db", type=float, default=30, help="top db") +@click.option("-f", "--frame-seconds", type=float, default=1, help="frame seconds") +@click.option( + "-ho", "-hop", "--hop-seconds", type=float, default=0.3, help="hop seconds" +) +@click.option("-s", "--sr", type=int, default=44100, help="sample rate") +def pre_split( + input_dir: Path | str, + output_dir: Path | str, + top_db: int, + frame_seconds: float, + hop_seconds: float, + n_jobs: int, + sr: int, +): + """Split audio files into multiple files""" + from so_vits_svc_fork.preprocessing.preprocess_split import preprocess_split + + preprocess_split( + input_dir=input_dir, + output_dir=output_dir, + top_db=top_db, + frame_seconds=frame_seconds, + hop_seconds=hop_seconds, + n_jobs=n_jobs, + sr=sr, + ) + + +@cli.command() +@click.option( + "-i", + "--input-dir", + type=click.Path(exists=True), + required=True, + help="path to source dir", +) +@click.option( + "-o", + "--output-dir", + type=click.Path(), + default=None, + help="path to output dir", +) +@click.option( + "-c/-nc", + "--create-new/--no-create-new", + type=bool, + default=True, + help="create a new folder for the speaker if not exist", +) +def pre_classify( + input_dir: Path | str, + output_dir: Path | str | None, + create_new: bool, +) -> None: + """Classify multiple audio files into multiple files""" + from so_vits_svc_fork.preprocessing.preprocess_classify import preprocess_classify + + if output_dir is None: + output_dir = input_dir + preprocess_classify( + input_dir=input_dir, + output_dir=output_dir, + create_new=create_new, + ) + + +@cli.command +def clean(): + """Clean up files, only useful if you are using the default file structure""" + import shutil + + folders = ["dataset", "filelists", "logs"] + if pyip.inputYesNo(f"Are you sure you want to delete files in {folders}?") == "yes": + for folder in folders: + if Path(folder).exists(): + shutil.rmtree(folder) + LOG.info("Cleaned up files") + else: + LOG.info("Aborted") + + +@cli.command +@click.option( + "-i", + "--input-path", + type=click.Path(exists=True), + help="model path", + default=Path("./logs/44k/"), +) +@click.option( + "-o", + "--output-path", + type=click.Path(), + help="onnx model path to save", + default=None, +) +@click.option( + "-c", + "--config-path", + type=click.Path(), + help="config path", + default=Path("./configs/44k/config.json"), +) +@click.option( + "-d", + "--device", + type=str, + default="cpu", + help="device to use", +) +def onnx( + input_path: Path, output_path: Path, config_path: Path, device: torch.device | str +) -> None: + """Export model to onnx (currently not working)""" + raise NotImplementedError("ONNX export is not yet supported") + input_path = Path(input_path) + if input_path.is_dir(): + input_path = list(input_path.glob("*.pth"))[0] + if output_path is None: + output_path = input_path.with_suffix(".onnx") + output_path = Path(output_path) + if output_path.is_dir(): + output_path = output_path / (input_path.stem + ".onnx") + config_path = Path(config_path) + device_ = torch.device(device) + from so_vits_svc_fork.modules.onnx._export import onnx_export + + onnx_export( + input_path=input_path, + output_path=output_path, + config_path=config_path, + device=device_, + ) + + +@cli.command +@click.option( + "-i", + "--input-dir", + type=click.Path(exists=True), + help="dataset directory", + default=Path("./dataset/44k"), +) +@click.option( + "-o", + "--output-path", + type=click.Path(), + help="model path to save", + default=Path("./logs/44k/kmeans.pt"), +) +@click.option("-n", "--n-clusters", type=int, help="number of clusters", default=2000) +@click.option( + "-m/-nm", "--minibatch/--no-minibatch", default=True, help="use minibatch k-means" +) +def train_cluster( + input_dir: Path, output_path: Path, n_clusters: int, minibatch: bool +) -> None: + """Train k-means clustering""" + from .cluster.train_cluster import main + + main( + input_dir=input_dir, + output_path=output_path, + n_clusters=n_clusters, + verbose=True, + use_minibatch=minibatch, + ) + + +if __name__ == "__main__": + freeze_support() + cli() diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/cluster/__init__.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/cluster/__init__.py new file mode 100644 index 0000000..9155223 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/cluster/__init__.py @@ -0,0 +1,48 @@ +from __future__ import annotations + +from pathlib import Path +from typing import Any + +import torch +from sklearn.cluster import KMeans + + +def get_cluster_model(ckpt_path: Path | str): + with Path(ckpt_path).open("rb") as f: + checkpoint = torch.load( + f, map_location="cpu" + ) # Danger of arbitrary code execution + kmeans_dict = {} + for spk, ckpt in checkpoint.items(): + km = KMeans(ckpt["n_features_in_"]) + km.__dict__["n_features_in_"] = ckpt["n_features_in_"] + km.__dict__["_n_threads"] = ckpt["_n_threads"] + km.__dict__["cluster_centers_"] = ckpt["cluster_centers_"] + kmeans_dict[spk] = km + return kmeans_dict + + +def check_speaker(model: Any, speaker: Any): + if speaker not in model: + raise ValueError(f"Speaker {speaker} not in {list(model.keys())}") + + +def get_cluster_result(model: Any, x: Any, speaker: Any): + """ + x: np.array [t, 256] + return cluster class result + """ + check_speaker(model, speaker) + return model[speaker].predict(x) + + +def get_cluster_center_result(model: Any, x: Any, speaker: Any): + """x: np.array [t, 256]""" + check_speaker(model, speaker) + predict = model[speaker].predict(x) + return model[speaker].cluster_centers_[predict] + + +def get_center(model: Any, x: Any, speaker: Any): + check_speaker(model, speaker) + return model[speaker].cluster_centers_[x] diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/cluster/train_cluster.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/cluster/train_cluster.py new file mode 100644 index 0000000..b48f87d --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/cluster/train_cluster.py @@ -0,0 +1,91 @@ +from __future__ import annotations + +from logging import getLogger +from pathlib import Path +from typing import Any + +import numpy as np +import torch +from cm_time import timer +from joblib import Parallel, delayed +from sklearn.cluster import KMeans, MiniBatchKMeans +from tqdm_joblib import tqdm_joblib + +LOG = getLogger(__name__) + + +def train_cluster( + input_dir: Path | str, + n_clusters: int, + use_minibatch: bool = True, + verbose: bool = False, +) -> dict: + input_dir = Path(input_dir) + LOG.info(f"Loading features from {input_dir}") + features = [] + for path in input_dir.rglob("*.data.pt"): + with path.open("rb") as f: + features.append( + torch.load(f, weights_only=True)["content"].squeeze(0).numpy().T + ) + if not features: + raise ValueError(f"No features found in {input_dir}") + features = np.concatenate(features, axis=0).astype(np.float32) + if features.shape[0] < n_clusters: + raise ValueError( + "Too few HuBERT features to cluster. Consider using a smaller number of clusters." + ) + LOG.info( + f"shape: {features.shape}, size: {features.nbytes/1024**2:.2f} MB, dtype: {features.dtype}" + ) + with timer() as t: + if use_minibatch: + kmeans = MiniBatchKMeans( + n_clusters=n_clusters, + verbose=verbose, + batch_size=4096, + max_iter=80, + n_init="auto", + ).fit(features) + else: + kmeans = KMeans(n_clusters=n_clusters, verbose=verbose, n_init="auto").fit( + features + ) + LOG.info(f"Clustering took {t.elapsed:.2f} seconds") + + x = { + "n_features_in_": kmeans.n_features_in_, + "_n_threads": kmeans._n_threads, + "cluster_centers_": kmeans.cluster_centers_, + } + return x + + +def main( + input_dir: Path | str, + output_path: Path | str, + n_clusters: int = 10000, + use_minibatch: bool = True, + verbose: bool = False, +) -> None: + input_dir = Path(input_dir) + output_path = Path(output_path) + + def train_cluster_(input_path: Path, **kwargs: Any) -> tuple[str, dict]: + return input_path.stem, train_cluster(input_path, **kwargs) + + with tqdm_joblib(desc="Training clusters", total=len(list(input_dir.iterdir()))): + parallel_result = Parallel(n_jobs=-1)( + delayed(train_cluster_)( + speaker_name, + n_clusters=n_clusters, + use_minibatch=use_minibatch, + verbose=verbose, + ) + for speaker_name in input_dir.iterdir() + ) + assert parallel_result is not None + checkpoint = dict(parallel_result) + output_path.parent.mkdir(exist_ok=True, parents=True) + with output_path.open("wb") as f: + torch.save(checkpoint, f) diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/dataset.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/dataset.py new file mode 100644 index 0000000..f28f57b --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/dataset.py @@ -0,0 +1,87 @@ +from __future__ import annotations + +from pathlib import Path +from random import Random +from typing import Sequence + +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch.utils.data import Dataset + +from .hparams import HParams + + +class TextAudioDataset(Dataset): + def __init__(self, hps: HParams, is_validation: bool = False): + self.datapaths = [ + Path(x).parent / (Path(x).name + ".data.pt") + for x in Path( + hps.data.validation_files if is_validation else hps.data.training_files + ) + .read_text("utf-8") + .splitlines() + ] + self.hps = hps + self.random = Random(hps.train.seed) + self.random.shuffle(self.datapaths) + self.max_spec_len = 800 + + def __getitem__(self, index: int) -> dict[str, torch.Tensor]: + with Path(self.datapaths[index]).open("rb") as f: + data = torch.load(f, weights_only=True, map_location="cpu") + + # cut long data randomly + spec_len = data["mel_spec"].shape[1] + hop_len = self.hps.data.hop_length + if spec_len > self.max_spec_len: + start = self.random.randint(0, spec_len - self.max_spec_len) + end = start + self.max_spec_len - 10 + for key in data.keys(): + if key == "audio": + data[key] = data[key][:, start * hop_len : end * hop_len] + elif key == "spk": + continue + else: + data[key] = data[key][..., start:end] + torch.cuda.empty_cache() + return data + + def __len__(self) -> int: + return len(self.datapaths) + + +def _pad_stack(array: Sequence[torch.Tensor]) -> torch.Tensor: + max_idx = torch.argmax(torch.tensor([x_.shape[-1] for x_ in array])) + max_x = array[max_idx] + x_padded = [ + F.pad(x_, (0, max_x.shape[-1] - x_.shape[-1]), mode="constant", value=0) + for x_ in array + ] + return torch.stack(x_padded) + + +class TextAudioCollate(nn.Module): + def forward( + self, batch: Sequence[dict[str, torch.Tensor]] + ) -> tuple[torch.Tensor, ...]: + batch = [b for b in batch if b is not None] + batch = list(sorted(batch, key=lambda x: x["mel_spec"].shape[1], reverse=True)) + lengths = torch.tensor([b["mel_spec"].shape[1] for b in batch]).long() + results = {} + for key in batch[0].keys(): + if key not in ["spk"]: + results[key] = _pad_stack([b[key] for b in batch]).cpu() + else: + results[key] = torch.tensor([[b[key]] for b in batch]).cpu() + + return ( + results["content"], + results["f0"], + results["spec"], + results["mel_spec"], + results["audio"], + results["spk"], + lengths, + results["uv"], + ) diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/default_gui_presets.json b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/default_gui_presets.json new file mode 100644 index 0000000..bb6df99 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/default_gui_presets.json @@ -0,0 +1,87 @@ +{ + "Default VC (GPU, GTX 1060)": { + "silence_threshold": -35.0, + "transpose": 12.0, + "auto_predict_f0": false, + "f0_method": "dio", + "cluster_infer_ratio": 0.0, + "noise_scale": 0.4, + "pad_seconds": 0.1, + "chunk_seconds": 0.5, + "absolute_thresh": true, + "crossfade_seconds": 0.05, + "block_seconds": 0.35, + "additional_infer_before_seconds": 0.15, + "additional_infer_after_seconds": 0.1, + "realtime_algorithm": "1 (Divide constantly)", + "passthrough_original": false, + "use_gpu": true + }, + "Default VC (CPU)": { + "silence_threshold": -35.0, + "transpose": 12.0, + "auto_predict_f0": false, + "f0_method": "dio", + "cluster_infer_ratio": 0.0, + "noise_scale": 0.4, + "pad_seconds": 0.1, + "chunk_seconds": 0.5, + "absolute_thresh": true, + "crossfade_seconds": 0.05, + "block_seconds": 1.5, + "additional_infer_before_seconds": 0.01, + "additional_infer_after_seconds": 0.01, + "realtime_algorithm": "1 (Divide constantly)", + "passthrough_original": false, + "use_gpu": false + }, + "Default VC (Mobile CPU)": { + "silence_threshold": -35.0, + "transpose": 12.0, + "auto_predict_f0": false, + "f0_method": "dio", + "cluster_infer_ratio": 0.0, + "noise_scale": 0.4, + "pad_seconds": 0.1, + "chunk_seconds": 0.5, + "absolute_thresh": true, + "crossfade_seconds": 0.05, + "block_seconds": 2.5, + "additional_infer_before_seconds": 0.01, + "additional_infer_after_seconds": 0.01, + "realtime_algorithm": "1 (Divide constantly)", + "passthrough_original": false, + "use_gpu": false + }, + "Default VC (Crooning)": { + "silence_threshold": -35.0, + "transpose": 12.0, + "auto_predict_f0": false, + "f0_method": "dio", + "cluster_infer_ratio": 0.0, + "noise_scale": 0.4, + "pad_seconds": 0.1, + "chunk_seconds": 0.5, + "absolute_thresh": true, + "crossfade_seconds": 0.04, + "block_seconds": 0.15, + "additional_infer_before_seconds": 0.05, + "additional_infer_after_seconds": 0.05, + "realtime_algorithm": "1 (Divide constantly)", + "passthrough_original": false, + "use_gpu": true + }, + "Default File": { + "silence_threshold": -35.0, + "transpose": 0.0, + "auto_predict_f0": true, + "f0_method": "crepe", + "cluster_infer_ratio": 0.0, + "noise_scale": 0.4, + "pad_seconds": 0.1, + "chunk_seconds": 0.5, + "absolute_thresh": true, + "auto_play": true, + "passthrough_original": false + } +} diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/f0.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/f0.py new file mode 100644 index 0000000..d044ddd --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/f0.py @@ -0,0 +1,239 @@ +from __future__ import annotations + +from logging import getLogger +from typing import Any, Literal + +import numpy as np +import torch +import torchcrepe +from cm_time import timer +from numpy import dtype, float32, ndarray +from torch import FloatTensor, Tensor + +from so_vits_svc_fork.utils import get_optimal_device + +LOG = getLogger(__name__) + + +def normalize_f0( + f0: FloatTensor, x_mask: FloatTensor, uv: FloatTensor, random_scale=True +) -> FloatTensor: + # calculate means based on x_mask + uv_sum = torch.sum(uv, dim=1, keepdim=True) + uv_sum[uv_sum == 0] = 9999 + means = torch.sum(f0[:, 0, :] * uv, dim=1, keepdim=True) / uv_sum + + if random_scale: + factor = torch.Tensor(f0.shape[0], 1).uniform_(0.8, 1.2).to(f0.device) + else: + factor = torch.ones(f0.shape[0], 1).to(f0.device) + # normalize f0 based on means and factor + f0_norm = (f0 - means.unsqueeze(-1)) * factor.unsqueeze(-1) + if torch.isnan(f0_norm).any(): + exit(0) + return f0_norm * x_mask + + +def interpolate_f0( + f0: ndarray[Any, dtype[float32]] +) -> tuple[ndarray[Any, dtype[float32]], ndarray[Any, dtype[float32]]]: + data = np.reshape(f0, (f0.size, 1)) + + vuv_vector = np.zeros((data.size, 1), dtype=np.float32) + vuv_vector[data > 0.0] = 1.0 + vuv_vector[data <= 0.0] = 0.0 + + ip_data = data + + frame_number = data.size + last_value = 0.0 + for i in range(frame_number): + if data[i] <= 0.0: + j = i + 1 + for j in range(i + 1, frame_number): + if data[j] > 0.0: + break + if j < frame_number - 1: + if last_value > 0.0: + step = (data[j] - data[i - 1]) / float(j - i) + for k in range(i, j): + ip_data[k] = data[i - 1] + step * (k - i + 1) + else: + for k in range(i, j): + ip_data[k] = data[j] + else: + for k in range(i, frame_number): + ip_data[k] = last_value + else: + ip_data[i] = data[i] + last_value = data[i] + + return ip_data[:, 0], vuv_vector[:, 0] + + +def compute_f0_parselmouth( + wav_numpy: ndarray[Any, dtype[float32]], + p_len: None | int = None, + sampling_rate: int = 44100, + hop_length: int = 512, +): + import parselmouth + + x = wav_numpy + if p_len is None: + p_len = x.shape[0] // hop_length + else: + assert abs(p_len - x.shape[0] // hop_length) < 4, "pad length error" + time_step = hop_length / sampling_rate * 1000 + f0_min = 50 + f0_max = 1100 + f0 = ( + parselmouth.Sound(x, sampling_rate) + .to_pitch_ac( + time_step=time_step / 1000, + voicing_threshold=0.6, + pitch_floor=f0_min, + pitch_ceiling=f0_max, + ) + .selected_array["frequency"] + ) + + pad_size = (p_len - len(f0) + 1) // 2 + if pad_size > 0 or p_len - len(f0) - pad_size > 0: + f0 = np.pad(f0, [[pad_size, p_len - len(f0) - pad_size]], mode="constant") + return f0 + + +def _resize_f0( + x: ndarray[Any, dtype[float32]], target_len: int +) -> ndarray[Any, dtype[float32]]: + source = np.array(x) + source[source < 0.001] = np.nan + target = np.interp( + np.arange(0, len(source) * target_len, len(source)) / target_len, + np.arange(0, len(source)), + source, + ) + res = np.nan_to_num(target) + return res + + +def compute_f0_pyworld( + wav_numpy: ndarray[Any, dtype[float32]], + p_len: None | int = None, + sampling_rate: int = 44100, + hop_length: int = 512, + type_: Literal["dio", "harvest"] = "dio", +): + import pyworld + + if p_len is None: + p_len = wav_numpy.shape[0] // hop_length + if type_ == "dio": + f0, t = pyworld.dio( + wav_numpy.astype(np.double), + fs=sampling_rate, + f0_ceil=f0_max, + f0_floor=f0_min, + frame_period=1000 * hop_length / sampling_rate, + ) + elif type_ == "harvest": + f0, t = pyworld.harvest( + wav_numpy.astype(np.double), + fs=sampling_rate, + f0_ceil=f0_max, + f0_floor=f0_min, + frame_period=1000 * hop_length / sampling_rate, + ) + f0 = pyworld.stonemask(wav_numpy.astype(np.double), f0, t, sampling_rate) + for index, pitch in enumerate(f0): + f0[index] = round(pitch, 1) + return _resize_f0(f0, p_len) + + +def compute_f0_crepe( + wav_numpy: ndarray[Any, dtype[float32]], + p_len: None | int = None, + sampling_rate: int = 44100, + hop_length: int = 512, + device: str | torch.device = get_optimal_device(), + model: Literal["full", "tiny"] = "full", +): + audio = torch.from_numpy(wav_numpy).to(device, copy=True) + audio = torch.unsqueeze(audio, dim=0) + + if audio.ndim == 2 and audio.shape[0] > 1: + audio = torch.mean(audio, dim=0, keepdim=True).detach() + # (T) -> (1, T) + audio = audio.detach() + + pitch: Tensor = torchcrepe.predict( + audio, + sampling_rate, + hop_length, + f0_min, + f0_max, + model, + batch_size=hop_length * 2, + device=device, + pad=True, + ) + + f0 = pitch.squeeze(0).cpu().float().numpy() + p_len = p_len or wav_numpy.shape[0] // hop_length + f0 = _resize_f0(f0, p_len) + return f0 + + +def compute_f0( + wav_numpy: ndarray[Any, dtype[float32]], + p_len: None | int = None, + sampling_rate: int = 44100, + hop_length: int = 512, + method: Literal["crepe", "crepe-tiny", "parselmouth", "dio", "harvest"] = "dio", + **kwargs, +): + with timer() as t: + wav_numpy = wav_numpy.astype(np.float32) + wav_numpy /= np.quantile(np.abs(wav_numpy), 0.999) + if method in ["dio", "harvest"]: + f0 = compute_f0_pyworld(wav_numpy, p_len, sampling_rate, hop_length, method) + elif method == "crepe": + f0 = compute_f0_crepe(wav_numpy, p_len, sampling_rate, hop_length, **kwargs) + elif method == "crepe-tiny": + f0 = compute_f0_crepe( + wav_numpy, p_len, sampling_rate, hop_length, model="tiny", **kwargs + ) + elif method == "parselmouth": + f0 = compute_f0_parselmouth(wav_numpy, p_len, sampling_rate, hop_length) + else: + raise ValueError( + "type must be dio, crepe, crepe-tiny, harvest or parselmouth" + ) + rtf = t.elapsed / (len(wav_numpy) / sampling_rate) + LOG.info(f"F0 inference time: {t.elapsed:.3f}s, RTF: {rtf:.3f}") + return f0 + + +def f0_to_coarse(f0: torch.Tensor | float): + is_torch = isinstance(f0, torch.Tensor) + f0_mel = 1127 * (1 + f0 / 700).log() if is_torch else 1127 * np.log(1 + f0 / 700) + f0_mel[f0_mel > 0] = (f0_mel[f0_mel > 0] - f0_mel_min) * (f0_bin - 2) / ( + f0_mel_max - f0_mel_min + ) + 1 + + f0_mel[f0_mel <= 1] = 1 + f0_mel[f0_mel > f0_bin - 1] = f0_bin - 1 + f0_coarse = (f0_mel + 0.5).long() if is_torch else np.rint(f0_mel).astype(np.int) + assert f0_coarse.max() <= 255 and f0_coarse.min() >= 1, ( + f0_coarse.max(), + f0_coarse.min(), + ) + return f0_coarse + + +f0_bin = 256 +f0_max = 1100.0 +f0_min = 50.0 +f0_mel_min = 1127 * np.log(1 + f0_min / 700) +f0_mel_max = 1127 * np.log(1 + f0_max / 700) diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/fakeyou_infer.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/fakeyou_infer.py new file mode 100644 index 0000000..63abe55 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/fakeyou_infer.py @@ -0,0 +1,612 @@ +from __future__ import annotations + +import sys +#sys.path.append(".") +#sys.path.append("/models/voice_conversion/so-vits-svc/src/so_vits_svc_fork") + +import os +from logging import ( + DEBUG, + INFO, + FileHandler, + StreamHandler, + basicConfig, + captureWarnings, + getLogger, +) +from pathlib import Path +from typing import Literal + +import click +import pyinputplus as pyip +import torch +from rich.logging import RichHandler + +print("Env vars:") +print(os.environ) + + +def print_gpu_info(): + print('========================================') + print('Python interpreter', sys.executable) + print('PyTorch version', torch.__version__) + print('CUDA Available?', torch.cuda.is_available()) + print('CUDA Device count', torch.cuda.device_count()) + print('CUDA architectures library was compiled for', torch.cuda.get_arch_list()) + + #try: + # from tensorflow.python.client import device_lib + # print('local devices', str(device_lib.list_local_devices()).replace("\n", "\n ")) + #except ImportError: + # print('no tensorflow - cannot list devices') + # pass + print('========================================', flush=True) + +print_gpu_info() + +def init_logger() -> None: + IN_COLAB = os.getenv("COLAB_RELEASE_TAG") + IS_TEST = "test" in Path(__file__).parent.stem + + basicConfig( + level=DEBUG if IS_TEST else INFO, + format="%(asctime)s %(message)s", + datefmt="[%X]", + handlers=[ + RichHandler() if not IN_COLAB else StreamHandler(), + FileHandler(f"{__name__.split('.')[0]}.log"), + ], + ) + captureWarnings(True) + if IS_TEST: + LOG.debug("Test mode is on.") + + +init_logger() + +LOG = getLogger(__name__) + + +class RichHelpFormatter(click.HelpFormatter): + def __init__( + self, + indent_increment: int = 2, + width: int | None = None, + max_width: int | None = None, + ) -> None: + width = 100 + super().__init__(indent_increment, width, max_width) + + +def patch_wrap_text(): + orig_wrap_text = click.formatting.wrap_text + + def wrap_text( + text, + width=78, + initial_indent="", + subsequent_indent="", + preserve_paragraphs=False, + ): + return orig_wrap_text( + text.replace("\n", "\n\n"), + width=width, + initial_indent=initial_indent, + subsequent_indent=subsequent_indent, + preserve_paragraphs=True, + ).replace("\n\n", "\n") + + click.formatting.wrap_text = wrap_text + + +patch_wrap_text() + +CONTEXT_SETTINGS = dict(help_option_names=["-h", "--help"], show_default=True) +click.Context.formatter_class = RichHelpFormatter + + +@click.group(context_settings=CONTEXT_SETTINGS) +def cli(): + """so-vits-svc allows any folder structure for training data. + However, the following folder structure is recommended.\n + When training: dataset_raw/{speaker_name}/**/{wav_name}.{any_format}\n + When inference: configs/44k/config.json, logs/44k/G_XXXX.pth\n + If the folder structure is followed, you DO NOT NEED TO SPECIFY model path, config path, etc. + (The latest model will be automatically loaded.)\n + To train a model, run pre-resample, pre-config, pre-hubert, train.\n + To infer a model, run infer. + """ + init_logger() + + +#@cli.command() +#@click.option( +# "-c", +# "--config-path", +# type=click.Path(exists=True), +# help="path to config", +# default=Path("./configs/44k/config.json"), +#) +#@click.option( +# "-m", +# "--model-path", +# type=click.Path(), +# help="path to output dir", +# default=Path("./logs/44k"), +#) +#def train(config_path: Path, model_path: Path): +# """Train model +# If D_0.pth or G_0.pth not found, automatically download from hub.""" +# from .train import train +# +# config_path = Path(config_path) +# model_path = Path(model_path) +# train(config_path=config_path, model_path=model_path) + + +@cli.command() +@click.argument( + "input-path", + type=click.Path(exists=True), +) +@click.option( + "-o", + "--output-path", + type=click.Path(), + help="path to output dir", +) +@click.option("-s", "--speaker", type=str, default=None, help="speaker name") +@click.option( + "-m", + "--model-path", + type=click.Path(exists=True), + default=Path("./logs/44k/"), + help="path to model", +) +@click.option( + "-c", + "--config-path", + type=click.Path(exists=True), + default=Path("./configs/44k/config.json"), + help="path to config", +) +@click.option( + "-k", + "--cluster-model-path", + type=click.Path(exists=True), + default=None, + help="path to cluster model", +) +@click.option("-t", "--transpose", type=int, default=0, help="transpose") +@click.option( + "-db", "--db-thresh", type=int, default=-20, help="threshold (DB) (RELATIVE)" +) +@click.option( + "-a", "--auto-predict-f0", type=bool, default=True, help="auto predict f0" +) +@click.option( + "-r", "--cluster-infer-ratio", type=float, default=0, help="cluster infer ratio" +) +@click.option("-n", "--noise-scale", type=float, default=0.4, help="noise scale") +@click.option("-p", "--pad-seconds", type=float, default=0.5, help="pad seconds") +@click.option( + "-d", + "--device", + type=str, + default="cuda" if torch.cuda.is_available() else "cpu", + help="device", +) +@click.option("-ch", "--chunk-seconds", type=float, default=0.5, help="chunk seconds") +@click.option( + "-ab", "--absolute-thresh", type=bool, default=False, help="absolute thresh" +) +def infer( + input_path: Path, + output_path: Path, + speaker: str, + model_path: Path, + config_path: Path, + cluster_model_path: Path | None = None, + transpose: int = 0, + db_thresh: int = -40, + auto_predict_f0: bool = False, + cluster_infer_ratio: float = 0, + noise_scale: float = 0.4, + pad_seconds: float = 0.5, + chunk_seconds: float = 0.5, + absolute_thresh: bool = False, + device: Literal["cpu", "cuda"] = "cuda" if torch.cuda.is_available() else "cpu", +): + """Inference""" + from .inference_main import infer + #from inference_main import infer + + if not auto_predict_f0: + LOG.warning( + f"auto_predict_f0 = False, transpose = {transpose}. If you want to change the pitch, please set transpose." + "Generally transpose = 0 does not work because your voice pitch and target voice pitch are different." + ) + + input_path = Path(input_path) + if output_path is None: + output_path = input_path.parent / f"{input_path.stem}.out{input_path.suffix}" + output_path = Path(output_path) + model_path = Path(model_path) + if model_path.is_dir(): + model_path = list(sorted(model_path.glob("*.pth")))[-1] + LOG.info(f"Since model_path is a directory, use {model_path}") + config_path = Path(config_path) + if cluster_model_path is not None: + cluster_model_path = Path(cluster_model_path) + + LOG.info("Calling infer()...") + + infer( + input_path=input_path, + output_path=output_path, + speaker=speaker, + model_path=model_path, + config_path=config_path, + cluster_model_path=cluster_model_path, + transpose=transpose, + db_thresh=db_thresh, + auto_predict_f0=auto_predict_f0, + cluster_infer_ratio=cluster_infer_ratio, + noise_scale=noise_scale, + pad_seconds=pad_seconds, + chunk_seconds=chunk_seconds, + absolute_thresh=absolute_thresh, + device=device, + ) + + +#@cli.command() +#@click.option( +# "-m", +# "--model-path", +# type=click.Path(exists=True), +# default=Path("./logs/44k/"), +# help="path to model", +#) +#@click.option( +# "-c", +# "--config-path", +# type=click.Path(exists=True), +# default=Path("./configs/44k/config.json"), +# help="path to config", +#) +#@click.option( +# "-k", +# "--cluster-model-path", +# type=click.Path(exists=True), +# default=None, +# help="path to cluster model", +#) +#@click.option("-t", "--transpose", type=int, default=12, help="transpose") +#@click.option( +# "-a", +# "--auto-predict-f0", +# type=bool, +# default=False, +# help="auto predict f0 (not recommended for realtime since voice pitch will not be stable)", +#) +#@click.option( +# "-r", "--cluster-infer-ratio", type=float, default=0, help="cluster infer ratio" +#) +#@click.option("-n", "--noise-scale", type=float, default=0.4, help="noise scale") +#@click.option( +# "-db", "--db-thresh", type=int, default=-30, help="threshold (DB) (ABSOLUTE)" +#) +#@click.option( +# "-fm", +# "--f0-method", +# type=click.Choice(["crepe", "crepe-tiny", "parselmouth", "dio", "harvest"]), +# default="crepe", +# help="f0 prediction method", +#) +#@click.option("-p", "--pad-seconds", type=float, default=0.02, help="pad seconds") +#@click.option("-ch", "--chunk-seconds", type=float, default=0.5, help="chunk seconds") +#@click.option( +# "-cr", +# "--crossfade-seconds", +# type=float, +# default=0.01, +# help="crossfade seconds", +#) +#@click.option( +# "-ab", +# "--additional-infer-before-seconds", +# type=float, +# default=0.2, +# help="additional infer before seconds", +#) +#@click.option( +# "-aa", +# "--additional-infer-after-seconds", +# type=float, +# default=0.1, +# help="additional infer after seconds", +#) +#@click.option("-b", "--block-seconds", type=float, default=0.5, help="block seconds") +#@click.option( +# "-d", +# "--device", +# type=str, +# default="cuda" if torch.cuda.is_available() else "cpu", +# help="device", +#) +#@click.option("-s", "--speaker", type=str, default=None, help="speaker name") +#@click.option("-v", "--version", type=int, default=2, help="version") +#@click.option("-i", "--input-device", type=int, default=None, help="input device") +#@click.option("-o", "--output-device", type=int, default=None, help="output device") +#@click.option( +# "-po", +# "--passthrough-original", +# type=bool, +# default=False, +# is_flag=True, +# help="passthrough original (for latency check)", +#) +#def vc( +# # paths +# model_path: Path, +# config_path: Path, +# # svc config +# speaker: str, +# cluster_model_path: Path | None, +# transpose: int, +# auto_predict_f0: bool, +# cluster_infer_ratio: float, +# noise_scale: float, +# f0_method: Literal["crepe", "crepe-tiny", "parselmouth", "dio", "harvest"], +# # slice config +# db_thresh: int, +# pad_seconds: float, +# chunk_seconds: float, +# # realtime config +# crossfade_seconds: float, +# additional_infer_before_seconds: float, +# additional_infer_after_seconds: float, +# block_seconds: float, +# version: int, +# input_device: int | str | None, +# output_device: int | str | None, +# device: Literal["cpu", "cuda"], +# passthrough_original: bool = False, +#) -> None: +# """Realtime inference from microphone""" +# from .inference_main import realtime +# +# if auto_predict_f0: +# LOG.warning( +# "auto_predict_f0 = True in realtime inference will cause unstable voice pitch, use with caution" +# ) +# else: +# LOG.warning( +# f"auto_predict_f0 = False, transpose = {transpose}. If you want to change the pitch, please change the transpose value." +# "Generally transpose = 0 does not work because your voice pitch and target voice pitch are different." +# ) +# model_path = Path(model_path) +# config_path = Path(config_path) +# if cluster_model_path is not None: +# cluster_model_path = Path(cluster_model_path) +# if model_path.is_dir(): +# model_path = list(sorted(model_path.glob("*.pth")))[-1] +# LOG.info(f"Since model_path is a directory, use {model_path}") +# +# realtime( +# # paths +# model_path=model_path, +# config_path=config_path, +# # svc config +# speaker=speaker, +# cluster_model_path=cluster_model_path, +# transpose=transpose, +# auto_predict_f0=auto_predict_f0, +# cluster_infer_ratio=cluster_infer_ratio, +# noise_scale=noise_scale, +# f0_method=f0_method, +# # slice config +# db_thresh=db_thresh, +# pad_seconds=pad_seconds, +# chunk_seconds=chunk_seconds, +# # realtime config +# crossfade_seconds=crossfade_seconds, +# additional_infer_before_seconds=additional_infer_before_seconds, +# additional_infer_after_seconds=additional_infer_after_seconds, +# block_seconds=block_seconds, +# version=version, +# input_device=input_device, +# output_device=output_device, +# device=device, +# passthrough_original=passthrough_original, +# ) + + +#@cli.command() +#@click.option( +# "-i", +# "--input-dir", +# type=click.Path(exists=True), +# default=Path("./dataset_raw"), +# help="path to source dir", +#) +#@click.option( +# "-o", +# "--output-dir", +# type=click.Path(), +# default=Path("./dataset/44k"), +# help="path to output dir", +#) +#@click.option("-s", "--sampling-rate", type=int, default=44100, help="sampling rate") +#def pre_resample(input_dir: Path, output_dir: Path, sampling_rate: int) -> None: +# """Preprocessing part 1: resample""" +# from .preprocess_resample import preprocess_resample +# +# input_dir = Path(input_dir) +# output_dir = Path(output_dir) +# preprocess_resample( +# input_dir=input_dir, output_dir=output_dir, sampling_rate=sampling_rate +# ) + + +#@cli.command() +#@click.option( +# "-i", +# "--input-dir", +# type=click.Path(exists=True), +# default=Path("./dataset/44k"), +# help="path to source dir", +#) +#@click.option( +# "-f", +# "--filelist-path", +# type=click.Path(), +# default=Path("./filelists/44k"), +# help="path to filelist dir", +#) +#@click.option( +# "-c", +# "--config-path", +# type=click.Path(), +# default=Path("./configs/44k/config.json"), +# help="path to config", +#) +#def pre_config( +# input_dir: Path, +# filelist_path: Path, +# config_path: Path, +#): +# """Preprocessing part 2: config""" +# from .preprocess_flist_config import preprocess_config +# +# input_dir = Path(input_dir) +# filelist_path = Path(filelist_path) +# config_path = Path(config_path) +# preprocess_config( +# input_dir=input_dir, +# train_list_path=filelist_path / "train.txt", +# val_list_path=filelist_path / "val.txt", +# test_list_path=filelist_path / "test.txt", +# config_path=config_path, +# ) + + +#@cli.command() +#@click.option( +# "-i", +# "--input-dir", +# type=click.Path(exists=True), +# default=Path("./dataset/44k"), +# help="path to source dir", +#) +#@click.option( +# "-c", +# "--config-path", +# type=click.Path(exists=True), +# help="path to config", +# default=Path("./configs/44k/config.json"), +#) +#@click.option( +# "-n", +# "--n_jobs", +# type=int, +# default=4, +# help="number of jobs (optimal value may depend on your VRAM capacity and audio duration per file)", +#) +#@click.option( +# "-f", +# "--force-rebuild", +# type=bool, +# default=True, +# help="force rebuild existing preprocessed files", +#) +#@click.option( +# "-fm", +# "--f0-method", +# type=click.Choice(["crepe", "crepe-tiny", "parselmouth", "dio", "harvest"]), +# default="dio", +#) +#def pre_hubert( +# input_dir: Path, +# config_path: Path, +# n_jobs: bool, +# force_rebuild: bool, +# f0_method: Literal["crepe", "crepe-tiny", "parselmouth", "dio", "harvest"], +#) -> None: +# """Preprocessing part 3: hubert +# If the HuBERT model is not found, it will be downloaded automatically.""" +# from .preprocess_hubert_f0 import preprocess_hubert_f0 +# +# input_dir = Path(input_dir) +# config_path = Path(config_path) +# preprocess_hubert_f0( +# input_dir=input_dir, +# config_path=config_path, +# n_jobs=n_jobs, +# force_rebuild=force_rebuild, +# f0_method=f0_method, +# ) + + +#@cli.command +#def clean(): +# """Clean up files, only useful if you are using the default file structure""" +# import shutil +# +# folders = ["dataset", "filelists", "logs"] +# if pyip.inputYesNo(f"Are you sure you want to delete files in {folders}?") == "yes": +# for folder in folders: +# if Path(folder).exists(): +# shutil.rmtree(folder) +# LOG.info("Cleaned up files") +# else: +# LOG.info("Aborted") + + +#@cli.command +#@click.option("-i", "--input-path", type=click.Path(exists=True), help="model path") +#@click.option("-o", "--output-path", type=click.Path(), help="onnx model path to save") +#@click.option("-c", "--config-path", type=click.Path(), help="config path") +#@click.option("-d", "--device", type=str, default="cpu", help="torch device") +#def onnx(input_path: Path, output_path: Path, config_path: Path, device: str) -> None: +# """Export model to onnx""" +# input_path = Path(input_path) +# output_path = Path(output_path) +# config_path = Path(config_path) +# device_ = torch.device(device) +# from .onnx_export import onnx_export +# +# onnx_export( +# input_path=input_path, +# output_path=output_path, +# config_path=config_path, +# device=device_, +# ) + + +#@cli.command +#@click.option( +# "-i", +# "--input-dir", +# type=click.Path(exists=True), +# help="dataset directory", +# default=Path("./dataset/44k"), +#) +#@click.option( +# "-o", +# "--output-path", +# type=click.Path(), +# help="model path to save", +# default=Path("./models/44k/kmeans.pt"), +#) +#@click.option("-n", "--n-clusters", type=int, help="number of clusters", default=10000) +#def train_cluster(input_dir: Path, output_path: Path, n_clusters: int) -> None: +# """Train k-means clustering""" +# from .cluster.train_cluster import main +# +# main(input_dir=input_dir, output_path=output_path, n_clusters=n_clusters) + + +if __name__ == '__main__': + infer() diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/gui.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/gui.py new file mode 100644 index 0000000..113840e --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/gui.py @@ -0,0 +1,746 @@ +from __future__ import annotations + +import json +import multiprocessing +from copy import copy +from logging import getLogger +from pathlib import Path + +import PySimpleGUI as sg +import sounddevice as sd +import soundfile as sf +import torch +from pebble import ProcessFuture, ProcessPool + +from . import __version__ +from .utils import get_optimal_device + +GUI_DEFAULT_PRESETS_PATH = Path(__file__).parent / "default_gui_presets.json" +GUI_PRESETS_PATH = Path("./user_gui_presets.json").absolute() + +LOG = getLogger(__name__) + + +def play_audio(path: Path | str): + if isinstance(path, Path): + path = path.as_posix() + data, sr = sf.read(path) + sd.play(data, sr) + + +def load_presets() -> dict: + defaults = json.loads(GUI_DEFAULT_PRESETS_PATH.read_text("utf-8")) + users = ( + json.loads(GUI_PRESETS_PATH.read_text("utf-8")) + if GUI_PRESETS_PATH.exists() + else {} + ) + # prioriy: defaults > users + # order: defaults -> users + return {**defaults, **users, **defaults} + + +def add_preset(name: str, preset: dict) -> dict: + presets = load_presets() + presets[name] = preset + with GUI_PRESETS_PATH.open("w") as f: + json.dump(presets, f, indent=2) + return load_presets() + + +def delete_preset(name: str) -> dict: + presets = load_presets() + if name in presets: + del presets[name] + else: + LOG.warning(f"Cannot delete preset {name} because it does not exist.") + with GUI_PRESETS_PATH.open("w") as f: + json.dump(presets, f, indent=2) + return load_presets() + + +def get_output_path(input_path: Path) -> Path: + # Default output path + output_path = input_path.parent / f"{input_path.stem}.out{input_path.suffix}" + + # Increment file number in path if output file already exists + file_num = 1 + while output_path.exists(): + output_path = ( + input_path.parent / f"{input_path.stem}.out_{file_num}{input_path.suffix}" + ) + file_num += 1 + return output_path + + +def get_supported_file_types() -> tuple[tuple[str], ...]: + return tuple( + [ + ((extension, f".{extension.lower()}")) + for extension in sf.available_formats().keys() + ] + ) + + +def validate_output_file_type(output_path: Path) -> bool: + supported_file_types = sorted( + [f".{extension.lower()}" for extension in sf.available_formats().keys()] + ) + if not output_path.suffix: + sg.popup_ok( + "Error: Output path missing file type extension, enter " + + "one of the following manually:\n\n" + + "\n".join(supported_file_types) + ) + return False + if output_path.suffix.lower() not in supported_file_types: + sg.popup_ok( + f"Error: {output_path.suffix.lower()} is not a supported " + + "extension; use one of the following:\n\n" + + "\n".join(supported_file_types) + ) + return False + return True + + +def get_devices( + update: bool = True, +) -> tuple[list[str], list[str], list[int], list[int]]: + if update: + sd._terminate() + sd._initialize() + devices = sd.query_devices() + hostapis = sd.query_hostapis() + for hostapi in hostapis: + for device_idx in hostapi["devices"]: + devices[device_idx]["hostapi_name"] = hostapi["name"] + input_devices = [ + f"{d['name']} ({d['hostapi_name']})" + for d in devices + if d["max_input_channels"] > 0 + ] + output_devices = [ + f"{d['name']} ({d['hostapi_name']})" + for d in devices + if d["max_output_channels"] > 0 + ] + input_devices_indices = [d["index"] for d in devices if d["max_input_channels"] > 0] + output_devices_indices = [ + d["index"] for d in devices if d["max_output_channels"] > 0 + ] + return input_devices, output_devices, input_devices_indices, output_devices_indices + + +def after_inference(window: sg.Window, path: Path, auto_play: bool, output_path: Path): + try: + LOG.info(f"Finished inference for {path.stem}{path.suffix}") + window["infer"].update(disabled=False) + + if auto_play: + play_audio(output_path) + except Exception as e: + LOG.exception(e) + + +def main(): + LOG.info(f"version: {__version__}") + + sg.theme("Dark") + model_candidates = list(sorted(Path("./logs/44k/").glob("G_*.pth"))) + + frame_contents = { + "Paths": [ + [ + sg.Text("Model path"), + sg.Push(), + sg.InputText( + key="model_path", + default_text=model_candidates[-1].absolute().as_posix() + if model_candidates + else "", + enable_events=True, + ), + sg.FileBrowse( + initial_folder=Path("./logs/44k/").absolute + if Path("./logs/44k/").exists() + else Path(".").absolute().as_posix(), + key="model_path_browse", + file_types=(("PyTorch", "*.pth"),), + ), + ], + [ + sg.Text("Config path"), + sg.Push(), + sg.InputText( + key="config_path", + default_text=Path("./configs/44k/config.json").absolute().as_posix() + if Path("./configs/44k/config.json").exists() + else "", + enable_events=True, + ), + sg.FileBrowse( + initial_folder=Path("./configs/44k/").as_posix() + if Path("./configs/44k/").exists() + else Path(".").absolute().as_posix(), + key="config_path_browse", + file_types=(("JSON", "*.json"),), + ), + ], + [ + sg.Text("Cluster model path (Optional)"), + sg.Push(), + sg.InputText( + key="cluster_model_path", + default_text=Path("./logs/44k/kmeans.pt").absolute().as_posix() + if Path("./logs/44k/kmeans.pt").exists() + else "", + enable_events=True, + ), + sg.FileBrowse( + initial_folder="./logs/44k/" + if Path("./logs/44k/").exists() + else ".", + key="cluster_model_path_browse", + file_types=(("PyTorch", "*.pt"),), + ), + ], + ], + "Common": [ + [ + sg.Text("Speaker"), + sg.Push(), + sg.Combo(values=[], key="speaker", size=(20, 1)), + ], + [ + sg.Text("Silence threshold"), + sg.Push(), + sg.Slider( + range=(-60.0, 0), + orientation="h", + key="silence_threshold", + resolution=0.1, + ), + ], + [ + sg.Text( + "Pitch (12 = 1 octave)\n" + "ADJUST THIS based on your voice\n" + "when Auto predict F0 is turned off.", + size=(None, 4), + ), + sg.Push(), + sg.Slider( + range=(-36, 36), + orientation="h", + key="transpose", + tick_interval=12, + ), + ], + [ + sg.Checkbox( + key="auto_predict_f0", + text="Auto predict F0 (Pitch may become unstable when turned on in real-time inference.)", + ) + ], + [ + sg.Text("F0 prediction method"), + sg.Push(), + sg.Combo( + ["crepe", "crepe-tiny", "parselmouth", "dio", "harvest"], + key="f0_method", + ), + ], + [ + sg.Text("Cluster infer ratio"), + sg.Push(), + sg.Slider( + range=(0, 1.0), + orientation="h", + key="cluster_infer_ratio", + resolution=0.01, + ), + ], + [ + sg.Text("Noise scale"), + sg.Push(), + sg.Slider( + range=(0.0, 1.0), + orientation="h", + key="noise_scale", + resolution=0.01, + ), + ], + [ + sg.Text("Pad seconds"), + sg.Push(), + sg.Slider( + range=(0.0, 1.0), + orientation="h", + key="pad_seconds", + resolution=0.01, + ), + ], + [ + sg.Text("Chunk seconds"), + sg.Push(), + sg.Slider( + range=(0.0, 3.0), + orientation="h", + key="chunk_seconds", + resolution=0.01, + ), + ], + [ + sg.Checkbox( + key="absolute_thresh", + text="Absolute threshold (ignored (True) in realtime inference)", + ) + ], + ], + "File": [ + [ + sg.Text("Input audio path"), + sg.Push(), + sg.InputText(key="input_path", enable_events=True), + sg.FileBrowse(initial_folder=".", key="input_path_browse"), + sg.Button("Play", key="play_input"), + ], + [ + sg.Text("Output audio path"), + sg.Push(), + sg.InputText(key="output_path"), + sg.FileSaveAs( + initial_folder=".", + key="output_path_browse", + file_types=get_supported_file_types(), + ), + ], + [sg.Checkbox(key="auto_play", text="Auto play", default=True)], + ], + "Realtime": [ + [ + sg.Text("Crossfade seconds"), + sg.Push(), + sg.Slider( + range=(0, 0.6), + orientation="h", + key="crossfade_seconds", + resolution=0.001, + ), + ], + [ + sg.Text( + "Block seconds", # \n(big -> more robust, slower, (the same) latency)" + tooltip="Big -> more robust, slower, (the same) latency", + ), + sg.Push(), + sg.Slider( + range=(0, 3.0), + orientation="h", + key="block_seconds", + resolution=0.001, + ), + ], + [ + sg.Text( + "Additional Infer seconds (before)", # \n(big -> more robust, slower)" + tooltip="Big -> more robust, slower, additional latency", + ), + sg.Push(), + sg.Slider( + range=(0, 2.0), + orientation="h", + key="additional_infer_before_seconds", + resolution=0.001, + ), + ], + [ + sg.Text( + "Additional Infer seconds (after)", # \n(big -> more robust, slower, additional latency)" + tooltip="Big -> more robust, slower, additional latency", + ), + sg.Push(), + sg.Slider( + range=(0, 2.0), + orientation="h", + key="additional_infer_after_seconds", + resolution=0.001, + ), + ], + [ + sg.Text("Realtime algorithm"), + sg.Push(), + sg.Combo( + ["2 (Divide by speech)", "1 (Divide constantly)"], + default_value="1 (Divide constantly)", + key="realtime_algorithm", + ), + ], + [ + sg.Text("Input device"), + sg.Push(), + sg.Combo( + key="input_device", + values=[], + size=(60, 1), + ), + ], + [ + sg.Text("Output device"), + sg.Push(), + sg.Combo( + key="output_device", + values=[], + size=(60, 1), + ), + ], + [ + sg.Checkbox( + "Passthrough original audio (for latency check)", + key="passthrough_original", + default=False, + ), + sg.Push(), + sg.Button("Refresh devices", key="refresh_devices"), + ], + [ + sg.Frame( + "Notes", + [ + [ + sg.Text( + "In Realtime Inference:\n" + " - Setting F0 prediction method to 'crepe` may cause performance degradation.\n" + " - Auto Predict F0 must be turned off.\n" + "If the audio sounds mumbly and choppy:\n" + " Case: The inference has not been made in time (Increase Block seconds)\n" + " Case: Mic input is low (Decrease Silence threshold)\n" + ) + ] + ], + ), + ], + ], + "Presets": [ + [ + sg.Text("Presets"), + sg.Push(), + sg.Combo( + key="presets", + values=list(load_presets().keys()), + size=(20, 1), + enable_events=True, + ), + sg.Button("Delete preset", key="delete_preset"), + ], + [ + sg.Text("Preset name"), + sg.Stretch(), + sg.InputText(key="preset_name", size=(20, 1)), + sg.Button("Add current settings as a preset", key="add_preset"), + ], + ], + } + + # frames + frames = {} + for name, items in frame_contents.items(): + frame = sg.Frame(name, items) + frame.expand_x = True + frames[name] = [frame] + + column1 = sg.Column( + [ + frames["Paths"], + frames["Common"], + ], + vertical_alignment="top", + ) + column2 = sg.Column( + [ + frames["File"], + frames["Realtime"], + frames["Presets"], + [ + sg.Checkbox( + key="use_gpu", + default=get_optimal_device() != torch.device("cpu"), + text="Use GPU" + + ( + " (not available; if your device has GPU, make sure you installed PyTorch with CUDA support)" + if get_optimal_device() == torch.device("cpu") + else "" + ), + disabled=get_optimal_device() == torch.device("cpu"), + ) + ], + [ + sg.Button("Infer", key="infer"), + sg.Button("(Re)Start Voice Changer", key="start_vc"), + sg.Button("Stop Voice Changer", key="stop_vc"), + sg.Push(), + # sg.Button("ONNX Export", key="onnx_export"), + ], + ] + ) + + # columns + layout = [[column1, column2]] + # layout = [[sg.Column(layout, vertical_alignment="top", scrollable=True, expand_x=True, expand_y=True)]] + window = sg.Window( + f"{__name__.split('.')[0]}", layout, grab_anywhere=True, finalize=True + ) # , use_custom_titlebar=True) + # for n in ["input_device", "output_device"]: + # window[n].Widget.configure(justify="right") + event, values = window.read(timeout=0.01) + + def update_speaker() -> None: + from . import utils + + config_path = Path(values["config_path"]) + if config_path.exists() and config_path.is_file(): + hp = utils.get_hparams(values["config_path"]) + LOG.debug(f"Loaded config from {values['config_path']}") + window["speaker"].update( + values=list(hp.__dict__["spk"].keys()), set_to_index=0 + ) + + def update_devices() -> None: + ( + input_devices, + output_devices, + input_device_indices, + output_device_indices, + ) = get_devices() + input_device_indices_reversed = { + v: k for k, v in enumerate(input_device_indices) + } + output_device_indices_reversed = { + v: k for k, v in enumerate(output_device_indices) + } + window["input_device"].update( + values=input_devices, value=values["input_device"] + ) + window["output_device"].update( + values=output_devices, value=values["output_device"] + ) + input_default, output_default = sd.default.device + if values["input_device"] not in input_devices: + window["input_device"].update( + values=input_devices, + set_to_index=input_device_indices_reversed.get(input_default, 0), + ) + if values["output_device"] not in output_devices: + window["output_device"].update( + values=output_devices, + set_to_index=output_device_indices_reversed.get(output_default, 0), + ) + + PRESET_KEYS = [ + key + for key in values.keys() + if not any(exclude in key for exclude in ["preset", "browse"]) + ] + + def apply_preset(name: str) -> None: + for key, value in load_presets()[name].items(): + if key in PRESET_KEYS: + window[key].update(value) + values[key] = value + + default_name = list(load_presets().keys())[0] + apply_preset(default_name) + window["presets"].update(default_name) + del default_name + update_speaker() + update_devices() + # with ProcessPool(max_workers=1) as pool: + # to support Linux + with ProcessPool( + max_workers=min(2, multiprocessing.cpu_count()), + context=multiprocessing.get_context("spawn"), + ) as pool: + future: None | ProcessFuture = None + infer_futures: set[ProcessFuture] = set() + while True: + event, values = window.read(200) + if event == sg.WIN_CLOSED: + break + if not event == sg.EVENT_TIMEOUT: + LOG.info(f"Event {event}, values {values}") + if event.endswith("_path"): + for name in window.AllKeysDict: + if str(name).endswith("_browse"): + browser = window[name] + if isinstance(browser, sg.Button): + LOG.info( + f"Updating browser {browser} to {Path(values[event]).parent}" + ) + browser.InitialFolder = Path(values[event]).parent + browser.update() + else: + LOG.warning(f"Browser {browser} is not a FileBrowse") + window["transpose"].update( + disabled=values["auto_predict_f0"], + visible=not values["auto_predict_f0"], + ) + + input_path = Path(values["input_path"]) + output_path = Path(values["output_path"]) + + if event == "add_preset": + presets = add_preset( + values["preset_name"], {key: values[key] for key in PRESET_KEYS} + ) + window["presets"].update(values=list(presets.keys())) + elif event == "delete_preset": + presets = delete_preset(values["presets"]) + window["presets"].update(values=list(presets.keys())) + elif event == "presets": + apply_preset(values["presets"]) + update_speaker() + elif event == "refresh_devices": + update_devices() + elif event == "config_path": + update_speaker() + elif event == "input_path": + # Don't change the output path if it's already set + if values["output_path"]: + continue + # Set a sensible default output path + window.Element("output_path").Update(str(get_output_path(input_path))) + elif event == "infer": + if not input_path.exists() or not input_path.is_file(): + LOG.warning(f"Input path {input_path} does not exist.") + continue + if not validate_output_file_type(output_path): + continue + + try: + from so_vits_svc_fork.inference.main import infer + + LOG.info("Starting inference...") + window["infer"].update(disabled=True) + infer_future = pool.schedule( + infer, + kwargs=dict( + # paths + model_path=Path(values["model_path"]), + output_path=output_path, + input_path=input_path, + config_path=Path(values["config_path"]), + # svc config + speaker=values["speaker"], + cluster_model_path=Path(values["cluster_model_path"]) + if values["cluster_model_path"] + else None, + transpose=values["transpose"], + auto_predict_f0=values["auto_predict_f0"], + cluster_infer_ratio=values["cluster_infer_ratio"], + noise_scale=values["noise_scale"], + f0_method=values["f0_method"], + # slice config + db_thresh=values["silence_threshold"], + pad_seconds=values["pad_seconds"], + chunk_seconds=values["chunk_seconds"], + absolute_thresh=values["absolute_thresh"], + device="cpu" + if not values["use_gpu"] + else get_optimal_device(), + ), + ) + infer_future.add_done_callback( + lambda _future: after_inference( + window, input_path, values["auto_play"], output_path + ) + ) + infer_futures.add(infer_future) + except Exception as e: + LOG.exception(e) + elif event == "play_input": + if Path(values["input_path"]).exists(): + pool.schedule(play_audio, args=[Path(values["input_path"])]) + elif event == "start_vc": + _, _, input_device_indices, output_device_indices = get_devices( + update=False + ) + from so_vits_svc_fork.inference.main import realtime + + if future: + LOG.info("Canceling previous task") + future.cancel() + future = pool.schedule( + realtime, + kwargs=dict( + # paths + model_path=Path(values["model_path"]), + config_path=Path(values["config_path"]), + speaker=values["speaker"], + # svc config + cluster_model_path=Path(values["cluster_model_path"]) + if values["cluster_model_path"] + else None, + transpose=values["transpose"], + auto_predict_f0=values["auto_predict_f0"], + cluster_infer_ratio=values["cluster_infer_ratio"], + noise_scale=values["noise_scale"], + f0_method=values["f0_method"], + # slice config + db_thresh=values["silence_threshold"], + pad_seconds=values["pad_seconds"], + chunk_seconds=values["chunk_seconds"], + # realtime config + crossfade_seconds=values["crossfade_seconds"], + additional_infer_before_seconds=values[ + "additional_infer_before_seconds" + ], + additional_infer_after_seconds=values[ + "additional_infer_after_seconds" + ], + block_seconds=values["block_seconds"], + version=int(values["realtime_algorithm"][0]), + input_device=input_device_indices[ + window["input_device"].widget.current() + ], + output_device=output_device_indices[ + window["output_device"].widget.current() + ], + device=get_optimal_device() if values["use_gpu"] else "cpu", + passthrough_original=values["passthrough_original"], + ), + ) + elif event == "stop_vc": + if future: + future.cancel() + future = None + elif event == "onnx_export": + try: + raise NotImplementedError("ONNX export is not implemented yet.") + from so_vits_svc_fork.modules.onnx._export import onnx_export + + onnx_export( + input_path=Path(values["model_path"]), + output_path=Path(values["model_path"]).with_suffix(".onnx"), + config_path=Path(values["config_path"]), + device="cpu", + ) + except Exception as e: + LOG.exception(e) + if future is not None and future.done(): + try: + future.result() + except Exception as e: + LOG.error("Error in realtime: ") + LOG.exception(e) + future = None + for future in copy(infer_futures): + if future.done(): + try: + future.result() + except Exception as e: + LOG.error("Error in inference: ") + LOG.exception(e) + infer_futures.remove(future) + if future: + future.cancel() + window.close() diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/hparams.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/hparams.py new file mode 100644 index 0000000..6307042 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/hparams.py @@ -0,0 +1,38 @@ +from __future__ import annotations + +from typing import Any + + +class HParams: + def __init__(self, **kwargs: Any) -> None: + for k, v in kwargs.items(): + if type(v) == dict: + v = HParams(**v) + self[k] = v + + def keys(self): + return self.__dict__.keys() + + def items(self): + return self.__dict__.items() + + def values(self): + return self.__dict__.values() + + def get(self, key: str, default: Any = None): + return self.__dict__.get(key, default) + + def __len__(self): + return len(self.__dict__) + + def __getitem__(self, key): + return getattr(self, key) + + def __setitem__(self, key, value): + return setattr(self, key, value) + + def __contains__(self, key): + return key in self.__dict__ + + def __repr__(self): + return self.__dict__.__repr__() diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/inference/__init__.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/inference/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/inference/core.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/inference/core.py new file mode 100644 index 0000000..5c29420 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/inference/core.py @@ -0,0 +1,686 @@ +from __future__ import annotations + +from copy import deepcopy +from logging import getLogger +from pathlib import Path +from typing import Any, Callable, Iterable, Literal + +import attrs +import librosa +import numpy as np +import torch +from cm_time import timer +from numpy import dtype, float32, ndarray + +import so_vits_svc_fork.f0 +from so_vits_svc_fork import cluster, utils + +from ..modules.synthesizers import SynthesizerTrn +from ..utils import get_optimal_device + +LOG = getLogger(__name__) + + +def pad_array(array_, target_length: int): + current_length = array_.shape[0] + if current_length >= target_length: + return array_[ + (current_length - target_length) + // 2 : (current_length - target_length) + // 2 + + target_length, + ..., + ] + else: + pad_width = target_length - current_length + pad_left = pad_width // 2 + pad_right = pad_width - pad_left + padded_arr = np.pad( + array_, (pad_left, pad_right), "constant", constant_values=(0, 0) + ) + return padded_arr + + +@attrs.frozen(kw_only=True) +class Chunk: + is_speech: bool + audio: ndarray[Any, dtype[float32]] + start: int + end: int + + @property + def duration(self) -> float32: + # return self.end - self.start + return float32(self.audio.shape[0]) + + def __repr__(self) -> str: + return f"Chunk(Speech: {self.is_speech}, {self.duration})" + + +def split_silence( + audio: ndarray[Any, dtype[float32]], + top_db: int = 40, + ref: float | Callable[[ndarray[Any, dtype[float32]]], float] = 1, + frame_length: int = 2048, + hop_length: int = 512, + aggregate: Callable[[ndarray[Any, dtype[float32]]], float] = np.mean, + chunk_size_max: int = 44100 * 10 +) -> Iterable[Chunk]: + non_silence_indices = librosa.effects.split( + audio, + top_db=top_db, + ref=ref, + frame_length=frame_length, + hop_length=hop_length, + #aggregate=aggregate, + ) + last_end = 0 + for start, end in non_silence_indices: + if start != last_end: + yield Chunk( + is_speech=False, audio=audio[last_end:start], start=last_end, end=start + ) + if end-start > chunk_size_max: + chunk_count = (end-start) // chunk_size_max + for i in range(0, chunk_count): + yield Chunk(is_speech=True, audio=audio[start+(i*chunk_size_max):start+((i+1)*chunk_size_max)], + start=start+(i*chunk_size_max), end=start+((i+1)*chunk_size_max)) + yield Chunk(is_speech=True, audio=audio[start+chunk_count*chunk_size_max:end], + start=start+chunk_count*chunk_size_max, end=end) + last_end=end + else: + yield Chunk(is_speech=True, audio=audio[start:end], start=start, end=end) + last_end = end + if last_end != len(audio): + yield Chunk( + is_speech=False, audio=audio[last_end:], start=last_end, end=len(audio) + ) + + +class Svc: + def __init__( + self, + *, + net_g_path: Path | str, + config_path: Path | str, + device: torch.device | str | None = None, + cluster_model_path: Path | str | None = None, + half: bool = False, + ): + self.net_g_path = net_g_path + if device is None: + self.device = (get_optimal_device(),) + else: + self.device = torch.device(device) + self.hps = utils.get_hparams(config_path) + self.target_sample = self.hps.data.sampling_rate + self.hop_size = self.hps.data.hop_length + self.spk2id = self.hps.spk + self.hubert_model = utils.get_hubert_model( + self.device, self.hps.data.get("contentvec_final_proj", True) + ) + self.dtype = torch.float16 if half else torch.float32 + self.contentvec_final_proj = self.hps.data.__dict__.get( + "contentvec_final_proj", True + ) + self.load_model() + if cluster_model_path is not None and Path(cluster_model_path).exists(): + self.cluster_model = cluster.get_cluster_model(cluster_model_path) + + def load_model(self): + self.net_g = SynthesizerTrn( + self.hps.data.filter_length // 2 + 1, + self.hps.train.segment_size // self.hps.data.hop_length, + **self.hps.model, + ) + _ = utils.load_checkpoint(self.net_g_path, self.net_g, None) + _ = self.net_g.eval().to(self.device, dtype=self.dtype) + + def get_unit_f0( + self, + audio: ndarray[Any, dtype[float32]], + tran: int, + cluster_infer_ratio: float, + speaker: int | str, + f0_method: Literal[ + "crepe", "crepe-tiny", "parselmouth", "dio", "harvest" + ] = "dio", + ): + f0 = so_vits_svc_fork.f0.compute_f0( + audio, + sampling_rate=self.target_sample, + hop_length=self.hop_size, + method=f0_method, + ) + f0, uv = so_vits_svc_fork.f0.interpolate_f0(f0) + f0 = torch.as_tensor(f0, dtype=self.dtype, device=self.device) + uv = torch.as_tensor(uv, dtype=self.dtype, device=self.device) + f0 = f0 * 2 ** (tran / 12) + f0 = f0.unsqueeze(0) + uv = uv.unsqueeze(0) + + c = utils.get_content( + self.hubert_model, + audio, + self.device, + self.target_sample, + self.contentvec_final_proj, + ).to(self.dtype) + c = utils.repeat_expand_2d(c.squeeze(0), f0.shape[1]) + + if cluster_infer_ratio != 0: + cluster_c = cluster.get_cluster_center_result( + self.cluster_model, c.cpu().numpy().T, speaker + ).T + cluster_c = torch.FloatTensor(cluster_c).to(self.device) + c = cluster_infer_ratio * cluster_c + (1 - cluster_infer_ratio) * c + + c = c.unsqueeze(0) + return c, f0, uv + + def infer( + self, + speaker: int | str, + transpose: int, + audio: ndarray[Any, dtype[float32]], + cluster_infer_ratio: float = 0, + auto_predict_f0: bool = False, + noise_scale: float = 0.4, + f0_method: Literal[ + "crepe", "crepe-tiny", "parselmouth", "dio", "harvest" + ] = "dio", + ) -> tuple[torch.Tensor, int]: + audio = audio.astype(np.float32) + # get speaker id + if isinstance(speaker, int): + if len(self.spk2id.__dict__) >= speaker: + speaker_id = speaker + else: + raise ValueError( + f"Speaker id {speaker} >= number of speakers {len(self.spk2id.__dict__)}" + ) + else: + if speaker in self.spk2id.__dict__: + speaker_id = self.spk2id.__dict__[speaker] + else: + LOG.warning(f"Speaker {speaker} is not found. Use speaker 0 instead.") + speaker_id = 0 + speaker_candidates = list( + filter(lambda x: x[1] == speaker_id, self.spk2id.__dict__.items()) + ) + if len(speaker_candidates) > 1: + raise ValueError( + f"Speaker_id {speaker_id} is not unique. Candidates: {speaker_candidates}" + ) + elif len(speaker_candidates) == 0: + raise ValueError(f"Speaker_id {speaker_id} is not found.") + speaker = speaker_candidates[0][0] + sid = torch.LongTensor([int(speaker_id)]).to(self.device).unsqueeze(0) + + # get unit f0 + c, f0, uv = self.get_unit_f0( + audio, transpose, cluster_infer_ratio, speaker, f0_method + ) + + # inference + with torch.no_grad(): + with timer() as t: + audio = self.net_g.infer( + c, + f0=f0, + g=sid, + uv=uv, + predict_f0=auto_predict_f0, + noice_scale=noise_scale, + )[0, 0].data.float() + audio_duration = audio.shape[-1] / self.target_sample + LOG.info( + f"Inferece time: {t.elapsed:.2f}s, RTF: {t.elapsed / audio_duration:.2f}" + ) + torch.cuda.empty_cache() + return audio, audio.shape[-1] + + def infer_silence( + self, + audio: np.ndarray[Any, np.dtype[np.float32]], + *, + # svc config + speaker: int | str, + transpose: int = 0, + auto_predict_f0: bool = False, + cluster_infer_ratio: float = 0, + noise_scale: float = 0.4, + f0_method: Literal[ + "crepe", "crepe-tiny", "parselmouth", "dio", "harvest" + ] = "dio", + # slice config + db_thresh: int = -40, + pad_seconds: float = 0.5, + chunk_seconds: float = 0.5, + absolute_thresh: bool = False, + # fade_seconds: float = 0.0, + ) -> np.ndarray[Any, np.dtype[np.float32]]: + sr = self.target_sample + result_audio = np.array([], dtype=np.float32) + chunk_length_min = chunk_length_min = ( + int( + min( + sr / so_vits_svc_fork.f0.f0_min * 20 + 1, + chunk_seconds * sr, + ) + ) + // 2 + ) + for chunk in split_silence( + audio, + top_db=-db_thresh, + frame_length=chunk_length_min * 2, + hop_length=chunk_length_min, + ref=1 if absolute_thresh else np.max, + ): + LOG.info(f"Chunk: {chunk}") + if not chunk.is_speech: + audio_chunk_infer = np.zeros_like(chunk.audio) + else: + # pad + pad_len = int(sr * pad_seconds) + audio_chunk_pad = np.concatenate( + [ + np.zeros([pad_len], dtype=np.float32), + chunk.audio, + np.zeros([pad_len], dtype=np.float32), + ] + ) + audio_chunk_pad_infer_tensor, _ = self.infer( + speaker, + transpose, + audio_chunk_pad, + cluster_infer_ratio=cluster_infer_ratio, + auto_predict_f0=auto_predict_f0, + noise_scale=noise_scale, + f0_method=f0_method, + ) + audio_chunk_pad_infer = audio_chunk_pad_infer_tensor.cpu().numpy() + pad_len = int(self.target_sample * pad_seconds) + cut_len_2 = (len(audio_chunk_pad_infer) - len(chunk.audio)) // 2 + audio_chunk_infer = audio_chunk_pad_infer[ + cut_len_2 : cut_len_2 + len(chunk.audio) + ] + + # add fade + # fade_len = int(self.target_sample * fade_seconds) + # _audio[:fade_len] = _audio[:fade_len] * np.linspace(0, 1, fade_len) + # _audio[-fade_len:] = _audio[-fade_len:] * np.linspace(1, 0, fade_len) + + # empty cache + torch.cuda.empty_cache() + result_audio = np.concatenate([result_audio, audio_chunk_infer]) + result_audio = result_audio[: audio.shape[0]] + return result_audio + + +def sola_crossfade( + first: ndarray[Any, dtype[float32]], + second: ndarray[Any, dtype[float32]], + crossfade_len: int, + sola_search_len: int, +) -> ndarray[Any, dtype[float32]]: + cor_nom = np.convolve( + second[: sola_search_len + crossfade_len], + np.flip(first[-crossfade_len:]), + "valid", + ) + cor_den = np.sqrt( + np.convolve( + second[: sola_search_len + crossfade_len] ** 2, + np.ones(crossfade_len), + "valid", + ) + + 1e-8 + ) + sola_shift = np.argmax(cor_nom / cor_den) + LOG.info(f"SOLA shift: {sola_shift}") + second = second[sola_shift : sola_shift + len(second) - sola_search_len] + return np.concatenate( + [ + first[:-crossfade_len], + first[-crossfade_len:] * np.linspace(1, 0, crossfade_len) + + second[:crossfade_len] * np.linspace(0, 1, crossfade_len), + second[crossfade_len:], + ] + ) + + +class Crossfader: + def __init__( + self, + *, + additional_infer_before_len: int, + additional_infer_after_len: int, + crossfade_len: int, + sola_search_len: int = 384, + ) -> None: + if additional_infer_before_len < 0: + raise ValueError("additional_infer_len must be >= 0") + if crossfade_len < 0: + raise ValueError("crossfade_len must be >= 0") + if additional_infer_after_len < 0: + raise ValueError("additional_infer_len must be >= 0") + if additional_infer_before_len < 0: + raise ValueError("additional_infer_len must be >= 0") + self.additional_infer_before_len = additional_infer_before_len + self.additional_infer_after_len = additional_infer_after_len + self.crossfade_len = crossfade_len + self.sola_search_len = sola_search_len + self.last_input_left = np.zeros( + sola_search_len + + crossfade_len + + additional_infer_before_len + + additional_infer_after_len, + dtype=np.float32, + ) + self.last_infered_left = np.zeros(crossfade_len, dtype=np.float32) + + def process( + self, input_audio: ndarray[Any, dtype[float32]], *args, **kwargs: Any + ) -> ndarray[Any, dtype[float32]]: + """ + chunks : ■■■■■■□□□□□□ + add last input:□■■■■■■ + ■□□□□□□ + infer :□■■■■■■ + ■□□□□□□ + crossfade :▲■■■■■ + ▲□□□□□ + """ + # check input + if input_audio.ndim != 1: + raise ValueError("Input audio must be 1-dimensional.") + if ( + input_audio.shape[0] + self.additional_infer_before_len + <= self.crossfade_len + ): + raise ValueError( + f"Input audio length ({input_audio.shape[0]}) + additional_infer_len ({self.additional_infer_before_len}) must be greater than crossfade_len ({self.crossfade_len})." + ) + input_audio = input_audio.astype(np.float32) + input_audio_len = len(input_audio) + + # concat last input and infer + input_audio_concat = np.concatenate([self.last_input_left, input_audio]) + del input_audio + pad_len = 0 + if pad_len: + infer_audio_concat = self.infer( + np.pad(input_audio_concat, (pad_len, pad_len), mode="reflect"), + *args, + **kwargs, + )[pad_len:-pad_len] + else: + infer_audio_concat = self.infer(input_audio_concat, *args, **kwargs) + + # debug SOLA (using copy synthesis with a random shift) + """ + rs = int(np.random.uniform(-200,200)) + LOG.info(f"Debug random shift: {rs}") + infer_audio_concat = np.roll(input_audio_concat, rs) + """ + + if len(infer_audio_concat) != len(input_audio_concat): + raise ValueError( + f"Inferred audio length ({len(infer_audio_concat)}) should be equal to input audio length ({len(input_audio_concat)})." + ) + infer_audio_to_use = infer_audio_concat[ + -( + self.sola_search_len + + self.crossfade_len + + input_audio_len + + self.additional_infer_after_len + ) : -self.additional_infer_after_len + ] + assert ( + len(infer_audio_to_use) + == input_audio_len + self.sola_search_len + self.crossfade_len + ), f"{len(infer_audio_to_use)} != {input_audio_len + self.sola_search_len + self.cross_fade_len}" + _audio = sola_crossfade( + self.last_infered_left, + infer_audio_to_use, + self.crossfade_len, + self.sola_search_len, + ) + result_audio = _audio[: -self.crossfade_len] + assert ( + len(result_audio) == input_audio_len + ), f"{len(result_audio)} != {input_audio_len}" + + # update last input and inferred + self.last_input_left = input_audio_concat[ + -( + self.sola_search_len + + self.crossfade_len + + self.additional_infer_before_len + + self.additional_infer_after_len + ) : + ] + self.last_infered_left = _audio[-self.crossfade_len :] + return result_audio + + def infer( + self, input_audio: ndarray[Any, dtype[float32]] + ) -> ndarray[Any, dtype[float32]]: + return input_audio + + +class RealtimeVC(Crossfader): + def __init__( + self, + *, + svc_model: Svc, + crossfade_len: int = 3840, + additional_infer_before_len: int = 7680, + additional_infer_after_len: int = 7680, + split: bool = True, + ) -> None: + self.svc_model = svc_model + self.split = split + super().__init__( + crossfade_len=crossfade_len, + additional_infer_before_len=additional_infer_before_len, + additional_infer_after_len=additional_infer_after_len, + ) + + def process( + self, + input_audio: ndarray[Any, dtype[float32]], + *args: Any, + **kwargs: Any, + ) -> ndarray[Any, dtype[float32]]: + return super().process(input_audio, *args, **kwargs) + + def infer( + self, + input_audio: np.ndarray[Any, np.dtype[np.float32]], + # svc config + speaker: int | str, + transpose: int, + cluster_infer_ratio: float = 0, + auto_predict_f0: bool = False, + noise_scale: float = 0.4, + f0_method: Literal[ + "crepe", "crepe-tiny", "parselmouth", "dio", "harvest" + ] = "dio", + # slice config + db_thresh: int = -40, + pad_seconds: float = 0.5, + chunk_seconds: float = 0.5, + ) -> ndarray[Any, dtype[float32]]: + # infer + if self.split: + return self.svc_model.infer_silence( + audio=input_audio, + speaker=speaker, + transpose=transpose, + cluster_infer_ratio=cluster_infer_ratio, + auto_predict_f0=auto_predict_f0, + noise_scale=noise_scale, + f0_method=f0_method, + db_thresh=db_thresh, + pad_seconds=pad_seconds, + chunk_seconds=chunk_seconds, + absolute_thresh=True, + ) + else: + rms = np.sqrt(np.mean(input_audio**2)) + min_rms = 10 ** (db_thresh / 20) + if rms < min_rms: + LOG.info(f"Skip silence: RMS={rms:.2f} < {min_rms:.2f}") + return np.zeros_like(input_audio) + else: + LOG.info(f"Start inference: RMS={rms:.2f} >= {min_rms:.2f}") + infered_audio_c, _ = self.svc_model.infer( + speaker=speaker, + transpose=transpose, + audio=input_audio, + cluster_infer_ratio=cluster_infer_ratio, + auto_predict_f0=auto_predict_f0, + noise_scale=noise_scale, + f0_method=f0_method, + ) + return infered_audio_c.cpu().numpy() + + +class RealtimeVC2: + chunk_store: list[Chunk] + + def __init__(self, svc_model: Svc) -> None: + self.input_audio_store = np.array([], dtype=np.float32) + self.chunk_store = [] + self.svc_model = svc_model + + def process( + self, + input_audio: np.ndarray[Any, np.dtype[np.float32]], + # svc config + speaker: int | str, + transpose: int, + cluster_infer_ratio: float = 0, + auto_predict_f0: bool = False, + noise_scale: float = 0.4, + f0_method: Literal[ + "crepe", "crepe-tiny", "parselmouth", "dio", "harvest" + ] = "dio", + # slice config + db_thresh: int = -40, + chunk_seconds: float = 0.5, + ) -> ndarray[Any, dtype[float32]]: + def infer(audio: ndarray[Any, dtype[float32]]) -> ndarray[Any, dtype[float32]]: + infered_audio_c, _ = self.svc_model.infer( + speaker=speaker, + transpose=transpose, + audio=audio, + cluster_infer_ratio=cluster_infer_ratio, + auto_predict_f0=auto_predict_f0, + noise_scale=noise_scale, + f0_method=f0_method, + ) + return infered_audio_c.cpu().numpy() + + self.input_audio_store = np.concatenate([self.input_audio_store, input_audio]) + LOG.info(f"input_audio_store: {self.input_audio_store.shape}") + sr = self.svc_model.target_sample + chunk_length_min = ( + int(min(sr / so_vits_svc_fork.f0.f0_min * 20 + 1, chunk_seconds * sr)) // 2 + ) + LOG.info(f"Chunk length min: {chunk_length_min}") + chunk_list = list( + split_silence( + self.input_audio_store, + -db_thresh, + frame_length=chunk_length_min * 2, + hop_length=chunk_length_min, + ref=1, # use absolute threshold + ) + ) + assert len(chunk_list) > 0 + LOG.info(f"Chunk list: {chunk_list}") + # do not infer LAST incomplete is_speech chunk and save to store + if chunk_list[-1].is_speech: + self.input_audio_store = chunk_list.pop().audio + else: + self.input_audio_store = np.array([], dtype=np.float32) + + # infer complete is_speech chunk and save to store + self.chunk_store.extend( + [ + attrs.evolve(c, audio=infer(c.audio) if c.is_speech else c.audio) + for c in chunk_list + ] + ) + + # calculate lengths and determine compress rate + total_speech_len = sum( + [c.duration if c.is_speech else 0 for c in self.chunk_store] + ) + total_silence_len = sum( + [c.duration if not c.is_speech else 0 for c in self.chunk_store] + ) + input_audio_len = input_audio.shape[0] + silence_compress_rate = total_silence_len / max( + 0, input_audio_len - total_speech_len + ) + LOG.info( + f"Total speech len: {total_speech_len}, silence len: {total_silence_len}, silence compress rate: {silence_compress_rate}" + ) + + # generate output audio + output_audio = np.array([], dtype=np.float32) + break_flag = False + LOG.info(f"Chunk store: {self.chunk_store}") + for chunk in deepcopy(self.chunk_store): + compress_rate = 1 if chunk.is_speech else silence_compress_rate + left_len = input_audio_len - output_audio.shape[0] + # calculate chunk duration + chunk_duration_output = int(min(chunk.duration / compress_rate, left_len)) + chunk_duration_input = int(min(chunk.duration, left_len * compress_rate)) + LOG.info( + f"Chunk duration output: {chunk_duration_output}, input: {chunk_duration_input}, left len: {left_len}" + ) + + # remove chunk from store + self.chunk_store.pop(0) + if chunk.duration > chunk_duration_input: + left_chunk = attrs.evolve( + chunk, audio=chunk.audio[chunk_duration_input:] + ) + chunk = attrs.evolve(chunk, audio=chunk.audio[:chunk_duration_input]) + + self.chunk_store.insert(0, left_chunk) + break_flag = True + + if chunk.is_speech: + # if is_speech, just concat + output_audio = np.concatenate([output_audio, chunk.audio]) + else: + # if is_silence, concat with zeros and compress with silence_compress_rate + output_audio = np.concatenate( + [ + output_audio, + np.zeros( + chunk_duration_output, + dtype=np.float32, + ), + ] + ) + + if break_flag: + break + LOG.info(f"Chunk store: {self.chunk_store}, output_audio: {output_audio.shape}") + # make same length (errors) + output_audio = output_audio[:input_audio_len] + output_audio = np.concatenate( + [ + output_audio, + np.zeros(input_audio_len - output_audio.shape[0], dtype=np.float32), + ] + ) + return output_audio diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/inference/main.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/inference/main.py new file mode 100644 index 0000000..ff726a9 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/inference/main.py @@ -0,0 +1,226 @@ +from __future__ import annotations + +from logging import getLogger +from pathlib import Path +from typing import Literal + +import librosa +import numpy as np +import soundfile +import torch +from cm_time import timer + +from so_vits_svc_fork.inference.core import RealtimeVC, RealtimeVC2, Svc +from so_vits_svc_fork.utils import get_optimal_device + +LOG = getLogger(__name__) + + +def infer( + *, + # paths + input_path: Path | str, + output_path: Path | str, + model_path: Path | str, + config_path: Path | str, + # svc config + speaker: int | str, + cluster_model_path: Path | str | None = None, + transpose: int = 0, + auto_predict_f0: bool = False, + cluster_infer_ratio: float = 0, + noise_scale: float = 0.4, + f0_method: Literal["crepe", "crepe-tiny", "parselmouth", "dio", "harvest"] = "dio", + # slice config + db_thresh: int = -40, + pad_seconds: float = 0.5, + chunk_seconds: float = 0.5, + absolute_thresh: bool = False, + device: str | torch.device = get_optimal_device(), +): + model_path = Path(model_path) + output_path = Path(output_path) + input_path = Path(input_path) + config_path = Path(config_path) + cluster_model_path = Path(cluster_model_path) if cluster_model_path else None + svc_model = Svc( + net_g_path=model_path.as_posix(), + config_path=config_path.as_posix(), + cluster_model_path=cluster_model_path.as_posix() + if cluster_model_path + else None, + device=device, + ) + + audio, _ = librosa.load(input_path, sr=svc_model.target_sample) + audio = svc_model.infer_silence( + audio.astype(np.float32), + speaker=speaker, + transpose=transpose, + auto_predict_f0=auto_predict_f0, + cluster_infer_ratio=cluster_infer_ratio, + noise_scale=noise_scale, + f0_method=f0_method, + db_thresh=db_thresh, + pad_seconds=pad_seconds, + chunk_seconds=chunk_seconds, + absolute_thresh=absolute_thresh, + ) + + soundfile.write(output_path, audio, svc_model.target_sample) + + +def realtime( + *, + # paths + model_path: Path | str, + config_path: Path | str, + # svc config + speaker: str, + cluster_model_path: Path | str | None = None, + transpose: int = 0, + auto_predict_f0: bool = False, + cluster_infer_ratio: float = 0, + noise_scale: float = 0.4, + f0_method: Literal["crepe", "crepe-tiny", "parselmouth", "dio", "harvest"] = "dio", + # slice config + db_thresh: int = -40, + pad_seconds: float = 0.5, + chunk_seconds: float = 0.5, + # realtime config + crossfade_seconds: float = 0.05, + additional_infer_before_seconds: float = 0.2, + additional_infer_after_seconds: float = 0.1, + block_seconds: float = 0.5, + version: int = 2, + input_device: int | str | None = None, + output_device: int | str | None = None, + device: str | torch.device = get_optimal_device(), + passthrough_original: bool = False, +): + import sounddevice as sd + + model_path = Path(model_path) + config_path = Path(config_path) + cluster_model_path = Path(cluster_model_path) if cluster_model_path else None + svc_model = Svc( + net_g_path=model_path.as_posix(), + config_path=config_path.as_posix(), + cluster_model_path=cluster_model_path.as_posix() + if cluster_model_path + else None, + device=device, + ) + + LOG.info("Creating realtime model...") + if version == 1: + model = RealtimeVC( + svc_model=svc_model, + crossfade_len=int(crossfade_seconds * svc_model.target_sample), + additional_infer_before_len=int( + additional_infer_before_seconds * svc_model.target_sample + ), + additional_infer_after_len=int( + additional_infer_after_seconds * svc_model.target_sample + ), + ) + else: + model = RealtimeVC2( + svc_model=svc_model, + ) + + # LOG all device info + devices = sd.query_devices() + LOG.info(f"Device: {devices}") + if isinstance(input_device, str): + input_device_candidates = [ + i for i, d in enumerate(devices) if d["name"] == input_device + ] + if len(input_device_candidates) == 0: + LOG.warning(f"Input device {input_device} not found, using default") + input_device = None + else: + input_device = input_device_candidates[0] + if isinstance(output_device, str): + output_device_candidates = [ + i for i, d in enumerate(devices) if d["name"] == output_device + ] + if len(output_device_candidates) == 0: + LOG.warning(f"Output device {output_device} not found, using default") + output_device = None + else: + output_device = output_device_candidates[0] + if input_device is None or input_device >= len(devices): + input_device = sd.default.device[0] + if output_device is None or output_device >= len(devices): + output_device = sd.default.device[1] + LOG.info( + f"Input Device: {devices[input_device]['name']}, Output Device: {devices[output_device]['name']}" + ) + + # the model RTL is somewhat significantly high only in the first inference + # there could be no better way to warm up the model than to do a dummy inference + # (there are not differences in the behavior of the model between the first and the later inferences) + # so we do a dummy inference to warm up the model (1 second of audio) + LOG.info("Warming up the model...") + svc_model.infer( + speaker=speaker, + transpose=transpose, + auto_predict_f0=auto_predict_f0, + cluster_infer_ratio=cluster_infer_ratio, + noise_scale=noise_scale, + f0_method=f0_method, + audio=np.zeros(svc_model.target_sample, dtype=np.float32), + ) + + def callback( + indata: np.ndarray, + outdata: np.ndarray, + frames: int, + time: int, + status: sd.CallbackFlags, + ) -> None: + LOG.debug( + f"Frames: {frames}, Status: {status}, Shape: {indata.shape}, Time: {time}" + ) + + kwargs = dict( + input_audio=indata.mean(axis=1).astype(np.float32), + # svc config + speaker=speaker, + transpose=transpose, + auto_predict_f0=auto_predict_f0, + cluster_infer_ratio=cluster_infer_ratio, + noise_scale=noise_scale, + f0_method=f0_method, + # slice config + db_thresh=db_thresh, + # pad_seconds=pad_seconds, + chunk_seconds=chunk_seconds, + ) + if version == 1: + kwargs["pad_seconds"] = pad_seconds + with timer() as t: + inference = model.process( + **kwargs, + ).reshape(-1, 1) + if passthrough_original: + outdata[:] = (indata + inference) / 2 + else: + outdata[:] = inference + rtf = t.elapsed / block_seconds + LOG.info(f"Realtime inference time: {t.elapsed:.3f}s, RTF: {rtf:.3f}") + if rtf > 1: + LOG.warning("RTF is too high, consider increasing block_seconds") + + with sd.Stream( + device=(input_device, output_device), + channels=1, + callback=callback, + samplerate=svc_model.target_sample, + blocksize=int(block_seconds * svc_model.target_sample), + latency="low", + ) as stream: + LOG.info(f"Latency: {stream.latency}") + while True: + sd.sleep(1000) diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/logger.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/logger.py new file mode 100644 index 0000000..caa9110 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/logger.py @@ -0,0 +1,54 @@ +import os +import sys +from logging import ( + DEBUG, + INFO, + FileHandler, + StreamHandler, + basicConfig, + captureWarnings, + getLogger, +) +from pathlib import Path + +from rich.logging import RichHandler + +LOGGER_INIT = False + + +def init_logger() -> None: + global LOGGER_INIT + if LOGGER_INIT: + return + + IS_TEST = "test" in Path.cwd().stem + package_name = sys.modules[__name__].__package__ + basicConfig( + level=INFO, + format="%(asctime)s %(message)s", + datefmt="[%X]", + handlers=[ + StreamHandler() if is_notebook() else RichHandler(), + FileHandler(f"{package_name}.log"), + ], + ) + if IS_TEST: + getLogger(package_name).setLevel(DEBUG) + captureWarnings(True) + LOGGER_INIT = True + + +def is_notebook(): + try: + from IPython import get_ipython + + if "IPKernelApp" not in get_ipython().config: # pragma: no cover + raise ImportError("console") + return False + if "VSCODE_PID" in os.environ: # pragma: no cover + raise ImportError("vscode") + return False + except Exception: + return False + else: # pragma: no cover + return True diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/__init__.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/attentions.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/attentions.py new file mode 100644 index 0000000..aeaf40f --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/attentions.py @@ -0,0 +1,488 @@ +import math + +import torch +from torch import nn +from torch.nn import functional as F + +from so_vits_svc_fork.modules import commons +from so_vits_svc_fork.modules.modules import LayerNorm + + +class FFT(nn.Module): + def __init__( + self, + hidden_channels, + filter_channels, + n_heads, + n_layers=1, + kernel_size=1, + p_dropout=0.0, + proximal_bias=False, + proximal_init=True, + **kwargs + ): + super().__init__() + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.proximal_bias = proximal_bias + self.proximal_init = proximal_init + + self.drop = nn.Dropout(p_dropout) + self.self_attn_layers = nn.ModuleList() + self.norm_layers_0 = nn.ModuleList() + self.ffn_layers = nn.ModuleList() + self.norm_layers_1 = nn.ModuleList() + for i in range(self.n_layers): + self.self_attn_layers.append( + MultiHeadAttention( + hidden_channels, + hidden_channels, + n_heads, + p_dropout=p_dropout, + proximal_bias=proximal_bias, + proximal_init=proximal_init, + ) + ) + self.norm_layers_0.append(LayerNorm(hidden_channels)) + self.ffn_layers.append( + FFN( + hidden_channels, + hidden_channels, + filter_channels, + kernel_size, + p_dropout=p_dropout, + causal=True, + ) + ) + self.norm_layers_1.append(LayerNorm(hidden_channels)) + + def forward(self, x, x_mask): + """ + x: decoder input + h: encoder output + """ + self_attn_mask = commons.subsequent_mask(x_mask.size(2)).to( + device=x.device, dtype=x.dtype + ) + x = x * x_mask + for i in range(self.n_layers): + y = self.self_attn_layers[i](x, x, self_attn_mask) + y = self.drop(y) + x = self.norm_layers_0[i](x + y) + + y = self.ffn_layers[i](x, x_mask) + y = self.drop(y) + x = self.norm_layers_1[i](x + y) + x = x * x_mask + return x + + +class Encoder(nn.Module): + def __init__( + self, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size=1, + p_dropout=0.0, + window_size=4, + **kwargs + ): + super().__init__() + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.window_size = window_size + + self.drop = nn.Dropout(p_dropout) + self.attn_layers = nn.ModuleList() + self.norm_layers_1 = nn.ModuleList() + self.ffn_layers = nn.ModuleList() + self.norm_layers_2 = nn.ModuleList() + for i in range(self.n_layers): + self.attn_layers.append( + MultiHeadAttention( + hidden_channels, + hidden_channels, + n_heads, + p_dropout=p_dropout, + window_size=window_size, + ) + ) + self.norm_layers_1.append(LayerNorm(hidden_channels)) + self.ffn_layers.append( + FFN( + hidden_channels, + hidden_channels, + filter_channels, + kernel_size, + p_dropout=p_dropout, + ) + ) + self.norm_layers_2.append(LayerNorm(hidden_channels)) + + def forward(self, x, x_mask): + attn_mask = x_mask.unsqueeze(2) * x_mask.unsqueeze(-1) + x = x * x_mask + for i in range(self.n_layers): + y = self.attn_layers[i](x, x, attn_mask) + y = self.drop(y) + x = self.norm_layers_1[i](x + y) + + y = self.ffn_layers[i](x, x_mask) + y = self.drop(y) + x = self.norm_layers_2[i](x + y) + x = x * x_mask + return x + + +class Decoder(nn.Module): + def __init__( + self, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size=1, + p_dropout=0.0, + proximal_bias=False, + proximal_init=True, + **kwargs + ): + super().__init__() + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.proximal_bias = proximal_bias + self.proximal_init = proximal_init + + self.drop = nn.Dropout(p_dropout) + self.self_attn_layers = nn.ModuleList() + self.norm_layers_0 = nn.ModuleList() + self.encdec_attn_layers = nn.ModuleList() + self.norm_layers_1 = nn.ModuleList() + self.ffn_layers = nn.ModuleList() + self.norm_layers_2 = nn.ModuleList() + for i in range(self.n_layers): + self.self_attn_layers.append( + MultiHeadAttention( + hidden_channels, + hidden_channels, + n_heads, + p_dropout=p_dropout, + proximal_bias=proximal_bias, + proximal_init=proximal_init, + ) + ) + self.norm_layers_0.append(LayerNorm(hidden_channels)) + self.encdec_attn_layers.append( + MultiHeadAttention( + hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout + ) + ) + self.norm_layers_1.append(LayerNorm(hidden_channels)) + self.ffn_layers.append( + FFN( + hidden_channels, + hidden_channels, + filter_channels, + kernel_size, + p_dropout=p_dropout, + causal=True, + ) + ) + self.norm_layers_2.append(LayerNorm(hidden_channels)) + + def forward(self, x, x_mask, h, h_mask): + """ + x: decoder input + h: encoder output + """ + self_attn_mask = commons.subsequent_mask(x_mask.size(2)).to( + device=x.device, dtype=x.dtype + ) + encdec_attn_mask = h_mask.unsqueeze(2) * x_mask.unsqueeze(-1) + x = x * x_mask + for i in range(self.n_layers): + y = self.self_attn_layers[i](x, x, self_attn_mask) + y = self.drop(y) + x = self.norm_layers_0[i](x + y) + + y = self.encdec_attn_layers[i](x, h, encdec_attn_mask) + y = self.drop(y) + x = self.norm_layers_1[i](x + y) + + y = self.ffn_layers[i](x, x_mask) + y = self.drop(y) + x = self.norm_layers_2[i](x + y) + x = x * x_mask + return x + + +class MultiHeadAttention(nn.Module): + def __init__( + self, + channels, + out_channels, + n_heads, + p_dropout=0.0, + window_size=None, + heads_share=True, + block_length=None, + proximal_bias=False, + proximal_init=False, + ): + super().__init__() + assert channels % n_heads == 0 + + self.channels = channels + self.out_channels = out_channels + self.n_heads = n_heads + self.p_dropout = p_dropout + self.window_size = window_size + self.heads_share = heads_share + self.block_length = block_length + self.proximal_bias = proximal_bias + self.proximal_init = proximal_init + self.attn = None + + self.k_channels = channels // n_heads + self.conv_q = nn.Conv1d(channels, channels, 1) + self.conv_k = nn.Conv1d(channels, channels, 1) + self.conv_v = nn.Conv1d(channels, channels, 1) + self.conv_o = nn.Conv1d(channels, out_channels, 1) + self.drop = nn.Dropout(p_dropout) + + if window_size is not None: + n_heads_rel = 1 if heads_share else n_heads + rel_stddev = self.k_channels**-0.5 + self.emb_rel_k = nn.Parameter( + torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels) + * rel_stddev + ) + self.emb_rel_v = nn.Parameter( + torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels) + * rel_stddev + ) + + nn.init.xavier_uniform_(self.conv_q.weight) + nn.init.xavier_uniform_(self.conv_k.weight) + nn.init.xavier_uniform_(self.conv_v.weight) + if proximal_init: + with torch.no_grad(): + self.conv_k.weight.copy_(self.conv_q.weight) + self.conv_k.bias.copy_(self.conv_q.bias) + + def forward(self, x, c, attn_mask=None): + q = self.conv_q(x) + k = self.conv_k(c) + v = self.conv_v(c) + + x, self.attn = self.attention(q, k, v, mask=attn_mask) + + x = self.conv_o(x) + return x + + def attention(self, query, key, value, mask=None): + # reshape [b, d, t] -> [b, n_h, t, d_k] + b, d, t_s, t_t = (*key.size(), query.size(2)) + query = query.view(b, self.n_heads, self.k_channels, t_t).transpose(2, 3) + key = key.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3) + value = value.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3) + + scores = torch.matmul(query / math.sqrt(self.k_channels), key.transpose(-2, -1)) + if self.window_size is not None: + assert ( + t_s == t_t + ), "Relative attention is only available for self-attention." + key_relative_embeddings = self._get_relative_embeddings(self.emb_rel_k, t_s) + rel_logits = self._matmul_with_relative_keys( + query / math.sqrt(self.k_channels), key_relative_embeddings + ) + scores_local = self._relative_position_to_absolute_position(rel_logits) + scores = scores + scores_local + if self.proximal_bias: + assert t_s == t_t, "Proximal bias is only available for self-attention." + scores = scores + self._attention_bias_proximal(t_s).to( + device=scores.device, dtype=scores.dtype + ) + if mask is not None: + scores = scores.masked_fill(mask == 0, -1e4) + if self.block_length is not None: + assert ( + t_s == t_t + ), "Local attention is only available for self-attention." + block_mask = ( + torch.ones_like(scores) + .triu(-self.block_length) + .tril(self.block_length) + ) + scores = scores.masked_fill(block_mask == 0, -1e4) + p_attn = F.softmax(scores, dim=-1) # [b, n_h, t_t, t_s] + p_attn = self.drop(p_attn) + output = torch.matmul(p_attn, value) + if self.window_size is not None: + relative_weights = self._absolute_position_to_relative_position(p_attn) + value_relative_embeddings = self._get_relative_embeddings( + self.emb_rel_v, t_s + ) + output = output + self._matmul_with_relative_values( + relative_weights, value_relative_embeddings + ) + output = ( + output.transpose(2, 3).contiguous().view(b, d, t_t) + ) # [b, n_h, t_t, d_k] -> [b, d, t_t] + return output, p_attn + + def _matmul_with_relative_values(self, x, y): + """ + x: [b, h, l, m] + y: [h or 1, m, d] + ret: [b, h, l, d] + """ + ret = torch.matmul(x, y.unsqueeze(0)) + return ret + + def _matmul_with_relative_keys(self, x, y): + """ + x: [b, h, l, d] + y: [h or 1, m, d] + ret: [b, h, l, m] + """ + ret = torch.matmul(x, y.unsqueeze(0).transpose(-2, -1)) + return ret + + def _get_relative_embeddings(self, relative_embeddings, length): + 2 * self.window_size + 1 + # Pad first before slice to avoid using cond ops. + pad_length = max(length - (self.window_size + 1), 0) + slice_start_position = max((self.window_size + 1) - length, 0) + slice_end_position = slice_start_position + 2 * length - 1 + if pad_length > 0: + padded_relative_embeddings = F.pad( + relative_embeddings, + commons.convert_pad_shape([[0, 0], [pad_length, pad_length], [0, 0]]), + ) + else: + padded_relative_embeddings = relative_embeddings + used_relative_embeddings = padded_relative_embeddings[ + :, slice_start_position:slice_end_position + ] + return used_relative_embeddings + + def _relative_position_to_absolute_position(self, x): + """ + x: [b, h, l, 2*l-1] + ret: [b, h, l, l] + """ + batch, heads, length, _ = x.size() + # Concat columns of pad to shift from relative to absolute indexing. + x = F.pad(x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, 1]])) + + # Concat extra elements so to add up to shape (len+1, 2*len-1). + x_flat = x.view([batch, heads, length * 2 * length]) + x_flat = F.pad( + x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [0, length - 1]]) + ) + + # Reshape and slice out the padded elements. + x_final = x_flat.view([batch, heads, length + 1, 2 * length - 1])[ + :, :, :length, length - 1 : + ] + return x_final + + def _absolute_position_to_relative_position(self, x): + """ + x: [b, h, l, l] + ret: [b, h, l, 2*l-1] + """ + batch, heads, length, _ = x.size() + # pad along column + x = F.pad( + x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, length - 1]]) + ) + x_flat = x.view([batch, heads, length**2 + length * (length - 1)]) + # add 0's in the beginning that will skew the elements after reshape + x_flat = F.pad(x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [length, 0]])) + x_final = x_flat.view([batch, heads, length, 2 * length])[:, :, :, 1:] + return x_final + + def _attention_bias_proximal(self, length): + """Bias for self-attention to encourage attention to close positions. + Args: + length: an integer scalar. + Returns: + a Tensor with shape [1, 1, length, length] + """ + r = torch.arange(length, dtype=torch.float32) + diff = torch.unsqueeze(r, 0) - torch.unsqueeze(r, 1) + return torch.unsqueeze(torch.unsqueeze(-torch.log1p(torch.abs(diff)), 0), 0) + + +class FFN(nn.Module): + def __init__( + self, + in_channels, + out_channels, + filter_channels, + kernel_size, + p_dropout=0.0, + activation=None, + causal=False, + ): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.filter_channels = filter_channels + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.activation = activation + self.causal = causal + + if causal: + self.padding = self._causal_padding + else: + self.padding = self._same_padding + + self.conv_1 = nn.Conv1d(in_channels, filter_channels, kernel_size) + self.conv_2 = nn.Conv1d(filter_channels, out_channels, kernel_size) + self.drop = nn.Dropout(p_dropout) + + def forward(self, x, x_mask): + x = self.conv_1(self.padding(x * x_mask)) + if self.activation == "gelu": + x = x * torch.sigmoid(1.702 * x) + else: + x = torch.relu(x) + x = self.drop(x) + x = self.conv_2(self.padding(x * x_mask)) + return x * x_mask + + def _causal_padding(self, x): + if self.kernel_size == 1: + return x + pad_l = self.kernel_size - 1 + pad_r = 0 + padding = [[0, 0], [0, 0], [pad_l, pad_r]] + x = F.pad(x, commons.convert_pad_shape(padding)) + return x + + def _same_padding(self, x): + if self.kernel_size == 1: + return x + pad_l = (self.kernel_size - 1) // 2 + pad_r = self.kernel_size // 2 + padding = [[0, 0], [0, 0], [pad_l, pad_r]] + x = F.pad(x, commons.convert_pad_shape(padding)) + return x diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/commons.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/commons.py new file mode 100644 index 0000000..68e990d --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/commons.py @@ -0,0 +1,132 @@ +from __future__ import annotations + +import torch +import torch.nn.functional as F +from torch import Tensor + + +def slice_segments(x: Tensor, starts: Tensor, length: int) -> Tensor: + if length is None: + return x + length = min(length, x.size(-1)) + x_slice = torch.zeros((x.size()[:-1] + (length,)), dtype=x.dtype, device=x.device) + ends = starts + length + for i, (start, end) in enumerate(zip(starts, ends)): + # LOG.debug(i, start, end, x.size(), x[i, ..., start:end].size(), x_slice.size()) + # x_slice[i, ...] = x[i, ..., start:end] need to pad + # x_slice[i, ..., :end - start] = x[i, ..., start:end] this does not work + x_slice[i, ...] = F.pad(x[i, ..., start:end], (0, max(0, length - x.size(-1)))) + return x_slice + + +def rand_slice_segments_with_pitch( + x: Tensor, f0: Tensor, x_lengths: Tensor | int | None, segment_size: int | None +): + if segment_size is None: + return x, f0, torch.arange(x.size(0), device=x.device) + if x_lengths is None: + x_lengths = x.size(-1) * torch.ones( + x.size(0), dtype=torch.long, device=x.device + ) + # slice_starts = (torch.rand(z.size(0), device=z.device) * (z_lengths - segment_size)).long() + slice_starts = ( + torch.rand(x.size(0), device=x.device) + * torch.max( + x_lengths - segment_size, torch.zeros_like(x_lengths, device=x.device) + ) + ).long() + z_slice = slice_segments(x, slice_starts, segment_size) + f0_slice = slice_segments(f0, slice_starts, segment_size) + return z_slice, f0_slice, slice_starts + + +def slice_2d_segments(x: Tensor, starts: Tensor, length: int) -> Tensor: + batch_size, num_features, seq_len = x.shape + ends = starts + length + idxs = ( + torch.arange(seq_len, device=x.device) + .unsqueeze(0) + .unsqueeze(1) + .repeat(batch_size, num_features, 1) + ) + mask = (idxs >= starts.unsqueeze(-1).unsqueeze(-1)) & ( + idxs < ends.unsqueeze(-1).unsqueeze(-1) + ) + return x[mask].reshape(batch_size, num_features, length) + + +def slice_1d_segments(x: Tensor, starts: Tensor, length: int) -> Tensor: + batch_size, seq_len = x.shape + ends = starts + length + idxs = torch.arange(seq_len, device=x.device).unsqueeze(0).repeat(batch_size, 1) + mask = (idxs >= starts.unsqueeze(-1)) & (idxs < ends.unsqueeze(-1)) + return x[mask].reshape(batch_size, length) + + +def _slice_segments_v3(x: Tensor, starts: Tensor, length: int) -> Tensor: + shape = x.shape[:-1] + (length,) + ends = starts + length + idxs = torch.arange(x.shape[-1], device=x.device).unsqueeze(0).unsqueeze(0) + unsqueeze_dims = len(shape) - len( + x.shape + ) # calculate number of dimensions to unsqueeze + starts = starts.reshape(starts.shape + (1,) * unsqueeze_dims) + ends = ends.reshape(ends.shape + (1,) * unsqueeze_dims) + mask = (idxs >= starts) & (idxs < ends) + return x[mask].reshape(shape) + + +def init_weights(m, mean=0.0, std=0.01): + classname = m.__class__.__name__ + if classname.find("Conv") != -1: + m.weight.data.normal_(mean, std) + + +def get_padding(kernel_size, dilation=1): + return int((kernel_size * dilation - dilation) / 2) + + +def convert_pad_shape(pad_shape): + l = pad_shape[::-1] + pad_shape = [item for sublist in l for item in sublist] + return pad_shape + + +def subsequent_mask(length): + mask = torch.tril(torch.ones(length, length)).unsqueeze(0).unsqueeze(0) + return mask + + +@torch.jit.script +def fused_add_tanh_sigmoid_multiply(input_a, input_b, n_channels): + n_channels_int = n_channels[0] + in_act = input_a + input_b + t_act = torch.tanh(in_act[:, :n_channels_int, :]) + s_act = torch.sigmoid(in_act[:, n_channels_int:, :]) + acts = t_act * s_act + return acts + + +def sequence_mask(length, max_length=None): + if max_length is None: + max_length = length.max() + x = torch.arange(max_length, dtype=length.dtype, device=length.device) + return x.unsqueeze(0) < length.unsqueeze(1) + + +def clip_grad_value_(parameters, clip_value, norm_type=2): + if isinstance(parameters, torch.Tensor): + parameters = [parameters] + parameters = list(filter(lambda p: p.grad is not None, parameters)) + norm_type = float(norm_type) + if clip_value is not None: + clip_value = float(clip_value) + + total_norm = 0 + for p in parameters: + param_norm = p.grad.data.norm(norm_type) + total_norm += param_norm.item() ** norm_type + if clip_value is not None: + p.grad.data.clamp_(min=-clip_value, max=clip_value) + total_norm = total_norm ** (1.0 / norm_type) + return total_norm diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/__init__.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/f0.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/f0.py new file mode 100644 index 0000000..b30b73b --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/f0.py @@ -0,0 +1,46 @@ +import torch +from torch import nn + +from so_vits_svc_fork.modules import attentions as attentions + + +class F0Decoder(nn.Module): + def __init__( + self, + out_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + spk_channels=0, + ): + super().__init__() + self.out_channels = out_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.spk_channels = spk_channels + + self.prenet = nn.Conv1d(hidden_channels, hidden_channels, 3, padding=1) + self.decoder = attentions.FFT( + hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout + ) + self.proj = nn.Conv1d(hidden_channels, out_channels, 1) + self.f0_prenet = nn.Conv1d(1, hidden_channels, 3, padding=1) + self.cond = nn.Conv1d(spk_channels, hidden_channels, 1) + + def forward(self, x, norm_f0, x_mask, spk_emb=None): + x = torch.detach(x) + if spk_emb is not None: + spk_emb = torch.detach(spk_emb) + x = x + self.cond(spk_emb) + x += self.f0_prenet(norm_f0) + x = self.prenet(x) * x_mask + x = self.decoder(x * x_mask, x_mask) + x = self.proj(x) * x_mask + return x diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/hifigan/__init__.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/hifigan/__init__.py new file mode 100644 index 0000000..7272ec9 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/hifigan/__init__.py @@ -0,0 +1,3 @@ +from ._models import NSFHifiGANGenerator + +__all__ = ["NSFHifiGANGenerator"] diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/hifigan/_models.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/hifigan/_models.py new file mode 100644 index 0000000..fee8300 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/hifigan/_models.py @@ -0,0 +1,311 @@ +from logging import getLogger + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch.nn import Conv1d, ConvTranspose1d +from torch.nn.utils import remove_weight_norm, weight_norm + +from ...modules import ResBlock1, ResBlock2 +from ._utils import init_weights + +LOG = getLogger(__name__) + +LRELU_SLOPE = 0.1 + + +def padDiff(x): + return F.pad( + F.pad(x, (0, 0, -1, 1), "constant", 0) - x, (0, 0, 0, -1), "constant", 0 + ) + + +class SineGen(torch.nn.Module): + """Definition of sine generator + SineGen(samp_rate, harmonic_num = 0, + sine_amp = 0.1, noise_std = 0.003, + voiced_threshold = 0, + flag_for_pulse=False) + samp_rate: sampling rate in Hz + harmonic_num: number of harmonic overtones (default 0) + sine_amp: amplitude of sine-wavefrom (default 0.1) + noise_std: std of Gaussian noise (default 0.003) + voiced_thoreshold: F0 threshold for U/V classification (default 0) + flag_for_pulse: this SinGen is used inside PulseGen (default False) + Note: when flag_for_pulse is True, the first time step of a voiced + segment is always sin(np.pi) or cos(0) + """ + + def __init__( + self, + samp_rate, + harmonic_num=0, + sine_amp=0.1, + noise_std=0.003, + voiced_threshold=0, + flag_for_pulse=False, + ): + super().__init__() + self.sine_amp = sine_amp + self.noise_std = noise_std + self.harmonic_num = harmonic_num + self.dim = self.harmonic_num + 1 + self.sampling_rate = samp_rate + self.voiced_threshold = voiced_threshold + self.flag_for_pulse = flag_for_pulse + + def _f02uv(self, f0): + # generate uv signal + uv = (f0 > self.voiced_threshold).type(torch.float32) + return uv + + def _f02sine(self, f0_values): + """f0_values: (batchsize, length, dim) + where dim indicates fundamental tone and overtones + """ + # convert to F0 in rad. The integer part n can be ignored + # because 2 * np.pi * n doesn't affect phase + rad_values = (f0_values / self.sampling_rate) % 1 + + # initial phase noise (no noise for fundamental component) + rand_ini = torch.rand( + f0_values.shape[0], f0_values.shape[2], device=f0_values.device + ) + rand_ini[:, 0] = 0 + rad_values[:, 0, :] = rad_values[:, 0, :] + rand_ini + + # instantanouse phase sine[t] = sin(2*pi \sum_i=1 ^{t} rad) + if not self.flag_for_pulse: + # for normal case + + # To prevent torch.cumsum numerical overflow, + # it is necessary to add -1 whenever \sum_k=1^n rad_value_k > 1. + # Buffer tmp_over_one_idx indicates the time step to add -1. + # This will not change F0 of sine because (x-1) * 2*pi = x * 2*pi + tmp_over_one = torch.cumsum(rad_values, 1) % 1 + tmp_over_one_idx = (padDiff(tmp_over_one)) < 0 + cumsum_shift = torch.zeros_like(rad_values) + cumsum_shift[:, 1:, :] = tmp_over_one_idx * -1.0 + + sines = torch.sin( + torch.cumsum(rad_values + cumsum_shift, dim=1) * 2 * np.pi + ) + else: + # If necessary, make sure that the first time step of every + # voiced segments is sin(pi) or cos(0) + # This is used for pulse-train generation + + # identify the last time step in unvoiced segments + uv = self._f02uv(f0_values) + uv_1 = torch.roll(uv, shifts=-1, dims=1) + uv_1[:, -1, :] = 1 + u_loc = (uv < 1) * (uv_1 > 0) + + # get the instantanouse phase + tmp_cumsum = torch.cumsum(rad_values, dim=1) + # different batch needs to be processed differently + for idx in range(f0_values.shape[0]): + temp_sum = tmp_cumsum[idx, u_loc[idx, :, 0], :] + temp_sum[1:, :] = temp_sum[1:, :] - temp_sum[0:-1, :] + # stores the accumulation of i.phase within + # each voiced segments + tmp_cumsum[idx, :, :] = 0 + tmp_cumsum[idx, u_loc[idx, :, 0], :] = temp_sum + + # rad_values - tmp_cumsum: remove the accumulation of i.phase + # within the previous voiced segment. + i_phase = torch.cumsum(rad_values - tmp_cumsum, dim=1) + + # get the sines + sines = torch.cos(i_phase * 2 * np.pi) + return sines + + def forward(self, f0): + """sine_tensor, uv = forward(f0) + input F0: tensor(batchsize=1, length, dim=1) + f0 for unvoiced steps should be 0 + output sine_tensor: tensor(batchsize=1, length, dim) + output uv: tensor(batchsize=1, length, 1) + """ + with torch.no_grad(): + # f0_buf = torch.zeros(f0.shape[0], f0.shape[1], self.dim, device=f0.device) + # fundamental component + # fn = torch.multiply( + # f0, torch.FloatTensor([[range(1, self.harmonic_num + 2)]]).to(f0.device) + # ) + fn = torch.multiply( + f0, torch.arange(1, self.harmonic_num + 2).to(f0.device).to(f0.dtype) + ) + + # generate sine waveforms + sine_waves = self._f02sine(fn) * self.sine_amp + + # generate uv signal + # uv = torch.ones(f0.shape) + # uv = uv * (f0 > self.voiced_threshold) + uv = self._f02uv(f0) + + # noise: for unvoiced should be similar to sine_amp + # std = self.sine_amp/3 -> max value ~ self.sine_amp + # . for voiced regions is self.noise_std + noise_amp = uv * self.noise_std + (1 - uv) * self.sine_amp / 3 + noise = noise_amp * torch.randn_like(sine_waves) + + # first: set the unvoiced part to 0 by uv + # then: additive noise + sine_waves = sine_waves * uv + noise + return sine_waves, uv, noise + + +class SourceModuleHnNSF(torch.nn.Module): + """SourceModule for hn-nsf + SourceModule(sampling_rate, harmonic_num=0, sine_amp=0.1, + add_noise_std=0.003, voiced_threshod=0) + sampling_rate: sampling_rate in Hz + harmonic_num: number of harmonic above F0 (default: 0) + sine_amp: amplitude of sine source signal (default: 0.1) + add_noise_std: std of additive Gaussian noise (default: 0.003) + note that amplitude of noise in unvoiced is decided + by sine_amp + voiced_threshold: threshold to set U/V given F0 (default: 0) + Sine_source, noise_source = SourceModuleHnNSF(F0_sampled) + F0_sampled (batchsize, length, 1) + Sine_source (batchsize, length, 1) + noise_source (batchsize, length 1) + uv (batchsize, length, 1) + """ + + def __init__( + self, + sampling_rate, + harmonic_num=0, + sine_amp=0.1, + add_noise_std=0.003, + voiced_threshod=0, + ): + super().__init__() + + self.sine_amp = sine_amp + self.noise_std = add_noise_std + + # to produce sine waveforms + self.l_sin_gen = SineGen( + sampling_rate, harmonic_num, sine_amp, add_noise_std, voiced_threshod + ) + + # to merge source harmonics into a single excitation + self.l_linear = torch.nn.Linear(harmonic_num + 1, 1) + self.l_tanh = torch.nn.Tanh() + + def forward(self, x): + """ + Sine_source, noise_source = SourceModuleHnNSF(F0_sampled) + F0_sampled (batchsize, length, 1) + Sine_source (batchsize, length, 1) + noise_source (batchsize, length 1) + """ + # source for harmonic branch + sine_wavs, uv, _ = self.l_sin_gen(x) + sine_merge = self.l_tanh(self.l_linear(sine_wavs)) + + # source for noise branch, in the same shape as uv + noise = torch.randn_like(uv) * self.sine_amp / 3 + return sine_merge, noise, uv + + +class NSFHifiGANGenerator(torch.nn.Module): + def __init__(self, h): + super().__init__() + self.h = h + + self.num_kernels = len(h["resblock_kernel_sizes"]) + self.num_upsamples = len(h["upsample_rates"]) + self.f0_upsamp = torch.nn.Upsample(scale_factor=np.prod(h["upsample_rates"])) + self.m_source = SourceModuleHnNSF( + sampling_rate=h["sampling_rate"], harmonic_num=8 + ) + self.noise_convs = nn.ModuleList() + self.conv_pre = weight_norm( + Conv1d(h["inter_channels"], h["upsample_initial_channel"], 7, 1, padding=3) + ) + resblock = ResBlock1 if h["resblock"] == "1" else ResBlock2 + self.ups = nn.ModuleList() + for i, (u, k) in enumerate( + zip(h["upsample_rates"], h["upsample_kernel_sizes"]) + ): + c_cur = h["upsample_initial_channel"] // (2 ** (i + 1)) + self.ups.append( + weight_norm( + ConvTranspose1d( + h["upsample_initial_channel"] // (2**i), + h["upsample_initial_channel"] // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + if i + 1 < len(h["upsample_rates"]): # + stride_f0 = np.prod(h["upsample_rates"][i + 1 :]) + self.noise_convs.append( + Conv1d( + 1, + c_cur, + kernel_size=stride_f0 * 2, + stride=stride_f0, + padding=stride_f0 // 2, + ) + ) + else: + self.noise_convs.append(Conv1d(1, c_cur, kernel_size=1)) + self.resblocks = nn.ModuleList() + for i in range(len(self.ups)): + ch = h["upsample_initial_channel"] // (2 ** (i + 1)) + for j, (k, d) in enumerate( + zip(h["resblock_kernel_sizes"], h["resblock_dilation_sizes"]) + ): + self.resblocks.append(resblock(ch, k, d)) + + self.conv_post = weight_norm(Conv1d(ch, 1, 7, 1, padding=3)) + self.ups.apply(init_weights) + self.conv_post.apply(init_weights) + self.cond = nn.Conv1d(h["gin_channels"], h["upsample_initial_channel"], 1) + + def forward(self, x, f0, g=None): + # LOG.info(1,x.shape,f0.shape,f0[:, None].shape) + f0 = self.f0_upsamp(f0[:, None]).transpose(1, 2) # bs,n,t + # LOG.info(2,f0.shape) + har_source, noi_source, uv = self.m_source(f0) + har_source = har_source.transpose(1, 2) + x = self.conv_pre(x) + x = x + self.cond(g) + # LOG.info(124,x.shape,har_source.shape) + for i in range(self.num_upsamples): + x = F.leaky_relu(x, LRELU_SLOPE) + # LOG.info(3,x.shape) + x = self.ups[i](x) + x_source = self.noise_convs[i](har_source) + # LOG.info(4,x_source.shape,har_source.shape,x.shape) + x = x + x_source + xs = None + for j in range(self.num_kernels): + if xs is None: + xs = self.resblocks[i * self.num_kernels + j](x) + else: + xs += self.resblocks[i * self.num_kernels + j](x) + x = xs / self.num_kernels + x = F.leaky_relu(x) + x = self.conv_post(x) + x = torch.tanh(x) + + return x + + def remove_weight_norm(self): + LOG.info("Removing weight norm...") + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + remove_weight_norm(self.conv_pre) + remove_weight_norm(self.conv_post) diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/hifigan/_utils.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/hifigan/_utils.py new file mode 100644 index 0000000..8f862c1 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/hifigan/_utils.py @@ -0,0 +1,15 @@ +from logging import getLogger + +# matplotlib.use("Agg") + +LOG = getLogger(__name__) + + +def init_weights(m, mean=0.0, std=0.01): + classname = m.__class__.__name__ + if classname.find("Conv") != -1: + m.weight.data.normal_(mean, std) + + +def get_padding(kernel_size, dilation=1): + return int((kernel_size * dilation - dilation) / 2) diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/__init__.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/__init__.py new file mode 100644 index 0000000..1ba61d2 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/__init__.py @@ -0,0 +1,15 @@ +from ._generators import ( + Multiband_iSTFT_Generator, + Multistream_iSTFT_Generator, + iSTFT_Generator, +) +from ._loss import subband_stft_loss +from ._pqmf import PQMF + +__all__ = [ + "subband_stft_loss", + "PQMF", + "iSTFT_Generator", + "Multiband_iSTFT_Generator", + "Multistream_iSTFT_Generator", +] diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_generators.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_generators.py new file mode 100644 index 0000000..31bbbd7 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_generators.py @@ -0,0 +1,376 @@ +import math + +import torch +from torch import nn +from torch.nn import Conv1d, ConvTranspose1d +from torch.nn import functional as F +from torch.nn.utils import remove_weight_norm, weight_norm + +from ....modules import modules +from ....modules.commons import get_padding, init_weights +from ._pqmf import PQMF +from ._stft import TorchSTFT + + +class iSTFT_Generator(torch.nn.Module): + def __init__( + self, + initial_channel, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gen_istft_n_fft, + gen_istft_hop_size, + gin_channels=0, + ): + super().__init__() + # self.h = h + self.gen_istft_n_fft = gen_istft_n_fft + self.gen_istft_hop_size = gen_istft_hop_size + + self.num_kernels = len(resblock_kernel_sizes) + self.num_upsamples = len(upsample_rates) + self.conv_pre = weight_norm( + Conv1d(initial_channel, upsample_initial_channel, 7, 1, padding=3) + ) + resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2 + + self.ups = nn.ModuleList() + for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)): + self.ups.append( + weight_norm( + ConvTranspose1d( + upsample_initial_channel // (2**i), + upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + + self.resblocks = nn.ModuleList() + for i in range(len(self.ups)): + ch = upsample_initial_channel // (2 ** (i + 1)) + for j, (k, d) in enumerate( + zip(resblock_kernel_sizes, resblock_dilation_sizes) + ): + self.resblocks.append(resblock(ch, k, d)) + + self.post_n_fft = self.gen_istft_n_fft + self.conv_post = weight_norm(Conv1d(ch, self.post_n_fft + 2, 7, 1, padding=3)) + self.ups.apply(init_weights) + self.conv_post.apply(init_weights) + self.reflection_pad = torch.nn.ReflectionPad1d((1, 0)) + self.stft = TorchSTFT( + filter_length=self.gen_istft_n_fft, + hop_length=self.gen_istft_hop_size, + win_length=self.gen_istft_n_fft, + ) + + def forward(self, x, g=None): + x = self.conv_pre(x) + for i in range(self.num_upsamples): + x = F.leaky_relu(x, modules.LRELU_SLOPE) + x = self.ups[i](x) + xs = None + for j in range(self.num_kernels): + if xs is None: + xs = self.resblocks[i * self.num_kernels + j](x) + else: + xs += self.resblocks[i * self.num_kernels + j](x) + x = xs / self.num_kernels + x = F.leaky_relu(x) + x = self.reflection_pad(x) + x = self.conv_post(x) + spec = torch.exp(x[:, : self.post_n_fft // 2 + 1, :]) + phase = math.pi * torch.sin(x[:, self.post_n_fft // 2 + 1 :, :]) + out = self.stft.inverse(spec, phase).to(x.device) + return out, None + + def remove_weight_norm(self): + print("Removing weight norm...") + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + remove_weight_norm(self.conv_pre) + remove_weight_norm(self.conv_post) + + +class Multiband_iSTFT_Generator(torch.nn.Module): + def __init__( + self, + initial_channel, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gen_istft_n_fft, + gen_istft_hop_size, + subbands, + gin_channels=0, + ): + super().__init__() + # self.h = h + self.subbands = subbands + self.num_kernels = len(resblock_kernel_sizes) + self.num_upsamples = len(upsample_rates) + self.conv_pre = weight_norm( + Conv1d(initial_channel, upsample_initial_channel, 7, 1, padding=3) + ) + resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2 + + self.ups = nn.ModuleList() + for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)): + self.ups.append( + weight_norm( + ConvTranspose1d( + upsample_initial_channel // (2**i), + upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + + self.resblocks = nn.ModuleList() + for i in range(len(self.ups)): + ch = upsample_initial_channel // (2 ** (i + 1)) + for j, (k, d) in enumerate( + zip(resblock_kernel_sizes, resblock_dilation_sizes) + ): + self.resblocks.append(resblock(ch, k, d)) + + self.post_n_fft = gen_istft_n_fft + self.ups.apply(init_weights) + self.reflection_pad = torch.nn.ReflectionPad1d((1, 0)) + self.reshape_pixelshuffle = [] + + self.subband_conv_post = weight_norm( + Conv1d(ch, self.subbands * (self.post_n_fft + 2), 7, 1, padding=3) + ) + + self.subband_conv_post.apply(init_weights) + + self.gen_istft_n_fft = gen_istft_n_fft + self.gen_istft_hop_size = gen_istft_hop_size + + def forward(self, x, g=None): + stft = TorchSTFT( + filter_length=self.gen_istft_n_fft, + hop_length=self.gen_istft_hop_size, + win_length=self.gen_istft_n_fft, + ).to(x.device) + pqmf = PQMF(x.device, subbands=self.subbands).to(x.device, dtype=x.dtype) + + x = self.conv_pre(x) # [B, ch, length] + + for i in range(self.num_upsamples): + x = F.leaky_relu(x, modules.LRELU_SLOPE) + x = self.ups[i](x) + + xs = None + for j in range(self.num_kernels): + if xs is None: + xs = self.resblocks[i * self.num_kernels + j](x) + else: + xs += self.resblocks[i * self.num_kernels + j](x) + x = xs / self.num_kernels + + x = F.leaky_relu(x) + x = self.reflection_pad(x) + x = self.subband_conv_post(x) + x = torch.reshape( + x, (x.shape[0], self.subbands, x.shape[1] // self.subbands, x.shape[-1]) + ) + + spec = torch.exp(x[:, :, : self.post_n_fft // 2 + 1, :]) + phase = math.pi * torch.sin(x[:, :, self.post_n_fft // 2 + 1 :, :]) + + y_mb_hat = stft.inverse( + torch.reshape( + spec, + ( + spec.shape[0] * self.subbands, + self.gen_istft_n_fft // 2 + 1, + spec.shape[-1], + ), + ), + torch.reshape( + phase, + ( + phase.shape[0] * self.subbands, + self.gen_istft_n_fft // 2 + 1, + phase.shape[-1], + ), + ), + ) + y_mb_hat = torch.reshape( + y_mb_hat, (x.shape[0], self.subbands, 1, y_mb_hat.shape[-1]) + ) + y_mb_hat = y_mb_hat.squeeze(-2) + + y_g_hat = pqmf.synthesis(y_mb_hat) + + return y_g_hat, y_mb_hat + + def remove_weight_norm(self): + print("Removing weight norm...") + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + + +class Multistream_iSTFT_Generator(torch.nn.Module): + def __init__( + self, + initial_channel, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gen_istft_n_fft, + gen_istft_hop_size, + subbands, + gin_channels=0, + ): + super().__init__() + # self.h = h + self.subbands = subbands + self.num_kernels = len(resblock_kernel_sizes) + self.num_upsamples = len(upsample_rates) + self.conv_pre = weight_norm( + Conv1d(initial_channel, upsample_initial_channel, 7, 1, padding=3) + ) + resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2 + + self.ups = nn.ModuleList() + for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)): + self.ups.append( + weight_norm( + ConvTranspose1d( + upsample_initial_channel // (2**i), + upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + + self.resblocks = nn.ModuleList() + for i in range(len(self.ups)): + ch = upsample_initial_channel // (2 ** (i + 1)) + for j, (k, d) in enumerate( + zip(resblock_kernel_sizes, resblock_dilation_sizes) + ): + self.resblocks.append(resblock(ch, k, d)) + + self.post_n_fft = gen_istft_n_fft + self.ups.apply(init_weights) + self.reflection_pad = torch.nn.ReflectionPad1d((1, 0)) + self.reshape_pixelshuffle = [] + + self.subband_conv_post = weight_norm( + Conv1d(ch, self.subbands * (self.post_n_fft + 2), 7, 1, padding=3) + ) + + self.subband_conv_post.apply(init_weights) + + self.gen_istft_n_fft = gen_istft_n_fft + self.gen_istft_hop_size = gen_istft_hop_size + + updown_filter = torch.zeros( + (self.subbands, self.subbands, self.subbands) + ).float() + for k in range(self.subbands): + updown_filter[k, k, 0] = 1.0 + self.register_buffer("updown_filter", updown_filter) + self.multistream_conv_post = weight_norm( + Conv1d( + self.subbands, 1, kernel_size=63, bias=False, padding=get_padding(63, 1) + ) + ) + self.multistream_conv_post.apply(init_weights) + + def forward(self, x, g=None): + stft = TorchSTFT( + filter_length=self.gen_istft_n_fft, + hop_length=self.gen_istft_hop_size, + win_length=self.gen_istft_n_fft, + ).to(x.device) + # pqmf = PQMF(x.device) + + x = self.conv_pre(x) # [B, ch, length] + + for i in range(self.num_upsamples): + x = F.leaky_relu(x, modules.LRELU_SLOPE) + x = self.ups[i](x) + + xs = None + for j in range(self.num_kernels): + if xs is None: + xs = self.resblocks[i * self.num_kernels + j](x) + else: + xs += self.resblocks[i * self.num_kernels + j](x) + x = xs / self.num_kernels + + x = F.leaky_relu(x) + x = self.reflection_pad(x) + x = self.subband_conv_post(x) + x = torch.reshape( + x, (x.shape[0], self.subbands, x.shape[1] // self.subbands, x.shape[-1]) + ) + + spec = torch.exp(x[:, :, : self.post_n_fft // 2 + 1, :]) + phase = math.pi * torch.sin(x[:, :, self.post_n_fft // 2 + 1 :, :]) + + y_mb_hat = stft.inverse( + torch.reshape( + spec, + ( + spec.shape[0] * self.subbands, + self.gen_istft_n_fft // 2 + 1, + spec.shape[-1], + ), + ), + torch.reshape( + phase, + ( + phase.shape[0] * self.subbands, + self.gen_istft_n_fft // 2 + 1, + phase.shape[-1], + ), + ), + ) + y_mb_hat = torch.reshape( + y_mb_hat, (x.shape[0], self.subbands, 1, y_mb_hat.shape[-1]) + ) + y_mb_hat = y_mb_hat.squeeze(-2) + + y_mb_hat = F.conv_transpose1d( + y_mb_hat, + self.updown_filter.to(x.device) * self.subbands, + stride=self.subbands, + ) + + y_g_hat = self.multistream_conv_post(y_mb_hat) + + return y_g_hat, y_mb_hat + + def remove_weight_norm(self): + print("Removing weight norm...") + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_loss.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_loss.py new file mode 100644 index 0000000..7e8b763 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_loss.py @@ -0,0 +1,11 @@ +from ._stft_loss import MultiResolutionSTFTLoss + + +def subband_stft_loss(h, y_mb, y_hat_mb): + sub_stft_loss = MultiResolutionSTFTLoss( + h.train.fft_sizes, h.train.hop_sizes, h.train.win_lengths + ) + y_mb = y_mb.view(-1, y_mb.size(2)) + y_hat_mb = y_hat_mb.view(-1, y_hat_mb.size(2)) + sub_sc_loss, sub_mag_loss = sub_stft_loss(y_hat_mb[:, : y_mb.size(-1)], y_mb) + return sub_sc_loss + sub_mag_loss diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_pqmf.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_pqmf.py new file mode 100644 index 0000000..c6b40c3 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_pqmf.py @@ -0,0 +1,128 @@ +# Copyright 2020 Tomoki Hayashi +# MIT License (https://opensource.org/licenses/MIT) + +"""Pseudo QMF modules.""" + +import numpy as np +import torch +import torch.nn.functional as F +from scipy.signal import kaiser + + +def design_prototype_filter(taps=62, cutoff_ratio=0.15, beta=9.0): + """Design prototype filter for PQMF. + This method is based on `A Kaiser window approach for the design of prototype + filters of cosine modulated filterbanks`_. + Args: + taps (int): The number of filter taps. + cutoff_ratio (float): Cut-off frequency ratio. + beta (float): Beta coefficient for kaiser window. + Returns: + ndarray: Impluse response of prototype filter (taps + 1,). + .. _`A Kaiser window approach for the design of prototype filters of cosine modulated filterbanks`: + https://ieeexplore.ieee.org/abstract/document/681427 + """ + # check the arguments are valid + assert taps % 2 == 0, "The number of taps mush be even number." + assert 0.0 < cutoff_ratio < 1.0, "Cutoff ratio must be > 0.0 and < 1.0." + + # make initial filter + omega_c = np.pi * cutoff_ratio + with np.errstate(invalid="ignore"): + h_i = np.sin(omega_c * (np.arange(taps + 1) - 0.5 * taps)) / ( + np.pi * (np.arange(taps + 1) - 0.5 * taps) + ) + h_i[taps // 2] = np.cos(0) * cutoff_ratio # fix nan due to indeterminate form + + # apply kaiser window + w = kaiser(taps + 1, beta) + h = h_i * w + + return h + + +class PQMF(torch.nn.Module): + """PQMF module. + This module is based on `Near-perfect-reconstruction pseudo-QMF banks`_. + .. _`Near-perfect-reconstruction pseudo-QMF banks`: + https://ieeexplore.ieee.org/document/258122 + """ + + def __init__(self, device, subbands=8, taps=62, cutoff_ratio=0.15, beta=9.0): + """Initialize PQMF module. + Args: + subbands (int): The number of subbands. + taps (int): The number of filter taps. + cutoff_ratio (float): Cut-off frequency ratio. + beta (float): Beta coefficient for kaiser window. + """ + super().__init__() + + # define filter coefficient + h_proto = design_prototype_filter(taps, cutoff_ratio, beta) + h_analysis = np.zeros((subbands, len(h_proto))) + h_synthesis = np.zeros((subbands, len(h_proto))) + for k in range(subbands): + h_analysis[k] = ( + 2 + * h_proto + * np.cos( + (2 * k + 1) + * (np.pi / (2 * subbands)) + * (np.arange(taps + 1) - ((taps - 1) / 2)) + + (-1) ** k * np.pi / 4 + ) + ) + h_synthesis[k] = ( + 2 + * h_proto + * np.cos( + (2 * k + 1) + * (np.pi / (2 * subbands)) + * (np.arange(taps + 1) - ((taps - 1) / 2)) + - (-1) ** k * np.pi / 4 + ) + ) + + # convert to tensor + analysis_filter = torch.from_numpy(h_analysis).float().unsqueeze(1).to(device) + synthesis_filter = torch.from_numpy(h_synthesis).float().unsqueeze(0).to(device) + + # register coefficients as buffer + self.register_buffer("analysis_filter", analysis_filter) + self.register_buffer("synthesis_filter", synthesis_filter) + + # filter for downsampling & upsampling + updown_filter = torch.zeros((subbands, subbands, subbands)).float().to(device) + for k in range(subbands): + updown_filter[k, k, 0] = 1.0 + self.register_buffer("updown_filter", updown_filter) + self.subbands = subbands + + # keep padding info + self.pad_fn = torch.nn.ConstantPad1d(taps // 2, 0.0) + + def analysis(self, x): + """Analysis with PQMF. + Args: + x (Tensor): Input tensor (B, 1, T). + Returns: + Tensor: Output tensor (B, subbands, T // subbands). + """ + x = F.conv1d(self.pad_fn(x), self.analysis_filter) + return F.conv1d(x, self.updown_filter, stride=self.subbands) + + def synthesis(self, x): + """Synthesis with PQMF. + Args: + x (Tensor): Input tensor (B, subbands, T // subbands). + Returns: + Tensor: Output tensor (B, 1, T). + """ + # NOTE(kan-bayashi): Power will be dreased so here multiply by # subbands. + # Not sure this is the correct way, it is better to check again. + # TODO(kan-bayashi): Understand the reconstruction procedure + x = F.conv_transpose1d( + x, self.updown_filter * self.subbands, stride=self.subbands + ) + return F.conv1d(self.pad_fn(x), self.synthesis_filter) diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_stft.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_stft.py new file mode 100644 index 0000000..26632bc --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_stft.py @@ -0,0 +1,244 @@ +""" +BSD 3-Clause License +Copyright (c) 2017, Prem Seetharaman +All rights reserved. +* Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +""" + +import librosa.util as librosa_util +import numpy as np +import torch +import torch.nn.functional as F +from librosa.util import pad_center, tiny +from scipy.signal import get_window +from torch.autograd import Variable + + +def window_sumsquare( + window, + n_frames, + hop_length=200, + win_length=800, + n_fft=800, + dtype=np.float32, + norm=None, +): + """ + # from librosa 0.6 + Compute the sum-square envelope of a window function at a given hop length. + This is used to estimate modulation effects induced by windowing + observations in short-time fourier transforms. + Parameters + ---------- + window : string, tuple, number, callable, or list-like + Window specification, as in `get_window` + n_frames : int > 0 + The number of analysis frames + hop_length : int > 0 + The number of samples to advance between frames + win_length : [optional] + The length of the window function. By default, this matches `n_fft`. + n_fft : int > 0 + The length of each analysis frame. + dtype : np.dtype + The data type of the output + Returns + ------- + wss : np.ndarray, shape=`(n_fft + hop_length * (n_frames - 1))` + The sum-squared envelope of the window function + """ + if win_length is None: + win_length = n_fft + + n = n_fft + hop_length * (n_frames - 1) + x = np.zeros(n, dtype=dtype) + + # Compute the squared window at the desired length + win_sq = get_window(window, win_length, fftbins=True) + win_sq = librosa_util.normalize(win_sq, norm=norm) ** 2 + win_sq = librosa_util.pad_center(win_sq, n_fft) + + # Fill the envelope + for i in range(n_frames): + sample = i * hop_length + x[sample : min(n, sample + n_fft)] += win_sq[: max(0, min(n_fft, n - sample))] + return x + + +class STFT(torch.nn.Module): + """adapted from Prem Seetharaman's https://github.com/pseeth/pytorch-stft""" + + def __init__( + self, filter_length=800, hop_length=200, win_length=800, window="hann" + ): + super().__init__() + self.filter_length = filter_length + self.hop_length = hop_length + self.win_length = win_length + self.window = window + self.forward_transform = None + scale = self.filter_length / self.hop_length + fourier_basis = np.fft.fft(np.eye(self.filter_length)) + + cutoff = int(self.filter_length / 2 + 1) + fourier_basis = np.vstack( + [np.real(fourier_basis[:cutoff, :]), np.imag(fourier_basis[:cutoff, :])] + ) + + forward_basis = torch.FloatTensor(fourier_basis[:, None, :]) + inverse_basis = torch.FloatTensor( + np.linalg.pinv(scale * fourier_basis).T[:, None, :] + ) + + if window is not None: + assert filter_length >= win_length + # get window and zero center pad it to filter_length + fft_window = get_window(window, win_length, fftbins=True) + fft_window = pad_center(fft_window, filter_length) + fft_window = torch.from_numpy(fft_window).float() + + # window the bases + forward_basis *= fft_window + inverse_basis *= fft_window + + self.register_buffer("forward_basis", forward_basis.float()) + self.register_buffer("inverse_basis", inverse_basis.float()) + + def transform(self, input_data): + num_batches = input_data.size(0) + num_samples = input_data.size(1) + + self.num_samples = num_samples + + # similar to librosa, reflect-pad the input + input_data = input_data.view(num_batches, 1, num_samples) + input_data = F.pad( + input_data.unsqueeze(1), + (int(self.filter_length / 2), int(self.filter_length / 2), 0, 0), + mode="reflect", + ) + input_data = input_data.squeeze(1) + + forward_transform = F.conv1d( + input_data, + Variable(self.forward_basis, requires_grad=False), + stride=self.hop_length, + padding=0, + ) + + cutoff = int((self.filter_length / 2) + 1) + real_part = forward_transform[:, :cutoff, :] + imag_part = forward_transform[:, cutoff:, :] + + magnitude = torch.sqrt(real_part**2 + imag_part**2) + phase = torch.autograd.Variable(torch.atan2(imag_part.data, real_part.data)) + + return magnitude, phase + + def inverse(self, magnitude, phase): + recombine_magnitude_phase = torch.cat( + [magnitude * torch.cos(phase), magnitude * torch.sin(phase)], dim=1 + ) + + inverse_transform = F.conv_transpose1d( + recombine_magnitude_phase, + Variable(self.inverse_basis, requires_grad=False), + stride=self.hop_length, + padding=0, + ) + + if self.window is not None: + window_sum = window_sumsquare( + self.window, + magnitude.size(-1), + hop_length=self.hop_length, + win_length=self.win_length, + n_fft=self.filter_length, + dtype=np.float32, + ) + # remove modulation effects + approx_nonzero_indices = torch.from_numpy( + np.where(window_sum > tiny(window_sum))[0] + ) + window_sum = torch.autograd.Variable( + torch.from_numpy(window_sum), requires_grad=False + ) + window_sum = window_sum.to(inverse_transform.device()) + inverse_transform[:, :, approx_nonzero_indices] /= window_sum[ + approx_nonzero_indices + ] + + # scale by hop ratio + inverse_transform *= float(self.filter_length) / self.hop_length + + inverse_transform = inverse_transform[:, :, int(self.filter_length / 2) :] + inverse_transform = inverse_transform[:, :, : -int(self.filter_length / 2) :] + + return inverse_transform + + def forward(self, input_data): + self.magnitude, self.phase = self.transform(input_data) + reconstruction = self.inverse(self.magnitude, self.phase) + return reconstruction + + +class TorchSTFT(torch.nn.Module): + def __init__( + self, filter_length=800, hop_length=200, win_length=800, window="hann" + ): + super().__init__() + self.filter_length = filter_length + self.hop_length = hop_length + self.win_length = win_length + self.window = torch.from_numpy( + get_window(window, win_length, fftbins=True).astype(np.float32) + ) + + def transform(self, input_data): + forward_transform = torch.stft( + input_data, + self.filter_length, + self.hop_length, + self.win_length, + window=self.window, + return_complex=True, + ) + + return torch.abs(forward_transform), torch.angle(forward_transform) + + def inverse(self, magnitude, phase): + inverse_transform = torch.istft( + magnitude * torch.exp(phase * 1j), + self.filter_length, + self.hop_length, + self.win_length, + window=self.window.to(magnitude.device), + ) + + return inverse_transform.unsqueeze( + -2 + ) # unsqueeze to stay consistent with conv_transpose1d implementation + + def forward(self, input_data): + self.magnitude, self.phase = self.transform(input_data) + reconstruction = self.inverse(self.magnitude, self.phase) + return reconstruction diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_stft_loss.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_stft_loss.py new file mode 100644 index 0000000..c685cb0 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/decoders/mb_istft/_stft_loss.py @@ -0,0 +1,142 @@ +# Copyright 2019 Tomoki Hayashi +# MIT License (https://opensource.org/licenses/MIT) + +"""STFT-based Loss modules.""" + +import torch +import torch.nn.functional as F + + +def stft(x, fft_size, hop_size, win_length, window): + """Perform STFT and convert to magnitude spectrogram. + Args: + x (Tensor): Input signal tensor (B, T). + fft_size (int): FFT size. + hop_size (int): Hop size. + win_length (int): Window length. + window (str): Window function type. + Returns: + Tensor: Magnitude spectrogram (B, #frames, fft_size // 2 + 1). + """ + x_stft = torch.stft( + x, fft_size, hop_size, win_length, window.to(x.device), return_complex=False + ) + real = x_stft[..., 0] + imag = x_stft[..., 1] + + # NOTE(kan-bayashi): clamp is needed to avoid nan or inf + return torch.sqrt(torch.clamp(real**2 + imag**2, min=1e-7)).transpose(2, 1) + + +class SpectralConvergengeLoss(torch.nn.Module): + """Spectral convergence loss module.""" + + def __init__(self): + """Initialize spectral convergence loss module.""" + super().__init__() + + def forward(self, x_mag, y_mag): + """Calculate forward propagation. + Args: + x_mag (Tensor): Magnitude spectrogram of predicted signal (B, #frames, #freq_bins). + y_mag (Tensor): Magnitude spectrogram of groundtruth signal (B, #frames, #freq_bins). + Returns: + Tensor: Spectral convergence loss value. + """ + return torch.norm(y_mag - x_mag) / torch.norm( + y_mag + ) # MB-iSTFT-VITS changed here due to codespell + + +class LogSTFTMagnitudeLoss(torch.nn.Module): + """Log STFT magnitude loss module.""" + + def __init__(self): + """Initialize los STFT magnitude loss module.""" + super().__init__() + + def forward(self, x_mag, y_mag): + """Calculate forward propagation. + Args: + x_mag (Tensor): Magnitude spectrogram of predicted signal (B, #frames, #freq_bins). + y_mag (Tensor): Magnitude spectrogram of groundtruth signal (B, #frames, #freq_bins). + Returns: + Tensor: Log STFT magnitude loss value. + """ + return F.l1_loss(torch.log(y_mag), torch.log(x_mag)) + + +class STFTLoss(torch.nn.Module): + """STFT loss module.""" + + def __init__( + self, fft_size=1024, shift_size=120, win_length=600, window="hann_window" + ): + """Initialize STFT loss module.""" + super().__init__() + self.fft_size = fft_size + self.shift_size = shift_size + self.win_length = win_length + self.window = getattr(torch, window)(win_length) + self.spectral_convergenge_loss = SpectralConvergengeLoss() + self.log_stft_magnitude_loss = LogSTFTMagnitudeLoss() + + def forward(self, x, y): + """Calculate forward propagation. + Args: + x (Tensor): Predicted signal (B, T). + y (Tensor): Groundtruth signal (B, T). + Returns: + Tensor: Spectral convergence loss value. + Tensor: Log STFT magnitude loss value. + """ + x_mag = stft(x, self.fft_size, self.shift_size, self.win_length, self.window) + y_mag = stft(y, self.fft_size, self.shift_size, self.win_length, self.window) + sc_loss = self.spectral_convergenge_loss(x_mag, y_mag) + mag_loss = self.log_stft_magnitude_loss(x_mag, y_mag) + + return sc_loss, mag_loss + + +class MultiResolutionSTFTLoss(torch.nn.Module): + """Multi resolution STFT loss module.""" + + def __init__( + self, + fft_sizes=[1024, 2048, 512], + hop_sizes=[120, 240, 50], + win_lengths=[600, 1200, 240], + window="hann_window", + ): + """Initialize Multi resolution STFT loss module. + Args: + fft_sizes (list): List of FFT sizes. + hop_sizes (list): List of hop sizes. + win_lengths (list): List of window lengths. + window (str): Window function type. + """ + super().__init__() + assert len(fft_sizes) == len(hop_sizes) == len(win_lengths) + self.stft_losses = torch.nn.ModuleList() + for fs, ss, wl in zip(fft_sizes, hop_sizes, win_lengths): + self.stft_losses += [STFTLoss(fs, ss, wl, window)] + + def forward(self, x, y): + """Calculate forward propagation. + Args: + x (Tensor): Predicted signal (B, T). + y (Tensor): Groundtruth signal (B, T). + Returns: + Tensor: Multi resolution spectral convergence loss value. + Tensor: Multi resolution log STFT magnitude loss value. + """ + sc_loss = 0.0 + mag_loss = 0.0 + for f in self.stft_losses: + sc_l, mag_l = f(x, y) + sc_loss += sc_l + mag_loss += mag_l + sc_loss /= len(self.stft_losses) + mag_loss /= len(self.stft_losses) + + return sc_loss, mag_loss diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/descriminators.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/descriminators.py new file mode 100644 index 0000000..a59b1e5 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/descriminators.py @@ -0,0 +1,177 @@ +import torch +from torch import nn +from torch.nn import AvgPool1d, Conv1d, Conv2d +from torch.nn import functional as F +from torch.nn.utils import spectral_norm, weight_norm + +from so_vits_svc_fork.modules import modules as modules +from so_vits_svc_fork.modules.commons import get_padding + + +class DiscriminatorP(torch.nn.Module): + def __init__(self, period, kernel_size=5, stride=3, use_spectral_norm=False): + super().__init__() + self.period = period + self.use_spectral_norm = use_spectral_norm + norm_f = weight_norm if use_spectral_norm == False else spectral_norm + self.convs = nn.ModuleList( + [ + norm_f( + Conv2d( + 1, + 32, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 32, + 128, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 128, + 512, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 512, + 1024, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 1024, + 1024, + (kernel_size, 1), + 1, + padding=(get_padding(kernel_size, 1), 0), + ) + ), + ] + ) + self.conv_post = norm_f(Conv2d(1024, 1, (3, 1), 1, padding=(1, 0))) + + def forward(self, x): + fmap = [] + + # 1d to 2d + b, c, t = x.shape + if t % self.period != 0: # pad first + n_pad = self.period - (t % self.period) + x = F.pad(x, (0, n_pad), "reflect") + t = t + n_pad + x = x.view(b, c, t // self.period, self.period) + + for l in self.convs: + x = l(x) + x = F.leaky_relu(x, modules.LRELU_SLOPE) + fmap.append(x) + x = self.conv_post(x) + fmap.append(x) + x = torch.flatten(x, 1, -1) + + return x, fmap + + +class DiscriminatorS(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super().__init__() + norm_f = weight_norm if use_spectral_norm == False else spectral_norm + self.convs = nn.ModuleList( + [ + norm_f(Conv1d(1, 16, 15, 1, padding=7)), + norm_f(Conv1d(16, 64, 41, 4, groups=4, padding=20)), + norm_f(Conv1d(64, 256, 41, 4, groups=16, padding=20)), + norm_f(Conv1d(256, 1024, 41, 4, groups=64, padding=20)), + norm_f(Conv1d(1024, 1024, 41, 4, groups=256, padding=20)), + norm_f(Conv1d(1024, 1024, 5, 1, padding=2)), + ] + ) + self.conv_post = norm_f(Conv1d(1024, 1, 3, 1, padding=1)) + + def forward(self, x): + fmap = [] + + for l in self.convs: + x = l(x) + x = F.leaky_relu(x, modules.LRELU_SLOPE) + fmap.append(x) + x = self.conv_post(x) + fmap.append(x) + x = torch.flatten(x, 1, -1) + + return x, fmap + + +class MultiPeriodDiscriminator(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super().__init__() + periods = [2, 3, 5, 7, 11] + + discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)] + discs = discs + [ + DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods + ] + self.discriminators = nn.ModuleList(discs) + + def forward(self, y, y_hat): + y_d_rs = [] + y_d_gs = [] + fmap_rs = [] + fmap_gs = [] + for i, d in enumerate(self.discriminators): + y_d_r, fmap_r = d(y) + y_d_g, fmap_g = d(y_hat) + y_d_rs.append(y_d_r) + y_d_gs.append(y_d_g) + fmap_rs.append(fmap_r) + fmap_gs.append(fmap_g) + + return y_d_rs, y_d_gs, fmap_rs, fmap_gs + + +class MultiScaleDiscriminator(torch.nn.Module): + def __init__(self): + super().__init__() + self.discriminators = nn.ModuleList( + [ + DiscriminatorS(use_spectral_norm=True), + DiscriminatorS(), + DiscriminatorS(), + ] + ) + self.meanpools = nn.ModuleList( + [AvgPool1d(4, 2, padding=2), AvgPool1d(4, 2, padding=2)] + ) + + def forward(self, y, y_hat): + y_d_rs = [] + y_d_gs = [] + fmap_rs = [] + fmap_gs = [] + for i, d in enumerate(self.discriminators): + if i != 0: + y = self.meanpools[i - 1](y) + y_hat = self.meanpools[i - 1](y_hat) + y_d_r, fmap_r = d(y) + y_d_g, fmap_g = d(y_hat) + y_d_rs.append(y_d_r) + fmap_rs.append(fmap_r) + y_d_gs.append(y_d_g) + fmap_gs.append(fmap_g) + + return y_d_rs, y_d_gs, fmap_rs, fmap_gs diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/encoders.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/encoders.py new file mode 100644 index 0000000..4894aa5 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/encoders.py @@ -0,0 +1,136 @@ +import torch +from torch import nn + +from so_vits_svc_fork.modules import attentions as attentions +from so_vits_svc_fork.modules import commons as commons +from so_vits_svc_fork.modules import modules as modules + + +class SpeakerEncoder(torch.nn.Module): + def __init__( + self, + mel_n_channels=80, + model_num_layers=3, + model_hidden_size=256, + model_embedding_size=256, + ): + super().__init__() + self.lstm = nn.LSTM( + mel_n_channels, model_hidden_size, model_num_layers, batch_first=True + ) + self.linear = nn.Linear(model_hidden_size, model_embedding_size) + self.relu = nn.ReLU() + + def forward(self, mels): + self.lstm.flatten_parameters() + _, (hidden, _) = self.lstm(mels) + embeds_raw = self.relu(self.linear(hidden[-1])) + return embeds_raw / torch.norm(embeds_raw, dim=1, keepdim=True) + + def compute_partial_slices(self, total_frames, partial_frames, partial_hop): + mel_slices = [] + for i in range(0, total_frames - partial_frames, partial_hop): + mel_range = torch.arange(i, i + partial_frames) + mel_slices.append(mel_range) + + return mel_slices + + def embed_utterance(self, mel, partial_frames=128, partial_hop=64): + mel_len = mel.size(1) + last_mel = mel[:, -partial_frames:] + + if mel_len > partial_frames: + mel_slices = self.compute_partial_slices( + mel_len, partial_frames, partial_hop + ) + mels = list(mel[:, s] for s in mel_slices) + mels.append(last_mel) + mels = torch.stack(tuple(mels), 0).squeeze(1) + + with torch.no_grad(): + partial_embeds = self(mels) + embed = torch.mean(partial_embeds, axis=0).unsqueeze(0) + # embed = embed / torch.linalg.norm(embed, 2) + else: + with torch.no_grad(): + embed = self(last_mel) + + return embed + + +class Encoder(nn.Module): + def __init__( + self, + in_channels, + out_channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=0, + ): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.gin_channels = gin_channels + + self.pre = nn.Conv1d(in_channels, hidden_channels, 1) + self.enc = modules.WN( + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=gin_channels, + ) + self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) + + def forward(self, x, x_lengths, g=None): + # print(x.shape,x_lengths.shape) + x_mask = torch.unsqueeze(commons.sequence_mask(x_lengths, x.size(2)), 1).to( + x.dtype + ) + x = self.pre(x) * x_mask + x = self.enc(x, x_mask, g=g) + stats = self.proj(x) * x_mask + m, logs = torch.split(stats, self.out_channels, dim=1) + z = (m + torch.randn_like(m) * torch.exp(logs)) * x_mask + return z, m, logs, x_mask + + +class TextEncoder(nn.Module): + def __init__( + self, + out_channels, + hidden_channels, + kernel_size, + n_layers, + gin_channels=0, + filter_channels=None, + n_heads=None, + p_dropout=None, + ): + super().__init__() + self.out_channels = out_channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.n_layers = n_layers + self.gin_channels = gin_channels + self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) + self.f0_emb = nn.Embedding(256, hidden_channels) + + self.enc_ = attentions.Encoder( + hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout + ) + + def forward(self, x, x_mask, f0=None, noice_scale=1): + x = x + self.f0_emb(f0).transpose(1, 2) + x = self.enc_(x * x_mask, x_mask) + stats = self.proj(x) * x_mask + m, logs = torch.split(stats, self.out_channels, dim=1) + z = (m + torch.randn_like(m) * torch.exp(logs) * noice_scale) * x_mask + + return z, m, logs, x_mask diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/flows.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/flows.py new file mode 100644 index 0000000..9abcba2 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/flows.py @@ -0,0 +1,48 @@ +from torch import nn + +from so_vits_svc_fork.modules import modules as modules + + +class ResidualCouplingBlock(nn.Module): + def __init__( + self, + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + n_flows=4, + gin_channels=0, + ): + super().__init__() + self.channels = channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.n_flows = n_flows + self.gin_channels = gin_channels + + self.flows = nn.ModuleList() + for i in range(n_flows): + self.flows.append( + modules.ResidualCouplingLayer( + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=gin_channels, + mean_only=True, + ) + ) + self.flows.append(modules.Flip()) + + def forward(self, x, x_mask, g=None, reverse=False): + if not reverse: + for flow in self.flows: + x, _ = flow(x, x_mask, g=g, reverse=reverse) + else: + for flow in reversed(self.flows): + x = flow(x, x_mask, g=g, reverse=reverse) + return x diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/losses.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/losses.py new file mode 100644 index 0000000..1fbcce9 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/losses.py @@ -0,0 +1,58 @@ +import torch + + +def feature_loss(fmap_r, fmap_g): + loss = 0 + for dr, dg in zip(fmap_r, fmap_g): + for rl, gl in zip(dr, dg): + rl = rl.float().detach() + gl = gl.float() + loss += torch.mean(torch.abs(rl - gl)) + + return loss * 2 + + +def discriminator_loss(disc_real_outputs, disc_generated_outputs): + loss = 0 + r_losses = [] + g_losses = [] + for dr, dg in zip(disc_real_outputs, disc_generated_outputs): + dr = dr.float() + dg = dg.float() + r_loss = torch.mean((1 - dr) ** 2) + g_loss = torch.mean(dg**2) + loss += r_loss + g_loss + r_losses.append(r_loss.item()) + g_losses.append(g_loss.item()) + + return loss, r_losses, g_losses + + +def generator_loss(disc_outputs): + loss = 0 + gen_losses = [] + for dg in disc_outputs: + dg = dg.float() + l = torch.mean((1 - dg) ** 2) + gen_losses.append(l) + loss += l + + return loss, gen_losses + + +def kl_loss(z_p, logs_q, m_p, logs_p, z_mask): + """ + z_p, logs_q: [b, h, t_t] + m_p, logs_p: [b, h, t_t] + """ + z_p = z_p.float() + logs_q = logs_q.float() + m_p = m_p.float() + logs_p = logs_p.float() + z_mask = z_mask.float() + # print(logs_p) + kl = logs_p - logs_q - 0.5 + kl += 0.5 * ((z_p - m_p) ** 2) * torch.exp(-2.0 * logs_p) + kl = torch.sum(kl * z_mask) + l = kl / torch.sum(z_mask) + return l diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/mel_processing.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/mel_processing.py new file mode 100644 index 0000000..298acd8 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/mel_processing.py @@ -0,0 +1,205 @@ +"""from logging import getLogger + +import torch +import torch.utils.data +import torchaudio + +LOG = getLogger(__name__) + + +from ..hparams import HParams + + +def spectrogram_torch(audio: torch.Tensor, hps: HParams) -> torch.Tensor: + return torchaudio.transforms.Spectrogram( + n_fft=hps.data.filter_length, + win_length=hps.data.win_length, + hop_length=hps.data.hop_length, + power=1.0, + window_fn=torch.hann_window, + normalized=False, + ).to(audio.device)(audio) + + +def spec_to_mel_torch(spec: torch.Tensor, hps: HParams) -> torch.Tensor: + return torchaudio.transforms.MelScale( + n_mels=hps.data.n_mel_channels, + sample_rate=hps.data.sampling_rate, + f_min=hps.data.mel_fmin, + f_max=hps.data.mel_fmax, + ).to(spec.device)(spec) + + +def mel_spectrogram_torch(audio: torch.Tensor, hps: HParams) -> torch.Tensor: + return torchaudio.transforms.MelSpectrogram( + sample_rate=hps.data.sampling_rate, + n_fft=hps.data.filter_length, + n_mels=hps.data.n_mel_channels, + win_length=hps.data.win_length, + hop_length=hps.data.hop_length, + f_min=hps.data.mel_fmin, + f_max=hps.data.mel_fmax, + power=1.0, + window_fn=torch.hann_window, + normalized=False, + ).to(audio.device)(audio)""" + +from logging import getLogger + +import torch +import torch.utils.data +from librosa.filters import mel as librosa_mel_fn + +LOG = getLogger(__name__) + +MAX_WAV_VALUE = 32768.0 + + +def dynamic_range_compression_torch(x, C=1, clip_val=1e-5): + """ + PARAMS + ------ + C: compression factor + """ + return torch.log(torch.clamp(x, min=clip_val) * C) + + +def dynamic_range_decompression_torch(x, C=1): + """ + PARAMS + ------ + C: compression factor used to compress + """ + return torch.exp(x) / C + + +def spectral_normalize_torch(magnitudes): + output = dynamic_range_compression_torch(magnitudes) + return output + + +def spectral_de_normalize_torch(magnitudes): + output = dynamic_range_decompression_torch(magnitudes) + return output + + +mel_basis = {} +hann_window = {} + + +def spectrogram_torch(y, hps, center=False): + if torch.min(y) < -1.0: + LOG.info("min value is ", torch.min(y)) + if torch.max(y) > 1.0: + LOG.info("max value is ", torch.max(y)) + n_fft = hps.data.filter_length + hop_size = hps.data.hop_length + win_size = hps.data.win_length + global hann_window + dtype_device = str(y.dtype) + "_" + str(y.device) + wnsize_dtype_device = str(win_size) + "_" + dtype_device + if wnsize_dtype_device not in hann_window: + hann_window[wnsize_dtype_device] = torch.hann_window(win_size).to( + dtype=y.dtype, device=y.device + ) + + y = torch.nn.functional.pad( + y.unsqueeze(1), + (int((n_fft - hop_size) / 2), int((n_fft - hop_size) / 2)), + mode="reflect", + ) + y = y.squeeze(1) + + spec = torch.stft( + y, + n_fft, + hop_length=hop_size, + win_length=win_size, + window=hann_window[wnsize_dtype_device], + center=center, + pad_mode="reflect", + normalized=False, + onesided=True, + return_complex=False, + ) + + spec = torch.sqrt(spec.pow(2).sum(-1) + 1e-6) + return spec + + +def spec_to_mel_torch(spec, hps): + sampling_rate = hps.data.sampling_rate + n_fft = hps.data.filter_length + num_mels = hps.data.n_mel_channels + fmin = hps.data.mel_fmin + fmax = hps.data.mel_fmax + global mel_basis + dtype_device = str(spec.dtype) + "_" + str(spec.device) + fmax_dtype_device = str(fmax) + "_" + dtype_device + if fmax_dtype_device not in mel_basis: + mel = librosa_mel_fn( + sr=sampling_rate, n_fft=n_fft, n_mels=num_mels, fmin=fmin, fmax=fmax + ) + mel_basis[fmax_dtype_device] = torch.from_numpy(mel).to( + dtype=spec.dtype, device=spec.device + ) + spec = torch.matmul(mel_basis[fmax_dtype_device], spec) + spec = spectral_normalize_torch(spec) + return spec + + +def mel_spectrogram_torch(y, hps, center=False): + sampling_rate = hps.data.sampling_rate + n_fft = hps.data.filter_length + num_mels = hps.data.n_mel_channels + fmin = hps.data.mel_fmin + fmax = hps.data.mel_fmax + hop_size = hps.data.hop_length + win_size = hps.data.win_length + if torch.min(y) < -1.0: + LOG.info(f"min value is {torch.min(y)}") + if torch.max(y) > 1.0: + LOG.info(f"max value is {torch.max(y)}") + + global mel_basis, hann_window + dtype_device = str(y.dtype) + "_" + str(y.device) + fmax_dtype_device = str(fmax) + "_" + dtype_device + wnsize_dtype_device = str(win_size) + "_" + dtype_device + if fmax_dtype_device not in mel_basis: + mel = librosa_mel_fn( + sr=sampling_rate, n_fft=n_fft, n_mels=num_mels, fmin=fmin, fmax=fmax + ) + mel_basis[fmax_dtype_device] = torch.from_numpy(mel).to( + dtype=y.dtype, device=y.device + ) + if wnsize_dtype_device not in hann_window: + hann_window[wnsize_dtype_device] = torch.hann_window(win_size).to( + dtype=y.dtype, device=y.device + ) + + y = torch.nn.functional.pad( + y.unsqueeze(1), + (int((n_fft - hop_size) / 2), int((n_fft - hop_size) / 2)), + mode="reflect", + ) + y = y.squeeze(1) + + spec = torch.stft( + y, + n_fft, + hop_length=hop_size, + win_length=win_size, + window=hann_window[wnsize_dtype_device], + center=center, + pad_mode="reflect", + normalized=False, + onesided=True, + return_complex=False, + ) + + spec = torch.sqrt(spec.pow(2).sum(-1) + 1e-6) + + spec = torch.matmul(mel_basis[fmax_dtype_device], spec) + spec = spectral_normalize_torch(spec) + + return spec diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/modules.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/modules.py new file mode 100644 index 0000000..659d4df --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/modules.py @@ -0,0 +1,452 @@ +import torch +from torch import nn +from torch.nn import Conv1d +from torch.nn import functional as F +from torch.nn.utils import remove_weight_norm, weight_norm + +from so_vits_svc_fork.modules import commons +from so_vits_svc_fork.modules.commons import get_padding, init_weights + +LRELU_SLOPE = 0.1 + + +class LayerNorm(nn.Module): + def __init__(self, channels, eps=1e-5): + super().__init__() + self.channels = channels + self.eps = eps + + self.gamma = nn.Parameter(torch.ones(channels)) + self.beta = nn.Parameter(torch.zeros(channels)) + + def forward(self, x): + x = x.transpose(1, -1) + x = F.layer_norm(x, (self.channels,), self.gamma, self.beta, self.eps) + return x.transpose(1, -1) + + +class ConvReluNorm(nn.Module): + def __init__( + self, + in_channels, + hidden_channels, + out_channels, + kernel_size, + n_layers, + p_dropout, + ): + super().__init__() + self.in_channels = in_channels + self.hidden_channels = hidden_channels + self.out_channels = out_channels + self.kernel_size = kernel_size + self.n_layers = n_layers + self.p_dropout = p_dropout + assert n_layers > 1, "Number of layers should be larger than 0." + + self.conv_layers = nn.ModuleList() + self.norm_layers = nn.ModuleList() + self.conv_layers.append( + nn.Conv1d( + in_channels, hidden_channels, kernel_size, padding=kernel_size // 2 + ) + ) + self.norm_layers.append(LayerNorm(hidden_channels)) + self.relu_drop = nn.Sequential(nn.ReLU(), nn.Dropout(p_dropout)) + for _ in range(n_layers - 1): + self.conv_layers.append( + nn.Conv1d( + hidden_channels, + hidden_channels, + kernel_size, + padding=kernel_size // 2, + ) + ) + self.norm_layers.append(LayerNorm(hidden_channels)) + self.proj = nn.Conv1d(hidden_channels, out_channels, 1) + self.proj.weight.data.zero_() + self.proj.bias.data.zero_() + + def forward(self, x, x_mask): + x_org = x + for i in range(self.n_layers): + x = self.conv_layers[i](x * x_mask) + x = self.norm_layers[i](x) + x = self.relu_drop(x) + x = x_org + self.proj(x) + return x * x_mask + + +class DDSConv(nn.Module): + """ + Dialted and Depth-Separable Convolution + """ + + def __init__(self, channels, kernel_size, n_layers, p_dropout=0.0): + super().__init__() + self.channels = channels + self.kernel_size = kernel_size + self.n_layers = n_layers + self.p_dropout = p_dropout + + self.drop = nn.Dropout(p_dropout) + self.convs_sep = nn.ModuleList() + self.convs_1x1 = nn.ModuleList() + self.norms_1 = nn.ModuleList() + self.norms_2 = nn.ModuleList() + for i in range(n_layers): + dilation = kernel_size**i + padding = (kernel_size * dilation - dilation) // 2 + self.convs_sep.append( + nn.Conv1d( + channels, + channels, + kernel_size, + groups=channels, + dilation=dilation, + padding=padding, + ) + ) + self.convs_1x1.append(nn.Conv1d(channels, channels, 1)) + self.norms_1.append(LayerNorm(channels)) + self.norms_2.append(LayerNorm(channels)) + + def forward(self, x, x_mask, g=None): + if g is not None: + x = x + g + for i in range(self.n_layers): + y = self.convs_sep[i](x * x_mask) + y = self.norms_1[i](y) + y = F.gelu(y) + y = self.convs_1x1[i](y) + y = self.norms_2[i](y) + y = F.gelu(y) + y = self.drop(y) + x = x + y + return x * x_mask + + +class WN(torch.nn.Module): + def __init__( + self, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=0, + p_dropout=0, + ): + super().__init__() + assert kernel_size % 2 == 1 + self.hidden_channels = hidden_channels + self.kernel_size = (kernel_size,) + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.gin_channels = gin_channels + self.p_dropout = p_dropout + + self.in_layers = torch.nn.ModuleList() + self.res_skip_layers = torch.nn.ModuleList() + self.drop = nn.Dropout(p_dropout) + + if gin_channels != 0: + cond_layer = torch.nn.Conv1d( + gin_channels, 2 * hidden_channels * n_layers, 1 + ) + self.cond_layer = torch.nn.utils.weight_norm(cond_layer, name="weight") + + for i in range(n_layers): + dilation = dilation_rate**i + padding = int((kernel_size * dilation - dilation) / 2) + in_layer = torch.nn.Conv1d( + hidden_channels, + 2 * hidden_channels, + kernel_size, + dilation=dilation, + padding=padding, + ) + in_layer = torch.nn.utils.weight_norm(in_layer, name="weight") + self.in_layers.append(in_layer) + + # last one is not necessary + if i < n_layers - 1: + res_skip_channels = 2 * hidden_channels + else: + res_skip_channels = hidden_channels + + res_skip_layer = torch.nn.Conv1d(hidden_channels, res_skip_channels, 1) + res_skip_layer = torch.nn.utils.weight_norm(res_skip_layer, name="weight") + self.res_skip_layers.append(res_skip_layer) + + def forward(self, x, x_mask, g=None, **kwargs): + output = torch.zeros_like(x) + n_channels_tensor = torch.IntTensor([self.hidden_channels]) + + if g is not None: + g = self.cond_layer(g) + + for i in range(self.n_layers): + x_in = self.in_layers[i](x) + if g is not None: + cond_offset = i * 2 * self.hidden_channels + g_l = g[:, cond_offset : cond_offset + 2 * self.hidden_channels, :] + else: + g_l = torch.zeros_like(x_in) + + acts = commons.fused_add_tanh_sigmoid_multiply(x_in, g_l, n_channels_tensor) + acts = self.drop(acts) + + res_skip_acts = self.res_skip_layers[i](acts) + if i < self.n_layers - 1: + res_acts = res_skip_acts[:, : self.hidden_channels, :] + x = (x + res_acts) * x_mask + output = output + res_skip_acts[:, self.hidden_channels :, :] + else: + output = output + res_skip_acts + return output * x_mask + + def remove_weight_norm(self): + if self.gin_channels != 0: + torch.nn.utils.remove_weight_norm(self.cond_layer) + for l in self.in_layers: + torch.nn.utils.remove_weight_norm(l) + for l in self.res_skip_layers: + torch.nn.utils.remove_weight_norm(l) + + +class ResBlock1(torch.nn.Module): + def __init__(self, channels, kernel_size=3, dilation=(1, 3, 5)): + super().__init__() + self.convs1 = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[0], + padding=get_padding(kernel_size, dilation[0]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[1], + padding=get_padding(kernel_size, dilation[1]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[2], + padding=get_padding(kernel_size, dilation[2]), + ) + ), + ] + ) + self.convs1.apply(init_weights) + + self.convs2 = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + ] + ) + self.convs2.apply(init_weights) + + def forward(self, x, x_mask=None): + for c1, c2 in zip(self.convs1, self.convs2): + xt = F.leaky_relu(x, LRELU_SLOPE) + if x_mask is not None: + xt = xt * x_mask + xt = c1(xt) + xt = F.leaky_relu(xt, LRELU_SLOPE) + if x_mask is not None: + xt = xt * x_mask + xt = c2(xt) + x = xt + x + if x_mask is not None: + x = x * x_mask + return x + + def remove_weight_norm(self): + for l in self.convs1: + remove_weight_norm(l) + for l in self.convs2: + remove_weight_norm(l) + + +class ResBlock2(torch.nn.Module): + def __init__(self, channels, kernel_size=3, dilation=(1, 3)): + super().__init__() + self.convs = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[0], + padding=get_padding(kernel_size, dilation[0]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[1], + padding=get_padding(kernel_size, dilation[1]), + ) + ), + ] + ) + self.convs.apply(init_weights) + + def forward(self, x, x_mask=None): + for c in self.convs: + xt = F.leaky_relu(x, LRELU_SLOPE) + if x_mask is not None: + xt = xt * x_mask + xt = c(xt) + x = xt + x + if x_mask is not None: + x = x * x_mask + return x + + def remove_weight_norm(self): + for l in self.convs: + remove_weight_norm(l) + + +class Log(nn.Module): + def forward(self, x, x_mask, reverse=False, **kwargs): + if not reverse: + y = torch.log(torch.clamp_min(x, 1e-5)) * x_mask + logdet = torch.sum(-y, [1, 2]) + return y, logdet + else: + x = torch.exp(x) * x_mask + return x + + +class Flip(nn.Module): + def forward(self, x, *args, reverse=False, **kwargs): + x = torch.flip(x, [1]) + if not reverse: + logdet = torch.zeros(x.size(0)).to(dtype=x.dtype, device=x.device) + return x, logdet + else: + return x + + +class ElementwiseAffine(nn.Module): + def __init__(self, channels): + super().__init__() + self.channels = channels + self.m = nn.Parameter(torch.zeros(channels, 1)) + self.logs = nn.Parameter(torch.zeros(channels, 1)) + + def forward(self, x, x_mask, reverse=False, **kwargs): + if not reverse: + y = self.m + torch.exp(self.logs) * x + y = y * x_mask + logdet = torch.sum(self.logs * x_mask, [1, 2]) + return y, logdet + else: + x = (x - self.m) * torch.exp(-self.logs) * x_mask + return x + + +class ResidualCouplingLayer(nn.Module): + def __init__( + self, + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + p_dropout=0, + gin_channels=0, + mean_only=False, + ): + assert channels % 2 == 0, "channels should be divisible by 2" + super().__init__() + self.channels = channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.half_channels = channels // 2 + self.mean_only = mean_only + + self.pre = nn.Conv1d(self.half_channels, hidden_channels, 1) + self.enc = WN( + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + p_dropout=p_dropout, + gin_channels=gin_channels, + ) + self.post = nn.Conv1d(hidden_channels, self.half_channels * (2 - mean_only), 1) + self.post.weight.data.zero_() + self.post.bias.data.zero_() + + def forward(self, x, x_mask, g=None, reverse=False): + x0, x1 = torch.split(x, [self.half_channels] * 2, 1) + h = self.pre(x0) * x_mask + h = self.enc(h, x_mask, g=g) + stats = self.post(h) * x_mask + if not self.mean_only: + m, logs = torch.split(stats, [self.half_channels] * 2, 1) + else: + m = stats + logs = torch.zeros_like(m) + + if not reverse: + x1 = m + x1 * torch.exp(logs) * x_mask + x = torch.cat([x0, x1], 1) + logdet = torch.sum(logs, [1, 2]) + return x, logdet + else: + x1 = (x1 - m) * torch.exp(-logs) * x_mask + x = torch.cat([x0, x1], 1) + return x diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/synthesizers.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/synthesizers.py new file mode 100644 index 0000000..c96e021 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/modules/synthesizers.py @@ -0,0 +1,233 @@ +import warnings +from logging import getLogger +from typing import Any, Literal, Sequence + +import torch +from torch import nn + +import so_vits_svc_fork.f0 +from so_vits_svc_fork.f0 import f0_to_coarse +from so_vits_svc_fork.modules import commons as commons +from so_vits_svc_fork.modules.decoders.f0 import F0Decoder +from so_vits_svc_fork.modules.decoders.hifigan import NSFHifiGANGenerator +from so_vits_svc_fork.modules.decoders.mb_istft import ( + Multiband_iSTFT_Generator, + Multistream_iSTFT_Generator, + iSTFT_Generator, +) +from so_vits_svc_fork.modules.encoders import Encoder, TextEncoder +from so_vits_svc_fork.modules.flows import ResidualCouplingBlock + +LOG = getLogger(__name__) + + +class SynthesizerTrn(nn.Module): + """ + Synthesizer for Training + """ + + def __init__( + self, + spec_channels: int, + segment_size: int, + inter_channels: int, + hidden_channels: int, + filter_channels: int, + n_heads: int, + n_layers: int, + kernel_size: int, + p_dropout: int, + resblock: str, + resblock_kernel_sizes: Sequence[int], + resblock_dilation_sizes: Sequence[Sequence[int]], + upsample_rates: Sequence[int], + upsample_initial_channel: int, + upsample_kernel_sizes: Sequence[int], + gin_channels: int, + ssl_dim: int, + n_speakers: int, + sampling_rate: int = 44100, + type_: Literal["hifi-gan", "istft", "ms-istft", "mb-istft"] = "hifi-gan", + gen_istft_n_fft: int = 16, + gen_istft_hop_size: int = 4, + subbands: int = 4, + **kwargs: Any, + ): + super().__init__() + self.spec_channels = spec_channels + self.inter_channels = inter_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.resblock = resblock + self.resblock_kernel_sizes = resblock_kernel_sizes + self.resblock_dilation_sizes = resblock_dilation_sizes + self.upsample_rates = upsample_rates + self.upsample_initial_channel = upsample_initial_channel + self.upsample_kernel_sizes = upsample_kernel_sizes + self.segment_size = segment_size + self.gin_channels = gin_channels + self.ssl_dim = ssl_dim + self.n_speakers = n_speakers + self.sampling_rate = sampling_rate + self.type_ = type_ + self.gen_istft_n_fft = gen_istft_n_fft + self.gen_istft_hop_size = gen_istft_hop_size + self.subbands = subbands + if kwargs: + warnings.warn(f"Unused arguments: {kwargs}") + + self.emb_g = nn.Embedding(n_speakers, gin_channels) + + if ssl_dim is None: + self.pre = nn.LazyConv1d(hidden_channels, kernel_size=5, padding=2) + else: + self.pre = nn.Conv1d(ssl_dim, hidden_channels, kernel_size=5, padding=2) + + self.enc_p = TextEncoder( + inter_channels, + hidden_channels, + filter_channels=filter_channels, + n_heads=n_heads, + n_layers=n_layers, + kernel_size=kernel_size, + p_dropout=p_dropout, + ) + + LOG.info(f"Decoder type: {type_}") + if type_ == "hifi-gan": + hps = { + "sampling_rate": sampling_rate, + "inter_channels": inter_channels, + "resblock": resblock, + "resblock_kernel_sizes": resblock_kernel_sizes, + "resblock_dilation_sizes": resblock_dilation_sizes, + "upsample_rates": upsample_rates, + "upsample_initial_channel": upsample_initial_channel, + "upsample_kernel_sizes": upsample_kernel_sizes, + "gin_channels": gin_channels, + } + self.dec = NSFHifiGANGenerator(h=hps) + self.mb = False + else: + hps = { + "initial_channel": inter_channels, + "resblock": resblock, + "resblock_kernel_sizes": resblock_kernel_sizes, + "resblock_dilation_sizes": resblock_dilation_sizes, + "upsample_rates": upsample_rates, + "upsample_initial_channel": upsample_initial_channel, + "upsample_kernel_sizes": upsample_kernel_sizes, + "gin_channels": gin_channels, + "gen_istft_n_fft": gen_istft_n_fft, + "gen_istft_hop_size": gen_istft_hop_size, + "subbands": subbands, + } + + # gen_istft_n_fft, gen_istft_hop_size, subbands + if type_ == "istft": + del hps["subbands"] + self.dec = iSTFT_Generator(**hps) + elif type_ == "ms-istft": + self.dec = Multistream_iSTFT_Generator(**hps) + elif type_ == "mb-istft": + self.dec = Multiband_iSTFT_Generator(**hps) + else: + raise ValueError(f"Unknown type: {type_}") + self.mb = True + + self.enc_q = Encoder( + spec_channels, + inter_channels, + hidden_channels, + 5, + 1, + 16, + gin_channels=gin_channels, + ) + self.flow = ResidualCouplingBlock( + inter_channels, hidden_channels, 5, 1, 4, gin_channels=gin_channels + ) + self.f0_decoder = F0Decoder( + 1, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + spk_channels=gin_channels, + ) + self.emb_uv = nn.Embedding(2, hidden_channels) + + def forward(self, c, f0, uv, spec, g=None, c_lengths=None, spec_lengths=None): + g = self.emb_g(g).transpose(1, 2) + # ssl prenet + x_mask = torch.unsqueeze(commons.sequence_mask(c_lengths, c.size(2)), 1).to( + c.dtype + ) + x = self.pre(c) * x_mask + self.emb_uv(uv.long()).transpose(1, 2) + + # f0 predict + lf0 = 2595.0 * torch.log10(1.0 + f0.unsqueeze(1) / 700.0) / 500 + norm_lf0 = so_vits_svc_fork.f0.normalize_f0(lf0, x_mask, uv) + pred_lf0 = self.f0_decoder(x, norm_lf0, x_mask, spk_emb=g) + + # encoder + z_ptemp, m_p, logs_p, _ = self.enc_p(x, x_mask, f0=f0_to_coarse(f0)) + z, m_q, logs_q, spec_mask = self.enc_q(spec, spec_lengths, g=g) + + # flow + z_p = self.flow(z, spec_mask, g=g) + z_slice, pitch_slice, ids_slice = commons.rand_slice_segments_with_pitch( + z, f0, spec_lengths, self.segment_size + ) + + # MB-iSTFT-VITS + if self.mb: + o, o_mb = self.dec(z_slice, g=g) + # HiFi-GAN + else: + o = self.dec(z_slice, g=g, f0=pitch_slice) + o_mb = None + return ( + o, + o_mb, + ids_slice, + spec_mask, + (z, z_p, m_p, logs_p, m_q, logs_q), + pred_lf0, + norm_lf0, + lf0, + ) + + def infer(self, c, f0, uv, g=None, noice_scale=0.35, predict_f0=False): + c_lengths = (torch.ones(c.size(0)) * c.size(-1)).to(c.device) + g = self.emb_g(g).transpose(1, 2) + x_mask = torch.unsqueeze(commons.sequence_mask(c_lengths, c.size(2)), 1).to( + c.dtype + ) + x = self.pre(c) * x_mask + self.emb_uv(uv.long()).transpose(1, 2) + + if predict_f0: + lf0 = 2595.0 * torch.log10(1.0 + f0.unsqueeze(1) / 700.0) / 500 + norm_lf0 = so_vits_svc_fork.f0.normalize_f0( + lf0, x_mask, uv, random_scale=False + ) + pred_lf0 = self.f0_decoder(x, norm_lf0, x_mask, spk_emb=g) + f0 = (700 * (torch.pow(10, pred_lf0 * 500 / 2595) - 1)).squeeze(1) + + z_p, m_p, logs_p, c_mask = self.enc_p( + x, x_mask, f0=f0_to_coarse(f0), noice_scale=noice_scale + ) + z = self.flow(z_p, c_mask, g=g, reverse=True) + + # MB-iSTFT-VITS + if self.mb: + o, o_mb = self.dec(z * c_mask, g=g) + else: + o = self.dec(z * c_mask, g=g, f0=f0) + return o diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/__init__.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/config_templates/quickvc.json b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/config_templates/quickvc.json new file mode 100644 index 0000000..1d72525 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/config_templates/quickvc.json @@ -0,0 +1,74 @@ +{ + "train": { + "log_interval": 100, + "eval_interval": 200, + "seed": 1234, + "epochs": 10000, + "learning_rate": 0.0001, + "betas": [0.8, 0.99], + "eps": 1e-9, + "batch_size": 16, + "fp16_run": false, + "bf16_run": false, + "lr_decay": 0.999875, + "segment_size": 10240, + "init_lr_ratio": 1, + "warmup_epochs": 0, + "c_mel": 45, + "c_kl": 1.0, + "use_sr": true, + "max_speclen": 512, + "port": "8001", + "keep_ckpts": 3, + "fft_sizes": [768, 1366, 342], + "hop_sizes": [60, 120, 20], + "win_lengths": [300, 600, 120], + "window": "hann_window", + "num_workers": 4, + "log_version": 0, + "ckpt_name_by_step": false, + "accumulate_grad_batches": 1 + }, + "data": { + "training_files": "filelists/44k/train.txt", + "validation_files": "filelists/44k/val.txt", + "max_wav_value": 32768.0, + "sampling_rate": 44100, + "filter_length": 2048, + "hop_length": 512, + "win_length": 2048, + "n_mel_channels": 80, + "mel_fmin": 0.0, + "mel_fmax": 22050, + "contentvec_final_proj": false + }, + "model": { + "inter_channels": 192, + "hidden_channels": 192, + "filter_channels": 768, + "n_heads": 2, + "n_layers": 6, + "kernel_size": 3, + "p_dropout": 0.1, + "resblock": "1", + "resblock_kernel_sizes": [3, 7, 11], + "resblock_dilation_sizes": [ + [1, 3, 5], + [1, 3, 5], + [1, 3, 5] + ], + "upsample_rates": [8, 4], + "upsample_initial_channel": 512, + "upsample_kernel_sizes": [32, 16], + "n_layers_q": 3, + "use_spectral_norm": false, + "gin_channels": 256, + "ssl_dim": 768, + "n_speakers": 200, + "type_": "ms-istft", + "gen_istft_n_fft": 16, + "gen_istft_hop_size": 4, + "subbands": 4 + }, + "spk": {} +} diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/config_templates/so-vits-svc-4.0v1-legacy.json b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/config_templates/so-vits-svc-4.0v1-legacy.json new file mode 100644 index 0000000..174e1b7 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/config_templates/so-vits-svc-4.0v1-legacy.json @@ -0,0 +1,65 @@ +{ + "train": { + "log_interval": 200, + "eval_interval": 800, + "seed": 1234, + "epochs": 10000, + "learning_rate": 0.0001, + "betas": [0.8, 0.99], + "eps": 1e-9, + "batch_size": 16, + "fp16_run": false, + "bf16_run": false, + "lr_decay": 0.999875, + "segment_size": 10240, + "init_lr_ratio": 1, + "warmup_epochs": 0, + "c_mel": 45, + "c_kl": 1.0, + "use_sr": true, + "max_speclen": 512, + "port": "8001", + "keep_ckpts": 3, + "num_workers": 4, + "log_version": 0, + "ckpt_name_by_step": false, + "accumulate_grad_batches": 1 + }, + "data": { + "training_files": "filelists/44k/train.txt", + "validation_files": "filelists/44k/val.txt", + "max_wav_value": 32768.0, + "sampling_rate": 44100, + "filter_length": 2048, + "hop_length": 512, + "win_length": 2048, + "n_mel_channels": 80, + "mel_fmin": 0.0, + "mel_fmax": 22050 + }, + "model": { + "inter_channels": 192, + "hidden_channels": 192, + "filter_channels": 768, + "n_heads": 2, + "n_layers": 6, + "kernel_size": 3, + "p_dropout": 0.1, + "resblock": "1", + "resblock_kernel_sizes": [3, 7, 11], + "resblock_dilation_sizes": [ + [1, 3, 5], + [1, 3, 5], + [1, 3, 5] + ], + "upsample_rates": [8, 8, 2, 2, 2], + "upsample_initial_channel": 512, + "upsample_kernel_sizes": [16, 16, 4, 4, 4], + "n_layers_q": 3, + "use_spectral_norm": false, + "gin_channels": 256, + "ssl_dim": 256, + "n_speakers": 200 + }, + "spk": {} +} diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/config_templates/so-vits-svc-4.0v1.json b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/config_templates/so-vits-svc-4.0v1.json new file mode 100644 index 0000000..0e5522c --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/config_templates/so-vits-svc-4.0v1.json @@ -0,0 +1,67 @@ +{ + "train": { + "log_interval": 100, + "eval_interval": 200, + "seed": 1234, + "epochs": 10000, + "learning_rate": 0.0001, + "betas": [0.8, 0.99], + "eps": 1e-9, + "batch_size": 16, + "fp16_run": false, + "bf16_run": false, + "lr_decay": 0.999875, + "segment_size": 10240, + "init_lr_ratio": 1, + "warmup_epochs": 0, + "c_mel": 45, + "c_kl": 1.0, + "use_sr": true, + "max_speclen": 512, + "port": "8001", + "keep_ckpts": 3, + "num_workers": 4, + "log_version": 0, + "ckpt_name_by_step": false, + "accumulate_grad_batches": 1 + }, + "data": { + "training_files": "filelists/44k/train.txt", + "validation_files": "filelists/44k/val.txt", + "max_wav_value": 32768.0, + "sampling_rate": 44100, + "filter_length": 2048, + "hop_length": 512, + "win_length": 2048, + "n_mel_channels": 80, + "mel_fmin": 0.0, + "mel_fmax": 22050, + "contentvec_final_proj": false + }, + "model": { + "inter_channels": 192, + "hidden_channels": 192, + "filter_channels": 768, + "n_heads": 2, + "n_layers": 6, + "kernel_size": 3, + "p_dropout": 0.1, + "resblock": "1", + "resblock_kernel_sizes": [3, 7, 11], + "resblock_dilation_sizes": [ + [1, 3, 5], + [1, 3, 5], + [1, 3, 5] + ], + "upsample_rates": [8, 8, 2, 2, 2], + "upsample_initial_channel": 512, + "upsample_kernel_sizes": [16, 16, 4, 4, 4], + "n_layers_q": 3, + "use_spectral_norm": false, + "gin_channels": 256, + "ssl_dim": 768, + "n_speakers": 200, + "type_": "hifi-gan" + }, + "spk": {} +} diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_classify.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_classify.py new file mode 100644 index 0000000..ca0f8c7 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_classify.py @@ -0,0 +1,95 @@ +from __future__ import annotations + +from logging import getLogger +from pathlib import Path + +import keyboard +import librosa +import sounddevice as sd +import soundfile as sf +from rich.console import Console +from tqdm.rich import tqdm + +LOG = getLogger(__name__) + + +def preprocess_classify( + input_dir: Path | str, output_dir: Path | str, create_new: bool = True +) -> None: + # paths + input_dir_ = Path(input_dir) + output_dir_ = Path(output_dir) + speed = 1 + if not input_dir_.is_dir(): + raise ValueError(f"{input_dir} is not a directory.") + output_dir_.mkdir(exist_ok=True) + + console = Console() + # get audio paths and folders + audio_paths = list(input_dir_.glob("*.*")) + last_folders = [x for x in output_dir_.glob("*") if x.is_dir()] + console.print("Press ↑ or ↓ to change speed. Press any other key to classify.") + console.print(f"Folders: {[x.name for x in last_folders]}") + + pbar_description = "" + + pbar = tqdm(audio_paths) + for audio_path in pbar: + # read file + audio, sr = sf.read(audio_path) + + # update description + duration = librosa.get_duration(y=audio, sr=sr) + pbar_description = f"{duration:.1f} {pbar_description}" + pbar.set_description(pbar_description) + + while True: + # start playing + sd.play(librosa.effects.time_stretch(audio, rate=speed), sr, loop=True) + + # wait for key press + key = str(keyboard.read_key()) + if key == "down": + speed /= 1.1 + console.print(f"Speed: {speed:.2f}") + elif key == "up": + speed *= 1.1 + console.print(f"Speed: {speed:.2f}") + else: + break + + # stop playing + sd.stop() + + # print if folder changed + folders = [x for x in output_dir_.glob("*") if x.is_dir()] + if folders != last_folders: + console.print(f"Folders updated: {[x.name for x in folders]}") + last_folders = folders + + # get folder + folder_candidates = [x for x in folders if x.name.startswith(key)] + if len(folder_candidates) == 0: + if create_new: + folder = output_dir_ / key + else: + console.print(f"No folder starts with {key}.") + continue + else: + if len(folder_candidates) > 1: + LOG.warning( + f"Multiple folders ({[x.name for x in folder_candidates]}) start with {key}. " + f"Using first one ({folder_candidates[0].name})." + ) + folder = folder_candidates[0] + folder.mkdir(exist_ok=True) + + # move file + new_path = folder / audio_path.name + audio_path.rename(new_path) + + # update description + pbar_description = f"Last: {audio_path.name} -> {folder.name}" + + # yield result + # yield audio_path, key, folder, new_path diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_flist_config.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_flist_config.py new file mode 100644 index 0000000..01f9213 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_flist_config.py @@ -0,0 +1,85 @@ +from __future__ import annotations + +import json +import os +from copy import deepcopy +from logging import getLogger +from pathlib import Path +from random import shuffle + +from librosa import get_duration +from tqdm import tqdm + +LOG = getLogger(__name__) +CONFIG_TEMPLATE_DIR = Path(__file__).parent / "config_templates" + + +def preprocess_config( + input_dir: Path | str, + train_list_path: Path | str, + val_list_path: Path | str, + test_list_path: Path | str, + config_path: Path | str, + config_name: str, +): + input_dir = Path(input_dir) + train_list_path = Path(train_list_path) + val_list_path = Path(val_list_path) + test_list_path = Path(test_list_path) + config_path = Path(config_path) + train = [] + val = [] + test = [] + spk_dict = {} + spk_id = 0 + for speaker in os.listdir(input_dir): + spk_dict[speaker] = spk_id + spk_id += 1 + paths = [] + for path in tqdm(list((input_dir / speaker).rglob("*.wav"))): + if get_duration(filename=path) < 0.3: + LOG.warning(f"skip {path} because it is too short.") + continue + paths.append(path) + shuffle(paths) + if len(paths) <= 4: + raise ValueError( + f"too few files in {input_dir / speaker} (expected at least 5)." + ) + train += paths[2:-2] + val += paths[:2] + test += paths[-2:] + + LOG.info(f"Writing {train_list_path}") + train_list_path.parent.mkdir(parents=True, exist_ok=True) + train_list_path.write_text( + "\n".join([x.as_posix() for x in train]), encoding="utf-8" + ) + + LOG.info(f"Writing {val_list_path}") + val_list_path.parent.mkdir(parents=True, exist_ok=True) + val_list_path.write_text("\n".join([x.as_posix() for x in val]), encoding="utf-8") + + LOG.info(f"Writing {test_list_path}") + test_list_path.parent.mkdir(parents=True, exist_ok=True) + test_list_path.write_text("\n".join([x.as_posix() for x in test]), encoding="utf-8") + + config = deepcopy( + json.loads( + ( + CONFIG_TEMPLATE_DIR + / ( + config_name + if config_name.endswith(".json") + else config_name + ".json" + ) + ).read_text(encoding="utf-8") + ) + ) + config["spk"] = spk_dict + config["data"]["training_files"] = train_list_path.as_posix() + config["data"]["validation_files"] = val_list_path.as_posix() + LOG.info(f"Writing {config_path}") + config_path.parent.mkdir(parents=True, exist_ok=True) + with config_path.open("w", encoding="utf-8") as f: + json.dump(config, f, indent=2) diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_hubert_f0.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_hubert_f0.py new file mode 100644 index 0000000..69c2a69 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_hubert_f0.py @@ -0,0 +1,157 @@ +from __future__ import annotations + +from logging import getLogger +from pathlib import Path +from random import shuffle +from typing import Iterable, Literal + +import librosa +import numpy as np +import torch +import torchaudio +from joblib import Parallel, cpu_count, delayed +from tqdm import tqdm +from transformers import HubertModel + +import so_vits_svc_fork.f0 +from so_vits_svc_fork import utils + +from ..hparams import HParams +from ..modules.mel_processing import spec_to_mel_torch, spectrogram_torch +from ..utils import get_optimal_device, get_total_gpu_memory +from .preprocess_utils import check_hubert_min_duration + +LOG = getLogger(__name__) +HUBERT_MEMORY = 2900 +HUBERT_MEMORY_CREPE = 3900 + + +def _process_one( + *, + filepath: Path, + content_model: HubertModel, + device: torch.device | str = get_optimal_device(), + f0_method: Literal["crepe", "crepe-tiny", "parselmouth", "dio", "harvest"] = "dio", + force_rebuild: bool = False, + hps: HParams, +): + audio, sr = librosa.load(filepath, sr=hps.data.sampling_rate, mono=True) + + if not check_hubert_min_duration(audio, sr): + LOG.info(f"Skip {filepath} because it is too short.") + return + + data_path = filepath.parent / (filepath.name + ".data.pt") + if data_path.exists() and not force_rebuild: + return + + # Compute f0 + f0 = so_vits_svc_fork.f0.compute_f0( + audio, sampling_rate=sr, hop_length=hps.data.hop_length, method=f0_method + ) + f0, uv = so_vits_svc_fork.f0.interpolate_f0(f0) + f0 = torch.from_numpy(f0).float() + uv = torch.from_numpy(uv).float() + + # Compute HuBERT content + audio = torch.from_numpy(audio).float().to(device) + c = utils.get_content( + content_model, + audio, + device, + sr=sr, + legacy_final_proj=hps.data.get("contentvec_final_proj", True), + ) + c = utils.repeat_expand_2d(c.squeeze(0), f0.shape[0]) + torch.cuda.empty_cache() + + # Compute spectrogram + audio, sr = torchaudio.load(filepath) + spec = spectrogram_torch(audio, hps).squeeze(0) + mel_spec = spec_to_mel_torch(spec, hps) + torch.cuda.empty_cache() + + # fix lengths + lmin = min(spec.shape[1], mel_spec.shape[1], f0.shape[0], uv.shape[0], c.shape[1]) + spec, mel_spec, f0, uv, c = ( + spec[:, :lmin], + mel_spec[:, :lmin], + f0[:lmin], + uv[:lmin], + c[:, :lmin], + ) + + # get speaker id + spk_name = filepath.parent.name + spk = hps.spk.__dict__[spk_name] + spk = torch.tensor(spk).long() + assert ( + spec.shape[1] == mel_spec.shape[1] == f0.shape[0] == uv.shape[0] == c.shape[1] + ), (spec.shape, mel_spec.shape, f0.shape, uv.shape, c.shape) + data = { + "spec": spec, + "mel_spec": mel_spec, + "f0": f0, + "uv": uv, + "content": c, + "audio": audio, + "spk": spk, + } + data = {k: v.cpu() for k, v in data.items()} + with data_path.open("wb") as f: + torch.save(data, f) + + +def _process_batch(filepaths: Iterable[Path], pbar_position: int, **kwargs): + hps = kwargs["hps"] + content_model = utils.get_hubert_model( + get_optimal_device(), hps.data.get("contentvec_final_proj", True) + ) + + for filepath in tqdm(filepaths, position=pbar_position): + _process_one( + content_model=content_model, + filepath=filepath, + **kwargs, + ) + + +def preprocess_hubert_f0( + input_dir: Path | str, + config_path: Path | str, + n_jobs: int | None = None, + f0_method: Literal["crepe", "crepe-tiny", "parselmouth", "dio", "harvest"] = "dio", + force_rebuild: bool = False, +): + input_dir = Path(input_dir) + config_path = Path(config_path) + hps = utils.get_hparams(config_path) + if n_jobs is None: + # add cpu_count() to avoid SIGKILL + memory = get_total_gpu_memory("total") + n_jobs = min( + max( + memory + // (HUBERT_MEMORY_CREPE if f0_method == "crepe" else HUBERT_MEMORY) + if memory is not None + else 1, + 1, + ), + cpu_count(), + ) + LOG.info(f"n_jobs automatically set to {n_jobs}, memory: {memory} MiB") + + filepaths = list(input_dir.rglob("*.wav")) + n_jobs = min(len(filepaths) // 16 + 1, n_jobs) + shuffle(filepaths) + filepath_chunks = np.array_split(filepaths, n_jobs) + Parallel(n_jobs=n_jobs)( + delayed(_process_batch)( + filepaths=chunk, + pbar_position=pbar_position, + f0_method=f0_method, + force_rebuild=force_rebuild, + hps=hps, + ) + for (pbar_position, chunk) in enumerate(filepath_chunks) + ) diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_resample.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_resample.py new file mode 100644 index 0000000..348c4e9 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_resample.py @@ -0,0 +1,143 @@ +from __future__ import annotations + +import warnings +from logging import getLogger +from pathlib import Path +from typing import Iterable + +import librosa +import soundfile +from joblib import Parallel, delayed +from tqdm_joblib import tqdm_joblib + +from .preprocess_utils import check_hubert_min_duration + +LOG = getLogger(__name__) + +# input_dir and output_dir exists. +# write code to convert input dir audio files to output dir audio files, +# without changing folder structure. Use joblib to parallelize. +# Converting audio files includes: +# - resampling to specified sampling rate +# - trim silence +# - adjust volume in a smart way +# - save as 16-bit wav file + + +def _get_unique_filename(path: Path, existing_paths: Iterable[Path]) -> Path: + """Return a unique path by appending a number to the original path.""" + if path not in existing_paths: + return path + i = 1 + while True: + new_path = path.parent / f"{path.stem}_{i}{path.suffix}" + if new_path not in existing_paths: + return new_path + i += 1 + + +def is_relative_to(path: Path, *other): + """Return True if the path is relative to another path or False. + Python 3.9+ has Path.is_relative_to() method, but we need to support Python 3.8. + """ + try: + path.relative_to(*other) + return True + except ValueError: + return False + + +def _preprocess_one( + input_path: Path, + output_path: Path, + sr: int, + *, + top_db: int, + frame_seconds: float, + hop_seconds: float, +) -> None: + """Preprocess one audio file.""" + + try: + audio, sr = librosa.load(input_path, sr=sr, mono=True) + + # Audioread is the last backend it will attempt, so this is the exception thrown on failure + except Exception as e: + # Failure due to attempting to load a file that is not audio, so return early + LOG.warning(f"Failed to load {input_path} due to {e}") + return + + if not check_hubert_min_duration(audio, sr): + LOG.info(f"Skip {input_path} because it is too short.") + return + + # Adjust volume + audio /= max(audio.max(), -audio.min()) + + # Trim silence + audio, _ = librosa.effects.trim( + audio, + top_db=top_db, + frame_length=int(frame_seconds * sr), + hop_length=int(hop_seconds * sr), + ) + + if not check_hubert_min_duration(audio, sr): + LOG.info(f"Skip {input_path} because it is too short.") + return + + soundfile.write(output_path, audio, samplerate=sr, subtype="PCM_16") + + +def preprocess_resample( + input_dir: Path | str, + output_dir: Path | str, + sampling_rate: int, + n_jobs: int = -1, + *, + top_db: int = 30, + frame_seconds: float = 0.1, + hop_seconds: float = 0.05, +) -> None: + input_dir = Path(input_dir) + output_dir = Path(output_dir) + """Preprocess audio files in input_dir and save them to output_dir.""" + + in_paths = [] + out_paths = [] + for in_path in input_dir.rglob("*.*"): + in_path_relative = in_path.relative_to(input_dir) + if not in_path.is_absolute() and is_relative_to( + in_path, Path("dataset_raw") / "44k" + ): + new_in_path_relative = in_path_relative.relative_to("44k") + warnings.warn( + f"Recommended folder structure has changed since v1.0.0. " + "Please move your dataset directly under dataset_raw folder. " + f"Recoginzed {in_path_relative} as {new_in_path_relative}" + ) + in_path_relative = new_in_path_relative + + if len(in_path_relative.parts) < 2: + continue + speaker_name = in_path_relative.parts[0] + file_name = in_path_relative.with_suffix(".wav").name + out_path = output_dir / speaker_name / file_name + out_path = _get_unique_filename(out_path, out_paths) + out_path.parent.mkdir(parents=True, exist_ok=True) + in_paths.append(in_path) + out_paths.append(out_path) + + in_and_out_paths = list(zip(in_paths, out_paths)) + + with tqdm_joblib(desc="Preprocessing", total=len(in_and_out_paths)): + Parallel(n_jobs=n_jobs)( + delayed(_preprocess_one)( + *args, + sr=sampling_rate, + top_db=top_db, + frame_seconds=frame_seconds, + hop_seconds=hop_seconds, + ) + for args in in_and_out_paths + ) diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_speaker_diarization.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_speaker_diarization.py new file mode 100644 index 0000000..12d0c41 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_speaker_diarization.py @@ -0,0 +1,93 @@ +from __future__ import annotations + +from collections import defaultdict +from logging import getLogger +from pathlib import Path + +import librosa +import soundfile as sf +import torch +from joblib import Parallel, delayed +from pyannote.audio import Pipeline +from tqdm import tqdm +from tqdm_joblib import tqdm_joblib + +LOG = getLogger(__name__) + + +def _process_one( + input_path: Path, + output_dir: Path, + sr: int, + *, + min_speakers: int = 1, + max_speakers: int = 1, + huggingface_token: str | None = None, +) -> None: + try: + audio, sr = librosa.load(input_path, sr=sr, mono=True) + except Exception as e: + LOG.warning(f"Failed to read {input_path}: {e}") + return + pipeline = Pipeline.from_pretrained( + "pyannote/speaker-diarization", use_auth_token=huggingface_token + ) + if pipeline is None: + raise ValueError("Failed to load pipeline") + + LOG.info(f"Processing {input_path}. This may take a while...") + diarization = pipeline( + input_path, min_speakers=min_speakers, max_speakers=max_speakers + ) + + LOG.info(f"Found {len(diarization)} tracks, writing to {output_dir}") + speaker_count = defaultdict(int) + + output_dir.mkdir(parents=True, exist_ok=True) + for segment, track, speaker in tqdm( + list(diarization.itertracks(yield_label=True)), desc=f"Writing {input_path}" + ): + if segment.end - segment.start < 1: + continue + speaker_count[speaker] += 1 + audio_cut = audio[int(segment.start * sr) : int(segment.end * sr)] + sf.write( + (output_dir / f"{speaker}_{speaker_count[speaker]}.wav"), + audio_cut, + sr, + ) + + LOG.info(f"Speaker count: {speaker_count}") + + +def preprocess_speaker_diarization( + input_dir: Path | str, + output_dir: Path | str, + sr: int, + *, + min_speakers: int = 1, + max_speakers: int = 1, + huggingface_token: str | None = None, + n_jobs: int = -1, +) -> None: + if huggingface_token is not None and not huggingface_token.startswith("hf_"): + LOG.warning("Huggingface token probably should start with hf_") + if not torch.cuda.is_available(): + LOG.warning("CUDA is not available. This will be extremely slow.") + input_dir = Path(input_dir) + output_dir = Path(output_dir) + input_dir.mkdir(parents=True, exist_ok=True) + output_dir.mkdir(parents=True, exist_ok=True) + input_paths = list(input_dir.rglob("*.*")) + with tqdm_joblib(desc="Preprocessing speaker diarization", total=len(input_paths)): + Parallel(n_jobs=n_jobs)( + delayed(_process_one)( + input_path, + output_dir / input_path.relative_to(input_dir).parent / input_path.stem, + sr, + max_speakers=max_speakers, + min_speakers=min_speakers, + huggingface_token=huggingface_token, + ) + for input_path in input_paths + ) diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_split.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_split.py new file mode 100644 index 0000000..fb98938 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_split.py @@ -0,0 +1,70 @@ +from __future__ import annotations + +from logging import getLogger +from pathlib import Path + +import librosa +import soundfile as sf +from joblib import Parallel, delayed +from tqdm import tqdm +from tqdm_joblib import tqdm_joblib + +LOG = getLogger(__name__) + + +def _process_one( + input_path: Path, + output_dir: Path, + sr: int, + *, + top_db: int = 30, + frame_seconds: float = 0.5, + hop_seconds: float = 0.1, +): + try: + audio, sr = librosa.load(input_path, sr=sr, mono=True) + except Exception as e: + LOG.warning(f"Failed to read {input_path}: {e}") + return + intervals = librosa.effects.split( + audio, + top_db=top_db, + frame_length=int(sr * frame_seconds), + hop_length=int(sr * hop_seconds), + ) + output_dir.mkdir(parents=True, exist_ok=True) + for start, end in tqdm(intervals, desc=f"Writing {input_path}"): + audio_cut = audio[start:end] + sf.write( + (output_dir / f"{input_path.stem}_{start / sr:.3f}_{end / sr:.3f}.wav"), + audio_cut, + sr, + ) + + +def preprocess_split( + input_dir: Path | str, + output_dir: Path | str, + sr: int, + *, + top_db: int = 30, + frame_seconds: float = 0.5, + hop_seconds: float = 0.1, + n_jobs: int = -1, +): + input_dir = Path(input_dir) + output_dir = Path(output_dir) + output_dir.mkdir(parents=True, exist_ok=True) + input_paths = list(input_dir.rglob("*.*")) + with tqdm_joblib(desc="Splitting", total=len(input_paths)): + Parallel(n_jobs=n_jobs)( + delayed(_process_one)( + input_path, + output_dir / input_path.relative_to(input_dir).parent, + sr, + top_db=top_db, + frame_seconds=frame_seconds, + hop_seconds=hop_seconds, + ) + for input_path in input_paths + ) diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_utils.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_utils.py new file mode 100644 index 0000000..4a2e4c5 --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/preprocessing/preprocess_utils.py @@ -0,0 +1,5 @@ +from numpy import ndarray + + +def check_hubert_min_duration(audio: ndarray, sr: int) -> bool: + return len(audio) / sr >= 0.3 diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/py.typed b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/train.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/train.py new file mode 100644 index 0000000..e2fe9be --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/train.py @@ -0,0 +1,560 @@ +from __future__ import annotations + +import os +import warnings +from logging import getLogger +from multiprocessing import cpu_count +from pathlib import Path +from typing import Any + +import lightning.pytorch as pl +import torch +from lightning.pytorch.accelerators import MPSAccelerator, TPUAccelerator +from lightning.pytorch.loggers import TensorBoardLogger +from lightning.pytorch.strategies.ddp import DDPStrategy +from lightning.pytorch.tuner import Tuner +from torch.cuda.amp import autocast +from torch.nn import functional as F +from torch.utils.data import DataLoader +from torch.utils.tensorboard.writer import SummaryWriter + +import so_vits_svc_fork.f0 +import so_vits_svc_fork.modules.commons as commons +import so_vits_svc_fork.utils + +from . import utils +from .dataset import TextAudioCollate, TextAudioDataset +from .logger import is_notebook +from .modules.descriminators import MultiPeriodDiscriminator +from .modules.losses import discriminator_loss, feature_loss, generator_loss, kl_loss +from .modules.mel_processing import mel_spectrogram_torch +from .modules.synthesizers import SynthesizerTrn + +LOG = getLogger(__name__) +torch.set_float32_matmul_precision("high") + + +class VCDataModule(pl.LightningDataModule): + batch_size: int + + def __init__(self, hparams: Any): + super().__init__() + self.__hparams = hparams + self.batch_size = hparams.train.batch_size + if not isinstance(self.batch_size, int): + self.batch_size = 1 + self.collate_fn = TextAudioCollate() + + # these should be called in setup(), but we need to calculate check_val_every_n_epoch + self.train_dataset = TextAudioDataset(self.__hparams, is_validation=False) + self.val_dataset = TextAudioDataset(self.__hparams, is_validation=True) + + def train_dataloader(self): + return DataLoader( + self.train_dataset, + num_workers=min(cpu_count(), self.__hparams.train.get("num_workers", 8)), + batch_size=self.batch_size, + collate_fn=self.collate_fn, + persistent_workers=True, + ) + + def val_dataloader(self): + return DataLoader( + self.val_dataset, + batch_size=1, + collate_fn=self.collate_fn, + ) + + +def train( + config_path: Path | str, model_path: Path | str, reset_optimizer: bool = False +): + config_path = Path(config_path) + model_path = Path(model_path) + + hparams = utils.get_backup_hparams(config_path, model_path) + utils.ensure_pretrained_model(model_path, hparams.model.get("type_", "hifi-gan")) + + datamodule = VCDataModule(hparams) + strategy = ( + ( + "ddp_find_unused_parameters_true" + if os.name != "nt" + else DDPStrategy(find_unused_parameters=True, process_group_backend="gloo") + ) + if torch.cuda.device_count() > 1 + else "auto" + ) + LOG.info(f"Using strategy: {strategy}") + trainer = pl.Trainer( + logger=TensorBoardLogger( + model_path, "lightning_logs", hparams.train.get("log_version", 0) + ), + # profiler="simple", + val_check_interval=hparams.train.eval_interval, + max_epochs=hparams.train.epochs, + check_val_every_n_epoch=None, + precision="16-mixed" + if hparams.train.fp16_run + else "bf16-mixed" + if hparams.train.get("bf16_run", False) + else 32, + strategy=strategy, + callbacks=[pl.callbacks.RichProgressBar()] if not is_notebook() else None, + benchmark=True, + enable_checkpointing=False, + ) + tuner = Tuner(trainer) + model = VitsLightning(reset_optimizer=reset_optimizer, **hparams) + + # automatic batch size scaling + batch_size = hparams.train.batch_size + batch_split = str(batch_size).split("-") + batch_size = batch_split[0] + init_val = 2 if len(batch_split) <= 1 else int(batch_split[1]) + max_trials = 25 if len(batch_split) <= 2 else int(batch_split[2]) + if batch_size == "auto": + batch_size = "binsearch" + if batch_size in ["power", "binsearch"]: + model.tuning = True + tuner.scale_batch_size( + model, + mode=batch_size, + datamodule=datamodule, + steps_per_trial=1, + init_val=init_val, + max_trials=max_trials, + ) + model.tuning = False + else: + batch_size = int(batch_size) + # automatic learning rate scaling is not supported for multiple optimizers + """if hparams.train.learning_rate == "auto": + lr_finder = tuner.lr_find(model) + LOG.info(lr_finder.results) + fig = lr_finder.plot(suggest=True) + fig.savefig(model_path / "lr_finder.png")""" + + trainer.fit(model, datamodule=datamodule) + + +class VitsLightning(pl.LightningModule): + def __init__(self, reset_optimizer: bool = False, **hparams: Any): + super().__init__() + self._temp_epoch = 0 # Add this line to initialize the _temp_epoch attribute + self.save_hyperparameters("reset_optimizer") + self.save_hyperparameters(*[k for k in hparams.keys()]) + torch.manual_seed(self.hparams.train.seed) + self.net_g = SynthesizerTrn( + self.hparams.data.filter_length // 2 + 1, + self.hparams.train.segment_size // self.hparams.data.hop_length, + **self.hparams.model, + ) + self.net_d = MultiPeriodDiscriminator(self.hparams.model.use_spectral_norm) + self.automatic_optimization = False + self.learning_rate = self.hparams.train.learning_rate + self.optim_g = torch.optim.AdamW( + self.net_g.parameters(), + self.learning_rate, + betas=self.hparams.train.betas, + eps=self.hparams.train.eps, + ) + self.optim_d = torch.optim.AdamW( + self.net_d.parameters(), + self.learning_rate, + betas=self.hparams.train.betas, + eps=self.hparams.train.eps, + ) + self.scheduler_g = torch.optim.lr_scheduler.ExponentialLR( + self.optim_g, gamma=self.hparams.train.lr_decay + ) + self.scheduler_d = torch.optim.lr_scheduler.ExponentialLR( + self.optim_d, gamma=self.hparams.train.lr_decay + ) + self.optimizers_count = 2 + self.load(reset_optimizer) + self.tuning = False + + def on_train_start(self) -> None: + if not self.tuning: + self.set_current_epoch(self._temp_epoch) + total_batch_idx = self._temp_epoch * len(self.trainer.train_dataloader) + self.set_total_batch_idx(total_batch_idx) + global_step = total_batch_idx * self.optimizers_count + self.set_global_step(global_step) + + # check if using tpu or mps + if isinstance(self.trainer.accelerator, (TPUAccelerator, MPSAccelerator)): + # patch torch.stft to use cpu + LOG.warning("Using TPU/MPS. Patching torch.stft to use cpu.") + + def stft( + input: torch.Tensor, + n_fft: int, + hop_length: int | None = None, + win_length: int | None = None, + window: torch.Tensor | None = None, + center: bool = True, + pad_mode: str = "reflect", + normalized: bool = False, + onesided: bool | None = None, + return_complex: bool | None = None, + ) -> torch.Tensor: + device = input.device + input = input.cpu() + if window is not None: + window = window.cpu() + return torch.functional.stft( + input, + n_fft, + hop_length, + win_length, + window, + center, + pad_mode, + normalized, + onesided, + return_complex, + ).to(device) + + torch.stft = stft + + elif "bf" in self.trainer.precision: + LOG.warning("Using bf. Patching torch.stft to use fp32.") + + def stft( + input: torch.Tensor, + n_fft: int, + hop_length: int | None = None, + win_length: int | None = None, + window: torch.Tensor | None = None, + center: bool = True, + pad_mode: str = "reflect", + normalized: bool = False, + onesided: bool | None = None, + return_complex: bool | None = None, + ) -> torch.Tensor: + dtype = input.dtype + input = input.float() + if window is not None: + window = window.float() + return torch.functional.stft( + input, + n_fft, + hop_length, + win_length, + window, + center, + pad_mode, + normalized, + onesided, + return_complex, + ).to(dtype) + + torch.stft = stft + + def on_train_end(self) -> None: + self.save_checkpoints(adjust=0) + + def save_checkpoints(self, adjust=1): + if self.tuning or self.trainer.sanity_checking: + return + + # only save checkpoints if we are on the main device + if ( + hasattr(self.device, "index") + and self.device.index != None + and self.device.index != 0 + ): + return + + # `on_train_end` will be the actual epoch, not a -1, so we have to call it with `adjust = 0` + current_epoch = self.current_epoch + adjust + total_batch_idx = self.total_batch_idx - 1 + adjust + + utils.save_checkpoint( + self.net_g, + self.optim_g, + self.learning_rate, + current_epoch, + Path(self.hparams.model_dir) + / f"G_{total_batch_idx if self.hparams.train.get('ckpt_name_by_step', False) else current_epoch}.pth", + ) + utils.save_checkpoint( + self.net_d, + self.optim_d, + self.learning_rate, + current_epoch, + Path(self.hparams.model_dir) + / f"D_{total_batch_idx if self.hparams.train.get('ckpt_name_by_step', False) else current_epoch}.pth", + ) + keep_ckpts = self.hparams.train.get("keep_ckpts", 0) + if keep_ckpts > 0: + utils.clean_checkpoints( + path_to_models=self.hparams.model_dir, + n_ckpts_to_keep=keep_ckpts, + sort_by_time=True, + ) + + def set_current_epoch(self, epoch: int): + LOG.info(f"Setting current epoch to {epoch}") + self.trainer.fit_loop.epoch_progress.current.completed = epoch + self.trainer.fit_loop.epoch_progress.current.processed = epoch + assert self.current_epoch == epoch, f"{self.current_epoch} != {epoch}" + + def set_global_step(self, global_step: int): + LOG.info(f"Setting global step to {global_step}") + self.trainer.fit_loop.epoch_loop.manual_optimization.optim_step_progress.total.completed = ( + global_step + ) + self.trainer.fit_loop.epoch_loop.automatic_optimization.optim_progress.optimizer.step.total.completed = ( + global_step + ) + assert self.global_step == global_step, f"{self.global_step} != {global_step}" + + def set_total_batch_idx(self, total_batch_idx: int): + LOG.info(f"Setting total batch idx to {total_batch_idx}") + self.trainer.fit_loop.epoch_loop.batch_progress.total.ready = ( + total_batch_idx + 1 + ) + self.trainer.fit_loop.epoch_loop.batch_progress.total.completed = ( + total_batch_idx + ) + assert ( + self.total_batch_idx == total_batch_idx + 1 + ), f"{self.total_batch_idx} != {total_batch_idx + 1}" + + @property + def total_batch_idx(self) -> int: + return self.trainer.fit_loop.epoch_loop.total_batch_idx + 1 + + def load(self, reset_optimizer: bool = False): + latest_g_path = utils.latest_checkpoint_path(self.hparams.model_dir, "G_*.pth") + latest_d_path = utils.latest_checkpoint_path(self.hparams.model_dir, "D_*.pth") + if latest_g_path is not None and latest_d_path is not None: + try: + _, _, _, epoch = utils.load_checkpoint( + latest_g_path, + self.net_g, + self.optim_g, + reset_optimizer, + ) + _, _, _, epoch = utils.load_checkpoint( + latest_d_path, + self.net_d, + self.optim_d, + reset_optimizer, + ) + self._temp_epoch = epoch + self.scheduler_g.last_epoch = epoch - 1 + self.scheduler_d.last_epoch = epoch - 1 + except Exception as e: + raise RuntimeError("Failed to load checkpoint") from e + else: + LOG.warning("No checkpoint found. Start from scratch.") + + def configure_optimizers(self): + return [self.optim_g, self.optim_d], [self.scheduler_g, self.scheduler_d] + + def log_image_dict( + self, image_dict: dict[str, Any], dataformats: str = "HWC" + ) -> None: + if not isinstance(self.logger, TensorBoardLogger): + warnings.warn("Image logging is only supported with TensorBoardLogger.") + return + writer: SummaryWriter = self.logger.experiment + for k, v in image_dict.items(): + try: + writer.add_image(k, v, self.total_batch_idx, dataformats=dataformats) + except Exception as e: + warnings.warn(f"Failed to log image {k}: {e}") + + def log_audio_dict(self, audio_dict: dict[str, Any]) -> None: + if not isinstance(self.logger, TensorBoardLogger): + warnings.warn("Audio logging is only supported with TensorBoardLogger.") + return + writer: SummaryWriter = self.logger.experiment + for k, v in audio_dict.items(): + writer.add_audio( + k, + v.float(), + self.total_batch_idx, + sample_rate=self.hparams.data.sampling_rate, + ) + + def log_dict_(self, log_dict: dict[str, Any], **kwargs) -> None: + if not isinstance(self.logger, TensorBoardLogger): + warnings.warn("Logging is only supported with TensorBoardLogger.") + return + writer: SummaryWriter = self.logger.experiment + for k, v in log_dict.items(): + writer.add_scalar(k, v, self.total_batch_idx) + kwargs["logger"] = False + self.log_dict(log_dict, **kwargs) + + def log_(self, key: str, value: Any, **kwargs) -> None: + self.log_dict_({key: value}, **kwargs) + + def training_step(self, batch: dict[str, torch.Tensor], batch_idx: int) -> None: + self.net_g.train() + self.net_d.train() + + # get optims + optim_g, optim_d = self.optimizers() + + # Generator + # train + self.toggle_optimizer(optim_g) + c, f0, spec, mel, y, g, lengths, uv = batch + ( + y_hat, + y_hat_mb, + ids_slice, + z_mask, + (z, z_p, m_p, logs_p, m_q, logs_q), + pred_lf0, + norm_lf0, + lf0, + ) = self.net_g(c, f0, uv, spec, g=g, c_lengths=lengths, spec_lengths=lengths) + y_mel = commons.slice_segments( + mel, + ids_slice, + self.hparams.train.segment_size // self.hparams.data.hop_length, + ) + y_hat_mel = mel_spectrogram_torch(y_hat.squeeze(1), self.hparams) + y_mel = y_mel[..., : y_hat_mel.shape[-1]] + y = commons.slice_segments( + y, + ids_slice * self.hparams.data.hop_length, + self.hparams.train.segment_size, + ) + y = y[..., : y_hat.shape[-1]] + + # generator loss + y_d_hat_r, y_d_hat_g, fmap_r, fmap_g = self.net_d(y, y_hat) + + with autocast(enabled=False): + loss_mel = F.l1_loss(y_mel, y_hat_mel) * self.hparams.train.c_mel + loss_kl = ( + kl_loss(z_p, logs_q, m_p, logs_p, z_mask) * self.hparams.train.c_kl + ) + loss_fm = feature_loss(fmap_r, fmap_g) + loss_gen, losses_gen = generator_loss(y_d_hat_g) + loss_lf0 = F.mse_loss(pred_lf0, lf0) + loss_gen_all = loss_gen + loss_fm + loss_mel + loss_kl + loss_lf0 + + # MB-iSTFT-VITS + loss_subband = torch.tensor(0.0) + if self.hparams.model.get("type_") == "mb-istft": + from .modules.decoders.mb_istft import PQMF, subband_stft_loss + + y_mb = PQMF(y.device, self.hparams.model.subbands).analysis(y) + loss_subband = subband_stft_loss(self.hparams, y_mb, y_hat_mb) + loss_gen_all += loss_subband + + # log loss + self.log_("lr", self.optim_g.param_groups[0]["lr"]) + self.log_dict_( + { + "loss/g/total": loss_gen_all, + "loss/g/fm": loss_fm, + "loss/g/mel": loss_mel, + "loss/g/kl": loss_kl, + "loss/g/lf0": loss_lf0, + }, + prog_bar=True, + ) + if self.hparams.model.get("type_") == "mb-istft": + self.log_("loss/g/subband", loss_subband) + if self.total_batch_idx % self.hparams.train.log_interval == 0: + self.log_image_dict( + { + "slice/mel_org": utils.plot_spectrogram_to_numpy( + y_mel[0].data.cpu().float().numpy() + ), + "slice/mel_gen": utils.plot_spectrogram_to_numpy( + y_hat_mel[0].data.cpu().float().numpy() + ), + "all/mel": utils.plot_spectrogram_to_numpy( + mel[0].data.cpu().float().numpy() + ), + "all/lf0": so_vits_svc_fork.utils.plot_data_to_numpy( + lf0[0, 0, :].cpu().float().numpy(), + pred_lf0[0, 0, :].detach().cpu().float().numpy(), + ), + "all/norm_lf0": so_vits_svc_fork.utils.plot_data_to_numpy( + lf0[0, 0, :].cpu().float().numpy(), + norm_lf0[0, 0, :].detach().cpu().float().numpy(), + ), + } + ) + + accumulate_grad_batches = self.hparams.train.get("accumulate_grad_batches", 1) + should_update = ( + batch_idx + 1 + ) % accumulate_grad_batches == 0 or self.trainer.is_last_batch + # optimizer + self.manual_backward(loss_gen_all / accumulate_grad_batches) + if should_update: + self.log_( + "grad_norm_g", commons.clip_grad_value_(self.net_g.parameters(), None) + ) + optim_g.step() + optim_g.zero_grad() + self.untoggle_optimizer(optim_g) + + # Discriminator + # train + self.toggle_optimizer(optim_d) + y_d_hat_r, y_d_hat_g, _, _ = self.net_d(y, y_hat.detach()) + + # discriminator loss + with autocast(enabled=False): + loss_disc, losses_disc_r, losses_disc_g = discriminator_loss( + y_d_hat_r, y_d_hat_g + ) + loss_disc_all = loss_disc + + # log loss + self.log_("loss/d/total", loss_disc_all, prog_bar=True) + + # optimizer + self.manual_backward(loss_disc_all / accumulate_grad_batches) + if should_update: + self.log_( + "grad_norm_d", commons.clip_grad_value_(self.net_d.parameters(), None) + ) + optim_d.step() + optim_d.zero_grad() + self.untoggle_optimizer(optim_d) + + # end of epoch + if self.trainer.is_last_batch: + self.scheduler_g.step() + self.scheduler_d.step() + + def validation_step(self, batch, batch_idx): + # avoid logging with wrong global step + if self.global_step == 0: + return + with torch.no_grad(): + self.net_g.eval() + c, f0, _, mel, y, g, _, uv = batch + y_hat = self.net_g.infer(c, f0, uv, g=g) + y_hat_mel = mel_spectrogram_torch(y_hat.squeeze(1).float(), self.hparams) + self.log_audio_dict( + {f"gen/audio_{batch_idx}": y_hat[0], f"gt/audio_{batch_idx}": y[0]} + ) + self.log_image_dict( + { + "gen/mel": utils.plot_spectrogram_to_numpy( + y_hat_mel[0].cpu().float().numpy() + ), + "gt/mel": utils.plot_spectrogram_to_numpy( + mel[0].cpu().float().numpy() + ), + } + ) + + def on_validation_end(self) -> None: + self.save_checkpoints() diff --git a/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/utils.py b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/utils.py new file mode 100644 index 0000000..8faf4ff --- /dev/null +++ b/voice_conversion/so-vits-svc-paul-v2/src/so_vits_svc_fork/utils.py @@ -0,0 +1,430 @@ +from __future__ import annotations + +import json +import re +import subprocess +import warnings +from itertools import groupby +from logging import getLogger +from pathlib import Path +from typing import Any, Literal, Sequence + +import matplotlib +import matplotlib.pylab as plt +import numpy as np +import requests +import torch +import torch.backends.mps +import torch.nn as nn +import torchaudio +from cm_time import timer +from numpy import ndarray +from tqdm import tqdm +from transformers import HubertModel + +from so_vits_svc_fork.hparams import HParams + +LOG = getLogger(__name__) +HUBERT_SAMPLING_RATE = 16000 + + +def get_optimal_device(index: int = 0) -> torch.device: + if torch.cuda.is_available(): + return torch.device(f"cuda:{index % torch.cuda.device_count()}") + elif torch.backends.mps.is_available(): + return torch.device("mps") + else: + try: + import torch_xla.core.xla_model as xm # noqa + + if xm.xrt_world_size() > 0: + return torch.device("xla") + # return xm.xla_device() + except ImportError: + pass + return torch.device("cpu") + + +def download_file( + url: str, + filepath: Path | str, + chunk_size: int = 64 * 1024, + tqdm_cls: type = tqdm, + skip_if_exists: bool = False, + overwrite: bool = False, + **tqdm_kwargs: Any, +): + if skip_if_exists is True and overwrite is True: + raise ValueError("skip_if_exists and overwrite cannot be both True") + filepath = Path(filepath) + filepath.parent.mkdir(parents=True, exist_ok=True) + temppath = filepath.parent / f"{filepath.name}.download" + if filepath.exists(): + if skip_if_exists: + return + elif not overwrite: + filepath.unlink() + else: + raise FileExistsError(f"{filepath} already exists") + temppath.unlink(missing_ok=True) + resp = requests.get(url, stream=True) + total = int(resp.headers.get("content-length", 0)) + kwargs = dict( + total=total, + unit="iB", + unit_scale=True, + unit_divisor=1024, + desc=f"Downloading {filepath.name}", + ) + kwargs.update(tqdm_kwargs) + with temppath.open("wb") as f, tqdm_cls(**kwargs) as pbar: + for data in resp.iter_content(chunk_size=chunk_size): + size = f.write(data) + pbar.update(size) + temppath.rename(filepath) + + +PRETRAINED_MODEL_URLS = { + "hifi-gan": [ + [ + "https://huggingface.co/therealvul/so-vits-svc-4.0-init/resolve/main/D_0.pth", + "https://huggingface.co/therealvul/so-vits-svc-4.0-init/resolve/main/G_0.pth", + ], + [ + "https://huggingface.co/Himawari00/so-vits-svc4.0-pretrain-models/resolve/main/D_0.pth", + "https://huggingface.co/Himawari00/so-vits-svc4.0-pretrain-models/resolve/main/G_0.pth", + ], + ], + "contentvec": [ + [ + "https://huggingface.co/therealvul/so-vits-svc-4.0-init/resolve/main/checkpoint_best_legacy_500.pt" + ], + [ + "https://huggingface.co/Himawari00/so-vits-svc4.0-pretrain-models/resolve/main/checkpoint_best_legacy_500.pt" + ], + [ + "http://obs.cstcloud.cn/share/obs/sankagenkeshi/checkpoint_best_legacy_500.pt" + ], + ], +} +from joblib import Parallel, delayed + + +def ensure_pretrained_model( + folder_path: Path | str, type_: str, **tqdm_kwargs: Any +) -> tuple[Path, ...] | None: + folder_path = Path(folder_path) + models_candidates = PRETRAINED_MODEL_URLS.get(type_, None) + if models_candidates is None: + LOG.warning(f"Unknown pretrained model type: {type_}") + return + for model_urls in models_candidates: + paths = [folder_path / model_url.split("/")[-1] for model_url in model_urls] + try: + Parallel(n_jobs=len(paths))( + [ + delayed(download_file)( + url, path, position=i, skip_if_exists=True, **tqdm_kwargs + ) + for i, (url, path) in enumerate(zip(model_urls, paths)) + ] + ) + return tuple(paths) + except Exception as e: + LOG.exception(e) + return + + +class HubertModelWithFinalProj(HubertModel): + def __init__(self, config): + super().__init__(config) + + # The final projection layer is only used for backward compatibility. + # Following https://github.com/auspicious3000/contentvec/issues/6 + # Remove this layer is necessary to achieve the desired outcome. + self.final_proj = nn.Linear(config.hidden_size, config.classifier_proj_size) + + +def get_hubert_model( + device: str | torch.device, final_proj: bool = True +) -> HubertModel: + if final_proj: + return HubertModelWithFinalProj.from_pretrained( + "lengyue233/content-vec-best" + ).to(device) + else: + return HubertModel.from_pretrained("lengyue233/content-vec-best").to(device) + + +def get_content( + cmodel: HubertModel, + audio: torch.Tensor | ndarray[Any, Any], + device: torch.device | str, + sr: int, + legacy_final_proj: bool = False, +) -> torch.Tensor: + audio = torch.as_tensor(audio) + if sr != HUBERT_SAMPLING_RATE: + audio = ( + torchaudio.transforms.Resample(sr, HUBERT_SAMPLING_RATE) + .to(audio.device)(audio) + .to(device) + ) + if audio.ndim == 1: + audio = audio.unsqueeze(0) + with torch.no_grad(), timer() as t: + if legacy_final_proj: + warnings.warn("legacy_final_proj is deprecated") + if not hasattr(cmodel, "final_proj"): + raise ValueError("HubertModel does not have final_proj") + c = cmodel(audio, output_hidden_states=True)["hidden_states"][9] + c = cmodel.final_proj(c) + else: + c = cmodel(audio)["last_hidden_state"] + c = c.transpose(1, 2) + wav_len = audio.shape[-1] / HUBERT_SAMPLING_RATE + LOG.info( + f"HuBERT inference time : {t.elapsed:.3f}s, RTF: {t.elapsed / wav_len:.3f}" + ) + return c + + +def _substitute_if_same_shape(to_: dict[str, Any], from_: dict[str, Any]) -> None: + not_in_to = list(filter(lambda x: x not in to_, from_.keys())) + not_in_from = list(filter(lambda x: x not in from_, to_.keys())) + if not_in_to: + warnings.warn(f"Keys not found in model state dict:" f"{not_in_to}") + if not_in_from: + warnings.warn(f"Keys not found in checkpoint state dict:" f"{not_in_from}") + shape_missmatch = [] + for k, v in from_.items(): + if k not in to_: + pass + elif hasattr(v, "shape"): + if not hasattr(to_[k], "shape"): + raise ValueError(f"Key {k} is not a tensor") + if to_[k].shape == v.shape: + to_[k] = v + else: + shape_missmatch.append((k, to_[k].shape, v.shape)) + elif isinstance(v, dict): + assert isinstance(to_[k], dict) + _substitute_if_same_shape(to_[k], v) + else: + to_[k] = v + if shape_missmatch: + warnings.warn( + f"Shape mismatch: {[f'{k}: {v1} -> {v2}' for k, v1, v2 in shape_missmatch]}" + ) + + +def safe_load(model: torch.nn.Module, state_dict: dict[str, Any]) -> None: + model_state_dict = model.state_dict() + _substitute_if_same_shape(model_state_dict, state_dict) + model.load_state_dict(model_state_dict) + + +def load_checkpoint( + checkpoint_path: Path | str, + model: torch.nn.Module, + optimizer: torch.optim.Optimizer | None = None, + skip_optimizer: bool = False, +) -> tuple[torch.nn.Module, torch.optim.Optimizer | None, float, int]: + if not Path(checkpoint_path).is_file(): + raise FileNotFoundError(f"File {checkpoint_path} not found") + with Path(checkpoint_path).open("rb") as f: + with warnings.catch_warnings(): + warnings.filterwarnings( + "ignore", category=UserWarning, message="TypedStorage is deprecated" + ) + # NB(paul): iirc changing this to false prevented an error at some point + # but it also worsens security + checkpoint_dict = torch.load(f, map_location="cpu", weights_only=False) + iteration = checkpoint_dict["iteration"] + learning_rate = checkpoint_dict["learning_rate"] + + # safe load module + if hasattr(model, "module"): + safe_load(model.module, checkpoint_dict["model"]) + else: + safe_load(model, checkpoint_dict["model"]) + # safe load optim + if ( + optimizer is not None + and not skip_optimizer + and checkpoint_dict["optimizer"] is not None + ): + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + safe_load(optimizer, checkpoint_dict["optimizer"]) + + LOG.info(f"Loaded checkpoint '{checkpoint_path}' (epoch {iteration})") + return model, optimizer, learning_rate, iteration + + +def save_checkpoint( + model: torch.nn.Module, + optimizer: torch.optim.Optimizer, + learning_rate: float, + iteration: int, + checkpoint_path: Path | str, +) -> None: + LOG.info( + "Saving model and optimizer state at epoch {} to {}".format( + iteration, checkpoint_path + ) + ) + if hasattr(model, "module"): + state_dict = model.module.state_dict() + else: + state_dict = model.state_dict() + with Path(checkpoint_path).open("wb") as f: + torch.save( + { + "model": state_dict, + "iteration": iteration, + "optimizer": optimizer.state_dict(), + "learning_rate": learning_rate, + }, + f, + ) + + +def clean_checkpoints( + path_to_models: Path | str, n_ckpts_to_keep: int = 2, sort_by_time: bool = True +) -> None: + """Freeing up space by deleting saved ckpts + + Arguments: + path_to_models -- Path to the model directory + n_ckpts_to_keep -- Number of ckpts to keep, excluding G_0.pth and D_0.pth + sort_by_time -- True -> chronologically delete ckpts + False -> lexicographically delete ckpts + """ + LOG.info("Cleaning old checkpoints...") + path_to_models = Path(path_to_models) + + # Define sort key functions + name_key = lambda p: int(re.match(r"[GD]_(\d+)", p.stem).group(1)) + time_key = lambda p: p.stat().st_mtime + path_key = lambda p: (p.stem[0], time_key(p) if sort_by_time else name_key(p)) + + models = list( + filter( + lambda p: ( + p.is_file() + and re.match(r"[GD]_\d+", p.stem) + and not p.stem.endswith("_0") + ), + path_to_models.glob("*.pth"), + ) + ) + + models_sorted = sorted(models, key=path_key) + + models_sorted_grouped = groupby(models_sorted, lambda p: p.stem[0]) + + for group_name, group_items in models_sorted_grouped: + to_delete_list = list(group_items)[:-n_ckpts_to_keep] + + for to_delete in to_delete_list: + if to_delete.exists(): + LOG.info(f"Removing {to_delete}") + to_delete.unlink() + + +def latest_checkpoint_path(dir_path: Path | str, regex: str = "G_*.pth") -> Path | None: + dir_path = Path(dir_path) + name_key = lambda p: int(re.match(r"._(\d+)\.pth", p.name).group(1)) + paths = list(sorted(dir_path.glob(regex), key=name_key)) + if len(paths) == 0: + return None + return paths[-1] + + +def plot_spectrogram_to_numpy(spectrogram: ndarray) -> ndarray: + matplotlib.use("Agg") + fig, ax = plt.subplots(figsize=(10, 2)) + im = ax.imshow(spectrogram, aspect="auto", origin="lower", interpolation="none") + plt.colorbar(im, ax=ax) + plt.xlabel("Frames") + plt.ylabel("Channels") + plt.tight_layout() + + fig.canvas.draw() + data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep="") + data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,)) + plt.close() + return data + + +def get_backup_hparams( + config_path: Path, model_path: Path, init: bool = True +) -> HParams: + model_path.mkdir(parents=True, exist_ok=True) + config_save_path = model_path / "config.json" + if init: + with config_path.open() as f: + data = f.read() + with config_save_path.open("w") as f: + f.write(data) + else: + with config_save_path.open() as f: + data = f.read() + config = json.loads(data) + + hparams = HParams(**config) + hparams.model_dir = model_path.as_posix() + return hparams + + +def get_hparams(config_path: Path | str) -> HParams: + config = json.loads(Path(config_path).read_text("utf-8")) + hparams = HParams(**config) + return hparams + + +def repeat_expand_2d(content: torch.Tensor, target_len: int) -> torch.Tensor: + # content : [h, t] + src_len = content.shape[-1] + if target_len < src_len: + return content[:, :target_len] + else: + return torch.nn.functional.interpolate( + content.unsqueeze(0), size=target_len, mode="nearest" + ).squeeze(0) + + +def plot_data_to_numpy(x: ndarray, y: ndarray) -> ndarray: + matplotlib.use("Agg") + fig, ax = plt.subplots(figsize=(10, 2)) + plt.plot(x) + plt.plot(y) + plt.tight_layout() + + fig.canvas.draw() + data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep="") + data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,)) + plt.close() + return data + + +def get_gpu_memory(type_: Literal["total", "free", "used"]) -> Sequence[int] | None: + command = f"nvidia-smi --query-gpu=memory.{type_} --format=csv" + try: + memory_free_info = ( + subprocess.check_output(command.split()) + .decode("ascii") + .split("\n")[:-1][1:] + ) + memory_free_values = [int(x.split()[0]) for i, x in enumerate(memory_free_info)] + return memory_free_values + except Exception: + return + + +def get_total_gpu_memory(type_: Literal["total", "free", "used"]) -> int | None: + memories = get_gpu_memory(type_) + if memories is None: + return + return sum(memories)