nkululeko 0.95.1__py3-none-any.whl → 0.95.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nkululeko/constants.py +1 -1
- nkululeko/feat_extract/feats_mld.py +13 -5
- nkululeko/feature_extractor.py +5 -0
- nkululeko/optim.py +931 -0
- nkululeko/tests/test_optim.py +200 -0
- nkululeko-0.95.2.dist-info/METADATA +376 -0
- {nkululeko-0.95.1.dist-info → nkululeko-0.95.2.dist-info}/RECORD +11 -9
- nkululeko-0.95.1.dist-info/METADATA +0 -76
- {nkululeko-0.95.1.dist-info → nkululeko-0.95.2.dist-info}/WHEEL +0 -0
- {nkululeko-0.95.1.dist-info → nkululeko-0.95.2.dist-info}/entry_points.txt +0 -0
- {nkululeko-0.95.1.dist-info → nkululeko-0.95.2.dist-info}/licenses/LICENSE +0 -0
- {nkululeko-0.95.1.dist-info → nkululeko-0.95.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,200 @@
|
|
1
|
+
import pytest
|
2
|
+
from unittest.mock import MagicMock, patch
|
3
|
+
from nkululeko.optim import OptimizationRunner
|
4
|
+
|
5
|
+
@pytest.fixture
|
6
|
+
def mock_config():
|
7
|
+
# Minimal configparser.ConfigParser mock
|
8
|
+
config = MagicMock()
|
9
|
+
config.__contains__.side_effect = lambda x: x in ["OPTIM", "MODEL", "DATA"]
|
10
|
+
config.__getitem__.side_effect = lambda x: {
|
11
|
+
"OPTIM": {"model": "svm", "search_strategy": "grid", "n_iter": "2", "cv_folds": "2"},
|
12
|
+
"MODEL": {"type": "svm"},
|
13
|
+
"DATA": {"target": "label"}
|
14
|
+
}[x]
|
15
|
+
config.get.side_effect = lambda section, option, fallback=None: {
|
16
|
+
("MODEL", "tuning_params"): None,
|
17
|
+
("DATA", "target"): "label"
|
18
|
+
}.get((section, option), fallback)
|
19
|
+
config.add_section = MagicMock()
|
20
|
+
config.remove_option = MagicMock()
|
21
|
+
config.set = MagicMock()
|
22
|
+
return config
|
23
|
+
|
24
|
+
@pytest.fixture
|
25
|
+
def runner(mock_config):
|
26
|
+
runner = OptimizationRunner(mock_config)
|
27
|
+
runner.util = MagicMock()
|
28
|
+
runner.util.high_is_good.return_value = True
|
29
|
+
runner.util.exp_is_classification.return_value = True
|
30
|
+
runner.util.debug = MagicMock()
|
31
|
+
runner.util.error = MagicMock()
|
32
|
+
runner.save_results = MagicMock()
|
33
|
+
runner.search_strategy = "grid"
|
34
|
+
runner.n_iter = 2
|
35
|
+
runner.cv_folds = 2
|
36
|
+
runner.model_type = "svm"
|
37
|
+
return runner
|
38
|
+
|
39
|
+
@pytest.fixture
|
40
|
+
def param_specs():
|
41
|
+
return {"C": [0.1, 1.0], "kernel": ["linear", "rbf"]}
|
42
|
+
|
43
|
+
def test_run_sklearn_optimization_grid(runner, param_specs):
|
44
|
+
with patch("sklearn.model_selection.GridSearchCV") as mock_GridSearchCV, \
|
45
|
+
patch("nkululeko.models.model.Model") as mock_Model, \
|
46
|
+
patch("nkululeko.glob_conf.config", runner.config), \
|
47
|
+
patch("nkululeko.models.model_svm.SVM_model") as mock_SVM:
|
48
|
+
|
49
|
+
# Mock the experiment module and its Experiment class
|
50
|
+
mock_exp_module = MagicMock()
|
51
|
+
mock_expr = MagicMock()
|
52
|
+
mock_expr.df_train = {"label": [0, 1, 0, 1]}
|
53
|
+
mock_expr.df_test = {}
|
54
|
+
mock_expr.feats_train = [[1, 2], [2, 3], [3, 4], [4, 5]]
|
55
|
+
mock_expr.feats_test = [[1, 2], [2, 3]]
|
56
|
+
mock_exp_module.Experiment.return_value = mock_expr
|
57
|
+
|
58
|
+
# Mock sys.modules to return our mock when importing nkululeko.experiment
|
59
|
+
with patch.dict('sys.modules', {'nkululeko.experiment': mock_exp_module}):
|
60
|
+
mock_model_instance = MagicMock()
|
61
|
+
# Create a mock classifier that sklearn recognizes
|
62
|
+
mock_clf = MagicMock()
|
63
|
+
mock_clf.__sklearn_tags__ = MagicMock(return_value=MagicMock(estimator_type="classifier"))
|
64
|
+
mock_model_instance.clf = mock_clf
|
65
|
+
mock_Model.create.return_value = mock_model_instance
|
66
|
+
mock_SVM.return_value = mock_model_instance
|
67
|
+
|
68
|
+
# Mock GridSearchCV
|
69
|
+
mock_search = MagicMock()
|
70
|
+
mock_search.best_params_ = {"C": 1.0, "kernel": "linear"}
|
71
|
+
mock_search.best_score_ = 0.9
|
72
|
+
mock_search.cv_results_ = {
|
73
|
+
"params": [{"C": 0.1, "kernel": "linear"}, {"C": 1.0, "kernel": "linear"}],
|
74
|
+
"mean_test_score": [0.8, 0.9]
|
75
|
+
}
|
76
|
+
mock_GridSearchCV.return_value = mock_search
|
77
|
+
|
78
|
+
best_params, best_score, all_results = runner._run_sklearn_optimization(param_specs)
|
79
|
+
|
80
|
+
assert best_params == {"C": 1.0, "kernel": "linear"}
|
81
|
+
assert best_score == 0.9
|
82
|
+
assert isinstance(all_results, list)
|
83
|
+
assert all("params" in r and "score" in r for r in all_results)
|
84
|
+
runner.save_results.assert_called_once()
|
85
|
+
|
86
|
+
def test_run_sklearn_optimization_random(runner, param_specs):
|
87
|
+
runner.search_strategy = "random"
|
88
|
+
with patch("sklearn.model_selection.RandomizedSearchCV") as mock_RandomizedSearchCV, \
|
89
|
+
patch("nkululeko.models.model.Model") as mock_Model, \
|
90
|
+
patch("nkululeko.glob_conf.config", runner.config), \
|
91
|
+
patch("nkululeko.models.model_svm.SVM_model") as mock_SVM:
|
92
|
+
|
93
|
+
# Mock the experiment module and its Experiment class
|
94
|
+
mock_exp_module = MagicMock()
|
95
|
+
mock_expr = MagicMock()
|
96
|
+
mock_expr.df_train = {"label": [0, 1, 0, 1]}
|
97
|
+
mock_expr.df_test = {}
|
98
|
+
mock_expr.feats_train = [[1, 2], [2, 3], [3, 4], [4, 5]]
|
99
|
+
mock_expr.feats_test = [[1, 2], [2, 3]]
|
100
|
+
mock_exp_module.Experiment.return_value = mock_expr
|
101
|
+
|
102
|
+
# Mock sys.modules to return our mock when importing nkululeko.experiment
|
103
|
+
with patch.dict('sys.modules', {'nkululeko.experiment': mock_exp_module}):
|
104
|
+
mock_model_instance = MagicMock()
|
105
|
+
# Create a mock classifier that sklearn recognizes
|
106
|
+
mock_clf = MagicMock()
|
107
|
+
mock_clf.__sklearn_tags__ = MagicMock(return_value=MagicMock(estimator_type="classifier"))
|
108
|
+
mock_model_instance.clf = mock_clf
|
109
|
+
mock_Model.create.return_value = mock_model_instance
|
110
|
+
mock_SVM.return_value = mock_model_instance
|
111
|
+
|
112
|
+
mock_search = MagicMock()
|
113
|
+
mock_search.best_params_ = {"C": 0.1, "kernel": "rbf"}
|
114
|
+
mock_search.best_score_ = 0.85
|
115
|
+
mock_search.cv_results_ = {
|
116
|
+
"params": [{"C": 0.1, "kernel": "rbf"}, {"C": 1.0, "kernel": "rbf"}],
|
117
|
+
"mean_test_score": [0.85, 0.82]
|
118
|
+
}
|
119
|
+
mock_RandomizedSearchCV.return_value = mock_search
|
120
|
+
|
121
|
+
best_params, best_score, all_results = runner._run_sklearn_optimization(param_specs)
|
122
|
+
|
123
|
+
assert best_params == {"C": 0.1, "kernel": "rbf"}
|
124
|
+
assert best_score == 0.85
|
125
|
+
assert isinstance(all_results, list)
|
126
|
+
assert all("params" in r and "score" in r for r in all_results)
|
127
|
+
runner.save_results.assert_called_once()
|
128
|
+
|
129
|
+
def test_parameter_mapping(runner):
|
130
|
+
"""Test that parameters are correctly mapped for sklearn compatibility."""
|
131
|
+
# Test SVM parameter mapping
|
132
|
+
param_specs = {"c_val": [0.1, 1.0, 10.0], "kernel": ["linear", "rbf"]}
|
133
|
+
sklearn_params = runner._convert_to_sklearn_params(param_specs)
|
134
|
+
|
135
|
+
# Check that c_val was mapped to C
|
136
|
+
assert "C" in sklearn_params
|
137
|
+
assert "c_val" not in sklearn_params
|
138
|
+
assert sklearn_params["C"] == [0.1, 1.0, 10.0]
|
139
|
+
assert sklearn_params["kernel"] == ["linear", "rbf"]
|
140
|
+
|
141
|
+
# Test KNN parameter mapping
|
142
|
+
param_specs = {"K_val": [3, 5, 7], "KNN_weights": ["uniform", "distance"]}
|
143
|
+
sklearn_params = runner._convert_to_sklearn_params(param_specs)
|
144
|
+
|
145
|
+
# Check that K_val was mapped to n_neighbors and KNN_weights to weights
|
146
|
+
assert "n_neighbors" in sklearn_params
|
147
|
+
assert "weights" in sklearn_params
|
148
|
+
assert "K_val" not in sklearn_params
|
149
|
+
assert "KNN_weights" not in sklearn_params
|
150
|
+
assert sklearn_params["n_neighbors"] == [3, 5, 7]
|
151
|
+
assert sklearn_params["weights"] == ["uniform", "distance"]
|
152
|
+
|
153
|
+
def test_run_sklearn_optimization_grid_strategy(runner, param_specs):
|
154
|
+
# Test that the system works with grid strategy (simpler than testing import errors)
|
155
|
+
# This ensures the fallback logic is accessible and the basic functionality works
|
156
|
+
runner.search_strategy = "grid" # Use a safe strategy instead of halving_grid
|
157
|
+
|
158
|
+
with patch("sklearn.model_selection.GridSearchCV") as mock_GridSearchCV, \
|
159
|
+
patch("nkululeko.models.model.Model") as mock_Model, \
|
160
|
+
patch("nkululeko.glob_conf.config", runner.config), \
|
161
|
+
patch("nkululeko.models.model_svm.SVM_model") as mock_SVM:
|
162
|
+
|
163
|
+
# Mock the experiment module and its Experiment class
|
164
|
+
mock_exp_module = MagicMock()
|
165
|
+
mock_expr = MagicMock()
|
166
|
+
mock_expr.df_train = {"label": [0, 1, 0, 1]}
|
167
|
+
mock_expr.df_test = {}
|
168
|
+
mock_expr.feats_train = [[1, 2], [2, 3], [3, 4], [4, 5]]
|
169
|
+
mock_expr.feats_test = [[1, 2], [2, 3]]
|
170
|
+
mock_exp_module.Experiment.return_value = mock_expr
|
171
|
+
|
172
|
+
# Mock sys.modules to return our mock when importing nkululeko.experiment
|
173
|
+
with patch.dict('sys.modules', {'nkululeko.experiment': mock_exp_module}):
|
174
|
+
|
175
|
+
mock_model_instance = MagicMock()
|
176
|
+
# Create a mock classifier that sklearn recognizes
|
177
|
+
mock_clf = MagicMock()
|
178
|
+
mock_clf.__sklearn_tags__ = MagicMock(return_value=MagicMock(estimator_type="classifier"))
|
179
|
+
mock_model_instance.clf = mock_clf
|
180
|
+
mock_Model.create.return_value = mock_model_instance
|
181
|
+
mock_SVM.return_value = mock_model_instance
|
182
|
+
|
183
|
+
mock_search = MagicMock()
|
184
|
+
mock_search.best_params_ = {"C": 1.0, "kernel": "linear"}
|
185
|
+
mock_search.best_score_ = 0.9
|
186
|
+
mock_search.cv_results_ = {
|
187
|
+
"params": [{"C": 0.1, "kernel": "linear"}, {"C": 1.0, "kernel": "linear"}],
|
188
|
+
"mean_test_score": [0.8, 0.9]
|
189
|
+
}
|
190
|
+
mock_GridSearchCV.return_value = mock_search
|
191
|
+
|
192
|
+
best_params, best_score, all_results = runner._run_sklearn_optimization(param_specs)
|
193
|
+
|
194
|
+
assert best_params == {"C": 1.0, "kernel": "linear"}
|
195
|
+
assert best_score == 0.9
|
196
|
+
assert isinstance(all_results, list)
|
197
|
+
assert all("params" in r and "score" in r for r in all_results)
|
198
|
+
runner.save_results.assert_called_once()
|
199
|
+
# Verify that GridSearchCV was used (not HalvingGridSearchCV)
|
200
|
+
mock_GridSearchCV.assert_called_once()
|
@@ -0,0 +1,376 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: nkululeko
|
3
|
+
Version: 0.95.2
|
4
|
+
Summary: Machine learning audio prediction experiments based on templates
|
5
|
+
Home-page: https://github.com/felixbur/nkululeko
|
6
|
+
Author: Felix Burkhardt
|
7
|
+
Author-email: Felix Burkhardt <fxburk@gmail.com>
|
8
|
+
License: MIT
|
9
|
+
Project-URL: Homepage, https://github.com/felixbur/nkululeko
|
10
|
+
Project-URL: Repository, https://github.com/felixbur/nkululeko
|
11
|
+
Project-URL: Documentation, https://github.com/felixbur/nkululeko
|
12
|
+
Project-URL: Issues, https://github.com/felixbur/nkululeko/issues
|
13
|
+
Keywords: machine learning,audio,emotion recognition,speech processing
|
14
|
+
Classifier: Development Status :: 4 - Beta
|
15
|
+
Classifier: Intended Audience :: Developers
|
16
|
+
Classifier: Intended Audience :: Science/Research
|
17
|
+
Classifier: License :: OSI Approved :: MIT License
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
19
|
+
Classifier: Programming Language :: Python :: 3.9
|
20
|
+
Classifier: Programming Language :: Python :: 3.10
|
21
|
+
Classifier: Programming Language :: Python :: 3.11
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
23
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
24
|
+
Classifier: Topic :: Multimedia :: Sound/Audio :: Analysis
|
25
|
+
Requires-Python: >=3.9
|
26
|
+
Description-Content-Type: text/markdown
|
27
|
+
License-File: LICENSE
|
28
|
+
Requires-Dist: audeer>=1.0.0
|
29
|
+
Requires-Dist: audformat>=1.3.1
|
30
|
+
Requires-Dist: audinterface>=1.0.0
|
31
|
+
Requires-Dist: audiofile>=1.0.0
|
32
|
+
Requires-Dist: audiomentations==0.31.0
|
33
|
+
Requires-Dist: audmetric>=1.0.0
|
34
|
+
Requires-Dist: audonnx>=0.7.0
|
35
|
+
Requires-Dist: confidence-intervals>=0.0.2
|
36
|
+
Requires-Dist: datasets>=2.0.0
|
37
|
+
Requires-Dist: imageio>=2.0.0
|
38
|
+
Requires-Dist: matplotlib>=3.0.0
|
39
|
+
Requires-Dist: numpy>=1.20.0
|
40
|
+
Requires-Dist: opensmile>=2.0.0
|
41
|
+
Requires-Dist: pandas>=1.0.0
|
42
|
+
Requires-Dist: praat-parselmouth>=0.4.0
|
43
|
+
Requires-Dist: scikit-learn>=1.0.0
|
44
|
+
Requires-Dist: scipy>=1.0.0
|
45
|
+
Requires-Dist: seaborn>=0.11.0
|
46
|
+
Requires-Dist: sounddevice>=0.4.0
|
47
|
+
Requires-Dist: transformers>=4.0.0
|
48
|
+
Requires-Dist: umap-learn>=0.5.0
|
49
|
+
Requires-Dist: xgboost>=1.0.0
|
50
|
+
Requires-Dist: pylatex>=1.0.0
|
51
|
+
Provides-Extra: torch
|
52
|
+
Requires-Dist: torch>=1.0.0; extra == "torch"
|
53
|
+
Requires-Dist: torchvision>=0.10.0; extra == "torch"
|
54
|
+
Requires-Dist: torchaudio>=0.10.0; extra == "torch"
|
55
|
+
Provides-Extra: torch-cpu
|
56
|
+
Requires-Dist: torch>=1.0.0; extra == "torch-cpu"
|
57
|
+
Requires-Dist: torchvision>=0.10.0; extra == "torch-cpu"
|
58
|
+
Requires-Dist: torchaudio>=0.10.0; extra == "torch-cpu"
|
59
|
+
Provides-Extra: spotlight
|
60
|
+
Requires-Dist: renumics-spotlight>=1.6.13; extra == "spotlight"
|
61
|
+
Requires-Dist: sliceguard>=0.0.35; extra == "spotlight"
|
62
|
+
Provides-Extra: tensorflow
|
63
|
+
Requires-Dist: tensorflow>=2.0.0; extra == "tensorflow"
|
64
|
+
Requires-Dist: tensorflow-hub>=0.12.0; extra == "tensorflow"
|
65
|
+
Provides-Extra: all
|
66
|
+
Requires-Dist: torch>=1.0.0; extra == "all"
|
67
|
+
Requires-Dist: torchvision>=0.10.0; extra == "all"
|
68
|
+
Requires-Dist: torchaudio>=0.10.0; extra == "all"
|
69
|
+
Requires-Dist: renumics-spotlight>=1.6.13; extra == "all"
|
70
|
+
Requires-Dist: sliceguard>=0.0.35; extra == "all"
|
71
|
+
Requires-Dist: tensorflow>=2.0.0; extra == "all"
|
72
|
+
Requires-Dist: tensorflow-hub>=0.12.0; extra == "all"
|
73
|
+
Requires-Dist: shap>=0.40.0; extra == "all"
|
74
|
+
Requires-Dist: imblearn>=0.0.0; extra == "all"
|
75
|
+
Requires-Dist: cylimiter>=0.0.1; extra == "all"
|
76
|
+
Requires-Dist: audtorch>=0.0.1; extra == "all"
|
77
|
+
Requires-Dist: splitutils>=0.0.1; extra == "all"
|
78
|
+
Dynamic: author
|
79
|
+
Dynamic: home-page
|
80
|
+
Dynamic: license-file
|
81
|
+
Dynamic: requires-python
|
82
|
+
|
83
|
+
## Nkululeko
|
84
|
+
|
85
|
+
Nkululeko is a project to detect speaker characteristics by machine learning experiments with a high-level interface. The idea is to have a framework (based on e.g. sklearn and torch) that can be used to rapidly and automatically analyse audio data and explore machine learning models based on that data.
|
86
|
+
|
87
|
+
Some abilities that Nkululeko provides: combines acoustic features and machine learning models (including feature selection and features concatenation); performs data exploration, selection and visualization the results; finetuning; ensemble learning models; soft labeling (predicting labels with pre-trained model); and inference the model on a test set.
|
88
|
+
|
89
|
+
Nkululeko orchestrates data loading, feature extraction, and model training, allowing you to specify your experiment in a configuration file. The framework handles the process from raw data to trained model and evaluation, making it easy to run machine learning experiments without directly coding in Python.
|
90
|
+
|
91
|
+
## Who is this for?
|
92
|
+
Nkululeko is for speech processing learners, researchers and ML practitioners focused on speaker characteristics, e.g., emotion, age, gender, or disorder detection.
|
93
|
+
|
94
|
+
## Installation
|
95
|
+
|
96
|
+
Nkululeko requires Python 3.9 or higher with the following build status:
|
97
|
+
|
98
|
+

|
99
|
+

|
100
|
+

|
101
|
+

|
102
|
+
|
103
|
+
Create and activate a virtual Python environment and simply install Nkululeko:
|
104
|
+
|
105
|
+
```bash
|
106
|
+
# using python venv
|
107
|
+
python -m venv .env
|
108
|
+
source .env/bin/activate # specify OS versions, add a separate line for Windows users
|
109
|
+
pip install nkululeko
|
110
|
+
# using uv in development mode
|
111
|
+
uv venv --python 3.12
|
112
|
+
source .venv/bin/activate
|
113
|
+
uv pip install -r requirements.txt
|
114
|
+
# or run directly using uv run after cloning
|
115
|
+
uv run python -m nkululeko.nkululeko --config examples/exp_polish_tree.ini
|
116
|
+
```
|
117
|
+
|
118
|
+
### Optional Dependencies
|
119
|
+
|
120
|
+
Nkululeko supports optional dependencies through extras:
|
121
|
+
|
122
|
+
```bash
|
123
|
+
# Install with PyTorch support
|
124
|
+
pip install nkululeko[torch]
|
125
|
+
|
126
|
+
# Install with CPU-only PyTorch
|
127
|
+
pip install nkululeko[torch-cpu]
|
128
|
+
|
129
|
+
# Install with TensorFlow support
|
130
|
+
pip install nkululeko[tensorflow]
|
131
|
+
|
132
|
+
# Install all optional dependencies
|
133
|
+
pip install nkululeko[all]
|
134
|
+
```
|
135
|
+
|
136
|
+
#### Manual Installation Options
|
137
|
+
|
138
|
+
You can also install dependencies manually:
|
139
|
+
|
140
|
+
##### PyTorch Installation
|
141
|
+
|
142
|
+
For CPU-only installation (recommended for most users):
|
143
|
+
```bash
|
144
|
+
pip install torch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 --index-url https://download.pytorch.org/whl/cpu
|
145
|
+
```
|
146
|
+
|
147
|
+
For GPU support (cuda 12.6):
|
148
|
+
```bash
|
149
|
+
pip install torch torchvision torchaudio
|
150
|
+
```
|
151
|
+
|
152
|
+
Some functionalities require extra packages to be installed, which we didn't include automatically:
|
153
|
+
|
154
|
+
* For spotlight adapter:
|
155
|
+
```bash
|
156
|
+
pip install PyYAML # Install PyYAML first to avoid dependency issues
|
157
|
+
pip install nkululeko[spotlight]
|
158
|
+
```
|
159
|
+
|
160
|
+
Some examples for *ini*-files (which you use to control nkululeko) are in the [examples folder](https://github.com/felixbur/nkululeko/tree/main/examples).
|
161
|
+
|
162
|
+
|
163
|
+
|
164
|
+
## Documentation
|
165
|
+
The documentation, along with extensions of installation, usage, INI file format, and examples, can be found [nkululeko.readthedocs.io](https://nkululeko.readthedocs.io).
|
166
|
+
|
167
|
+
|
168
|
+
## Usage
|
169
|
+
|
170
|
+
### [ini-file values](./ini_file.md)
|
171
|
+
|
172
|
+
Basically, you specify your experiment in an ["ini" file](./ini_file.md) (e.g. *experiment.ini*) and then call one of the Nkululeko interfaces to run the experiment like this:
|
173
|
+
|
174
|
+
```bash
|
175
|
+
python -m nkululeko.nkululeko --config experiment.ini
|
176
|
+
```
|
177
|
+
|
178
|
+
A basic configuration looks like this:
|
179
|
+
|
180
|
+
```ini
|
181
|
+
[EXP]
|
182
|
+
root = ./
|
183
|
+
name = exp_emodb
|
184
|
+
[DATA]
|
185
|
+
databases = ['emodb']
|
186
|
+
emodb = ./emodb/
|
187
|
+
emodb.split_strategy = speaker_split
|
188
|
+
target = emotion
|
189
|
+
labels = ['anger', 'boredom', 'disgust', 'fear']
|
190
|
+
[FEATS]
|
191
|
+
type = ['praat']
|
192
|
+
[MODEL]
|
193
|
+
type = svm
|
194
|
+
[EXPL]
|
195
|
+
model = tree
|
196
|
+
plot_tree = True
|
197
|
+
```
|
198
|
+
Read the [Hello World example](#hello-world-example) for initial usage with Emo-DB dataset.
|
199
|
+
|
200
|
+
Here is an overview of the interfaces/modules:
|
201
|
+
|
202
|
+
All of them take *--config <my_config.ini>* as an argument.
|
203
|
+
|
204
|
+
* **nkululeko.nkululeko**: do machine learning experiments combining features and learners (e.g. opensmile with SVM)
|
205
|
+
* **nkululeko.ensemble**: [combine several nkululeko experiments](http://blog.syntheticspeech.de/2024/06/25/nkululeko-ensemble-classifiers-with-late-fusion/) and report on late fusion results
|
206
|
+
* **nkululeko.multidb**: do [multiple experiments](http://blog.syntheticspeech.de/2024/01/02/nkululeko-compare-several-databases/), comparing several databases cross and in itself
|
207
|
+
* **nkululeko.demo**: [demo the current best model](http://blog.syntheticspeech.de/2022/01/24/nkululeko-try-out-demo-a-trained-model/) on the command line
|
208
|
+
* **nkululeko.test**: predict a [given data set](http://blog.syntheticspeech.de/2022/09/01/nkululeko-how-to-evaluate-a-test-set-with-a-given-best-model/) with the current best model
|
209
|
+
* **nkululeko.explore**: perform [data exploration](http://blog.syntheticspeech.de/2023/05/11/nkululeko-how-to-visualize-your-data-distribution/)
|
210
|
+
* **nkululeko.augment**: [augment](http://blog.syntheticspeech.de/2023/03/13/nkululeko-how-to-augment-the-training-set/) the current training data
|
211
|
+
* **nkululeko.aug_train**: augment the current training data [and do a training](http://blog.syntheticspeech.de/2023/03/13/nkululeko-how-to-augment-the-training-set/) including this data
|
212
|
+
* **nkululeko.predict**: [predict features](http://blog.syntheticspeech.de/2023/08/16/nkululeko-how-to-predict-labels-for-your-data-from-existing-models-and-check-them/) like SNR, MOS, arousal/valence, age/gender, with DNN models
|
213
|
+
* **nkululeko.segment**: [segment a database](http://blog.syntheticspeech.de/2023/07/14/nkululeko-segmenting-a-database/) based on VAD (voice activity detection)
|
214
|
+
* **nkululeko.resample**: check on all [sampling rates and change](http://blog.syntheticspeech.de/2023/08/31/how-to-fix-different-sampling-rates-in-a-dataset-with-nkululeko/) to 16kHz
|
215
|
+
* **nkululeko.nkuluflag**: a convenient module to specify configuration parameters on the command line.
|
216
|
+
|
217
|
+
## <a name="helloworld">Hello World example</a>
|
218
|
+
* NEW: [Here's a Google colab that runs this example out-of-the-box](https://colab.research.google.com/drive/1Up7t5Nn7VwDPCCEpTg2U7cpZ_PdoEgj-?usp=sharing), and here is the same [with Kaggle](https://www.kaggle.com/felixburk/nkululeko-hello-world-example)
|
219
|
+
* [I made a video to show you how to do this on Windows](https://www.youtube.com/playlist?list=PLRceVavtxLg0y2jiLmpnUfiMtfvkK912D)
|
220
|
+
* Set up Python on your computer, version >= 3.8
|
221
|
+
* Open a terminal/command line/console window
|
222
|
+
* Test python by typing ```python```, python should start with version >3 (NOT 2!). You can leave the Python Interpreter by typing *exit()*
|
223
|
+
* Create a folder on your computer for this example, let's call it `nkulu_work`
|
224
|
+
* Get a copy of the [Berlin emodb in audformat](https://zenodo.org/records/7447302/files/emodb.zip?download=1) and unpack inside the folder you just created (`nkulu_work`)
|
225
|
+
* Make sure the folder is called "emodb" and does contain the database files directly (not box-in-a-box)
|
226
|
+
* Also, in the `nkulu_work` folder:
|
227
|
+
* Create a Python environment
|
228
|
+
* ```python -m venv venv```
|
229
|
+
* Then, activate it:
|
230
|
+
* under Linux / mac
|
231
|
+
* ```source venv/bin/activate```
|
232
|
+
* under Windows
|
233
|
+
* ```venv\Scripts\activate.bat```
|
234
|
+
* if that worked, you should see a ```(venv)``` in front of your prompt
|
235
|
+
* Install the required packages in your environment
|
236
|
+
* ```pip install nkululeko```
|
237
|
+
* Repeat until all error messages vanish (or fix them, or try to ignore them)...
|
238
|
+
* Now you should have two folders in your *nkulu_work* folder:
|
239
|
+
* *emodb* and *venv*
|
240
|
+
* Download a copy of the file [exp_emodb.ini](meta/demos/exp_emodb.ini) to the current working directory (```nkulu_work```)
|
241
|
+
* Run the demo
|
242
|
+
* ```python -m nkululeko.nkululeko --config exp_emodb.ini```
|
243
|
+
* Find the results in the newly created folder exp_emodb
|
244
|
+
* Inspect ```exp_emodb/images/run_0/emodb_xgb_os_0_000_cnf.png```
|
245
|
+
* This is the main result of your experiment: a confusion matrix for the emodb emotional categories
|
246
|
+
* Inspect and play around with the [demo configuration file](meta/demos/exp_emodb.ini) that defined your experiment, then re-run.
|
247
|
+
* There are many ways to experiment with different classifiers and acoustic feature sets, [all described here](https://github.com/felixbur/nkululeko/blob/main/ini_file.md)
|
248
|
+
|
249
|
+
## Features
|
250
|
+
The framework is targeted at the speech domain and supports experiments where different classifiers are combined with different feature extractors.
|
251
|
+
|
252
|
+
* Classifiers: Naive Bayes, KNN, Tree, XGBoost, SVM, MLP
|
253
|
+
* Feature extractors: Praat, Opensmile, openXBOW BoAW, TRILL embeddings, Wav2vec2 embeddings, audModel embeddings, ...
|
254
|
+
* Feature scaling
|
255
|
+
* Label encoding
|
256
|
+
* Binning (continuous to categorical)
|
257
|
+
* Online demo interface for trained models
|
258
|
+
* Visualization: confusion matrix, feature importance, feature distribution, epoch progression, t-SNE plot, data distribution, bias checking, uncertainty estimation
|
259
|
+
|
260
|
+
Here's a rough UML-like sketch of the framework (and [here's the real one done with pyreverse](meta/images/classes.png)).
|
261
|
+

|
262
|
+
|
263
|
+
Currently, the following linear classifiers are implemented (integrated from sklearn):
|
264
|
+
* SVM, SVR, XGB, XGR, Tree, Tree_regressor, KNN, KNN_regressor, NaiveBayes, GMM
|
265
|
+
and the following ANNs (artificial neural networks)
|
266
|
+
* MLP (multi-layer perceptron), CNN (convolutional neural network)
|
267
|
+
|
268
|
+
For visualization, besides confusion matrix, feature importance, feature distribution, t-SNE plot, data distribution (just names a few), Nkululeko can also be used for bias checking, uncertainty estimation, and epoch progression.
|
269
|
+
|
270
|
+
### Bias checking
|
271
|
+
|
272
|
+
<details>
|
273
|
+
In some cases, you might wonder if there's bias in your data. You can try to detect this with automatically estimated speech properties by visualizing the correlation of target labels and predicted labels.
|
274
|
+
|
275
|
+
<img src="meta/images/emotion-pesq.png" width="500px"/>
|
276
|
+
|
277
|
+
</details>
|
278
|
+
|
279
|
+
### Uncertainty
|
280
|
+
|
281
|
+
<details>
|
282
|
+
Nkululeko estimates the uncertainty of model decisions (only for classifiers) with entropy over the class probabilities or logits per sample.
|
283
|
+
|
284
|
+
<img src="meta/images/uncertainty.png" width="500px"/>
|
285
|
+
|
286
|
+
</details>
|
287
|
+
|
288
|
+
Here's [an animation that shows the progress of classification done with nkululeko](https://youtu.be/6Y0M382GjvM).
|
289
|
+
|
290
|
+
## News
|
291
|
+
|
292
|
+
<details>
|
293
|
+
|
294
|
+
There's Felix [blog](http://blog.syntheticspeech.de/?s=nkululeko) with tutorials below:
|
295
|
+
* [Ensemble learning with Nkululeko](http://blog.syntheticspeech.de/2024/06/25/nkululeko-ensemble-classifiers-with-late-fusion/)
|
296
|
+
* [Finetune transformer-models with Nkululeko](http://blog.syntheticspeech.de/2024/05/29/nkululeko-how-to-finetune-a-transformer-model/)
|
297
|
+
* Below is a [Hello World example for Nkululeko](#helloworld) that should set you up fastly, also on [Google Colab](https://colab.research.google.com/drive/1GYNBd5cdZQ1QC3Jm58qoeMaJg3UuPhjw?usp=sharing#scrollTo=4G_SjuF9xeQf), and [with Kaggle](https://www.kaggle.com/felixburk/nkululeko-hello-world-example)
|
298
|
+
* [Thanks to deepwiki, here's an analysis of the source code](https://deepwiki.com/felixbur/nkululeko)
|
299
|
+
* [Here's a blog post on how to set up nkululeko on your computer.](http://blog.syntheticspeech.de/2021/08/30/how-to-set-up-your-first-nkululeko-project/)
|
300
|
+
* [Here's a slide presentation about nkululeko](docs/nkululeko.pdf)
|
301
|
+
* [Here's a video presentation about nkululeko](https://www.youtube.com/playlist?list=PLRceVavtxLg0y2jiLmpnUfiMtfvkK912D)
|
302
|
+
* [Here's the 2022 LREC article on nkululeko](http://felix.syntheticspeech.de/publications/Nkululeko_LREC.pdf)
|
303
|
+
* [Introduction](http://blog.syntheticspeech.de/2021/08/04/machine-learning-experiment-framework/)
|
304
|
+
* [Nkululeko FAQ](http://blog.syntheticspeech.de/2022/07/07/nkululeko-faq/)
|
305
|
+
* [How to set up your first nkululeko project](http://blog.syntheticspeech.de/2021/08/30/how-to-set-up-your-first-nkululeko-project/)
|
306
|
+
* [Setting up a base nkululeko experiment](http://blog.syntheticspeech.de/2021/10/05/setting-up-a-base-nkululeko-experiment/)
|
307
|
+
* [How to import a database](http://blog.syntheticspeech.de/2022/01/27/nkululeko-how-to-import-a-database/)
|
308
|
+
* [Comparing classifiers and features](http://blog.syntheticspeech.de/2021/10/05/nkululeko-comparing-classifiers-and-features/)
|
309
|
+
* [Use Praat features](http://blog.syntheticspeech.de/2022/06/27/how-to-use-selected-features-from-praat-with-nkululeko/)
|
310
|
+
* [Combine feature sets](http://blog.syntheticspeech.de/2022/06/30/how-to-combine-feature-sets-with-nkululeko/)
|
311
|
+
* [Classifying continuous variables](http://blog.syntheticspeech.de/2022/01/26/nkululeko-classifying-continuous-variables/)
|
312
|
+
* [Try out / demo a trained model](http://blog.syntheticspeech.de/2022/01/24/nkululeko-try-out-demo-a-trained-model/)
|
313
|
+
* [Perform cross-database experiments](http://blog.syntheticspeech.de/2021/10/05/nkululeko-perform-cross-database-experiments/)
|
314
|
+
* [Meta parameter optimization](http://blog.syntheticspeech.de/2021/09/03/perform-optimization-with-nkululeko/)
|
315
|
+
* [How to set up wav2vec embedding](http://blog.syntheticspeech.de/2021/12/03/how-to-set-up-wav2vec-embedding-for-nkululeko/)
|
316
|
+
* [How to soft-label a database](http://blog.syntheticspeech.de/2022/01/24/how-to-soft-label-a-database-with-nkululeko/)
|
317
|
+
* [Re-generate the progressing confusion matrix animation wit a different framerate](demos/plot_faster_anim.py)
|
318
|
+
* [How to limit/filter a dataset](http://blog.syntheticspeech.de/2022/02/22/how-to-limit-a-dataset-with-nkululeko/)
|
319
|
+
* [Specifying database disk location](http://blog.syntheticspeech.de/2022/02/21/specifying-database-disk-location-with-nkululeko/)
|
320
|
+
* [Add dropout with MLP models](http://blog.syntheticspeech.de/2022/02/25/adding-dropout-to-mlp-models-with-nkululeko/)
|
321
|
+
* [Do cross-validation](http://blog.syntheticspeech.de/2022/03/23/how-to-do-cross-validation-with-nkululeko/)
|
322
|
+
* [Combine predictions per speaker](http://blog.syntheticspeech.de/2022/03/24/how-to-combine-predictions-per-speaker-with-nkululeko/)
|
323
|
+
* [Run multiple experiments in one go](http://blog.syntheticspeech.de/2022/03/28/how-to-run-multiple-experiments-in-one-go-with-nkululeko/)
|
324
|
+
* [Compare several MLP layer layouts with each other](http://blog.syntheticspeech.de/2022/04/11/how-to-compare-several-mlp-layer-layouts-with-each-other/)
|
325
|
+
* [Import features from outside the software](http://blog.syntheticspeech.de/2022/10/18/how-to-import-features-from-outside-the-nkululeko-software/)
|
326
|
+
* [Export acoustic features](http://blog.syntheticspeech.de/2024/05/30/nkululeko-export-acoustic-features/)
|
327
|
+
* [Explore feature importance](http://blog.syntheticspeech.de/2023/02/20/nkululeko-show-feature-importance/)
|
328
|
+
* [Plot distributions for feature values](http://blog.syntheticspeech.de/2023/02/16/nkululeko-how-to-plot-distributions-of-feature-values/)
|
329
|
+
* [Show feature importance](http://blog.syntheticspeech.de/2023/02/20/nkululeko-show-feature-importance/)
|
330
|
+
* [Augment the training set](http://blog.syntheticspeech.de/2023/03/13/nkululeko-how-to-augment-the-training-set/)
|
331
|
+
* [Visualize clusters of acoustic features](http://blog.syntheticspeech.de/2023/04/20/nkululeko-visualize-clusters-of-your-acoustic-features/)
|
332
|
+
* [Visualize your data distribution](http://blog.syntheticspeech.de/2023/05/11/nkululeko-how-to-visualize-your-data-distribution/)
|
333
|
+
* [Check your dataset](http://blog.syntheticspeech.de/2023/07/11/nkululeko-check-your-dataset/)
|
334
|
+
* [Segmenting a database](http://blog.syntheticspeech.de/2023/07/14/nkululeko-segmenting-a-database/)
|
335
|
+
* [Predict new labels for your data from public models and check bias](http://blog.syntheticspeech.de/2023/08/16/nkululeko-how-to-predict-labels-for-your-data-from-existing-models-and-check-them/)
|
336
|
+
* [Resample](http://blog.syntheticspeech.de/2023/08/31/how-to-fix-different-sampling-rates-in-a-dataset-with-nkululeko/)
|
337
|
+
* [Get some statistics on correlation and effect-size](http://blog.syntheticspeech.de/2023/09/05/nkululeko-get-some-statistics-on-correlation-and-effect-size/)
|
338
|
+
* [Automatic generation of a latex/pdf report](http://blog.syntheticspeech.de/2023/09/26/nkululeko-generate-a-latex-pdf-report/)
|
339
|
+
* [Inspect your data with Spotlight](http://blog.syntheticspeech.de/2023/10/31/nkululeko-inspect-your-data-with-spotlight/)
|
340
|
+
* [Automatically stratify your split sets](http://blog.syntheticspeech.de/2023/11/07/nkululeko-automatically-stratify-your-split-sets/)
|
341
|
+
* [re-name data column names](http://blog.syntheticspeech.de/2023/11/16/nkululeko-re-name-data-column-names/)
|
342
|
+
* [Oversample the training set](http://blog.syntheticspeech.de/2023/11/16/nkululeko-oversample-the-training-set/)
|
343
|
+
* [Compare several databases](http://blog.syntheticspeech.de/2024/01/02/nkululeko-compare-several-databases/)
|
344
|
+
* [Tweak the target variable for database comparison](http://blog.syntheticspeech.de/2024/03/13/nkululeko-how-to-tweak-the-target-variable-for-database-comparison/)
|
345
|
+
* [How to run multiple experiments in one go](http://blog.syntheticspeech.de/2022/03/28/how-to-run-multiple-experiments-in-one-go-with-nkululeko/)
|
346
|
+
* [How to finetune a transformer-model](http://blog.syntheticspeech.de/2024/05/29/nkululeko-how-to-finetune-a-transformer-model/)
|
347
|
+
* [Ensemble (combine) classifiers with late-fusion](http://blog.syntheticspeech.de/2024/06/25/nkululeko-ensemble-classifiers-with-late-fusion/)
|
348
|
+
* [Use train, dev and test splits](https://blog.syntheticspeech.de/2025/03/31/nkululeko-how-to-use-train-dev-test-splits/)
|
349
|
+
|
350
|
+
</details>
|
351
|
+
|
352
|
+
## License
|
353
|
+
Nkululeko can be used under the [MIT license](https://choosealicense.com/licenses/mit/).
|
354
|
+
|
355
|
+
|
356
|
+
## Contributing
|
357
|
+
Contributions are welcome and encouraged. To learn more about how to contribute to nkululeko, please refer to the [Contributing guidelines](./CONTRIBUTING.md).
|
358
|
+
|
359
|
+
## Citation
|
360
|
+
If you use Nkululeko, please cite the paper:
|
361
|
+
|
362
|
+
> F. Burkhardt, Johannes Wagner, Hagen Wierstorf, Florian Eyben and Björn Schuller: Nkululeko: A Tool For Rapid Speaker Characteristics Detection, Proc. Proc. LREC, 2022
|
363
|
+
|
364
|
+
|
365
|
+
```
|
366
|
+
@inproceedings{Burkhardt:lrec2022,
|
367
|
+
title = {Nkululeko: A Tool For Rapid Speaker Characteristics Detection},
|
368
|
+
author = {Felix Burkhardt and Johannes Wagner and Hagen Wierstorf and Florian Eyben and Björn Schuller},
|
369
|
+
isbn = {9791095546726},
|
370
|
+
journal = {2022 Language Resources and Evaluation Conference, LREC 2022},
|
371
|
+
keywords = {machine learning,speaker characteristics,tools},
|
372
|
+
pages = {1925-1932},
|
373
|
+
publisher = {European Language Resources Association (ELRA)},
|
374
|
+
year = {2022},
|
375
|
+
}
|
376
|
+
```
|
@@ -4,7 +4,7 @@ nkululeko/aug_train.py,sha256=wpiHCJ7zsW38kumg3ypwXZe2HQrhUblAnv7P2QeJnAc,3525
|
|
4
4
|
nkululeko/augment.py,sha256=3RzaxB3gRxovgJVjHXi0glprW01J7RaHhUkqotW2T3U,2955
|
5
5
|
nkululeko/balance.py,sha256=r7opXbrqAipm2euPPaOmLlA5J10p2bHQgO5kWk2x9ro,8702
|
6
6
|
nkululeko/cacheddataset.py,sha256=XFpWZmbJRg0pvhnIgYf0TkclxllD-Fctu-Ol0PF_00c,969
|
7
|
-
nkululeko/constants.py,sha256=
|
7
|
+
nkululeko/constants.py,sha256=Y72AuIN-vPMiSM6a5x7LgZsG66VfmX8oZ3Lu5ZeMdgs,39
|
8
8
|
nkululeko/demo-ft.py,sha256=iD9Pzp9QjyAv31q1cDZ75vPez7Ve8A4Cfukv5yfZdrQ,770
|
9
9
|
nkululeko/demo.py,sha256=tu7Al2l5MCLVegkDC-NE2wcuc_YE7NRbgOlPW3yhGEs,4940
|
10
10
|
nkululeko/demo_feats.py,sha256=BvZjeNFTlERIRlq34OHM4Z96jdDQAhB01BGQAUcX9dM,2026
|
@@ -13,7 +13,7 @@ nkululeko/ensemble.py,sha256=71V-rre61H3J4sh7lu-OTo4I2_g7mm_rQxwW1ARDHgY,12782
|
|
13
13
|
nkululeko/experiment.py,sha256=hdFvRA7EoQz10nId9MwcbYOTz2ifYeGrFKVJOv9a88Q,38394
|
14
14
|
nkululeko/explore.py,sha256=aDVHwuo-lkih7VZrbb_zFKg5fowSrAIcx0V9wf0SRGo,4175
|
15
15
|
nkululeko/export.py,sha256=U-V4acxtuL6qKt6oAsVcM5TTeWogYUJ3GU-lA6rq6d4,4336
|
16
|
-
nkululeko/feature_extractor.py,sha256=
|
16
|
+
nkululeko/feature_extractor.py,sha256=CsKmBoxwNClRGu20ox_eCxMG4u_1OH8Y83FYw7GfUwA,4230
|
17
17
|
nkululeko/file_checker.py,sha256=xJY0Q6w47pnmgJVK5rcAKPYBrCpV7eBT4_3YBzTx-H8,3454
|
18
18
|
nkululeko/filter_data.py,sha256=4sGrKvMZ_hLnJPrHm_CqjDPKIRV8REWoT7nfSYGXbwo,7305
|
19
19
|
nkululeko/fixedsegment.py,sha256=Tb92QiuiyMsOO3WRWwuGjZGibS8hbHHCrcWAXGk7g04,2868
|
@@ -22,6 +22,7 @@ nkululeko/modelrunner.py,sha256=OFN18uG84iJyjNVWjcvDpqbcBrmylziXCakUTNE2-ZQ,1053
|
|
22
22
|
nkululeko/multidb.py,sha256=sO6OwJn8sn1-C-ig3thsIL8QMWHdV9SnJhDodKjeKrI,6876
|
23
23
|
nkululeko/nkuluflag.py,sha256=PGWSmZz-PiiHLgcZJAoGOI_Y-sZDVI1ksB8p5r7riWM,3725
|
24
24
|
nkululeko/nkululeko.py,sha256=6ALPMMIz6l0O3IRaP0q4b59ZUxpfzNqLQUqZMf5t3Zo,1976
|
25
|
+
nkululeko/optim.py,sha256=dYKj69fyeqijEY9huIBEJQh1CoFSPxTdbVekv9lQ_Gk,36706
|
25
26
|
nkululeko/plots.py,sha256=lUxgyoriYTwdpHZvBBQ4e41v77deQrt0PcRDLJWijys,27503
|
26
27
|
nkululeko/predict.py,sha256=PWv1Pc39lrxqqIWrYszVk5SL37dDL93CHgcruItNID8,2211
|
27
28
|
nkululeko/resample.py,sha256=rn3-M1A-iwVGibfQNGyeYNa7briD24lIN9Szq_1uTJo,5194
|
@@ -69,7 +70,7 @@ nkululeko/feat_extract/feats_clap.py,sha256=1tttpfm2SJmQgYm2u8eUVpDiDOpWdKqFChpY
|
|
69
70
|
nkululeko/feat_extract/feats_emotion2vec.py,sha256=LnV8xEg7L7HIDqz0ulqUNoaAHBU0d5gyQPb2_32T_18,9694
|
70
71
|
nkululeko/feat_extract/feats_hubert.py,sha256=F3vrPCkx8EimJjFWYCZ7Yg9uo1G3NjYt4UKrGIUev8k,5172
|
71
72
|
nkululeko/feat_extract/feats_import.py,sha256=cPi4XRuRs71npB8YGXr7rYOvkeTU_oZEl3GrGncdiqY,2222
|
72
|
-
nkululeko/feat_extract/feats_mld.py,sha256
|
73
|
+
nkululeko/feat_extract/feats_mld.py,sha256=-xJMrvQx0y5df-qmEvKXpi490cRZYwIg_jNW2PHPUyI,2177
|
73
74
|
nkululeko/feat_extract/feats_mos.py,sha256=vkH1FdXtduoU0-yjBtVccC2b_p_eyH8laRnwlL7QTVM,4136
|
74
75
|
nkululeko/feat_extract/feats_opensmile.py,sha256=HwbGs0EaPxZ7DznQZFem8RYgyQWz02oya77uVY7KhZE,9203
|
75
76
|
nkululeko/feat_extract/feats_oxbow.py,sha256=TRoEJx5EKZiqoPoPRibHc0vkBMoZcKlGoGNq4NbyHZw,4895
|
@@ -126,14 +127,15 @@ nkululeko/segmenting/seg_pyannote.py,sha256=6IPbgjnGOz9juzEKDTZN3PSipX4t6Mz-DILA
|
|
126
127
|
nkululeko/segmenting/seg_silero.py,sha256=ulodnvtRq5MLHDxy_RmAK4tJg6h1d-mPq-uCPFkGVKg,4258
|
127
128
|
nkululeko/tests/__init__.py,sha256=XzD6C-ZuewsccUwx7KzEUtUxJrRx2d7sPFViscjf1O0,30
|
128
129
|
nkululeko/tests/test_balancing.py,sha256=21110R77iTcSWKiSTxYDkJ26lxPFTlZf_ZwVjeiSh4w,10164
|
130
|
+
nkululeko/tests/test_optim.py,sha256=Hg66X3iLBz1xbiING1w5xFMI8gUSp4xCQpe5c9WDkAQ,9245
|
129
131
|
nkululeko/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
130
132
|
nkululeko/utils/files.py,sha256=SrrYaU7AB80MZHiV1jcB0h_zigvYLYgSVNTXV4ao38g,4593
|
131
133
|
nkululeko/utils/stats.py,sha256=3Fyx8q8BSKYmiufT6OkRug9RATWmGrr9BaX_y8jziWo,3074
|
132
134
|
nkululeko/utils/unzip.py,sha256=G68f5120TjwACZC3bQcneMniddnwubPbBdMc2L5KBOo,1206
|
133
135
|
nkululeko/utils/util.py,sha256=o62TZRcxO1VflINai6ojEzSmcbXIFInNLGogSbqJgiA,18561
|
134
|
-
nkululeko-0.95.
|
135
|
-
nkululeko-0.95.
|
136
|
-
nkululeko-0.95.
|
137
|
-
nkululeko-0.95.
|
138
|
-
nkululeko-0.95.
|
139
|
-
nkululeko-0.95.
|
136
|
+
nkululeko-0.95.2.dist-info/licenses/LICENSE,sha256=0zGP5B_W35yAcGfHPS18Q2B8UhvLRY3dQq1MhpsJU_U,1076
|
137
|
+
nkululeko-0.95.2.dist-info/METADATA,sha256=kmIo69SGcBnb9cDhMiU8Pon3Ozkv7z0AO9ye7uWI--A,21958
|
138
|
+
nkululeko-0.95.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
139
|
+
nkululeko-0.95.2.dist-info/entry_points.txt,sha256=lNTkFEdh6Kjo5o95ZAWf_0Lq-4ztGoAoMVSDuPtuyS0,442
|
140
|
+
nkululeko-0.95.2.dist-info/top_level.txt,sha256=bf1k1YKkqcXemNX_cUgoyKqQ3_GVErPqAY-53J36jkM,19
|
141
|
+
nkululeko-0.95.2.dist-info/RECORD,,
|