nkululeko 0.57.0__py3-none-any.whl → 0.58.0__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/ap_dominance.py +29 -0
- nkululeko/ap_mos.py +35 -0
- nkululeko/ap_pesq.py +35 -0
- nkululeko/constants.py +1 -1
- nkululeko/dataset.py +0 -1
- nkululeko/experiment.py +15 -2
- nkululeko/feats_mos.py +92 -0
- nkululeko/feats_pesq.py +89 -0
- nkululeko/feature_extractor.py +6 -0
- {nkululeko-0.57.0.dist-info → nkululeko-0.58.0.dist-info}/METADATA +15 -3
- {nkululeko-0.57.0.dist-info → nkululeko-0.58.0.dist-info}/RECORD +14 -9
- {nkululeko-0.57.0.dist-info → nkululeko-0.58.0.dist-info}/LICENSE +0 -0
- {nkululeko-0.57.0.dist-info → nkululeko-0.58.0.dist-info}/WHEEL +0 -0
- {nkululeko-0.57.0.dist-info → nkululeko-0.58.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
"""
|
2
|
+
A predictor for emotional dominance.
|
3
|
+
Currently based on audEERING's emotional dimension model.
|
4
|
+
"""
|
5
|
+
|
6
|
+
from nkululeko.util import Util
|
7
|
+
from nkululeko.feature_extractor import FeatureExtractor
|
8
|
+
import ast
|
9
|
+
import nkululeko.glob_conf as glob_conf
|
10
|
+
class DominancePredictor:
|
11
|
+
"""
|
12
|
+
DominancePredictor
|
13
|
+
predicting dominance with the audEERING emotional dimension model
|
14
|
+
"""
|
15
|
+
|
16
|
+
def __init__(self, df):
|
17
|
+
self.df = df
|
18
|
+
self.util = Util('dominancePredictor')
|
19
|
+
|
20
|
+
def predict(self, split_selection):
|
21
|
+
self.util.debug(f'predicting dominance for {split_selection} samples')
|
22
|
+
feats_name = "_".join(ast.literal_eval(glob_conf.config['DATA']['databases']))
|
23
|
+
self.feature_extractor = FeatureExtractor(self.df, ['auddim'], feats_name, split_selection)
|
24
|
+
pred_df = self.feature_extractor.extract()
|
25
|
+
pred_vals = pred_df.dominance * 1000
|
26
|
+
return_df = self.df.copy()
|
27
|
+
return_df['dominance_pred'] = pred_vals.astype('int')/1000
|
28
|
+
|
29
|
+
return return_df
|
nkululeko/ap_mos.py
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
""""
|
2
|
+
A predictor for MOS - mean opinion score.
|
3
|
+
"""
|
4
|
+
from nkululeko.util import Util
|
5
|
+
import ast
|
6
|
+
import nkululeko.glob_conf as glob_conf
|
7
|
+
from nkululeko.feature_extractor import FeatureExtractor
|
8
|
+
import numpy as np
|
9
|
+
|
10
|
+
|
11
|
+
class MOSPredictor:
|
12
|
+
"""
|
13
|
+
MOSPredictor
|
14
|
+
predicting MOS
|
15
|
+
|
16
|
+
"""
|
17
|
+
def __init__(self, df):
|
18
|
+
self.df = df
|
19
|
+
self.util = Util('mosPredictor')
|
20
|
+
|
21
|
+
|
22
|
+
def predict(self, split_selection):
|
23
|
+
self.util.debug(f'estimating MOS for {split_selection} samples')
|
24
|
+
return_df = self.df.copy()
|
25
|
+
feats_name = "_".join(ast.literal_eval(glob_conf.config['DATA']['databases']))
|
26
|
+
self.feature_extractor = FeatureExtractor(self.df, ['mos'], feats_name, split_selection)
|
27
|
+
result_df = self.feature_extractor.extract()
|
28
|
+
# replace missing values by 0
|
29
|
+
result_df = result_df.fillna(0)
|
30
|
+
result_df = result_df.replace(np.nan, 0)
|
31
|
+
result_df.replace([np.inf, -np.inf], 0, inplace=True)
|
32
|
+
pred_snr = result_df.mos * 100
|
33
|
+
return_df['mos_pred'] = pred_snr.astype('int')/100
|
34
|
+
return return_df
|
35
|
+
|
nkululeko/ap_pesq.py
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
""""
|
2
|
+
A predictor for PESQ - Perceptual Evaluation of Speech Quality.
|
3
|
+
"""
|
4
|
+
from nkululeko.util import Util
|
5
|
+
import ast
|
6
|
+
import nkululeko.glob_conf as glob_conf
|
7
|
+
from nkululeko.feature_extractor import FeatureExtractor
|
8
|
+
import numpy as np
|
9
|
+
|
10
|
+
|
11
|
+
class PESQPredictor:
|
12
|
+
"""
|
13
|
+
PESQPredictor
|
14
|
+
predicting PESQ
|
15
|
+
|
16
|
+
"""
|
17
|
+
def __init__(self, df):
|
18
|
+
self.df = df
|
19
|
+
self.util = Util('pesqPredictor')
|
20
|
+
|
21
|
+
|
22
|
+
def predict(self, split_selection):
|
23
|
+
self.util.debug(f'estimating PESQ for {split_selection} samples')
|
24
|
+
return_df = self.df.copy()
|
25
|
+
feats_name = "_".join(ast.literal_eval(glob_conf.config['DATA']['databases']))
|
26
|
+
self.feature_extractor = FeatureExtractor(self.df, ['pesq'], feats_name, split_selection)
|
27
|
+
result_df = self.feature_extractor.extract()
|
28
|
+
# replace missing values by 0
|
29
|
+
result_df = result_df.fillna(0)
|
30
|
+
result_df = result_df.replace(np.nan, 0)
|
31
|
+
result_df.replace([np.inf, -np.inf], 0, inplace=True)
|
32
|
+
pred_vals = result_df.pesq * 100
|
33
|
+
return_df['pesq_pred'] = pred_vals.astype('int')/100
|
34
|
+
return return_df
|
35
|
+
|
nkululeko/constants.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
VERSION = '0.
|
1
|
+
VERSION = '0.58.0'
|
nkululeko/dataset.py
CHANGED
@@ -67,7 +67,6 @@ class Dataset:
|
|
67
67
|
# store the dataframe
|
68
68
|
store = self.util.get_path('store')
|
69
69
|
store_file = f'{store}{self.name}.pkl'
|
70
|
-
self.util.debug(f'{self.name}: loading ...')
|
71
70
|
self.root = self._load_db()
|
72
71
|
# self.got_speaker, self.got_gender = False, False
|
73
72
|
if not self.start_fresh and os.path.isfile(store_file):
|
nkululeko/experiment.py
CHANGED
@@ -82,7 +82,8 @@ class Experiment:
|
|
82
82
|
self.got_speaker = True
|
83
83
|
self.datasets.update({d: data})
|
84
84
|
self.target = self.util.config_val('DATA', 'target', 'emotion')
|
85
|
-
|
85
|
+
dbs = ','.join(list(self.datasets.keys()))
|
86
|
+
self.util.debug(f'loaded databases {dbs}')
|
86
87
|
|
87
88
|
def _import_csv(self, storage):
|
88
89
|
# df = pd.read_csv(storage, header=0, index_col=[0,1,2])
|
@@ -353,6 +354,14 @@ class Experiment:
|
|
353
354
|
from nkululeko.ap_snr import SNRPredictor
|
354
355
|
predictor = SNRPredictor(df)
|
355
356
|
df = predictor.predict(sample_selection)
|
357
|
+
elif target == 'mos':
|
358
|
+
from nkululeko.ap_mos import MOSPredictor
|
359
|
+
predictor = MOSPredictor(df)
|
360
|
+
df = predictor.predict(sample_selection)
|
361
|
+
elif target == 'pesq':
|
362
|
+
from nkululeko.ap_pesq import PESQPredictor
|
363
|
+
predictor = PESQPredictor(df)
|
364
|
+
df = predictor.predict(sample_selection)
|
356
365
|
elif target == 'arousal':
|
357
366
|
from nkululeko.ap_arousal import ArousalPredictor
|
358
367
|
predictor = ArousalPredictor(df)
|
@@ -361,8 +370,12 @@ class Experiment:
|
|
361
370
|
from nkululeko.ap_valence import ValencePredictor
|
362
371
|
predictor = ValencePredictor(df)
|
363
372
|
df = predictor.predict(sample_selection)
|
373
|
+
elif target == 'dominance':
|
374
|
+
from nkululeko.ap_dominance import DominancePredictor
|
375
|
+
predictor = DominancePredictor(df)
|
376
|
+
df = predictor.predict(sample_selection)
|
364
377
|
else:
|
365
|
-
self.util.error(f'
|
378
|
+
self.util.error(f'unknown auto predict target: {target}')
|
366
379
|
return df
|
367
380
|
|
368
381
|
def random_splice(self):
|
nkululeko/feats_mos.py
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
""" feats_mos.py
|
2
|
+
predict MOS (mean opinion score)
|
3
|
+
|
4
|
+
adapted from
|
5
|
+
from https://pytorch.org/audio/main/tutorials/squim_tutorial.html#sphx-glr-tutorials-squim-tutorial-py
|
6
|
+
paper: https://arxiv.org/pdf/2304.01448.pdf
|
7
|
+
|
8
|
+
needs
|
9
|
+
pip uninstall -y torch torchvision torchaudio
|
10
|
+
pip install --pre torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/nightly/cpu
|
11
|
+
|
12
|
+
"""
|
13
|
+
from nkululeko.util import Util
|
14
|
+
from nkululeko.featureset import Featureset
|
15
|
+
import os
|
16
|
+
import pandas as pd
|
17
|
+
import os
|
18
|
+
import nkululeko.glob_conf as glob_conf
|
19
|
+
import audiofile
|
20
|
+
import torch
|
21
|
+
import torchaudio
|
22
|
+
from torchaudio.pipelines import SQUIM_SUBJECTIVE
|
23
|
+
from torchaudio.utils import download_asset
|
24
|
+
|
25
|
+
class MOSSet(Featureset):
|
26
|
+
"""Class to predict MOS (mean opinion score)
|
27
|
+
|
28
|
+
"""
|
29
|
+
|
30
|
+
def __init__(self, name, data_df):
|
31
|
+
"""Constructor. is_train is needed to distinguish from test/dev sets, because they use the codebook from the training"""
|
32
|
+
super().__init__(name, data_df)
|
33
|
+
self.device = self.util.config_val('MODEL', 'device', 'cpu')
|
34
|
+
self.model_initialized = False
|
35
|
+
|
36
|
+
|
37
|
+
def init_model(self):
|
38
|
+
# load model
|
39
|
+
self.util.debug('loading MOS model...')
|
40
|
+
self.subjective_model = SQUIM_SUBJECTIVE.get_model()
|
41
|
+
NMR_SPEECH = download_asset("tutorial-assets/ctc-decoding/1688-142285-0007.wav")
|
42
|
+
self.WAVEFORM_NMR, SAMPLE_RATE_NMR = torchaudio.load(NMR_SPEECH)
|
43
|
+
self.model_initialized = True
|
44
|
+
|
45
|
+
def extract(self):
|
46
|
+
"""Extract the features or load them from disk if present."""
|
47
|
+
store = self.util.get_path('store')
|
48
|
+
store_format = self.util.config_val('FEATS', 'store_format', 'pkl')
|
49
|
+
storage = f'{store}{self.name}.{store_format}'
|
50
|
+
extract = self.util.config_val('FEATS', 'needs_feature_extraction', False)
|
51
|
+
no_reuse = eval(self.util.config_val('FEATS', 'no_reuse', 'False'))
|
52
|
+
if extract or no_reuse or not os.path.isfile(storage):
|
53
|
+
if not self.model_initialized:
|
54
|
+
self.init_model()
|
55
|
+
self.util.debug('predicting MOS, this might take a while...')
|
56
|
+
emb_series = pd.Series(index = self.data_df.index, dtype=object)
|
57
|
+
length = len(self.data_df.index)
|
58
|
+
for idx, (file, start, end) in enumerate(self.data_df.index.to_list()):
|
59
|
+
signal, sampling_rate = audiofile.read(file, offset=start.total_seconds(), duration=(end-start).total_seconds(), always_2d=True)
|
60
|
+
emb = self.get_embeddings(signal, sampling_rate)
|
61
|
+
emb_series[idx] = emb
|
62
|
+
if idx%10==0:
|
63
|
+
self.util.debug(f'MOS: {idx} of {length} done')
|
64
|
+
self.df = pd.DataFrame(emb_series.values.tolist(), index=self.data_df.index)
|
65
|
+
self.df.columns = ['mos']
|
66
|
+
self.util.write_store(self.df, storage, store_format)
|
67
|
+
try:
|
68
|
+
glob_conf.config['DATA']['needs_feature_extraction'] = 'false'
|
69
|
+
except KeyError:
|
70
|
+
pass
|
71
|
+
else:
|
72
|
+
self.util.debug('reusing predicted MOS values')
|
73
|
+
self.df = self.util.get_store(storage, store_format)
|
74
|
+
if self.df.isnull().values.any():
|
75
|
+
nanrows = self.df.columns[self.df.isna().any()].tolist()
|
76
|
+
print(nanrows)
|
77
|
+
self.util.error(f'got nan: {self.df.shape} {self.df.isnull().sum().sum()}')
|
78
|
+
|
79
|
+
|
80
|
+
def get_embeddings(self, signal, sampling_rate):
|
81
|
+
tmp_audio_name = 'mos_audio_tmp.wav'
|
82
|
+
audiofile.write(tmp_audio_name, signal, sampling_rate)
|
83
|
+
WAVEFORM_SPEECH, SAMPLE_RATE_SPEECH = torchaudio.load(tmp_audio_name)
|
84
|
+
with torch.no_grad():
|
85
|
+
mos = self.subjective_model(WAVEFORM_SPEECH, self.WAVEFORM_NMR)
|
86
|
+
return float(mos[0].numpy())
|
87
|
+
|
88
|
+
|
89
|
+
def extract_sample(self, signal, sr):
|
90
|
+
self.init_model()
|
91
|
+
feats = self.get_embeddings(signal, sr)
|
92
|
+
return feats
|
nkululeko/feats_pesq.py
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
""" feats_pesq.py
|
2
|
+
predict PESQ (Perceptual Evaluation of Speech Quality)
|
3
|
+
|
4
|
+
adapted from
|
5
|
+
from https://pytorch.org/audio/main/tutorials/squim_tutorial.html#sphx-glr-tutorials-squim-tutorial-py
|
6
|
+
paper: https://arxiv.org/pdf/2304.01448.pdf
|
7
|
+
|
8
|
+
needs
|
9
|
+
pip uninstall -y torch torchvision torchaudio
|
10
|
+
pip install --pre torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/nightly/cpu
|
11
|
+
|
12
|
+
"""
|
13
|
+
from nkululeko.util import Util
|
14
|
+
from nkululeko.featureset import Featureset
|
15
|
+
import os
|
16
|
+
import pandas as pd
|
17
|
+
import os
|
18
|
+
import nkululeko.glob_conf as glob_conf
|
19
|
+
import audiofile
|
20
|
+
import torch
|
21
|
+
import torchaudio
|
22
|
+
from torchaudio.pipelines import SQUIM_OBJECTIVE
|
23
|
+
|
24
|
+
class PESQSet(Featureset):
|
25
|
+
"""Class to predict PESQ (Perceptual Evaluation of Speech Quality)
|
26
|
+
|
27
|
+
"""
|
28
|
+
|
29
|
+
def __init__(self, name, data_df):
|
30
|
+
"""Constructor. is_train is needed to distinguish from test/dev sets, because they use the codebook from the training"""
|
31
|
+
super().__init__(name, data_df)
|
32
|
+
self.device = self.util.config_val('MODEL', 'device', 'cpu')
|
33
|
+
self.model_initialized = False
|
34
|
+
|
35
|
+
|
36
|
+
def init_model(self):
|
37
|
+
# load model
|
38
|
+
self.util.debug('loading model...')
|
39
|
+
self.objective_model = SQUIM_OBJECTIVE.get_model()
|
40
|
+
self.model_initialized = True
|
41
|
+
|
42
|
+
|
43
|
+
def extract(self):
|
44
|
+
"""Extract the features or load them from disk if present."""
|
45
|
+
store = self.util.get_path('store')
|
46
|
+
store_format = self.util.config_val('FEATS', 'store_format', 'pkl')
|
47
|
+
storage = f'{store}{self.name}.{store_format}'
|
48
|
+
extract = self.util.config_val('FEATS', 'needs_feature_extraction', False)
|
49
|
+
no_reuse = eval(self.util.config_val('FEATS', 'no_reuse', 'False'))
|
50
|
+
if extract or no_reuse or not os.path.isfile(storage):
|
51
|
+
if not self.model_initialized:
|
52
|
+
self.init_model()
|
53
|
+
self.util.debug('predicting PESQ, this might take a while...')
|
54
|
+
emb_series = pd.Series(index = self.data_df.index, dtype=object)
|
55
|
+
length = len(self.data_df.index)
|
56
|
+
for idx, (file, start, end) in enumerate(self.data_df.index.to_list()):
|
57
|
+
signal, sampling_rate = audiofile.read(file, offset=start.total_seconds(), duration=(end-start).total_seconds(), always_2d=True)
|
58
|
+
emb = self.get_embeddings(signal, sampling_rate)
|
59
|
+
emb_series[idx] = emb
|
60
|
+
if idx%10==0:
|
61
|
+
self.util.debug(f'PESQ: {idx} of {length} done')
|
62
|
+
self.df = pd.DataFrame(emb_series.values.tolist(), index=self.data_df.index)
|
63
|
+
self.df.columns = ['pesq']
|
64
|
+
self.util.write_store(self.df, storage, store_format)
|
65
|
+
try:
|
66
|
+
glob_conf.config['DATA']['needs_feature_extraction'] = 'false'
|
67
|
+
except KeyError:
|
68
|
+
pass
|
69
|
+
else:
|
70
|
+
self.util.debug('reusing predicted PESQ values')
|
71
|
+
self.df = self.util.get_store(storage, store_format)
|
72
|
+
if self.df.isnull().values.any():
|
73
|
+
nanrows = self.df.columns[self.df.isna().any()].tolist()
|
74
|
+
print(nanrows)
|
75
|
+
self.util.error(f'got nan: {self.df.shape} {self.df.isnull().sum().sum()}')
|
76
|
+
|
77
|
+
|
78
|
+
def get_embeddings(self, signal, sampling_rate):
|
79
|
+
tmp_audio_name = 'pesq_audio_tmp.wav'
|
80
|
+
audiofile.write(tmp_audio_name, signal, sampling_rate)
|
81
|
+
WAVEFORM_SPEECH, SAMPLE_RATE_SPEECH = torchaudio.load(tmp_audio_name)
|
82
|
+
with torch.no_grad():
|
83
|
+
stoi_hyp, pesq_hyp, si_sdr_hyp = self.objective_model(WAVEFORM_SPEECH)
|
84
|
+
return float(pesq_hyp[0].numpy())
|
85
|
+
|
86
|
+
def extract_sample(self, signal, sr):
|
87
|
+
self.init_model()
|
88
|
+
feats = self.get_embeddings(signal, sr)
|
89
|
+
return feats
|
nkululeko/feature_extractor.py
CHANGED
@@ -61,6 +61,12 @@ class FeatureExtractor:
|
|
61
61
|
elif feats_type=='snr':
|
62
62
|
from nkululeko.feats_snr import SNRSet
|
63
63
|
self.featExtractor = SNRSet(f'{store_name}_{self.feats_designation}', self.data_df)
|
64
|
+
elif feats_type=='mos':
|
65
|
+
from nkululeko.feats_mos import MOSSet
|
66
|
+
self.featExtractor = MOSSet(f'{store_name}_{self.feats_designation}', self.data_df)
|
67
|
+
elif feats_type=='pesq':
|
68
|
+
from nkululeko.feats_pesq import PESQSet
|
69
|
+
self.featExtractor = PESQSet(f'{store_name}_{self.feats_designation}', self.data_df)
|
64
70
|
elif feats_type=='clap':
|
65
71
|
from nkululeko.feats_clap import Clap
|
66
72
|
self.featExtractor = Clap(f'{store_name}_{self.feats_designation}', self.data_df)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: nkululeko
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.58.0
|
4
4
|
Summary: Machine learning audio prediction experiments based on templates
|
5
5
|
Home-page: https://github.com/felixbur/nkululeko
|
6
6
|
Author: Felix Burkhardt
|
@@ -42,6 +42,7 @@ Requires-Dist: xgboost
|
|
42
42
|
# Nkululeko
|
43
43
|
* [Overview](#overview)
|
44
44
|
* [Installation](#installation)
|
45
|
+
* [Documentation](https://nkululeko.readthedocs.io)
|
45
46
|
* [Usage](#usage)
|
46
47
|
* [Hello World](#hello-world-example)
|
47
48
|
* [Licence](#licence)
|
@@ -91,7 +92,11 @@ Sometimes you only want to take a look at your data:
|
|
91
92
|
|
92
93
|
<img src="meta/images/data_plot.png" width="500px"/>
|
93
94
|
|
94
|
-
|
95
|
+
|
96
|
+
## Documentation
|
97
|
+
The documentation, along with extensions of installation, usage, INI file format, and examples, can be found [nkululeko.readthedocs.io](https://nkululeko.readthedocs.io).
|
98
|
+
|
99
|
+
## Installation
|
95
100
|
|
96
101
|
Create and activate a virtual Python environment and simply run
|
97
102
|
```
|
@@ -131,10 +136,11 @@ Read the [Hello World example](#hello-world-example) for initial usage with Emo-
|
|
131
136
|
|
132
137
|
Here is an overview of the interfaces:
|
133
138
|
* **nkululeko.nkululeko**: doing experiments
|
134
|
-
* **nkululeko.demo**: demo the current best model on command line
|
139
|
+
* **nkululeko.demo**: demo the current best model on the command line
|
135
140
|
* **nkululeko.test**: predict a series of files with the current best model
|
136
141
|
* **nkululeko.explore**: perform data exploration
|
137
142
|
* **nkululeko.augment**: augment the current training data
|
143
|
+
* **nkululeko.predict**: predict a series of files with a given model
|
138
144
|
|
139
145
|
Alternatively, there is a central "experiment" class that can be used by own experiments
|
140
146
|
|
@@ -242,6 +248,12 @@ Nkululeko can be used under the [MIT license](https://choosealicense.com/license
|
|
242
248
|
Changelog
|
243
249
|
=========
|
244
250
|
|
251
|
+
Version 0.58.0
|
252
|
+
--------------
|
253
|
+
* added dominance predict
|
254
|
+
* added MOS predict
|
255
|
+
* added PESQ predict
|
256
|
+
|
245
257
|
Version 0.57.0
|
246
258
|
--------------
|
247
259
|
* renamed autopredict predict
|
@@ -1,21 +1,24 @@
|
|
1
1
|
nkululeko/__init__.py,sha256=62f8HiEzJ8rG2QlTFJXUCMpvuH3fKI33DoJSj33mscc,63
|
2
2
|
nkululeko/ap_age.py,sha256=ZpWtNpfqseK2JwD2ZeRXdEtXm9EKmaeYwdQ-r-e0FcM,1054
|
3
3
|
nkululeko/ap_arousal.py,sha256=mYVHBdX4wmAjEZ9DvKBiVONJuDiiGN0Zn8HintV6OUQ,997
|
4
|
+
nkululeko/ap_dominance.py,sha256=gwsQ8OMSTgY9oG26L9wk4qfgGjR_gyo66yiDNQ9PY5I,1006
|
4
5
|
nkululeko/ap_gender.py,sha256=MfySaQNQEpV9GZCJm1vas_SIcXrCh7O5Q4X6AXVcQDE,983
|
6
|
+
nkululeko/ap_mos.py,sha256=GByXFm4IpHDyxUHqF5hmqnZbX4LfdH2quHjxzcrlzg0,1079
|
7
|
+
nkululeko/ap_pesq.py,sha256=DapnhAST1YHOkXptxoqvbFAti8rh2jvsR7HIGWxshZA,1111
|
5
8
|
nkululeko/ap_snr.py,sha256=X5Pnl9PDOw-w1cJSmzKaPtCMEiQhko6pWd0YAGeGYjQ,1082
|
6
9
|
nkululeko/ap_valence.py,sha256=cyFrKRy68EU5gDiVg0_HxiwaKGbAJ9UuwuiXgVTalAU,997
|
7
10
|
nkululeko/augment.py,sha256=8YVGm4kJWynrMknKc0okveKfHtv8KrnkwWZm60-ZcHo,1630
|
8
11
|
nkululeko/augmenter.py,sha256=nOJPb7Ut4wLlEcla1JaUiLntksrZqfvq1mFOCexpT7Y,2584
|
9
12
|
nkululeko/balancer.py,sha256=64ftZN68sMDfkvuovCDHpAHmSJgCO6Kdk9bwmpSisec,12
|
10
13
|
nkululeko/cacheddataset.py,sha256=bSJ_SDg7TxL89YL_pJXp-sFvdUXJtHuBTd5KSTE4AkQ,955
|
11
|
-
nkululeko/constants.py,sha256=
|
12
|
-
nkululeko/dataset.py,sha256=
|
14
|
+
nkululeko/constants.py,sha256=NVd5ylf2ISBL-XTr0fu2sJrttOdnSTrRPQrim34mGTM,18
|
15
|
+
nkululeko/dataset.py,sha256=pI4UYyR-H5ZeZBGXZqIOh1vGzPvzfp6yQx_cpQ-JIn8,20458
|
13
16
|
nkululeko/dataset_csv.py,sha256=4Pz_sjF_LJBd5mYDlnfY50ogksQ9j3XBczlI_rQrJ0Y,2110
|
14
17
|
nkululeko/dataset_ravdess.py,sha256=pTt98sr4_egdUCv2fWepkZTlkQ6x3A2YshO_n302DNg,537
|
15
18
|
nkululeko/demo.py,sha256=nGP3fUDXuW1ZF12AzMpzRWXct0rdqYRJVNgA9B_QWwA,1821
|
16
19
|
nkululeko/demo_predictor.py,sha256=VVxE2lf5lTkAP5qElG5U2bK6SdDzQ2Jmf0Vn_yHpSro,2302
|
17
20
|
nkululeko/estimate_snr.py,sha256=m3JZSRGXr2M9yVgovTSZ63rpho9hIUfHOXfAVRAHf1k,4186
|
18
|
-
nkululeko/experiment.py,sha256
|
21
|
+
nkululeko/experiment.py,sha256=-W3hYNs3vPMVcBUlKbZOFmQ8gsLao-VI_IvFg5Igd_k,24480
|
19
22
|
nkululeko/explore.py,sha256=CYh9-46yUGletO7p6xj_yx0zrYJ7FoqlQg_JbVY0TD8,1969
|
20
23
|
nkululeko/feats_agender.py,sha256=46DmyXVHKL7wH77j1W82ualUmPic93t8OAIL5q_yMXI,2750
|
21
24
|
nkululeko/feats_agender_agender.py,sha256=Vwt3fynWHwmTMJtHu5ltDQhtW_VO3ImKqwGMNoxhIyI,2832
|
@@ -25,13 +28,15 @@ nkululeko/feats_audmodel_dim.py,sha256=Pd_LXvjJTGb3MAuXiFo0_50BABJnm3IdxUVkRYLEY
|
|
25
28
|
nkululeko/feats_clap.py,sha256=CHOkNzdMNK5vDld69EsBeBTkyxn_hY1d3LyU2lO3mR0,3250
|
26
29
|
nkululeko/feats_import.py,sha256=Gm-svzwNY8Qvdv91VjgjmAudroAi32v2gCC56USJtKA,2045
|
27
30
|
nkululeko/feats_mld.py,sha256=6ErExKzDpfwoLwzBBNMeIZ2G5D2ovHA7UvKRqVdF-bo,1909
|
31
|
+
nkululeko/feats_mos.py,sha256=xp51EWetc7d4pMrUP3z0j_9hErDNLMo5GetNDiItOMA,3887
|
28
32
|
nkululeko/feats_opensmile.py,sha256=PjnG0P29-yGmaMmTm8fitWm5AUOj8yEbPIT6FHQ8pPk,3786
|
29
33
|
nkululeko/feats_oxbow.py,sha256=lZLPXcUk7IcexM3O5kw-ekkYodfXE6QpS2QSHU1D6F8,4425
|
34
|
+
nkululeko/feats_pesq.py,sha256=yVNvaMDEV4CO_sqhndgXRa8K7kCi2nANFMv_816krzk,3733
|
30
35
|
nkululeko/feats_praat.py,sha256=BbjgpIO-dJ2GuVxQdaTtu8rRuaJ0dmFm9F3g_z_5SCA,3024
|
31
36
|
nkululeko/feats_snr.py,sha256=BOhO0kDxyfnSTLA6gxSYilNkRGiXhamShZJNron8Z6g,2605
|
32
37
|
nkululeko/feats_trill.py,sha256=dydoLTVZnWeps_Ur0xWNhGdAw3PxA9yFCg6exTi2zhs,2934
|
33
38
|
nkululeko/feats_wav2vec2.py,sha256=S63QmTiGlyEalO4HjacAh9KxOAVO80vZntG-Alk91WU,4005
|
34
|
-
nkululeko/feature_extractor.py,sha256=
|
39
|
+
nkululeko/feature_extractor.py,sha256=1ZAYMEZThkrcEL07ObqWWkcUsd7da_Ij2z12ozN4gyM,5111
|
35
40
|
nkululeko/featureset.py,sha256=8zYafHU_nDYV89AukfNobltCxBuoIvvRIGEXPm0PCI0,1331
|
36
41
|
nkululeko/feinberg_praat.py,sha256=fUrdVo1aJNitdG1L0sZRfIvGMJJdQwG3BXoAV5xjh5o,19472
|
37
42
|
nkululeko/file_checker.py,sha256=Nw05SIp7Ez1U9ZeFhNGz0XivwKr43hHg1WsfzKsrFPQ,3510
|
@@ -68,8 +73,8 @@ nkululeko/syllable_nuclei.py,sha256=vK9dj5deqRnyEmlZmhFtKPzqKVGNCgTnWaG8UDITKNg,
|
|
68
73
|
nkululeko/test.py,sha256=BbHGliDChAXqMe2oA579dJpyZSlPGAm5997lX_POboQ,1372
|
69
74
|
nkululeko/test_predictor.py,sha256=7hbUhF09YqI7ixMp3gtVVnAO3prLF3J5tHH9mv125pM,2405
|
70
75
|
nkululeko/util.py,sha256=gZrNTF4C7hKkEMCC_hoNkEAhAViWzWebP8LsHRew7s4,9731
|
71
|
-
nkululeko-0.
|
72
|
-
nkululeko-0.
|
73
|
-
nkululeko-0.
|
74
|
-
nkululeko-0.
|
75
|
-
nkululeko-0.
|
76
|
+
nkululeko-0.58.0.dist-info/LICENSE,sha256=0zGP5B_W35yAcGfHPS18Q2B8UhvLRY3dQq1MhpsJU_U,1076
|
77
|
+
nkululeko-0.58.0.dist-info/METADATA,sha256=oXjiP4gxGgEe8GsPo_a9nO4-VoUJrd4DLN7o11trm90,20729
|
78
|
+
nkululeko-0.58.0.dist-info/WHEEL,sha256=5sUXSg9e4bi7lTLOHcm6QEYwO5TIF1TNbTSVFVjcJcc,92
|
79
|
+
nkululeko-0.58.0.dist-info/top_level.txt,sha256=DPFNNSHPjUeVKj44dVANAjuVGRCC3MusJ08lc2a8xFA,10
|
80
|
+
nkululeko-0.58.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|