stefantaubert commited on
Commit
fcf3f99
1 Parent(s): f7244fb
CODE_OF_CONDUCT.md DELETED
@@ -1,132 +0,0 @@
1
- # Contributor Covenant Code of Conduct
2
-
3
- ## Our Pledge
4
-
5
- We as members, contributors, and leaders pledge to make participation in our
6
- community a harassment-free experience for everyone, regardless of age, body
7
- size, visible or invisible disability, ethnicity, sex characteristics, gender
8
- identity and expression, level of experience, education, socio-economic status,
9
- nationality, personal appearance, race, caste, color, religion, or sexual
10
- identity and orientation.
11
-
12
- We pledge to act and interact in ways that contribute to an open, welcoming,
13
- diverse, inclusive, and healthy community.
14
-
15
- ## Our Standards
16
-
17
- Examples of behavior that contributes to a positive environment for our
18
- community include:
19
-
20
- * Demonstrating empathy and kindness toward other people
21
- * Being respectful of differing opinions, viewpoints, and experiences
22
- * Giving and gracefully accepting constructive feedback
23
- * Accepting responsibility and apologizing to those affected by our mistakes,
24
- and learning from the experience
25
- * Focusing on what is best not just for us as individuals, but for the overall
26
- community
27
-
28
- Examples of unacceptable behavior include:
29
-
30
- * The use of sexualized language or imagery, and sexual attention or advances of
31
- any kind
32
- * Trolling, insulting or derogatory comments, and personal or political attacks
33
- * Public or private harassment
34
- * Publishing others' private information, such as a physical or email address,
35
- without their explicit permission
36
- * Other conduct which could reasonably be considered inappropriate in a
37
- professional setting
38
-
39
- ## Enforcement Responsibilities
40
-
41
- Community leaders are responsible for clarifying and enforcing our standards of
42
- acceptable behavior and will take appropriate and fair corrective action in
43
- response to any behavior that they deem inappropriate, threatening, offensive,
44
- or harmful.
45
-
46
- Community leaders have the right and responsibility to remove, edit, or reject
47
- comments, commits, code, wiki edits, issues, and other contributions that are
48
- not aligned to this Code of Conduct, and will communicate reasons for moderation
49
- decisions when appropriate.
50
-
51
- ## Scope
52
-
53
- This Code of Conduct applies within all community spaces, and also applies when
54
- an individual is officially representing the community in public spaces.
55
- Examples of representing our community include using an official email address,
56
- posting via an official social media account, or acting as an appointed
57
- representative at an online or offline event.
58
-
59
- ## Enforcement
60
-
61
- Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
- reported to the community leaders responsible for enforcement at
63
- [github@stefantaubert.com](mailto:github@stefantaubert.com).
64
- All complaints will be reviewed and investigated promptly and fairly.
65
-
66
- All community leaders are obligated to respect the privacy and security of the
67
- reporter of any incident.
68
-
69
- ## Enforcement Guidelines
70
-
71
- Community leaders will follow these Community Impact Guidelines in determining
72
- the consequences for any action they deem in violation of this Code of Conduct:
73
-
74
- ### 1. Correction
75
-
76
- **Community Impact**: Use of inappropriate language or other behavior deemed
77
- unprofessional or unwelcome in the community.
78
-
79
- **Consequence**: A private, written warning from community leaders, providing
80
- clarity around the nature of the violation and an explanation of why the
81
- behavior was inappropriate. A public apology may be requested.
82
-
83
- ### 2. Warning
84
-
85
- **Community Impact**: A violation through a single incident or series of
86
- actions.
87
-
88
- **Consequence**: A warning with consequences for continued behavior. No
89
- interaction with the people involved, including unsolicited interaction with
90
- those enforcing the Code of Conduct, for a specified period of time. This
91
- includes avoiding interactions in community spaces as well as external channels
92
- like social media. Violating these terms may lead to a temporary or permanent
93
- ban.
94
-
95
- ### 3. Temporary Ban
96
-
97
- **Community Impact**: A serious violation of community standards, including
98
- sustained inappropriate behavior.
99
-
100
- **Consequence**: A temporary ban from any sort of interaction or public
101
- communication with the community for a specified period of time. No public or
102
- private interaction with the people involved, including unsolicited interaction
103
- with those enforcing the Code of Conduct, is allowed during this period.
104
- Violating these terms may lead to a permanent ban.
105
-
106
- ### 4. Permanent Ban
107
-
108
- **Community Impact**: Demonstrating a pattern of violation of community
109
- standards, including sustained inappropriate behavior, harassment of an
110
- individual, or aggression toward or disparagement of classes of individuals.
111
-
112
- **Consequence**: A permanent ban from any sort of public interaction within the
113
- community.
114
-
115
- ## Attribution
116
-
117
- This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118
- version 2.1, available at
119
- [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
120
-
121
- Community Impact Guidelines were inspired by
122
- [Mozilla's code of conduct enforcement ladder][Mozilla CoC].
123
-
124
- For answers to common questions about this code of conduct, see the FAQ at
125
- [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
126
- [https://www.contributor-covenant.org/translations][translations].
127
-
128
- [homepage]: https://www.contributor-covenant.org
129
- [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
130
- [Mozilla CoC]: https://github.com/mozilla/diversity
131
- [FAQ]: https://www.contributor-covenant.org/faq
132
- [translations]: https://www.contributor-covenant.org/translations
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
CONTRIBUTING.md DELETED
@@ -1,3 +0,0 @@
1
- # Contributing
2
-
3
- If you notice an error, please don't hesitate to open an issue.
 
 
 
 
LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2024 Stefan Taubert
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Pipfile CHANGED
@@ -4,10 +4,7 @@ verify_ssl = true
4
  name = "pypi"
5
 
6
  [packages]
7
- en-tts = ">=0.0.1"
8
- gradio = {extras = ["oauth"], version = ">=4.26.0"}
9
- uvicorn = ">=0.14.0"
10
- numpy = "*"
11
 
12
  [dev-packages]
13
  autopep8 = "*"
 
4
  name = "pypi"
5
 
6
  [packages]
7
+ en-tts = ">=0.0.2"
 
 
 
8
 
9
  [dev-packages]
10
  autopep8 = "*"
Pipfile.lock CHANGED
@@ -1,7 +1,7 @@
1
  {
2
  "_meta": {
3
  "hash": {
4
- "sha256": "18d92cc070e233d5351b1321363293c17976c1881ab519de0b58b5467515bf8b"
5
  },
6
  "pipfile-spec": 6,
7
  "requires": {
@@ -9,9 +9,9 @@
9
  },
10
  "sources": [
11
  {
12
- "name": "pip_conf_index_global",
13
  "url": "https://pypi.org/simple",
14
- "verify_ssl": false
15
  }
16
  ]
17
  },
@@ -142,7 +142,7 @@
142
  "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956",
143
  "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"
144
  ],
145
- "markers": "platform_python_implementation != 'PyPy'",
146
  "version": "==1.16.0"
147
  },
148
  "charset-normalizer": {
@@ -377,12 +377,12 @@
377
  },
378
  "en-tts": {
379
  "hashes": [
380
- "sha256:2a309e7df85e03b002fea7b0ab719a2878e7ad4c1a24bfc7ba04f2f9b775e9bd",
381
- "sha256:ac0d10d329dcf9d56b45daf953cb26c222fb85c770265ae6d140c94c2640e3e6"
382
  ],
383
- "index": "pip_conf_index_global",
384
  "markers": "python_version < '3.12' and python_version >= '3.8'",
385
- "version": "==0.0.1"
386
  },
387
  "english-text-normalization": {
388
  "hashes": [
@@ -394,11 +394,11 @@
394
  },
395
  "fastapi": {
396
  "hashes": [
397
- "sha256:5df913203c482f820d31f48e635e022f8cbfe7350e4830ef05a3163925b1addc",
398
- "sha256:6feac43ec359dfe4f45b2c18ec8c94edb8dc2dfc461d417d9e626590c071baad"
399
  ],
400
  "markers": "python_version >= '3.8'",
401
- "version": "==0.110.1"
402
  },
403
  "fastdtw": {
404
  "hashes": [
@@ -497,11 +497,11 @@
497
  "oauth"
498
  ],
499
  "hashes": [
500
- "sha256:44d7c4cf01e02e38c03afcfda1ca3c070968b01dbd69747e240148deff2f9f6c",
501
- "sha256:63e9ae7e65098ba8431bb3d6b519c548b9cf57decad063391c380ed593abae93"
502
  ],
503
  "markers": "python_version >= '3.8'",
504
- "version": "==4.26.0"
505
  },
506
  "gradio-client": {
507
  "hashes": [
@@ -553,11 +553,11 @@
553
  },
554
  "imageio": {
555
  "hashes": [
556
- "sha256:08082bf47ccb54843d9c73fe9fc8f3a88c72452ab676b58aca74f36167e8ccba",
557
- "sha256:ae9732e10acf807a22c389aef193f42215718e16bd06eed0c5bb57e1034a4d53"
558
  ],
559
  "markers": "python_version >= '3.8'",
560
- "version": "==2.34.0"
561
  },
562
  "importlib-resources": {
563
  "hashes": [
@@ -1340,11 +1340,11 @@
1340
  },
1341
  "plotly": {
1342
  "hashes": [
1343
- "sha256:837a9c8aa90f2c0a2f0d747b82544d014dc2a2bdde967b5bb1da25b53932d1a9",
1344
- "sha256:bf901c805d22032cfa534b2ff7c5aa6b0659e037f19ec1e0cca7f585918b5c89"
1345
  ],
1346
  "markers": "python_version >= '3.8'",
1347
- "version": "==5.20.0"
1348
  },
1349
  "pooch": {
1350
  "hashes": [
@@ -1825,48 +1825,48 @@
1825
  },
1826
  "ruff": {
1827
  "hashes": [
1828
- "sha256:0e8377cccb2f07abd25e84fc5b2cbe48eeb0fea9f1719cad7caedb061d70e5ce",
1829
- "sha256:15a4d1cc1e64e556fa0d67bfd388fed416b7f3b26d5d1c3e7d192c897e39ba4b",
1830
- "sha256:3050ec0af72b709a62ecc2aca941b9cd479a7bf2b36cc4562f0033d688e44fa1",
1831
- "sha256:379b67d4f49774ba679593b232dcd90d9e10f04d96e3c8ce4a28037ae473f7bb",
1832
- "sha256:5b15cc59c19edca917f51b1956637db47e200b0fc5e6e1878233d3a938384b0b",
1833
- "sha256:5ef0e501e1e39f35e03c2acb1d1238c595b8bb36cf7a170e7c1df1b73da00e74",
1834
- "sha256:6c44e0149f1d8b48c4d5c33d88c677a4aa22fd09b1683d6a7ff55b816b5d074f",
1835
- "sha256:789e144f6dc7019d1f92a812891c645274ed08af6037d11fc65fcbc183b7d59f",
1836
- "sha256:a29cc38e4c1ab00da18a3f6777f8b50099d73326981bb7d182e54a9a21bb4ff7",
1837
- "sha256:bc931de87593d64fad3a22e201e55ad76271f1d5bfc44e1a1887edd0903c7d9f",
1838
- "sha256:c060aea8ad5ef21cdfbbe05475ab5104ce7827b639a78dd55383a6e9895b7c51",
1839
- "sha256:d28bdf3d7dc71dd46929fafeec98ba89b7c3550c3f0978e36389b5631b793663",
1840
- "sha256:d48098bd8f5c38897b03604f5428901b65e3c97d40b3952e38637b5404b739a2",
1841
- "sha256:d5c1aebee5162c2226784800ae031f660c350e7a3402c4d1f8ea4e97e232e3ba",
1842
- "sha256:da8a4fda219bf9024692b1bc68c9cff4b80507879ada8769dc7e985755d662ea",
1843
- "sha256:e491045781b1e38b72c91247cf4634f040f8d0cb3e6d3d64d38dcf43616650b4",
1844
- "sha256:ebf8f615dde968272d70502c083ebf963b6781aacd3079081e03b32adfe4d58a"
1845
  ],
1846
  "markers": "sys_platform != 'emscripten'",
1847
- "version": "==0.3.7"
1848
  },
1849
  "scikit-image": {
1850
  "hashes": [
1851
- "sha256:24aba46af3fe87e702a87401d4861e3333f599a9506849222fd4f20e10173674",
1852
- "sha256:2bc96bd30d353989a67343f5318550cb72cbdafdba9642999f7db557bf5a0a86",
1853
- "sha256:2f2dbece1f4d84e8604867ff1cdb8f8afe7307a9593dd740a390855752160b64",
1854
- "sha256:382805bdc337d5dba0647afa1734b2665153975711df62c9f2ecff628e9571e6",
1855
- "sha256:4ff756161821568ed56523f1c4ab9094962ba79e817a9a8e818d9f51d223d669",
1856
- "sha256:6076d88292b73f93e14302c3772f4b2ea89c72be00e7454865bd30733bea9be7",
1857
- "sha256:7bcd13ffde2d0f37719ab4e2dbeebe6e137ac73a2fff8d28b1b673f554d1d686",
1858
- "sha256:9a7c360e000094c8fb432786fc17b56bfc3ead5ca56a390e7978fc7c4ae75f57",
1859
- "sha256:a1e1146e01e00d68fd0adae9917b91a720d0f4f4c81d6d2a378b3f91273e0cc7",
1860
- "sha256:a711744837bf987f08a3dd389a30e14da4a138b541c8a2442031e675f4f7ed64",
1861
- "sha256:b7dc640b2e30a5befd87cb4f86593b5679b9726c4066fa549ba0a8f56e587bc3",
1862
- "sha256:c10489f5262c69926f20423f3ec2698989a242e0d750f537a483792735eb7c31",
1863
- "sha256:d45fb275296b27cc0bb8a99d7bbb859ddb0f9ae1fc9f74345b082b0db33c0f01",
1864
- "sha256:d926b7645a7284342f93da10fe9f78f9f341787228ac70ff1f0d9164df623bf4",
1865
- "sha256:f10c01ee2c1577bf42d109dfdda5b2f1e92e7c8c2828347baa83aed57c8386f2",
1866
- "sha256:f33d0d4f900f122ed2397ad56cc06b89944c5e4b3ef479a580ca18bb42c7e11e"
1867
  ],
1868
  "markers": "python_version >= '3.10'",
1869
- "version": "==0.23.1"
1870
  },
1871
  "scikit-learn": {
1872
  "hashes": [
@@ -2071,11 +2071,11 @@
2071
  },
2072
  "tifffile": {
2073
  "hashes": [
2074
- "sha256:4920a3ec8e8e003e673d3c6531863c99eedd570d1b8b7e141c072ed78ff8030d",
2075
- "sha256:870998f82fbc94ff7c3528884c1b0ae54863504ff51dbebea431ac3fa8fb7c21"
2076
  ],
2077
  "markers": "python_version >= '3.9'",
2078
- "version": "==2024.2.12"
2079
  },
2080
  "tomlkit": {
2081
  "hashes": [
@@ -2208,7 +2208,6 @@
2208
  "sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de",
2209
  "sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0"
2210
  ],
2211
- "index": "pip_conf_index_global",
2212
  "markers": "python_version >= '3.8'",
2213
  "version": "==0.29.0"
2214
  },
@@ -2311,5 +2310,650 @@
2311
  "version": "==0.0.1"
2312
  }
2313
  },
2314
- "develop": {}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2315
  }
 
1
  {
2
  "_meta": {
3
  "hash": {
4
+ "sha256": "5a17d51fe36184478e03d04507dd962e5e76f6ff723187812930de6b1add1df7"
5
  },
6
  "pipfile-spec": 6,
7
  "requires": {
 
9
  },
10
  "sources": [
11
  {
12
+ "name": "pypi",
13
  "url": "https://pypi.org/simple",
14
+ "verify_ssl": true
15
  }
16
  ]
17
  },
 
142
  "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956",
143
  "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"
144
  ],
145
+ "markers": "python_version >= '3.8'",
146
  "version": "==1.16.0"
147
  },
148
  "charset-normalizer": {
 
377
  },
378
  "en-tts": {
379
  "hashes": [
380
+ "sha256:6487b2d7fc41249f5a5ab72ba74c4051a5f20157973918a2ff15819fd19285ac",
381
+ "sha256:dc082decdc2f5f9c2aabf485802d6bdd059c87a09e1b501aa0f118f6b13328bb"
382
  ],
383
+ "index": "pypi",
384
  "markers": "python_version < '3.12' and python_version >= '3.8'",
385
+ "version": "==0.0.2"
386
  },
387
  "english-text-normalization": {
388
  "hashes": [
 
394
  },
395
  "fastapi": {
396
  "hashes": [
397
+ "sha256:239403f2c0a3dda07a9420f95157a7f014ddb2b770acdbc984f9bdf3ead7afdb",
398
+ "sha256:b53d673652da3b65e8cd787ad214ec0fe303cad00d2b529b86ce7db13f17518d"
399
  ],
400
  "markers": "python_version >= '3.8'",
401
+ "version": "==0.110.2"
402
  },
403
  "fastdtw": {
404
  "hashes": [
 
497
  "oauth"
498
  ],
499
  "hashes": [
500
+ "sha256:4d7e09751f17294aaea5de720813ddbc430b9bf4b17a01b8a5f10db4589b6c93",
501
+ "sha256:eb5ef3bad1614bc3463b8f9f7002c7f1a29b93eade182eb90cd58a5552a2584c"
502
  ],
503
  "markers": "python_version >= '3.8'",
504
+ "version": "==4.27.0"
505
  },
506
  "gradio-client": {
507
  "hashes": [
 
553
  },
554
  "imageio": {
555
  "hashes": [
556
+ "sha256:408c1d4d62f72c9e8347e7d1ca9bc11d8673328af3913868db3b828e28b40a4c",
557
+ "sha256:f13eb76e4922f936ac4a7fec77ce8a783e63b93543d4ea3e40793a6cabd9ac7d"
558
  ],
559
  "markers": "python_version >= '3.8'",
560
+ "version": "==2.34.1"
561
  },
562
  "importlib-resources": {
563
  "hashes": [
 
1340
  },
1341
  "plotly": {
1342
  "hashes": [
1343
+ "sha256:69243f8c165d4be26c0df1c6f0b7b258e2dfeefe032763404ad7e7fb7d7c2073",
1344
+ "sha256:a33f41fd5922e45b2b253f795b200d14452eb625790bb72d0a72cf1328a6abbf"
1345
  ],
1346
  "markers": "python_version >= '3.8'",
1347
+ "version": "==5.21.0"
1348
  },
1349
  "pooch": {
1350
  "hashes": [
 
1825
  },
1826
  "ruff": {
1827
  "hashes": [
1828
+ "sha256:0926cefb57fc5fced629603fbd1a23d458b25418681d96823992ba975f050c2b",
1829
+ "sha256:1c859f294f8633889e7d77de228b203eb0e9a03071b72b5989d89a0cf98ee262",
1830
+ "sha256:2c6e37f2e3cd74496a74af9a4fa67b547ab3ca137688c484749189bf3a686ceb",
1831
+ "sha256:2d9ef6231e3fbdc0b8c72404a1a0c46fd0dcea84efca83beb4681c318ea6a953",
1832
+ "sha256:6e68d248ed688b9d69fd4d18737edcbb79c98b251bba5a2b031ce2470224bdf9",
1833
+ "sha256:9485f54a7189e6f7433e0058cf8581bee45c31a25cd69009d2a040d1bd4bfaef",
1834
+ "sha256:a1eaf03d87e6a7cd5e661d36d8c6e874693cb9bc3049d110bc9a97b350680c43",
1835
+ "sha256:b34510141e393519a47f2d7b8216fec747ea1f2c81e85f076e9f2910588d4b64",
1836
+ "sha256:b90506f3d6d1f41f43f9b7b5ff845aeefabed6d2494307bc7b178360a8805252",
1837
+ "sha256:b92f03b4aa9fa23e1799b40f15f8b95cdc418782a567d6c43def65e1bbb7f1cf",
1838
+ "sha256:baa27d9d72a94574d250f42b7640b3bd2edc4c58ac8ac2778a8c82374bb27984",
1839
+ "sha256:c7d391e5936af5c9e252743d767c564670dc3889aff460d35c518ee76e4b26d7",
1840
+ "sha256:d2921ac03ce1383e360e8a95442ffb0d757a6a7ddd9a5be68561a671e0e5807e",
1841
+ "sha256:d592116cdbb65f8b1b7e2a2b48297eb865f6bdc20641879aa9d7b9c11d86db79",
1842
+ "sha256:eec8d185fe193ad053eda3a6be23069e0c8ba8c5d20bc5ace6e3b9e37d246d3f",
1843
+ "sha256:efd703a5975ac1998c2cc5e9494e13b28f31e66c616b0a76e206de2562e0843c",
1844
+ "sha256:f1ee41580bff1a651339eb3337c20c12f4037f6110a36ae4a2d864c52e5ef954"
1845
  ],
1846
  "markers": "sys_platform != 'emscripten'",
1847
+ "version": "==0.4.1"
1848
  },
1849
  "scikit-image": {
1850
  "hashes": [
1851
+ "sha256:08b10781efbd6b084f3c847ff4049b657241ea866b9e331b14bf791dcb3e6661",
1852
+ "sha256:15bfb4e8d7bd90a967e6a3c3ab6be678063fc45e950b730684a8db46a02ff892",
1853
+ "sha256:1978be2abe3c3c3189a99a411d48bbb1306f7c2debb3aefbf426e23947f26623",
1854
+ "sha256:3597ac5d8f51dafbcb7433ef1fdefdefb535f50745b2002ae0a5d651df4f063b",
1855
+ "sha256:524b51a7440e46ed2ebbde7bc288bf2dde1dee2caafdd9513b2aca38a48223b7",
1856
+ "sha256:55de3326be124334b89314e9e04c8971ad98d6681e11a243f71bfb85ef9554b0",
1857
+ "sha256:5736e66d01b11cd90988ec24ab929c80a03af28f690189c951886891ebf63154",
1858
+ "sha256:8b335c229170d787b3fb8c60d220f72049ccf862d5191a3cfda6ac84b995ac4e",
1859
+ "sha256:a158f50d3df4867bbd1c698520ede8bc493e430ad83f54ac1f0d8f57b328779b",
1860
+ "sha256:a207352e9a1956dda1424bbe872c7795345187138118e8be6a421aef3b988c2a",
1861
+ "sha256:ae32bf0cb02b672ed74d28880ca6f88928ae8dd794d67e04fa3ff4836feb9bd6",
1862
+ "sha256:c9da4b2c3117e3e30364a3d14496ee5c72b09eb1a4ab1292b302416faa360590",
1863
+ "sha256:ee65669aa586e110346f567ed5c92d1bd63799a19e951cb83da3f54b0caf7c52",
1864
+ "sha256:ee83fdb1843ee938eabdfeb9498623282935ea30aa20dffc5d5d16698efb4b2a",
1865
+ "sha256:f9a8db6c52f8d0e1474ea8320d7b8db442b4d6baa29dd0acbd02f8a49572f18a",
1866
+ "sha256:fce619a6d84fe40c1208fa579b646e93ce13ef0afc3652a23e9782b2c183291a"
1867
  ],
1868
  "markers": "python_version >= '3.10'",
1869
+ "version": "==0.23.2"
1870
  },
1871
  "scikit-learn": {
1872
  "hashes": [
 
2071
  },
2072
  "tifffile": {
2073
  "hashes": [
2074
+ "sha256:5ffcd77b9d77c3aada1278631af5c8ac788438452fda2eb1b9b60d5553e95c82",
2075
+ "sha256:72643b5c9ef886669a00a659c9fd60a81f220d2fb6572d184c3e147435ccec43"
2076
  ],
2077
  "markers": "python_version >= '3.9'",
2078
+ "version": "==2024.4.18"
2079
  },
2080
  "tomlkit": {
2081
  "hashes": [
 
2208
  "sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de",
2209
  "sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0"
2210
  ],
 
2211
  "markers": "python_version >= '3.8'",
2212
  "version": "==0.29.0"
2213
  },
 
2310
  "version": "==0.0.1"
2311
  }
2312
  },
2313
+ "develop": {
2314
+ "astroid": {
2315
+ "hashes": [
2316
+ "sha256:951798f922990137ac090c53af473db7ab4e70c770e6d7fae0cec59f74411819",
2317
+ "sha256:ac248253bfa4bd924a0de213707e7ebeeb3138abeb48d798784ead1e56d419d4"
2318
+ ],
2319
+ "markers": "python_full_version >= '3.8.0'",
2320
+ "version": "==3.1.0"
2321
+ },
2322
+ "autoflake": {
2323
+ "hashes": [
2324
+ "sha256:3ae7495db9084b7b32818b4140e6dc4fc280b712fb414f5b8fe57b0a8e85a840",
2325
+ "sha256:c98b75dc5b0a86459c4f01a1d32ac7eb4338ec4317a4469515ff1e687ecd909e"
2326
+ ],
2327
+ "index": "pypi",
2328
+ "markers": "python_version >= '3.8'",
2329
+ "version": "==2.3.1"
2330
+ },
2331
+ "autopep8": {
2332
+ "hashes": [
2333
+ "sha256:1fa8964e4618929488f4ec36795c7ff12924a68b8bf01366c094fc52f770b6e7",
2334
+ "sha256:2bb76888c5edbcafe6aabab3c47ba534f5a2c2d245c2eddced4a30c4b4946357"
2335
+ ],
2336
+ "index": "pypi",
2337
+ "markers": "python_version >= '3.8'",
2338
+ "version": "==2.1.0"
2339
+ },
2340
+ "backports.tarfile": {
2341
+ "hashes": [
2342
+ "sha256:73e0179647803d3726d82e76089d01d8549ceca9bace469953fcb4d97cf2d417",
2343
+ "sha256:9c2ef9696cb73374f7164e17fc761389393ca76777036f5aad42e8b93fcd8009"
2344
+ ],
2345
+ "markers": "python_version < '3.12'",
2346
+ "version": "==1.1.1"
2347
+ },
2348
+ "build": {
2349
+ "hashes": [
2350
+ "sha256:526263f4870c26f26c433545579475377b2b7588b6f1eac76a001e873ae3e19d",
2351
+ "sha256:75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4"
2352
+ ],
2353
+ "index": "pypi",
2354
+ "markers": "python_version >= '3.8'",
2355
+ "version": "==1.2.1"
2356
+ },
2357
+ "cachetools": {
2358
+ "hashes": [
2359
+ "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945",
2360
+ "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"
2361
+ ],
2362
+ "markers": "python_version >= '3.7'",
2363
+ "version": "==5.3.3"
2364
+ },
2365
+ "certifi": {
2366
+ "hashes": [
2367
+ "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f",
2368
+ "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"
2369
+ ],
2370
+ "markers": "python_version >= '3.6'",
2371
+ "version": "==2024.2.2"
2372
+ },
2373
+ "cffi": {
2374
+ "hashes": [
2375
+ "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc",
2376
+ "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a",
2377
+ "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417",
2378
+ "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab",
2379
+ "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520",
2380
+ "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36",
2381
+ "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743",
2382
+ "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8",
2383
+ "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed",
2384
+ "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684",
2385
+ "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56",
2386
+ "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324",
2387
+ "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d",
2388
+ "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235",
2389
+ "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e",
2390
+ "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088",
2391
+ "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000",
2392
+ "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7",
2393
+ "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e",
2394
+ "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673",
2395
+ "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c",
2396
+ "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe",
2397
+ "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2",
2398
+ "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098",
2399
+ "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8",
2400
+ "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a",
2401
+ "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0",
2402
+ "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b",
2403
+ "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896",
2404
+ "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e",
2405
+ "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9",
2406
+ "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2",
2407
+ "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b",
2408
+ "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6",
2409
+ "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404",
2410
+ "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f",
2411
+ "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0",
2412
+ "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4",
2413
+ "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc",
2414
+ "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936",
2415
+ "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba",
2416
+ "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872",
2417
+ "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb",
2418
+ "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614",
2419
+ "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1",
2420
+ "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d",
2421
+ "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969",
2422
+ "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b",
2423
+ "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4",
2424
+ "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627",
2425
+ "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956",
2426
+ "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"
2427
+ ],
2428
+ "markers": "python_version >= '3.8'",
2429
+ "version": "==1.16.0"
2430
+ },
2431
+ "chardet": {
2432
+ "hashes": [
2433
+ "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7",
2434
+ "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"
2435
+ ],
2436
+ "markers": "python_version >= '3.7'",
2437
+ "version": "==5.2.0"
2438
+ },
2439
+ "charset-normalizer": {
2440
+ "hashes": [
2441
+ "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027",
2442
+ "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087",
2443
+ "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786",
2444
+ "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8",
2445
+ "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09",
2446
+ "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185",
2447
+ "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574",
2448
+ "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e",
2449
+ "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519",
2450
+ "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898",
2451
+ "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269",
2452
+ "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3",
2453
+ "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f",
2454
+ "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6",
2455
+ "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8",
2456
+ "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a",
2457
+ "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73",
2458
+ "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc",
2459
+ "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714",
2460
+ "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2",
2461
+ "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc",
2462
+ "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce",
2463
+ "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d",
2464
+ "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e",
2465
+ "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6",
2466
+ "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269",
2467
+ "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96",
2468
+ "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d",
2469
+ "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a",
2470
+ "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4",
2471
+ "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77",
2472
+ "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d",
2473
+ "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0",
2474
+ "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed",
2475
+ "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068",
2476
+ "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac",
2477
+ "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25",
2478
+ "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8",
2479
+ "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab",
2480
+ "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26",
2481
+ "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2",
2482
+ "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db",
2483
+ "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f",
2484
+ "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5",
2485
+ "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99",
2486
+ "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c",
2487
+ "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d",
2488
+ "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811",
2489
+ "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa",
2490
+ "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a",
2491
+ "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03",
2492
+ "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b",
2493
+ "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04",
2494
+ "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c",
2495
+ "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001",
2496
+ "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458",
2497
+ "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389",
2498
+ "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99",
2499
+ "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985",
2500
+ "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537",
2501
+ "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238",
2502
+ "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f",
2503
+ "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d",
2504
+ "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796",
2505
+ "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a",
2506
+ "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143",
2507
+ "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8",
2508
+ "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c",
2509
+ "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5",
2510
+ "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5",
2511
+ "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711",
2512
+ "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4",
2513
+ "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6",
2514
+ "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c",
2515
+ "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7",
2516
+ "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4",
2517
+ "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b",
2518
+ "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae",
2519
+ "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12",
2520
+ "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c",
2521
+ "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae",
2522
+ "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8",
2523
+ "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887",
2524
+ "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b",
2525
+ "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4",
2526
+ "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f",
2527
+ "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5",
2528
+ "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33",
2529
+ "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519",
2530
+ "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"
2531
+ ],
2532
+ "markers": "python_full_version >= '3.7.0'",
2533
+ "version": "==3.3.2"
2534
+ },
2535
+ "colorama": {
2536
+ "hashes": [
2537
+ "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44",
2538
+ "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"
2539
+ ],
2540
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'",
2541
+ "version": "==0.4.6"
2542
+ },
2543
+ "cryptography": {
2544
+ "hashes": [
2545
+ "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee",
2546
+ "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576",
2547
+ "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d",
2548
+ "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30",
2549
+ "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413",
2550
+ "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb",
2551
+ "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da",
2552
+ "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4",
2553
+ "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd",
2554
+ "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc",
2555
+ "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8",
2556
+ "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1",
2557
+ "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc",
2558
+ "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e",
2559
+ "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8",
2560
+ "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940",
2561
+ "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400",
2562
+ "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7",
2563
+ "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16",
2564
+ "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278",
2565
+ "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74",
2566
+ "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec",
2567
+ "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1",
2568
+ "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2",
2569
+ "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c",
2570
+ "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922",
2571
+ "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a",
2572
+ "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6",
2573
+ "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1",
2574
+ "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e",
2575
+ "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac",
2576
+ "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"
2577
+ ],
2578
+ "markers": "python_version >= '3.7'",
2579
+ "version": "==42.0.5"
2580
+ },
2581
+ "dill": {
2582
+ "hashes": [
2583
+ "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca",
2584
+ "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"
2585
+ ],
2586
+ "markers": "python_version >= '3.11'",
2587
+ "version": "==0.3.8"
2588
+ },
2589
+ "distlib": {
2590
+ "hashes": [
2591
+ "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784",
2592
+ "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"
2593
+ ],
2594
+ "version": "==0.3.8"
2595
+ },
2596
+ "docutils": {
2597
+ "hashes": [
2598
+ "sha256:14c8d34a55b46c88f9f714adb29cefbdd69fb82f3fef825e59c5faab935390d8",
2599
+ "sha256:65249d8a5345bc95e0f40f280ba63c98eb24de35c6c8f5b662e3e8948adea83f"
2600
+ ],
2601
+ "markers": "python_version >= '3.9'",
2602
+ "version": "==0.21.1"
2603
+ },
2604
+ "filelock": {
2605
+ "hashes": [
2606
+ "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f",
2607
+ "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4"
2608
+ ],
2609
+ "markers": "python_version >= '3.8'",
2610
+ "version": "==3.13.4"
2611
+ },
2612
+ "idna": {
2613
+ "hashes": [
2614
+ "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc",
2615
+ "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"
2616
+ ],
2617
+ "markers": "python_version >= '3.5'",
2618
+ "version": "==3.7"
2619
+ },
2620
+ "importlib-metadata": {
2621
+ "hashes": [
2622
+ "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570",
2623
+ "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"
2624
+ ],
2625
+ "markers": "python_version >= '3.8'",
2626
+ "version": "==7.1.0"
2627
+ },
2628
+ "iniconfig": {
2629
+ "hashes": [
2630
+ "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3",
2631
+ "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"
2632
+ ],
2633
+ "markers": "python_version >= '3.7'",
2634
+ "version": "==2.0.0"
2635
+ },
2636
+ "isort": {
2637
+ "hashes": [
2638
+ "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109",
2639
+ "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"
2640
+ ],
2641
+ "index": "pypi",
2642
+ "markers": "python_full_version >= '3.8.0'",
2643
+ "version": "==5.13.2"
2644
+ },
2645
+ "jaraco.classes": {
2646
+ "hashes": [
2647
+ "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd",
2648
+ "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"
2649
+ ],
2650
+ "markers": "python_version >= '3.8'",
2651
+ "version": "==3.4.0"
2652
+ },
2653
+ "jaraco.context": {
2654
+ "hashes": [
2655
+ "sha256:3e16388f7da43d384a1a7cd3452e72e14732ac9fe459678773a3608a812bf266",
2656
+ "sha256:c2f67165ce1f9be20f32f650f25d8edfc1646a8aeee48ae06fb35f90763576d2"
2657
+ ],
2658
+ "markers": "python_version >= '3.8'",
2659
+ "version": "==5.3.0"
2660
+ },
2661
+ "jaraco.functools": {
2662
+ "hashes": [
2663
+ "sha256:3b24ccb921d6b593bdceb56ce14799204f473976e2a9d4b15b04d0f2c2326664",
2664
+ "sha256:d33fa765374c0611b52f8b3a795f8900869aa88c84769d4d1746cd68fb28c3e8"
2665
+ ],
2666
+ "markers": "python_version >= '3.8'",
2667
+ "version": "==4.0.1"
2668
+ },
2669
+ "jeepney": {
2670
+ "hashes": [
2671
+ "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806",
2672
+ "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"
2673
+ ],
2674
+ "markers": "sys_platform == 'linux'",
2675
+ "version": "==0.8.0"
2676
+ },
2677
+ "keyring": {
2678
+ "hashes": [
2679
+ "sha256:26fc12e6a329d61d24aa47b22a7c5c3f35753df7d8f2860973cf94f4e1fb3427",
2680
+ "sha256:7230ea690525133f6ad536a9b5def74a4bd52642abe594761028fc044d7c7893"
2681
+ ],
2682
+ "markers": "python_version >= '3.8'",
2683
+ "version": "==25.1.0"
2684
+ },
2685
+ "markdown-it-py": {
2686
+ "hashes": [
2687
+ "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1",
2688
+ "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"
2689
+ ],
2690
+ "markers": "python_version >= '3.8'",
2691
+ "version": "==3.0.0"
2692
+ },
2693
+ "mccabe": {
2694
+ "hashes": [
2695
+ "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325",
2696
+ "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"
2697
+ ],
2698
+ "markers": "python_version >= '3.6'",
2699
+ "version": "==0.7.0"
2700
+ },
2701
+ "mdurl": {
2702
+ "hashes": [
2703
+ "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8",
2704
+ "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"
2705
+ ],
2706
+ "markers": "python_version >= '3.7'",
2707
+ "version": "==0.1.2"
2708
+ },
2709
+ "more-itertools": {
2710
+ "hashes": [
2711
+ "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684",
2712
+ "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1"
2713
+ ],
2714
+ "markers": "python_version >= '3.8'",
2715
+ "version": "==10.2.0"
2716
+ },
2717
+ "nh3": {
2718
+ "hashes": [
2719
+ "sha256:0316c25b76289cf23be6b66c77d3608a4fdf537b35426280032f432f14291b9a",
2720
+ "sha256:1a814dd7bba1cb0aba5bcb9bebcc88fd801b63e21e2450ae6c52d3b3336bc911",
2721
+ "sha256:1aa52a7def528297f256de0844e8dd680ee279e79583c76d6fa73a978186ddfb",
2722
+ "sha256:22c26e20acbb253a5bdd33d432a326d18508a910e4dcf9a3316179860d53345a",
2723
+ "sha256:40015514022af31975c0b3bca4014634fa13cb5dc4dbcbc00570acc781316dcc",
2724
+ "sha256:40d0741a19c3d645e54efba71cb0d8c475b59135c1e3c580f879ad5514cbf028",
2725
+ "sha256:551672fd71d06cd828e282abdb810d1be24e1abb7ae2543a8fa36a71c1006fe9",
2726
+ "sha256:66f17d78826096291bd264f260213d2b3905e3c7fae6dfc5337d49429f1dc9f3",
2727
+ "sha256:85cdbcca8ef10733bd31f931956f7fbb85145a4d11ab9e6742bbf44d88b7e351",
2728
+ "sha256:a3f55fabe29164ba6026b5ad5c3151c314d136fd67415a17660b4aaddacf1b10",
2729
+ "sha256:b4427ef0d2dfdec10b641ed0bdaf17957eb625b2ec0ea9329b3d28806c153d71",
2730
+ "sha256:ba73a2f8d3a1b966e9cdba7b211779ad8a2561d2dba9674b8a19ed817923f65f",
2731
+ "sha256:c21bac1a7245cbd88c0b0e4a420221b7bfa838a2814ee5bb924e9c2f10a1120b",
2732
+ "sha256:c551eb2a3876e8ff2ac63dff1585236ed5dfec5ffd82216a7a174f7c5082a78a",
2733
+ "sha256:c790769152308421283679a142dbdb3d1c46c79c823008ecea8e8141db1a2062",
2734
+ "sha256:d7a25fd8c86657f5d9d576268e3b3767c5cd4f42867c9383618be8517f0f022a"
2735
+ ],
2736
+ "version": "==0.2.17"
2737
+ },
2738
+ "packaging": {
2739
+ "hashes": [
2740
+ "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5",
2741
+ "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"
2742
+ ],
2743
+ "markers": "python_version >= '3.7'",
2744
+ "version": "==24.0"
2745
+ },
2746
+ "pkginfo": {
2747
+ "hashes": [
2748
+ "sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297",
2749
+ "sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097"
2750
+ ],
2751
+ "markers": "python_version >= '3.6'",
2752
+ "version": "==1.10.0"
2753
+ },
2754
+ "platformdirs": {
2755
+ "hashes": [
2756
+ "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068",
2757
+ "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"
2758
+ ],
2759
+ "markers": "python_version >= '3.8'",
2760
+ "version": "==4.2.0"
2761
+ },
2762
+ "pluggy": {
2763
+ "hashes": [
2764
+ "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1",
2765
+ "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"
2766
+ ],
2767
+ "markers": "python_version >= '3.8'",
2768
+ "version": "==1.5.0"
2769
+ },
2770
+ "pycodestyle": {
2771
+ "hashes": [
2772
+ "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f",
2773
+ "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"
2774
+ ],
2775
+ "index": "pypi",
2776
+ "markers": "python_version >= '3.8'",
2777
+ "version": "==2.11.1"
2778
+ },
2779
+ "pycparser": {
2780
+ "hashes": [
2781
+ "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6",
2782
+ "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"
2783
+ ],
2784
+ "markers": "python_version >= '3.8'",
2785
+ "version": "==2.22"
2786
+ },
2787
+ "pyflakes": {
2788
+ "hashes": [
2789
+ "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f",
2790
+ "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"
2791
+ ],
2792
+ "markers": "python_version >= '3.8'",
2793
+ "version": "==3.2.0"
2794
+ },
2795
+ "pygments": {
2796
+ "hashes": [
2797
+ "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c",
2798
+ "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"
2799
+ ],
2800
+ "markers": "python_version >= '3.7'",
2801
+ "version": "==2.17.2"
2802
+ },
2803
+ "pylint": {
2804
+ "hashes": [
2805
+ "sha256:507a5b60953874766d8a366e8e8c7af63e058b26345cfcb5f91f89d987fd6b74",
2806
+ "sha256:6a69beb4a6f63debebaab0a3477ecd0f559aa726af4954fc948c51f7a2549e23"
2807
+ ],
2808
+ "index": "pypi",
2809
+ "markers": "python_full_version >= '3.8.0'",
2810
+ "version": "==3.1.0"
2811
+ },
2812
+ "pyproject-api": {
2813
+ "hashes": [
2814
+ "sha256:1817dc018adc0d1ff9ca1ed8c60e1623d5aaca40814b953af14a9cf9a5cae538",
2815
+ "sha256:4c0116d60476b0786c88692cf4e325a9814965e2469c5998b830bba16b183675"
2816
+ ],
2817
+ "markers": "python_version >= '3.8'",
2818
+ "version": "==1.6.1"
2819
+ },
2820
+ "pyproject-hooks": {
2821
+ "hashes": [
2822
+ "sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8",
2823
+ "sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5"
2824
+ ],
2825
+ "markers": "python_version >= '3.7'",
2826
+ "version": "==1.0.0"
2827
+ },
2828
+ "pytest": {
2829
+ "hashes": [
2830
+ "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7",
2831
+ "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"
2832
+ ],
2833
+ "index": "pypi",
2834
+ "markers": "python_version >= '3.8'",
2835
+ "version": "==8.1.1"
2836
+ },
2837
+ "pytoolconfig": {
2838
+ "extras": [
2839
+ "global"
2840
+ ],
2841
+ "hashes": [
2842
+ "sha256:51e6bd1a6f108238ae6aab6a65e5eed5e75d456be1c2bf29b04e5c1e7d7adbae",
2843
+ "sha256:5d8cea8ae1996938ec3eaf44567bbc5ef1bc900742190c439a44a704d6e1b62b"
2844
+ ],
2845
+ "markers": "python_version >= '3.8'",
2846
+ "version": "==1.3.1"
2847
+ },
2848
+ "readme-renderer": {
2849
+ "hashes": [
2850
+ "sha256:1818dd28140813509eeed8d62687f7cd4f7bad90d4db586001c5dc09d4fde311",
2851
+ "sha256:19db308d86ecd60e5affa3b2a98f017af384678c63c88e5d4556a380e674f3f9"
2852
+ ],
2853
+ "markers": "python_version >= '3.8'",
2854
+ "version": "==43.0"
2855
+ },
2856
+ "requests": {
2857
+ "extras": [
2858
+ "socks"
2859
+ ],
2860
+ "hashes": [
2861
+ "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f",
2862
+ "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"
2863
+ ],
2864
+ "markers": "python_version >= '3.7'",
2865
+ "version": "==2.31.0"
2866
+ },
2867
+ "requests-toolbelt": {
2868
+ "hashes": [
2869
+ "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6",
2870
+ "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"
2871
+ ],
2872
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
2873
+ "version": "==1.0.0"
2874
+ },
2875
+ "rfc3986": {
2876
+ "hashes": [
2877
+ "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd",
2878
+ "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"
2879
+ ],
2880
+ "markers": "python_version >= '3.7'",
2881
+ "version": "==2.0.0"
2882
+ },
2883
+ "rich": {
2884
+ "hashes": [
2885
+ "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222",
2886
+ "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"
2887
+ ],
2888
+ "markers": "python_full_version >= '3.7.0'",
2889
+ "version": "==13.7.1"
2890
+ },
2891
+ "rope": {
2892
+ "hashes": [
2893
+ "sha256:51437d2decc8806cd5e9dd1fd9c1306a6d9075ecaf78d191af85fc1dfface880",
2894
+ "sha256:b435a0c0971244fdcd8741676a9fae697ae614c20cc36003678a7782f25c0d6c"
2895
+ ],
2896
+ "index": "pypi",
2897
+ "markers": "python_version >= '3.8'",
2898
+ "version": "==1.13.0"
2899
+ },
2900
+ "secretstorage": {
2901
+ "hashes": [
2902
+ "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77",
2903
+ "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"
2904
+ ],
2905
+ "markers": "sys_platform == 'linux'",
2906
+ "version": "==3.3.3"
2907
+ },
2908
+ "tomlkit": {
2909
+ "hashes": [
2910
+ "sha256:01f0477981119c7d8ee0f67ebe0297a7c95b14cf9f4b102b45486deb77018716",
2911
+ "sha256:926f1f37a1587c7a4f6c7484dae538f1345d96d793d9adab5d3675957b1d0766"
2912
+ ],
2913
+ "markers": "python_version >= '3.7'",
2914
+ "version": "==0.12.0"
2915
+ },
2916
+ "tox": {
2917
+ "hashes": [
2918
+ "sha256:0defb44f6dafd911b61788325741cc6b2e12ea71f987ac025ad4d649f1f1a104",
2919
+ "sha256:2900c4eb7b716af4a928a7fdc2ed248ad6575294ed7cfae2ea41203937422847"
2920
+ ],
2921
+ "index": "pypi",
2922
+ "markers": "python_version >= '3.8'",
2923
+ "version": "==4.14.2"
2924
+ },
2925
+ "twine": {
2926
+ "hashes": [
2927
+ "sha256:89b0cc7d370a4b66421cc6102f269aa910fe0f1861c124f573cf2ddedbc10cf4",
2928
+ "sha256:a262933de0b484c53408f9edae2e7821c1c45a3314ff2df9bdd343aa7ab8edc0"
2929
+ ],
2930
+ "index": "pypi",
2931
+ "markers": "python_version >= '3.8'",
2932
+ "version": "==5.0.0"
2933
+ },
2934
+ "urllib3": {
2935
+ "hashes": [
2936
+ "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d",
2937
+ "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"
2938
+ ],
2939
+ "markers": "python_version >= '3.8'",
2940
+ "version": "==2.2.1"
2941
+ },
2942
+ "virtualenv": {
2943
+ "hashes": [
2944
+ "sha256:7bb554bbdfeaacc3349fa614ea5bff6ac300fc7c335e9facf3a3bcfc703f45be",
2945
+ "sha256:8aac4332f2ea6ef519c648d0bc48a5b1d324994753519919bddbb1aff25a104e"
2946
+ ],
2947
+ "markers": "python_version >= '3.7'",
2948
+ "version": "==20.25.3"
2949
+ },
2950
+ "zipp": {
2951
+ "hashes": [
2952
+ "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b",
2953
+ "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"
2954
+ ],
2955
+ "markers": "python_version >= '3.8'",
2956
+ "version": "==3.18.1"
2957
+ }
2958
+ }
2959
  }
README.md CHANGED
@@ -1,6 +1,6 @@
1
  ---
2
- title: En Tts
3
- emoji: 🏆
4
  colorFrom: pink
5
  colorTo: green
6
  sdk: gradio
@@ -8,6 +8,20 @@ sdk_version: 4.26.0
8
  app_file: app.py
9
  pinned: false
10
  license: mit
 
 
 
 
 
 
 
 
 
 
 
 
11
  ---
12
 
13
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
1
  ---
2
+ title: en-tts
3
+ emoji: 💬
4
  colorFrom: pink
5
  colorTo: green
6
  sdk: gradio
 
8
  app_file: app.py
9
  pinned: false
10
  license: mit
11
+ fullWidth: false
12
+ python_version: 3.11
13
+ tags:
14
+ - speech synthesis
15
+ - text-to-speech
16
+ - speech generation
17
+ - linguistics
18
+ - Tacotron
19
+ - WaveGlow
20
+ startup_duration_timeout: 1h, 30m
21
+ models:
22
+ - stefantaubert/en-tts
23
  ---
24
 
25
+ # en-tts
26
+
27
+ English speech synthesis using `en-tts`.
app.py CHANGED
@@ -1,24 +1,31 @@
1
  import sys
2
  from functools import partial
3
 
4
- from en_tts_app import initialize_app, run_main
5
  from en_tts_gr import build_interface
6
 
7
- exit_code = initialize_app()
8
- if exit_code > 0:
9
- sys.exit(exit_code)
10
 
11
- interface = build_interface(cache_examples=False)
12
- interface.queue()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
- launch_method = partial(
15
- interface.launch,
16
- share=False,
17
- debug=True,
18
- inbrowser=True,
19
- quiet=False,
20
- show_api=False,
21
- )
22
 
23
- exit_code = run_main(launch_method)
24
- sys.exit(exit_code)
 
1
  import sys
2
  from functools import partial
3
 
4
+ from en_tts_app import initialize_logging, run_main
5
  from en_tts_gr import build_interface
6
 
 
 
 
7
 
8
+ def run() -> None:
9
+ try:
10
+ initialize_logging()
11
+ except ValueError as ex:
12
+ print("Logging not possible!")
13
+ sys.exit(1)
14
+
15
+ interface = build_interface(cache_examples=False)
16
+ interface.queue()
17
+
18
+ launch_method = partial(
19
+ interface.launch,
20
+ share=False,
21
+ debug=True,
22
+ inbrowser=True,
23
+ quiet=False,
24
+ show_api=False,
25
+ )
26
+
27
+ exit_code = run_main(launch_method)
28
+ sys.exit(exit_code)
29
 
 
 
 
 
 
 
 
 
30
 
31
+ run()
 
app_old.py DELETED
@@ -1,81 +0,0 @@
1
- from logging import getLogger
2
-
3
- import gradio as gr
4
- import numpy as np
5
- import numpy.typing as npt
6
- from en_tts import Synthesizer, Transcriber
7
-
8
- FLOAT32_64_MIN_WAV = -1.0
9
- FLOAT32_64_MAX_WAV = 1.0
10
- INT16_MIN = np.iinfo(np.int16).min # -32768 = -(2**15)
11
- INT16_MAX = np.iinfo(np.int16).max # 32767 = 2**15 - 1
12
- INT32_MIN = np.iinfo(np.int32).min # -2147483648 = -(2**31)
13
- INT32_MAX = np.iinfo(np.int32).max # 2147483647 = 2**31 - 1
14
-
15
- logger = getLogger(__name__)
16
- logger.info("Initializing transcriber...")
17
- transcriber = Transcriber()
18
-
19
- logger.info("Initializing synthesizer...")
20
- synthesizer = Synthesizer()
21
-
22
-
23
- def synt(text: str) -> str:
24
- logger.info("Transcribing...")
25
- text_ipa = transcriber.transcribe_to_ipa(text)
26
-
27
- logger.info("Synthesizing...")
28
- audio = synthesizer.synthesize(text_ipa)
29
- audio_int = convert_wav(audio, np.int16)
30
- return 22050, audio_int
31
-
32
-
33
- def get_max_value(dtype):
34
- # see wavfile.write() max positive eg. on 16-bit PCM is 32767
35
- if dtype == np.int16:
36
- return INT16_MAX
37
-
38
- if dtype == np.int32:
39
- return INT32_MAX
40
-
41
- if dtype in (np.float32, np.float64):
42
- return FLOAT32_64_MAX_WAV
43
-
44
- assert False
45
-
46
-
47
- def get_min_value(dtype):
48
- if dtype == np.int16:
49
- return INT16_MIN
50
-
51
- if dtype == np.int32:
52
- return INT32_MIN
53
-
54
- if dtype in (np.float32, np.float64):
55
- return FLOAT32_64_MIN_WAV
56
-
57
- assert False
58
-
59
-
60
- def convert_wav(wav: npt.NDArray[np.float64], to_dtype):
61
- '''
62
- if the wav is over-amplified the result will also be over-amplified.
63
- '''
64
- if wav.dtype != to_dtype:
65
- wav = wav / (-1 * get_min_value(wav.dtype)) * get_max_value(to_dtype)
66
- if to_dtype in (np.int16, np.int32):
67
- # the default seems to be np.fix instead of np.round on wav.astype()
68
- wav = np.round(wav, 0)
69
- wav = wav.astype(to_dtype)
70
-
71
- return wav
72
-
73
-
74
- example_text = "When the sunlight strikes raindrops in the air, they act as a prism and form a rainbow."
75
-
76
- iface = gr.Interface(
77
- fn=synt,
78
- inputs=[gr.Textbox(example_text, label="Text")],
79
- outputs=[gr.Audio(type="numpy", label="Speech", autoplay=True)],
80
- )
81
- iface.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
en_tts_app/__init__.py DELETED
@@ -1,5 +0,0 @@
1
- from en_tts_app.app import initialize_app, run_main
2
- from en_tts_app.globals import APP_NAME, APP_VERSION, get_conf_dir, get_log_path, get_work_dir
3
- from en_tts_app.logging_configuration import get_app_logger, get_file_logger
4
- from en_tts_app.main import (load_models_to_cache, reset_log, reset_work_dir, synthesize_english,
5
- synthesize_ipa)
 
 
 
 
 
 
en_tts_app/app.py DELETED
@@ -1,88 +0,0 @@
1
- import logging
2
- from logging import getLogger
3
- from time import perf_counter
4
- from typing import Callable
5
-
6
- from en_tts_app.globals import get_conf_dir, get_log_path
7
- from en_tts_app.logging_configuration import (configure_app_logger, configure_file_logger,
8
- configure_root_logger, get_file_logger)
9
-
10
- INITIALIZED = False
11
-
12
-
13
- def ensure_conf_dir_exists():
14
- conf_dir = get_conf_dir()
15
- if not conf_dir.is_dir():
16
- root_logger = getLogger()
17
- root_logger.debug("Creating configuration directory ...")
18
- conf_dir.mkdir(parents=False, exist_ok=False)
19
-
20
-
21
- def configure_external_loggers() -> None:
22
- file_logger = get_file_logger()
23
- for logger_name in ("httpcore", "httpx", "asyncio", "matplotlib"):
24
- logger = getLogger(logger_name)
25
- logger.parent = file_logger
26
- logger.disabled = False
27
- logger.propagate = True
28
- logger.level = logging.DEBUG
29
-
30
-
31
- def initialize_app() -> int:
32
- global INITIALIZED
33
- assert not INITIALIZED
34
- # CLI logging = INFO
35
- # External loggers go to file-logger
36
- # file-logger = DEBUG
37
-
38
- # # disable mpl temporarily
39
- # mpl_logger = getLogger("matplotlib")
40
- # mpl_logger.disabled = True
41
- # mpl_logger.propagate = False
42
-
43
- configure_root_logger(logging.INFO)
44
- root_logger = getLogger()
45
-
46
- logfile = get_log_path()
47
- try:
48
- configure_file_logger(logfile, logging.DEBUG)
49
- except Exception as ex:
50
- root_logger.exception("Logging to file is not possible. Exiting.", exc_info=ex, stack_info=True)
51
- return 1
52
-
53
- configure_app_logger(logging.INFO)
54
- configure_external_loggers()
55
-
56
- ensure_conf_dir_exists()
57
-
58
- # path not encapsulated in "" because it is only console out
59
- root_logger.info(f"Log will be written to: {logfile.absolute()}")
60
- INITIALIZED = True
61
- return 0
62
-
63
-
64
- def run_main(method: Callable) -> int:
65
- global INITIALIZED
66
- assert INITIALIZED
67
-
68
- flogger = get_file_logger()
69
-
70
- start = perf_counter()
71
- success = True
72
-
73
- try:
74
- method()
75
- except ValueError as error:
76
- success = False
77
- logger = getLogger(__name__)
78
- logger.debug("ValueError occurred.", exc_info=error)
79
- except Exception as error:
80
- success = False
81
- logger = getLogger(__name__)
82
- logger.debug("Exception occurred.", exc_info=error)
83
-
84
- duration = perf_counter() - start
85
- flogger.debug(f"Total duration (seconds): {duration}")
86
-
87
- exit_code = 0 if success else 1
88
- return exit_code
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
en_tts_app/globals.py DELETED
@@ -1,21 +0,0 @@
1
- from importlib.metadata import version
2
- from pathlib import Path
3
- from tempfile import gettempdir
4
-
5
- APP_NAME = "en-tts"
6
-
7
- APP_VERSION = version(APP_NAME)
8
-
9
-
10
- def get_conf_dir() -> Path:
11
- conf_dir = Path.home() / ".en-tts"
12
- return conf_dir
13
-
14
-
15
- def get_work_dir() -> Path:
16
- work_dir = Path(gettempdir()) / "en-tts"
17
- return work_dir
18
-
19
-
20
- def get_log_path() -> Path:
21
- return Path(gettempdir()) / "en-tts.log"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
en_tts_app/helper.py DELETED
@@ -1,11 +0,0 @@
1
-
2
- import os
3
- from pathlib import Path
4
- from typing import Generator
5
-
6
-
7
- def get_all_files_in_all_subfolders(directory: Path) -> Generator[Path, None, None]:
8
- for root, _, files in os.walk(directory):
9
- for name in files:
10
- file_path = Path(root) / name
11
- yield file_path
 
 
 
 
 
 
 
 
 
 
 
 
en_tts_app/logging_configuration.py DELETED
@@ -1,139 +0,0 @@
1
- import logging
2
- import os
3
- import platform
4
- import sys
5
- from logging import Formatter, Handler, Logger, StreamHandler, getLogger
6
- from pathlib import Path
7
- from pkgutil import iter_modules
8
-
9
- from en_tts_app.globals import APP_VERSION
10
-
11
-
12
- class ConsoleFormatter(logging.Formatter):
13
- """Logging colored formatter, adapted from https://stackoverflow.com/a/56944256/3638629"""
14
-
15
- purple = '\x1b[34m'
16
- blue = '\x1b[36m'
17
- # blue = '\x1b[38;5;39m'
18
- yellow = '\x1b[38;5;226m'
19
- red = '\x1b[1;49;31m'
20
- bold_red = '\x1b[1;49;31m'
21
- reset = '\x1b[0m'
22
-
23
- collected_loggers = set()
24
-
25
- def __init__(self):
26
- super().__init__()
27
- self.datefmt = '%H:%M:%S'
28
- fmt = '(%(levelname)s) %(message)s'
29
- fmt_info = '%(message)s'
30
-
31
- self.fmts = {
32
- logging.NOTSET: self.purple + fmt + self.reset,
33
- logging.DEBUG: self.blue + fmt + self.reset,
34
- logging.INFO: fmt_info,
35
- logging.WARNING: self.yellow + fmt + self.reset,
36
- logging.ERROR: self.red + fmt + self.reset,
37
- logging.CRITICAL: self.bold_red + fmt + self.reset,
38
- }
39
-
40
- def format(self, record):
41
- log_fmt = self.fmts.get(record.levelno)
42
- formatter = logging.Formatter(log_fmt, self.datefmt)
43
- self.collected_loggers.add(record.name)
44
-
45
- return formatter.format(record)
46
-
47
-
48
- def add_console_out(logger: Logger) -> StreamHandler:
49
- console = StreamHandler()
50
- logger.addHandler(console)
51
- set_console_formatter(console)
52
- return console
53
-
54
-
55
- def set_console_formatter(handler: Handler) -> None:
56
- logging_formatter = ConsoleFormatter()
57
- handler.setFormatter(logging_formatter)
58
-
59
-
60
- def set_logfile_formatter(handler: Handler) -> None:
61
- fmt = '[%(asctime)s.%(msecs)03d] %(name)s (%(levelname)s) %(message)s'
62
- datefmt = '%Y/%m/%d %H:%M:%S'
63
- logging_formatter = Formatter(fmt, datefmt)
64
- handler.setFormatter(logging_formatter)
65
-
66
-
67
- def get_app_logger() -> Logger:
68
- logger = getLogger("en_tts_app")
69
- return logger
70
-
71
-
72
- def get_file_logger() -> Logger:
73
- flogger = getLogger("file.en_tts_app")
74
- return flogger
75
-
76
-
77
- def configure_app_logger(level: int) -> None:
78
- app_logger = get_app_logger()
79
- app_logger.handlers.clear()
80
- assert len(app_logger.handlers) == 0
81
- console_handler = add_console_out(app_logger)
82
- # console_handler.setLevel(logging.DEBUG if debug else logging.INFO)
83
- app_logger.setLevel(level)
84
-
85
- core_logger = getLogger("en_tts")
86
- core_logger.parent = app_logger
87
-
88
- file_logger = get_file_logger()
89
- app_logger.parent = file_logger
90
-
91
-
92
- def configure_root_logger(level: int) -> None:
93
- # productive = False
94
- # loglevel = logging.INFO if productive else logging.DEBUG
95
- root_logger = getLogger()
96
- root_logger.setLevel(level)
97
- root_logger.manager.disable = logging.NOTSET
98
- if len(root_logger.handlers) > 0:
99
- console = root_logger.handlers[0]
100
- set_console_formatter(console)
101
- else:
102
- console = add_console_out(root_logger)
103
-
104
- # console.setLevel(logging.DEBUG if debug else logging.INFO)
105
-
106
-
107
- def configure_file_logger(path: Path, level: int):
108
- flogger = get_file_logger()
109
- assert len(flogger.handlers) == 0
110
- path.parent.mkdir(parents=True, exist_ok=True)
111
- if path.is_file():
112
- os.remove(path)
113
- path.write_text("")
114
- fh = logging.FileHandler(path)
115
- set_logfile_formatter(fh)
116
- # fh.setLevel(logging.DEBUG if debug else logging.INFO)
117
- flogger.setLevel(level)
118
- # mh = MemoryHandler(buffer_capacity, logging.ERROR, fh, True)
119
- flogger.addHandler(fh)
120
-
121
- if flogger.propagate:
122
- flogger.propagate = False
123
-
124
-
125
- def log_sysinfo():
126
- flogger = get_file_logger()
127
-
128
- sys_version = sys.version.replace('\n', '')
129
- flogger.debug(f"CLI version: {APP_VERSION}")
130
- flogger.debug(f"Python version: {sys_version}")
131
- flogger.debug("Modules: %s", ', '.join(sorted(p.name for p in iter_modules())))
132
-
133
- my_system = platform.uname()
134
- flogger.debug(f"System: {my_system.system}")
135
- flogger.debug(f"Node Name: {my_system.node}")
136
- flogger.debug(f"Release: {my_system.release}")
137
- flogger.debug(f"Version: {my_system.version}")
138
- flogger.debug(f"Machine: {my_system.machine}")
139
- flogger.debug(f"Processor: {my_system.processor}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
en_tts_app/main.py DELETED
@@ -1,191 +0,0 @@
1
- import logging
2
- import shutil
3
- from pathlib import Path
4
- from typing import Dict, Optional
5
-
6
- import torch
7
- from ordered_set import OrderedSet
8
- from pronunciation_dictionary import PronunciationDict, SerializationOptions, save_dict
9
-
10
- from en_tts.helper import get_default_device, normalize_audio
11
- from en_tts.io import save_audio
12
- from en_tts.synthesizer import Synthesizer
13
- from en_tts.transcriber import Transcriber
14
- from en_tts_app.globals import get_conf_dir, get_log_path, get_work_dir
15
- from en_tts_app.logging_configuration import get_app_logger, get_file_logger, log_sysinfo
16
-
17
- CACHE_TRANSCRIBER = "transcriber"
18
- CACHE_SYNTHESIZER = "synthesizer"
19
-
20
-
21
- def reset_work_dir():
22
- root_logger = get_app_logger()
23
- work_dir = get_work_dir()
24
-
25
- if work_dir.is_dir():
26
- root_logger.debug("Deleting working directory ...")
27
- shutil.rmtree(work_dir)
28
- root_logger.debug("Creating working directory ...")
29
- work_dir.mkdir(parents=False, exist_ok=False)
30
-
31
-
32
- def reset_log() -> None:
33
- get_log_path().write_text("", "utf-8")
34
-
35
-
36
- def load_models_to_cache(custom_device: torch.device = None) -> Dict:
37
- cli_logger = get_app_logger()
38
- cache = {}
39
-
40
- conf_dir = get_conf_dir()
41
-
42
- cli_logger.info("Initializing Transcriber...")
43
- cache[CACHE_TRANSCRIBER] = Transcriber(conf_dir)
44
-
45
- if custom_device is None:
46
- custom_device = get_default_device()
47
-
48
- cli_logger.info("Initializing Synthesizer...")
49
- cache[CACHE_SYNTHESIZER] = Synthesizer(conf_dir, custom_device)
50
- return cache
51
-
52
-
53
- def synthesize_ipa(text_ipa: str, cache: Dict, *, max_decoder_steps: int = 5000, sigma: float = 1.0, denoiser_strength: float = 0.0005, seed: int = 0, silence_sentences: float = 0.4, silence_paragraphs: float = 1.0, loglevel: int = 2, custom_output: Optional[Path] = None):
54
- if loglevel >= 1:
55
- try_log_text(text_ipa, "text")
56
-
57
- if custom_output is None:
58
- custom_output = get_work_dir() / "output.wav"
59
-
60
-
61
- output_path = synthesize_ipa_core(
62
- text_ipa, cache[CACHE_SYNTHESIZER], custom_output,
63
- max_decoder_steps=max_decoder_steps, sigma=sigma, denoiser_strength=denoiser_strength, seed=seed, silence_sentences=silence_sentences, silence_paragraphs=silence_paragraphs, loglevel=loglevel,
64
- )
65
-
66
- return output_path
67
-
68
-
69
- def synthesize_english(text: str, cache: Dict, *, max_decoder_steps: int = 5000, sigma: float = 1.0, denoiser_strength: float = 0.0005, seed: int = 0, silence_sentences: float = 0.4, silence_paragraphs: float = 1.0, loglevel: int = 2, skip_normalization: bool = False, skip_sentence_separation: bool = False, custom_output: Optional[Path] = None) -> Path:
70
- cli_logger = get_app_logger()
71
- reset_log()
72
- reset_work_dir()
73
- log_sysinfo()
74
-
75
- if loglevel == 0:
76
- cli_logger.setLevel(logging.WARNING)
77
-
78
- if custom_output is None:
79
- custom_output = get_work_dir() / "output.wav"
80
-
81
- text_ipa = convert_eng_to_ipa(
82
- text, cache[CACHE_TRANSCRIBER],
83
- loglevel=loglevel,
84
- skip_normalization=skip_normalization,
85
- skip_sentence_separation=skip_sentence_separation
86
- )
87
-
88
- output_path = synthesize_ipa_core(
89
- text_ipa, cache[CACHE_SYNTHESIZER], custom_output,
90
- max_decoder_steps=max_decoder_steps, sigma=sigma, denoiser_strength=denoiser_strength,
91
- seed=seed, silence_sentences=silence_sentences, silence_paragraphs=silence_paragraphs, loglevel=loglevel
92
- )
93
-
94
- return output_path
95
-
96
-
97
- def convert_eng_to_ipa(text: str, transcriber: Transcriber, *, loglevel: int = 1, skip_normalization: bool = False, skip_sentence_separation: bool = False) -> str:
98
- t = transcriber
99
- text_ipa = t.transcribe_to_ipa(text, skip_normalization, skip_sentence_separation)
100
-
101
- if loglevel >= 1:
102
- for txt, name in (
103
- (text, "text"),
104
- (t.text_normed, "text.normed"),
105
- (t.text_sentenced, "text.sentenced"),
106
- (t.text_ipa, "text.ipa"),
107
- (t.text_ipa_readable, "text.ipa.readable"),
108
- (text_ipa, "text.ipa.silenced"),
109
- ):
110
- try_log_text(txt, name)
111
-
112
- for v, name in (
113
- (t.vocabulary, "vocabulary"),
114
- (t.oov1, "oov1"),
115
- (t.oov2, "oov2"),
116
- (t.oov3, "oov3"),
117
- ):
118
- try_log_voc(v, name)
119
-
120
- for d, name in (
121
- (t.dict1, "dict1"),
122
- (t.dict1_single, "dict1.single"),
123
- (t.dict2, "dict2"),
124
- (t.dict2_single, "dict2.single"),
125
- (t.dict1_2, "dict1+2"),
126
- (t.dict3, "dict3"),
127
- (t.dict3_single, "dict3.single"),
128
- (t.dict1_2_3, "dict1+2+3"),
129
- (t.dict4_arpa, "dict4.arpa"),
130
- (t.dict4, "dict4"),
131
- (t.dict4_single, "dict4.single"),
132
- (t.dict1_2_3_4, "dict1+2+3+4"),
133
- ):
134
- try_log_dict(d, name)
135
- return text_ipa
136
-
137
-
138
- def synthesize_ipa_core(text_ipa: str, synthesizer: Synthesizer, output: Path, *, max_decoder_steps: int = 5000, sigma: float = 1.0, denoiser_strength: float = 0.0005, seed: int = 0, silence_sentences: float = 0.4, silence_paragraphs: float = 1.0, loglevel: int = 1) -> Path:
139
- logger = logging.getLogger(__name__)
140
- work_dir = get_work_dir()
141
-
142
- audio = synthesizer.synthesize(text_ipa, max_decoder_steps, seed, sigma,
143
- denoiser_strength, silence_sentences, silence_paragraphs, silent=loglevel == 0)
144
- unnormed_out = work_dir / "output.unnormed.wav"
145
- save_audio(audio, unnormed_out)
146
- work_dir_output = unnormed_out
147
-
148
- try:
149
- normalize_audio(unnormed_out, work_dir / "output.wav")
150
- work_dir_output = work_dir / "output.wav"
151
- except Exception as error:
152
- logger.warning("Normalization was not possible!", exc_info=error, stack_info=True)
153
- logger.info(f"Saved audio to: '{unnormed_out.absolute()}'")
154
-
155
- if output != work_dir_output:
156
- try:
157
- output.parent.mkdir(parents=True, exist_ok=True)
158
- shutil.copyfile(work_dir_output, output)
159
- except Exception as ex:
160
- logger.exception(
161
- f"Output couldn't be created at: '{output.absolute()}'", exc_info=ex, stack_info=True)
162
- logger.info(f"Saved audio to: '{work_dir_output.absolute()}'")
163
- logger.info(f"Saved audio to: '{output.absolute()}'")
164
- return output
165
-
166
-
167
- def try_log_dict(dictionary: Optional[PronunciationDict], name: str) -> None:
168
- if dictionary:
169
- work_dir = get_work_dir()
170
- logfile = work_dir / f"{name}.dict"
171
- save_dict(dictionary, logfile, "utf-8", SerializationOptions("TAB", False, True))
172
- flogger = get_file_logger()
173
- flogger.info(f"{name}: {logfile.absolute()}")
174
-
175
-
176
- def try_log_voc(vocabulary: Optional[OrderedSet[str]], name: str) -> None:
177
- if vocabulary:
178
- work_dir = get_work_dir()
179
- logfile = work_dir / f"{name}.txt"
180
- logfile.write_text("\n".join(vocabulary), "utf-8")
181
- flogger = get_file_logger()
182
- flogger.info(f"{name}: {logfile.absolute()}")
183
-
184
-
185
- def try_log_text(text: Optional[str], name: str) -> None:
186
- if text:
187
- work_dir = get_work_dir()
188
- logfile = work_dir / f"{name}.txt"
189
- logfile.write_text(text, "utf-8")
190
- flogger = get_file_logger()
191
- flogger.info(f"{name}: {logfile.absolute()}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
en_tts_app/py.typed DELETED
File without changes
en_tts_gr/__init__.py DELETED
@@ -1 +0,0 @@
1
- from en_tts_gr.app import build_interface, run
 
 
en_tts_gr/app.py DELETED
@@ -1,311 +0,0 @@
1
- import shutil
2
- import sys
3
- import zipfile
4
- from datetime import datetime
5
- from functools import partial
6
- from pathlib import Path
7
- from tempfile import gettempdir
8
- from typing import Dict
9
-
10
- import gradio as gr
11
- from scipy.io.wavfile import read
12
-
13
- from en_tts_app import (APP_VERSION, get_log_path, get_work_dir, initialize_app,
14
- load_models_to_cache, run_main, synthesize_english)
15
-
16
-
17
- def run():
18
- exit_code = initialize_app()
19
- if exit_code > 0:
20
- sys.exit(exit_code)
21
-
22
- interface = build_interface(cache_examples=False)
23
- interface.queue()
24
-
25
- launch_method = partial(
26
- interface.launch,
27
- share=False,
28
- debug=True,
29
- inbrowser=True,
30
- quiet=False,
31
- show_api=False,
32
- )
33
-
34
- exit_code = run_main(launch_method)
35
- sys.exit(exit_code)
36
-
37
-
38
- def build_interface(cache_examples: bool = False):
39
- cache = load_models_to_cache()
40
-
41
- fn = partial(synt, cache=cache)
42
-
43
- # iface = gr.Interface(
44
- # fn=fn,
45
- # inputs=[gr.Textbox(example_text, label="Text")],
46
- # outputs=[gr.Audio(type="numpy", label="Speech", autoplay=True)],
47
- # )
48
-
49
- with gr.Blocks(
50
- title="en-tts"
51
- ) as web_app:
52
- gr.Markdown(
53
- """
54
- # English Speech Synthesis
55
-
56
- Enter or paste your text into the provided text box and click the **Synthesize** button to convert it into speech. You can adjust settings as desired before synthesizing.
57
- """
58
- )
59
-
60
- with gr.Tab("Synthesis"):
61
- with gr.Row():
62
- with gr.Column():
63
- with gr.Group():
64
- input_txt_box = gr.Textbox(
65
- None,
66
- label="Input",
67
- placeholder="Enter the text you want to synthesize (or load an example from below).",
68
- lines=10,
69
- max_lines=5000,
70
- )
71
-
72
- with gr.Accordion("Settings", open=False):
73
- sent_norm_check_box = gr.Checkbox(
74
- False,
75
- label="Skip normalization",
76
- info="Skip normalization of numbers, units and abbreviations."
77
- )
78
-
79
- sent_sep_check_box = gr.Checkbox(
80
- False,
81
- label="Skip sentence separation",
82
- info="Skip sentence separation after these characters: .?!"
83
- )
84
-
85
- sil_sent_txt_box = gr.Number(
86
- 0.4,
87
- minimum=0.0,
88
- maximum=60,
89
- step=0.1,
90
- label="Silence between sentences (s)",
91
- info="Insert silence between each sentence."
92
- )
93
-
94
- sil_para_txt_box = gr.Number(
95
- 1.0,
96
- minimum=0.0,
97
- maximum=60,
98
- step=0.1,
99
- label="Silence between paragraphs (s)",
100
- info="Insert silence between each paragraph."
101
- )
102
-
103
- seed_txt_box = gr.Number(
104
- 0,
105
- minimum=0,
106
- maximum=999999,
107
- label="Seed",
108
- info="Seed used for inference in order to be able to reproduce the results."
109
- )
110
-
111
- sigma_txt_box = gr.Number(
112
- 1.0,
113
- minimum=0.0,
114
- maximum=1.0,
115
- step=0.001,
116
- label="Sigma",
117
- info="Sigma used for inference in WaveGlow."
118
- )
119
-
120
- max_decoder_steps_txt_box = gr.Number(
121
- 5000,
122
- minimum=1,
123
- step=500,
124
- label="Maximum decoder steps",
125
- info="Stop the synthesis after this number of decoder steps at the latest."
126
- )
127
-
128
- denoiser_txt_box = gr.Number(
129
- 0.005,
130
- minimum=0.0,
131
- maximum=1.0,
132
- step=0.001,
133
- label="Denoiser strength",
134
- info="Level of noise reduction used to remove the noise bias from WaveGlow."
135
- )
136
-
137
- synt_btn = gr.Button("Synthesize", variant="primary")
138
-
139
- with gr.Column():
140
- with gr.Group():
141
-
142
- with gr.Row():
143
- with gr.Column():
144
- out_audio = gr.Audio(
145
- type="numpy",
146
- label="Output",
147
- autoplay=True,
148
- )
149
-
150
- with gr.Accordion(
151
- "Log",
152
- open=False,
153
- ):
154
- out_md = gr.Textbox(
155
- interactive=False,
156
- show_copy_button=True,
157
- lines=15,
158
- max_lines=10000,
159
- placeholder="Log will be displayed here.",
160
- show_label=False,
161
- )
162
-
163
- dl_btn = gr.DownloadButton(
164
- "Download working directory",
165
- variant="secondary",
166
- )
167
-
168
- with gr.Row():
169
- gr.Examples(
170
- examples=[
171
- [
172
- "When the sunlight strikes raindrops in the air, they act as a prism and form a rainbow.",
173
- 5000, 1.0, 0.0005, 0, 0.4, 1.0, False, False
174
- ],
175
- # [
176
- # "Please call Stella. Ask her to bring these things with her from the store: six spoons of fresh snow peas, five thick slabs of blue cheese, and maybe a snack for her brother Bob.\n\nWe also need a small plastic snake and a big toy frog for the kids. She can scoop these things into three red bags, and we will go meet her Wednesday at the train station.",
177
- # 5000, 1.0, 0.0005, 0, 0.4, 1.0, False, False
178
- # ],
179
- ],
180
- fn=fn,
181
- inputs=[
182
- input_txt_box,
183
- max_decoder_steps_txt_box,
184
- sigma_txt_box,
185
- denoiser_txt_box,
186
- seed_txt_box,
187
- sil_sent_txt_box,
188
- sil_para_txt_box,
189
- sent_norm_check_box,
190
- sent_sep_check_box,
191
- ],
192
- outputs=[
193
- out_audio,
194
- out_md,
195
- dl_btn,
196
- ],
197
- label="Examples",
198
- cache_examples=cache_examples,
199
- )
200
-
201
- with gr.Tab("Info"):
202
- with gr.Column():
203
- gr.Markdown(
204
- f"""
205
- ### General information
206
-
207
- - Speaker: Linda Johnson
208
- - Language: English
209
- - Accent: North American
210
- - Supported special characters: `.?!,:;-—"'()[]`
211
-
212
- ### Evaluation results
213
-
214
- |Metric|Value|
215
- |---|---|
216
- |MOS naturalness|3.55 ± 0.28 (GT: 4.17 ± 0.23)|
217
- |MOS intelligibility|4.44 ± 0.24 (GT: 4.63 ± 0.19)|
218
- |Mean MCD-DTW|29.15|
219
- |Mean penalty|0.1018|
220
-
221
- ### Components
222
-
223
- |Component|Name|URLs|
224
- |---|---|---|
225
- |Acoustic model|Tacotron|[Checkpoint](https://zenodo.org/records/10107104), [Code](https://github.com/stefantaubert/tacotron)|
226
- |Vocoder|WaveGlow|[Checkpoint](https://catalog.ngc.nvidia.com/orgs/nvidia/models/waveglow_ljs_256channels/files?version=3), [Code](https://github.com/stefantaubert/waveglow)
227
- |Dataset|LJ Speech|[Link](https://keithito.com/LJ-Speech-Dataset), [Transcriptions](https://zenodo.org/records/7499098)|
228
-
229
- ### Citation
230
-
231
- Taubert, S. (2024). en-tts (Version {APP_VERSION}) [Computer software]. https://doi.org/10.5281/zenodo.11032264
232
-
233
- ### Acknowledgments
234
-
235
- Funded by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) – Project-ID 416228727 – [CRC 1410](https://gepris.dfg.de/gepris/projekt/416228727?context=projekt&task=showDetail&id=416228727)
236
-
237
- The authors gratefully acknowledge the GWK support for funding this project by providing computing time through the Center for Information Services and HPC (ZIH) at TU Dresden.
238
-
239
- The authors are grateful to the Center for Information Services and High Performance Computing [Zentrum fur Informationsdienste und Hochleistungsrechnen (ZIH)] at TU Dresden for providing its facilities for high throughput calculations.
240
-
241
- ### App information
242
-
243
- - Version: {APP_VERSION}
244
- - License: [MIT](https://github.com/stefantaubert/en-tts?tab=MIT-1-ov-file#readme)
245
- - GitHub: [stefantaubert/en-tts](https://github.com/stefantaubert/en-tts)
246
- """
247
- )
248
-
249
- # pylint: disable=E1101:no-member
250
- synt_btn.click(
251
- fn=fn,
252
- inputs=[
253
- input_txt_box,
254
- max_decoder_steps_txt_box,
255
- sigma_txt_box,
256
- denoiser_txt_box,
257
- seed_txt_box,
258
- sil_sent_txt_box,
259
- sil_para_txt_box,
260
- sent_norm_check_box,
261
- sent_sep_check_box,
262
- ],
263
- outputs=[
264
- out_audio,
265
- out_md,
266
- dl_btn,
267
- ],
268
- queue=True,
269
- )
270
-
271
- return web_app
272
-
273
-
274
- def synt(text: str, max_decoder_steps: int, sigma: float, denoiser_strength: float, seed: int, silence_sentences: float, silence_paragraphs: float, skip_normalization: bool, skip_sentence_separation: bool, cache: Dict) -> str:
275
- result_path = synthesize_english(
276
- text, cache,
277
- max_decoder_steps=max_decoder_steps,
278
- seed=seed,
279
- sigma=sigma,
280
- denoiser_strength=denoiser_strength,
281
- silence_paragraphs=silence_paragraphs,
282
- silence_sentences=silence_sentences,
283
- skip_normalization=skip_normalization,
284
- skip_sentence_separation=skip_sentence_separation,
285
- )
286
-
287
- rate, audio_int = read(result_path)
288
- logs = get_log_path().read_text("utf-8")
289
- zip_dl_path = create_zip_file_of_output()
290
- return (rate, audio_int), logs, zip_dl_path
291
-
292
-
293
- def create_zip_file_of_output() -> Path:
294
- work_dir = get_work_dir()
295
-
296
- name = f"en-tts-{datetime.now().strftime('%Y-%m-%dT%H-%M-%S')}"
297
-
298
- res = shutil.make_archive(Path(gettempdir()) / name, 'zip', root_dir=work_dir)
299
-
300
- resulting_zip = Path(res)
301
-
302
- with zipfile.ZipFile(resulting_zip, "a", compression=zipfile.ZIP_DEFLATED) as zipf:
303
- source_path = get_log_path()
304
- destination = 'output.log'
305
- zipf.write(source_path, destination)
306
-
307
- return resulting_zip
308
-
309
-
310
- if __name__ == "__main__":
311
- run()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
en_tts_gr/py.typed DELETED
File without changes
pylintrc DELETED
@@ -1,612 +0,0 @@
1
- [MAIN]
2
-
3
- # Analyse import fallback blocks. This can be used to support both Python 2 and
4
- # 3 compatible code, which means that the block might have code that exists
5
- # only in one or another interpreter, leading to false positives when analysed.
6
- analyse-fallback-blocks=no
7
-
8
- # Load and enable all available extensions. Use --list-extensions to see a list
9
- # all available extensions.
10
- #enable-all-extensions=
11
-
12
- # In error mode, checkers without error messages are disabled and for others,
13
- # only the ERROR messages are displayed, and no reports are done by default.
14
- #errors-only=
15
-
16
- # Always return a 0 (non-error) status code, even if lint errors are found.
17
- # This is primarily useful in continuous integration scripts.
18
- #exit-zero=
19
-
20
- # A comma-separated list of package or module names from where C extensions may
21
- # be loaded. Extensions are loading into the active Python interpreter and may
22
- # run arbitrary code.
23
- extension-pkg-allow-list=
24
-
25
- # A comma-separated list of package or module names from where C extensions may
26
- # be loaded. Extensions are loading into the active Python interpreter and may
27
- # run arbitrary code. (This is an alternative name to extension-pkg-allow-list
28
- # for backward compatibility.)
29
- extension-pkg-whitelist=
30
-
31
- # Return non-zero exit code if any of these messages/categories are detected,
32
- # even if score is above --fail-under value. Syntax same as enable. Messages
33
- # specified are enabled, while categories only check already-enabled messages.
34
- fail-on=
35
-
36
- # Specify a score threshold to be exceeded before program exits with error.
37
- fail-under=10.0
38
-
39
- # Interpret the stdin as a python script, whose filename needs to be passed as
40
- # the module_or_package argument.
41
- #from-stdin=
42
-
43
- # Files or directories to be skipped. They should be base names, not paths.
44
- ignore=CVS
45
-
46
- # Add files or directories matching the regex patterns to the ignore-list. The
47
- # regex matches against paths and can be in Posix or Windows format.
48
- ignore-paths=
49
-
50
- # Files or directories matching the regex patterns are skipped. The regex
51
- # matches against base names, not paths. The default value ignores Emacs file
52
- # locks
53
- ignore-patterns=
54
-
55
- # List of module names for which member attributes should not be checked
56
- # (useful for modules/projects where namespaces are manipulated during runtime
57
- # and thus existing member attributes cannot be deduced by static analysis). It
58
- # supports qualified module names, as well as Unix pattern matching.
59
- ignored-modules=
60
-
61
- # Python code to execute, usually for sys.path manipulation such as
62
- # pygtk.require().
63
- #init-hook=
64
-
65
- # Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the
66
- # number of processors available to use.
67
- jobs=1
68
-
69
- # Control the amount of potential inferred values when inferring a single
70
- # object. This can help the performance when dealing with large functions or
71
- # complex, nested conditions.
72
- limit-inference-results=100
73
-
74
- # List of plugins (as comma separated values of python module names) to load,
75
- # usually to register additional checkers.
76
- load-plugins=
77
-
78
- # Pickle collected data for later comparisons.
79
- persistent=yes
80
-
81
- # Minimum Python version to use for version dependent checks. Will default to
82
- # the version used to run pylint.
83
- py-version=3.9
84
-
85
- # Discover python modules and packages in the file system subtree.
86
- recursive=no
87
-
88
- # When enabled, pylint would attempt to guess common misconfiguration and emit
89
- # user-friendly hints instead of false-positive error messages.
90
- suggestion-mode=yes
91
-
92
- # Allow loading of arbitrary C extensions. Extensions are imported into the
93
- # active Python interpreter and may run arbitrary code.
94
- unsafe-load-any-extension=no
95
-
96
- # In verbose mode, extra non-checker-related info will be displayed.
97
- #verbose=
98
-
99
-
100
- [REPORTS]
101
-
102
- # Python expression which should return a score less than or equal to 10. You
103
- # have access to the variables 'fatal', 'error', 'warning', 'refactor',
104
- # 'convention', and 'info' which contain the number of messages in each
105
- # category, as well as 'statement' which is the total number of statements
106
- # analyzed. This score is used by the global evaluation report (RP0004).
107
- evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
108
-
109
- # Template used to display messages. This is a python new-style format string
110
- # used to format the message information. See doc for all details.
111
- msg-template=
112
-
113
- # Set the output format. Available formats are text, parseable, colorized, json
114
- # and msvs (visual studio). You can also give a reporter class, e.g.
115
- # mypackage.mymodule.MyReporterClass.
116
- #output-format=
117
-
118
- # Tells whether to display a full report or only the messages.
119
- reports=no
120
-
121
- # Activate the evaluation score.
122
- score=yes
123
-
124
-
125
- [MESSAGES CONTROL]
126
-
127
- # Only show warnings with the listed confidence levels. Leave empty to show
128
- # all. Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE,
129
- # UNDEFINED.
130
- confidence=HIGH,
131
- CONTROL_FLOW,
132
- INFERENCE,
133
- INFERENCE_FAILURE,
134
- UNDEFINED
135
-
136
- # Disable the message, report, category or checker with the given id(s). You
137
- # can either give multiple identifiers separated by comma (,) or put this
138
- # option multiple times (only on the command line, not in the configuration
139
- # file where it should appear only once). You can also use "--disable=all" to
140
- # disable everything first and then re-enable specific checks. For example, if
141
- # you want to run only the similarities checker, you can use "--disable=all
142
- # --enable=similarities". If you want to run only the classes checker, but have
143
- # no Warning level messages displayed, use "--disable=all --enable=classes
144
- # --disable=W".
145
- disable=raw-checker-failed,
146
- bad-inline-option,
147
- locally-disabled,
148
- file-ignored,
149
- suppressed-message,
150
- useless-suppression,
151
- deprecated-pragma,
152
- use-symbolic-message-instead,
153
- missing-module-docstring,
154
- missing-class-docstring,
155
- missing-function-docstring,
156
- logging-fstring-interpolation
157
-
158
- # Enable the message, report, category or checker with the given id(s). You can
159
- # either give multiple identifier separated by comma (,) or put this option
160
- # multiple time (only on the command line, not in the configuration file where
161
- # it should appear only once). See also the "--disable" option for examples.
162
- enable=c-extension-no-member
163
-
164
-
165
- [EXCEPTIONS]
166
-
167
- # Exceptions that will emit a warning when caught.
168
- overgeneral-exceptions=BaseException,
169
- Exception
170
-
171
-
172
- [STRING]
173
-
174
- # This flag controls whether inconsistent-quotes generates a warning when the
175
- # character used as a quote delimiter is used inconsistently within a module.
176
- check-quote-consistency=no
177
-
178
- # This flag controls whether the implicit-str-concat should generate a warning
179
- # on implicit string concatenation in sequences defined over several lines.
180
- check-str-concat-over-line-jumps=no
181
-
182
-
183
- [SPELLING]
184
-
185
- # Limits count of emitted suggestions for spelling mistakes.
186
- max-spelling-suggestions=4
187
-
188
- # Spelling dictionary name. Available dictionaries: none. To make it work,
189
- # install the 'python-enchant' package.
190
- spelling-dict=
191
-
192
- # List of comma separated words that should be considered directives if they
193
- # appear at the beginning of a comment and should not be checked.
194
- spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy:
195
-
196
- # List of comma separated words that should not be checked.
197
- spelling-ignore-words=
198
-
199
- # A path to a file that contains the private dictionary; one word per line.
200
- spelling-private-dict-file=
201
-
202
- # Tells whether to store unknown words to the private dictionary (see the
203
- # --spelling-private-dict-file option) instead of raising a message.
204
- spelling-store-unknown-words=no
205
-
206
-
207
- [IMPORTS]
208
-
209
- # List of modules that can be imported at any level, not just the top level
210
- # one.
211
- allow-any-import-level=
212
-
213
- # Allow wildcard imports from modules that define __all__.
214
- allow-wildcard-with-all=no
215
-
216
- # Deprecated modules which should not be used, separated by a comma.
217
- deprecated-modules=optparse,tkinter.tix
218
-
219
- # Output a graph (.gv or any supported image format) of external dependencies
220
- # to the given file (report RP0402 must not be disabled).
221
- ext-import-graph=
222
-
223
- # Output a graph (.gv or any supported image format) of all (i.e. internal and
224
- # external) dependencies to the given file (report RP0402 must not be
225
- # disabled).
226
- import-graph=
227
-
228
- # Output a graph (.gv or any supported image format) of internal dependencies
229
- # to the given file (report RP0402 must not be disabled).
230
- int-import-graph=
231
-
232
- # Force import order to recognize a module as part of the standard
233
- # compatibility libraries.
234
- known-standard-library=
235
-
236
- # Force import order to recognize a module as part of a third party library.
237
- known-third-party=enchant
238
-
239
- # Couples of modules and preferred modules, separated by a comma.
240
- preferred-modules=
241
-
242
-
243
- [REFACTORING]
244
-
245
- # Maximum number of nested blocks for function / method body
246
- max-nested-blocks=5
247
-
248
- # Complete name of functions that never returns. When checking for
249
- # inconsistent-return-statements if a never returning function is called then
250
- # it will be considered as an explicit return statement and no message will be
251
- # printed.
252
- never-returning-functions=sys.exit
253
-
254
-
255
- [MISCELLANEOUS]
256
-
257
- # List of note tags to take in consideration, separated by a comma.
258
- notes=FIXME,
259
- XXX,
260
- TODO
261
-
262
- # Regular expression of note tags to take in consideration.
263
- notes-rgx=
264
-
265
-
266
- [DESIGN]
267
-
268
- # List of regular expressions of class ancestor names to ignore when counting
269
- # public methods (see R0903)
270
- exclude-too-few-public-methods=
271
-
272
- # List of qualified class names to ignore when counting class parents (see
273
- # R0901)
274
- ignored-parents=
275
-
276
- # Maximum number of arguments for function / method.
277
- max-args=100
278
-
279
- # Maximum number of attributes for a class (see R0902).
280
- max-attributes=7
281
-
282
- # Maximum number of boolean expressions in an if statement (see R0916).
283
- max-bool-expr=5
284
-
285
- # Maximum number of branch for function / method body.
286
- max-branches=12
287
-
288
- # Maximum number of locals for function / method body.
289
- max-locals=15
290
-
291
- # Maximum number of parents for a class (see R0901).
292
- max-parents=7
293
-
294
- # Maximum number of public methods for a class (see R0904).
295
- max-public-methods=100
296
-
297
- # Maximum number of return / yield for function / method body.
298
- max-returns=6
299
-
300
- # Maximum number of statements in function / method body.
301
- max-statements=50
302
-
303
- # Minimum number of public methods for a class (see R0903).
304
- min-public-methods=0
305
-
306
-
307
- [VARIABLES]
308
-
309
- # List of additional names supposed to be defined in builtins. Remember that
310
- # you should avoid defining new builtins when possible.
311
- additional-builtins=
312
-
313
- # Tells whether unused global variables should be treated as a violation.
314
- allow-global-unused-variables=yes
315
-
316
- # List of names allowed to shadow builtins
317
- allowed-redefined-builtins=
318
-
319
- # List of strings which can identify a callback function by name. A callback
320
- # name must start or end with one of those strings.
321
- callbacks=cb_,
322
- _cb
323
-
324
- # A regular expression matching the name of dummy variables (i.e. expected to
325
- # not be used).
326
- dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
327
-
328
- # Argument names that match this expression will be ignored. Default to name
329
- # with leading underscore.
330
- ignored-argument-names=_.*|^ignored_|^unused_
331
-
332
- # Tells whether we should check for unused import in __init__ files.
333
- init-import=no
334
-
335
- # List of qualified module names which can have objects that can redefine
336
- # builtins.
337
- redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io
338
-
339
-
340
- [BASIC]
341
-
342
- # Naming style matching correct argument names.
343
- argument-naming-style=snake_case
344
-
345
- # Regular expression matching correct argument names. Overrides argument-
346
- # naming-style. If left empty, argument names will be checked with the set
347
- # naming style.
348
- #argument-rgx=
349
-
350
- # Naming style matching correct attribute names.
351
- attr-naming-style=snake_case
352
-
353
- # Regular expression matching correct attribute names. Overrides attr-naming-
354
- # style. If left empty, attribute names will be checked with the set naming
355
- # style.
356
- #attr-rgx=
357
-
358
- # Bad variable names which should always be refused, separated by a comma.
359
- bad-names=foo,
360
- bar,
361
- baz,
362
- toto,
363
- tutu,
364
- tata
365
-
366
- # Bad variable names regexes, separated by a comma. If names match any regex,
367
- # they will always be refused
368
- bad-names-rgxs=
369
-
370
- # Naming style matching correct class attribute names.
371
- class-attribute-naming-style=any
372
-
373
- # Regular expression matching correct class attribute names. Overrides class-
374
- # attribute-naming-style. If left empty, class attribute names will be checked
375
- # with the set naming style.
376
- #class-attribute-rgx=
377
-
378
- # Naming style matching correct class constant names.
379
- class-const-naming-style=UPPER_CASE
380
-
381
- # Regular expression matching correct class constant names. Overrides class-
382
- # const-naming-style. If left empty, class constant names will be checked with
383
- # the set naming style.
384
- #class-const-rgx=
385
-
386
- # Naming style matching correct class names.
387
- class-naming-style=PascalCase
388
-
389
- # Regular expression matching correct class names. Overrides class-naming-
390
- # style. If left empty, class names will be checked with the set naming style.
391
- #class-rgx=
392
-
393
- # Naming style matching correct constant names.
394
- const-naming-style=UPPER_CASE
395
-
396
- # Regular expression matching correct constant names. Overrides const-naming-
397
- # style. If left empty, constant names will be checked with the set naming
398
- # style.
399
- #const-rgx=
400
-
401
- # Minimum line length for functions/classes that require docstrings, shorter
402
- # ones are exempt.
403
- docstring-min-length=-1
404
-
405
- # Naming style matching correct function names.
406
- function-naming-style=snake_case
407
-
408
- # Regular expression matching correct function names. Overrides function-
409
- # naming-style. If left empty, function names will be checked with the set
410
- # naming style.
411
- #function-rgx=
412
-
413
- # Good variable names which should always be accepted, separated by a comma.
414
- good-names=i,
415
- j,
416
- k,
417
- ex,
418
- Run,
419
- _
420
-
421
- # Good variable names regexes, separated by a comma. If names match any regex,
422
- # they will always be accepted
423
- good-names-rgxs=
424
-
425
- # Include a hint for the correct naming format with invalid-name.
426
- include-naming-hint=no
427
-
428
- # Naming style matching correct inline iteration names.
429
- inlinevar-naming-style=any
430
-
431
- # Regular expression matching correct inline iteration names. Overrides
432
- # inlinevar-naming-style. If left empty, inline iteration names will be checked
433
- # with the set naming style.
434
- #inlinevar-rgx=
435
-
436
- # Naming style matching correct method names.
437
- method-naming-style=snake_case
438
-
439
- # Regular expression matching correct method names. Overrides method-naming-
440
- # style. If left empty, method names will be checked with the set naming style.
441
- #method-rgx=
442
-
443
- # Naming style matching correct module names.
444
- module-naming-style=snake_case
445
-
446
- # Regular expression matching correct module names. Overrides module-naming-
447
- # style. If left empty, module names will be checked with the set naming style.
448
- #module-rgx=
449
-
450
- # Colon-delimited sets of names that determine each other's naming style when
451
- # the name regexes allow several styles.
452
- name-group=
453
-
454
- # Regular expression which should only match function or class names that do
455
- # not require a docstring.
456
- no-docstring-rgx=^_
457
-
458
- # List of decorators that produce properties, such as abc.abstractproperty. Add
459
- # to this list to register other decorators that produce valid properties.
460
- # These decorators are taken in consideration only for invalid-name.
461
- property-classes=abc.abstractproperty
462
-
463
- # Regular expression matching correct type variable names. If left empty, type
464
- # variable names will be checked with the set naming style.
465
- #typevar-rgx=
466
-
467
- # Naming style matching correct variable names.
468
- variable-naming-style=snake_case
469
-
470
- # Regular expression matching correct variable names. Overrides variable-
471
- # naming-style. If left empty, variable names will be checked with the set
472
- # naming style.
473
- #variable-rgx=
474
-
475
-
476
- [CLASSES]
477
-
478
- # Warn about protected attribute access inside special methods
479
- check-protected-access-in-special-methods=no
480
-
481
- # List of method names used to declare (i.e. assign) instance attributes.
482
- defining-attr-methods=__init__,
483
- __new__,
484
- setUp,
485
- __post_init__
486
-
487
- # List of member names, which should be excluded from the protected access
488
- # warning.
489
- exclude-protected=_asdict,
490
- _fields,
491
- _replace,
492
- _source,
493
- _make
494
-
495
- # List of valid names for the first argument in a class method.
496
- valid-classmethod-first-arg=cls
497
-
498
- # List of valid names for the first argument in a metaclass class method.
499
- valid-metaclass-classmethod-first-arg=cls
500
-
501
-
502
- [FORMAT]
503
-
504
- # Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
505
- expected-line-ending-format=
506
-
507
- # Regexp for a line that is allowed to be longer than the limit.
508
- ignore-long-lines=^\s*(# )?<?https?://\S+>?$
509
-
510
- # Number of spaces of indent required inside a hanging or continued line.
511
- indent-after-paren=2
512
-
513
- # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
514
- # tab).
515
- indent-string=' '
516
-
517
- # Maximum number of characters on a single line.
518
- max-line-length=100
519
-
520
- # Maximum number of lines in a module.
521
- max-module-lines=1000
522
-
523
- # Allow the body of a class to be on the same line as the declaration if body
524
- # contains single statement.
525
- single-line-class-stmt=no
526
-
527
- # Allow the body of an if to be on the same line as the test if there is no
528
- # else.
529
- single-line-if-stmt=no
530
-
531
-
532
- [LOGGING]
533
-
534
- # The type of string formatting that logging methods do. `old` means using %
535
- # formatting, `new` is for `{}` formatting.
536
- logging-format-style=old
537
-
538
- # Logging modules to check that the string format arguments are in logging
539
- # function parameter format.
540
- logging-modules=logging
541
-
542
-
543
- [TYPECHECK]
544
-
545
- # List of decorators that produce context managers, such as
546
- # contextlib.contextmanager. Add to this list to register other decorators that
547
- # produce valid context managers.
548
- contextmanager-decorators=contextlib.contextmanager
549
-
550
- # List of members which are set dynamically and missed by pylint inference
551
- # system, and so shouldn't trigger E1101 when accessed. Python regular
552
- # expressions are accepted.
553
- generated-members=numpy.* ,torch.*
554
-
555
- # Tells whether to warn about missing members when the owner of the attribute
556
- # is inferred to be None.
557
- ignore-none=yes
558
-
559
- # This flag controls whether pylint should warn about no-member and similar
560
- # checks whenever an opaque object is returned when inferring. The inference
561
- # can return multiple potential results while evaluating a Python object, but
562
- # some branches might not be evaluated, which results in partial inference. In
563
- # that case, it might be useful to still emit no-member and other checks for
564
- # the rest of the inferred objects.
565
- ignore-on-opaque-inference=yes
566
-
567
- # List of symbolic message names to ignore for Mixin members.
568
- ignored-checks-for-mixins=no-member,
569
- not-async-context-manager,
570
- not-context-manager,
571
- attribute-defined-outside-init
572
-
573
- # List of class names for which member attributes should not be checked (useful
574
- # for classes with dynamically set attributes). This supports the use of
575
- # qualified names.
576
- ignored-classes=optparse.Values,thread._local,_thread._local
577
-
578
- # Show a hint with possible names when a member name was not found. The aspect
579
- # of finding the hint is based on edit distance.
580
- missing-member-hint=yes
581
-
582
- # The minimum edit distance a name should have in order to be considered a
583
- # similar match for a missing member name.
584
- missing-member-hint-distance=1
585
-
586
- # The total number of similar names that should be taken in consideration when
587
- # showing a hint for a missing member.
588
- missing-member-max-choices=1
589
-
590
- # Regex pattern to define which classes are considered mixins.
591
- mixin-class-rgx=.*[Mm]ixin
592
-
593
- # List of decorators that change the signature of a decorated function.
594
- signature-mutators=
595
-
596
-
597
- [SIMILARITIES]
598
-
599
- # Comments are removed from the similarity computation
600
- ignore-comments=yes
601
-
602
- # Docstrings are removed from the similarity computation
603
- ignore-docstrings=yes
604
-
605
- # Imports are removed from the similarity computation
606
- ignore-imports=no
607
-
608
- # Signatures are removed from the similarity computation
609
- ignore-signatures=yes
610
-
611
- # Minimum lines number of a similarity.
612
- min-similarity-lines=4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
requirements.txt CHANGED
@@ -1,135 +1 @@
1
- aiofiles==23.2.1
2
- altair==5.3.0
3
- annotated-types==0.6.0
4
- anyio==4.3.0
5
- attrs==23.2.0
6
- audioread==3.0.1
7
- Authlib==1.3.0
8
- beautifulsoup4==4.12.3
9
- certifi==2024.2.2
10
- cffi==1.16.0
11
- charset-normalizer==3.3.2
12
- click==8.1.7
13
- contourpy==1.2.1
14
- cryptography==42.0.5
15
- cycler==0.12.1
16
- decorator==5.1.1
17
- dict-from-dict==0.0.4
18
- dict-from-g2pE==0.0.2
19
- Distance==0.1.3
20
- en-tts==0.0.1
21
- english-text-normalization==0.0.3
22
- fastapi==0.110.1
23
- fastdtw==0.3.4
24
- ffmpy==0.3.2
25
- filelock==3.13.4
26
- fonttools==4.51.0
27
- fsspec==2024.3.1
28
- g2p-en==2.1.0
29
- gdown==5.1.0
30
- gradio==4.26.0
31
- gradio_client==0.15.1
32
- h11==0.14.0
33
- httpcore==1.0.5
34
- httpx==0.27.0
35
- huggingface-hub==0.22.2
36
- idna==3.7
37
- imageio==2.34.0
38
- importlib_resources==6.4.0
39
- inflect==7.2.0
40
- itsdangerous==2.2.0
41
- Jinja2==3.1.3
42
- joblib==1.4.0
43
- jsonschema==4.21.1
44
- jsonschema-specifications==2023.12.1
45
- kiwisolver==1.4.5
46
- lazy_loader==0.4
47
- librosa==0.10.1
48
- llvmlite==0.42.0
49
- markdown-it-py==3.0.0
50
- MarkupSafe==2.1.5
51
- matplotlib==3.8.4
52
- mdurl==0.1.2
53
- mel-cepstral-distance==0.0.3
54
- more-itertools==10.2.0
55
- mpmath==1.3.0
56
- msgpack==1.0.8
57
- networkx==3.3
58
- nltk==3.8.1
59
- numba==0.59.1
60
- numpy==1.26.4
61
- nvidia-cublas-cu12==12.1.3.1
62
- nvidia-cuda-cupti-cu12==12.1.105
63
- nvidia-cuda-nvrtc-cu12==12.1.105
64
- nvidia-cuda-runtime-cu12==12.1.105
65
- nvidia-cudnn-cu12==8.9.2.26
66
- nvidia-cufft-cu12==11.0.2.54
67
- nvidia-curand-cu12==10.3.2.106
68
- nvidia-cusolver-cu12==11.4.5.107
69
- nvidia-cusparse-cu12==12.1.0.106
70
- nvidia-nccl-cu12==2.19.3
71
- nvidia-nvjitlink-cu12==12.4.127
72
- nvidia-nvtx-cu12==12.1.105
73
- ordered-set==4.1.0
74
- orjson==3.10.1
75
- packaging==24.0
76
- pandas==2.2.2
77
- pillow==10.3.0
78
- platformdirs==4.2.0
79
- plotly==5.20.0
80
- pooch==1.8.1
81
- pronunciation-dictionary==0.0.6
82
- pronunciation-dictionary-utils==0.0.5
83
- pycparser==2.22
84
- pydantic==2.7.0
85
- pydantic_core==2.18.1
86
- pydub==0.25.1
87
- pyenchant==3.2.2
88
- Pygments==2.17.2
89
- pyparsing==3.1.2
90
- PySocks==1.7.1
91
- python-dateutil==2.9.0.post0
92
- python-multipart==0.0.9
93
- pytz==2024.1
94
- PyYAML==6.0.1
95
- referencing==0.34.0
96
- regex==2024.4.16
97
- requests==2.31.0
98
- rich==13.7.1
99
- rpds-py==0.18.0
100
- ruff==0.3.7
101
- scikit-image==0.23.1
102
- scikit-learn==1.4.2
103
- scipy==1.13.0
104
- semantic-version==2.10.0
105
- shellingham==1.5.4
106
- six==1.16.0
107
- sniffio==1.3.1
108
- soundfile==0.12.1
109
- soupsieve==2.5
110
- soxr==0.3.7
111
- speech-dataset-parser==0.0.4
112
- starlette==0.37.2
113
- sympy==1.12
114
- tacotron-cli==0.0.5
115
- tenacity==8.2.3
116
- TextGrid==1.6.1
117
- threadpoolctl==3.4.0
118
- tifffile==2024.2.12
119
- tomlkit==0.12.0
120
- toolz==0.12.1
121
- torch==2.2.2
122
- tqdm==4.66.2
123
- triton==2.2.0
124
- txt-utils==0.0.3
125
- typeguard==4.2.1
126
- typer==0.12.3
127
- typing_extensions==4.11.0
128
- tzdata==2024.1
129
- Unidecode==1.3.8
130
- urllib3==2.2.1
131
- uvicorn==0.29.0
132
- waveglow-cli==0.0.2
133
- websockets==11.0.3
134
- wget==3.2
135
- word-to-pronunciation==0.0.1
 
1
+ en-tts>=0.0.2