Spaces:
Sleeping
Sleeping
stefantaubert
commited on
Commit
•
fcf3f99
1
Parent(s):
f7244fb
update
Browse files- CODE_OF_CONDUCT.md +0 -132
- CONTRIBUTING.md +0 -3
- LICENSE +0 -21
- Pipfile +1 -4
- Pipfile.lock +704 -60
- README.md +17 -3
- app.py +23 -16
- app_old.py +0 -81
- en_tts_app/__init__.py +0 -5
- en_tts_app/app.py +0 -88
- en_tts_app/globals.py +0 -21
- en_tts_app/helper.py +0 -11
- en_tts_app/logging_configuration.py +0 -139
- en_tts_app/main.py +0 -191
- en_tts_app/py.typed +0 -0
- en_tts_gr/__init__.py +0 -1
- en_tts_gr/app.py +0 -311
- en_tts_gr/py.typed +0 -0
- pylintrc +0 -612
- requirements.txt +1 -135
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.
|
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": "
|
5 |
},
|
6 |
"pipfile-spec": 6,
|
7 |
"requires": {
|
@@ -9,9 +9,9 @@
|
|
9 |
},
|
10 |
"sources": [
|
11 |
{
|
12 |
-
"name": "
|
13 |
"url": "https://pypi.org/simple",
|
14 |
-
"verify_ssl":
|
15 |
}
|
16 |
]
|
17 |
},
|
@@ -142,7 +142,7 @@
|
|
142 |
"sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956",
|
143 |
"sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"
|
144 |
],
|
145 |
-
"markers": "
|
146 |
"version": "==1.16.0"
|
147 |
},
|
148 |
"charset-normalizer": {
|
@@ -377,12 +377,12 @@
|
|
377 |
},
|
378 |
"en-tts": {
|
379 |
"hashes": [
|
380 |
-
"sha256:
|
381 |
-
"sha256:
|
382 |
],
|
383 |
-
"index": "
|
384 |
"markers": "python_version < '3.12' and python_version >= '3.8'",
|
385 |
-
"version": "==0.0.
|
386 |
},
|
387 |
"english-text-normalization": {
|
388 |
"hashes": [
|
@@ -394,11 +394,11 @@
|
|
394 |
},
|
395 |
"fastapi": {
|
396 |
"hashes": [
|
397 |
-
"sha256:
|
398 |
-
"sha256:
|
399 |
],
|
400 |
"markers": "python_version >= '3.8'",
|
401 |
-
"version": "==0.110.
|
402 |
},
|
403 |
"fastdtw": {
|
404 |
"hashes": [
|
@@ -497,11 +497,11 @@
|
|
497 |
"oauth"
|
498 |
],
|
499 |
"hashes": [
|
500 |
-
"sha256:
|
501 |
-
"sha256:
|
502 |
],
|
503 |
"markers": "python_version >= '3.8'",
|
504 |
-
"version": "==4.
|
505 |
},
|
506 |
"gradio-client": {
|
507 |
"hashes": [
|
@@ -553,11 +553,11 @@
|
|
553 |
},
|
554 |
"imageio": {
|
555 |
"hashes": [
|
556 |
-
"sha256:
|
557 |
-
"sha256:
|
558 |
],
|
559 |
"markers": "python_version >= '3.8'",
|
560 |
-
"version": "==2.34.
|
561 |
},
|
562 |
"importlib-resources": {
|
563 |
"hashes": [
|
@@ -1340,11 +1340,11 @@
|
|
1340 |
},
|
1341 |
"plotly": {
|
1342 |
"hashes": [
|
1343 |
-
"sha256:
|
1344 |
-
"sha256:
|
1345 |
],
|
1346 |
"markers": "python_version >= '3.8'",
|
1347 |
-
"version": "==5.
|
1348 |
},
|
1349 |
"pooch": {
|
1350 |
"hashes": [
|
@@ -1825,48 +1825,48 @@
|
|
1825 |
},
|
1826 |
"ruff": {
|
1827 |
"hashes": [
|
1828 |
-
"sha256:
|
1829 |
-
"sha256:
|
1830 |
-
"sha256:
|
1831 |
-
"sha256:
|
1832 |
-
"sha256:
|
1833 |
-
"sha256:
|
1834 |
-
"sha256:
|
1835 |
-
"sha256:
|
1836 |
-
"sha256:
|
1837 |
-
"sha256:
|
1838 |
-
"sha256:
|
1839 |
-
"sha256:
|
1840 |
-
"sha256:
|
1841 |
-
"sha256:
|
1842 |
-
"sha256:
|
1843 |
-
"sha256:
|
1844 |
-
"sha256:
|
1845 |
],
|
1846 |
"markers": "sys_platform != 'emscripten'",
|
1847 |
-
"version": "==0.
|
1848 |
},
|
1849 |
"scikit-image": {
|
1850 |
"hashes": [
|
1851 |
-
"sha256:
|
1852 |
-
"sha256:
|
1853 |
-
"sha256:
|
1854 |
-
"sha256:
|
1855 |
-
"sha256:
|
1856 |
-
"sha256:
|
1857 |
-
"sha256:
|
1858 |
-
"sha256:
|
1859 |
-
"sha256:
|
1860 |
-
"sha256:
|
1861 |
-
"sha256:
|
1862 |
-
"sha256:
|
1863 |
-
"sha256:
|
1864 |
-
"sha256:
|
1865 |
-
"sha256:
|
1866 |
-
"sha256:
|
1867 |
],
|
1868 |
"markers": "python_version >= '3.10'",
|
1869 |
-
"version": "==0.23.
|
1870 |
},
|
1871 |
"scikit-learn": {
|
1872 |
"hashes": [
|
@@ -2071,11 +2071,11 @@
|
|
2071 |
},
|
2072 |
"tifffile": {
|
2073 |
"hashes": [
|
2074 |
-
"sha256:
|
2075 |
-
"sha256:
|
2076 |
],
|
2077 |
"markers": "python_version >= '3.9'",
|
2078 |
-
"version": "==2024.
|
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:
|
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 |
-
|
|
|
|
|
|
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
|
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 |
-
|
12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
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 |
-
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|