nkululeko 0.83.1__tar.gz → 0.83.3__tar.gz
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-0.83.1 → nkululeko-0.83.3}/CHANGELOG.md +8 -0
- {nkululeko-0.83.1/nkululeko.egg-info → nkululeko-0.83.3}/PKG-INFO +9 -1
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/constants.py +1 -1
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/experiment.py +15 -8
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_agender_agender.py +4 -2
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_squim.py +8 -3
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_trill.py +31 -31
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_wav2vec2.py +8 -7
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_whisper.py +6 -3
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/models/model_cnn.py +14 -6
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/models/model_mlp.py +16 -7
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/models/model_mlp_regression.py +15 -7
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/plots.py +30 -15
- {nkululeko-0.83.1 → nkululeko-0.83.3/nkululeko.egg-info}/PKG-INFO +9 -1
- {nkululeko-0.83.1 → nkululeko-0.83.3}/LICENSE +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/README.md +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/aesdd/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/androids/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/androids_orig/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/androids_test/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/ased/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/asvp-esd/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/baved/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/cafe/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/clac/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/cmu-mosei/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/demos/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/ekorpus/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/emns/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/emofilm/convert_to_16k.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/emofilm/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/emorynlp/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/emov-db/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/emovo/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/emozionalmente/create.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/enterface/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/esd/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/gerparas/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/iemocap/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/jl/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/jtes/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/meld/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/mesd/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/mess/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/mlendsnd/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/msp-improv/process_database2.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/msp-podcast/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/oreau2/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/portuguese/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/ravdess/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/ravdess/process_database_speaker.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/savee/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/shemo/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/subesco/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/tess/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/thorsten-emotional/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/urdu/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/data/vivae/process_database.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/docs/source/conf.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/meta/demos/demo_best_model.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/meta/demos/my_experiment.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/meta/demos/my_experiment_local.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/meta/demos/plot_faster_anim.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/__init__.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/aug_train.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/augment.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/augmenting/__init__.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/augmenting/augmenter.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/augmenting/randomsplicer.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/augmenting/randomsplicing.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/augmenting/resampler.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/autopredict/__init__.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/autopredict/ap_age.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/autopredict/ap_arousal.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/autopredict/ap_dominance.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/autopredict/ap_gender.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/autopredict/ap_mos.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/autopredict/ap_pesq.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/autopredict/ap_sdr.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/autopredict/ap_snr.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/autopredict/ap_stoi.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/autopredict/ap_valence.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/autopredict/estimate_snr.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/cacheddataset.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/data/__init__.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/data/dataset.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/data/dataset_csv.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/demo.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/demo_feats.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/demo_predictor.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/explore.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/export.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/__init__.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_agender.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_analyser.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_auddim.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_audmodel.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_clap.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_hubert.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_import.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_mld.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_mos.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_opensmile.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_oxbow.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_praat.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_snr.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_spectra.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_spkrec.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feats_wavlm.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/featureset.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feat_extract/feinberg_praat.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/feature_extractor.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/file_checker.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/filter_data.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/glob_conf.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/losses/__init__.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/losses/loss_ccc.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/losses/loss_softf1loss.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/modelrunner.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/models/__init__.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/models/model.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/models/model_bayes.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/models/model_gmm.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/models/model_knn.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/models/model_knn_reg.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/models/model_lin_reg.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/models/model_svm.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/models/model_svr.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/models/model_tree.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/models/model_tree_reg.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/models/model_xgb.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/models/model_xgr.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/multidb.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/nkuluflag.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/nkululeko.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/predict.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/reporting/__init__.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/reporting/defines.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/reporting/latex_writer.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/reporting/report.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/reporting/report_item.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/reporting/reporter.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/reporting/result.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/resample.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/runmanager.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/scaler.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/segment.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/segmenting/__init__.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/segmenting/seg_inaspeechsegmenter.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/segmenting/seg_silero.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/syllable_nuclei.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/test.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/test_predictor.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/utils/__init__.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/utils/files.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/utils/stats.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko/utils/util.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko.egg-info/SOURCES.txt +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko.egg-info/dependency_links.txt +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko.egg-info/requires.txt +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/nkululeko.egg-info/top_level.txt +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/pyproject.toml +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/setup.cfg +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/setup.py +0 -0
- {nkululeko-0.83.1 → nkululeko-0.83.3}/venv/bin/activate_this.py +0 -0
@@ -1,6 +1,14 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
+
Version 0.83.3
|
5
|
+
--------------
|
6
|
+
* fixed a naming error in trill features that prevented storage of experiment
|
7
|
+
|
8
|
+
Version 0.83.2
|
9
|
+
--------------
|
10
|
+
* added default cuda if present and not stated
|
11
|
+
|
4
12
|
Version 0.83.1
|
5
13
|
--------------
|
6
14
|
* add test module to nkuluflag
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: nkululeko
|
3
|
-
Version: 0.83.
|
3
|
+
Version: 0.83.3
|
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
|
@@ -333,6 +333,14 @@ F. Burkhardt, Johannes Wagner, Hagen Wierstorf, Florian Eyben and Björn Schulle
|
|
333
333
|
Changelog
|
334
334
|
=========
|
335
335
|
|
336
|
+
Version 0.83.3
|
337
|
+
--------------
|
338
|
+
* fixed a naming error in trill features that prevented storage of experiment
|
339
|
+
|
340
|
+
Version 0.83.2
|
341
|
+
--------------
|
342
|
+
* added default cuda if present and not stated
|
343
|
+
|
336
344
|
Version 0.83.1
|
337
345
|
--------------
|
338
346
|
* add test module to nkuluflag
|
@@ -1,2 +1,2 @@
|
|
1
|
-
VERSION="0.83.
|
1
|
+
VERSION="0.83.3"
|
2
2
|
SAMPLING_RATE = 16000
|
@@ -679,9 +679,12 @@ class Experiment:
|
|
679
679
|
return result
|
680
680
|
|
681
681
|
def load(self, filename):
|
682
|
-
|
683
|
-
|
684
|
-
|
682
|
+
try:
|
683
|
+
f = open(filename, "rb")
|
684
|
+
tmp_dict = pickle.load(f)
|
685
|
+
f.close()
|
686
|
+
except EOFError as eof:
|
687
|
+
self.util.error(f"can't open file {filename}: {eof}")
|
685
688
|
self.__dict__.update(tmp_dict)
|
686
689
|
glob_conf.set_labels(self.labels)
|
687
690
|
|
@@ -689,22 +692,26 @@ class Experiment:
|
|
689
692
|
if self.runmgr.modelrunner.model.is_ann():
|
690
693
|
self.runmgr.modelrunner.model = None
|
691
694
|
self.util.warn(
|
692
|
-
|
695
|
+
"Save experiment: Can't pickle the learning model so saving without it."
|
693
696
|
)
|
694
697
|
try:
|
695
698
|
f = open(filename, "wb")
|
696
699
|
pickle.dump(self.__dict__, f)
|
697
700
|
f.close()
|
698
|
-
except TypeError:
|
701
|
+
except (TypeError, AttributeError) as error:
|
699
702
|
self.feature_extractor.feat_extractor.model = None
|
700
703
|
f = open(filename, "wb")
|
701
704
|
pickle.dump(self.__dict__, f)
|
702
705
|
f.close()
|
703
706
|
self.util.warn(
|
704
|
-
|
707
|
+
"Save experiment: Can't pickle the feature extraction model so saving without it."
|
708
|
+
+ f"{type(error).__name__} {error}"
|
709
|
+
)
|
710
|
+
except RuntimeError as error:
|
711
|
+
self.util.warn(
|
712
|
+
"Save experiment: Can't pickle local object, NOT saving: "
|
713
|
+
+ f"{type(error).__name__} {error}"
|
705
714
|
)
|
706
|
-
except (AttributeError, RuntimeError) as error:
|
707
|
-
self.util.warn(f"Save experiment: Can't pickle local object: {error}")
|
708
715
|
|
709
716
|
def save_onnx(self, filename):
|
710
717
|
# export the model to onnx
|
@@ -28,9 +28,11 @@ class AgenderAgenderSet(Featureset):
|
|
28
28
|
if not os.path.isdir(model_root):
|
29
29
|
cache_root = audeer.mkdir("cache")
|
30
30
|
model_root = audeer.mkdir(model_root)
|
31
|
-
archive_path = audeer.download_url(
|
31
|
+
archive_path = audeer.download_url(
|
32
|
+
model_url, cache_root, verbose=True)
|
32
33
|
audeer.extract_archive(archive_path, model_root)
|
33
|
-
|
34
|
+
cuda = "cuda" if torch.cuda.is_available() else "cpu"
|
35
|
+
device = self.util.config_val("MODEL", "device", cuda)
|
34
36
|
self.model = audonnx.load(model_root, device=device)
|
35
37
|
# pytorch_total_params = sum(p.numel() for p in self.model.parameters())
|
36
38
|
# self.util.debug(
|
@@ -28,12 +28,17 @@ from nkululeko.utils.util import Util
|
|
28
28
|
|
29
29
|
|
30
30
|
class SquimSet(Featureset):
|
31
|
-
"""Class to predict SQUIM features"""
|
31
|
+
"""Class to predict SQUIM features."""
|
32
32
|
|
33
33
|
def __init__(self, name, data_df, feats_type):
|
34
|
-
"""Constructor.
|
34
|
+
"""Constructor.
|
35
|
+
|
36
|
+
Is_train is needed to distinguish from test/dev sets,
|
37
|
+
because they use the codebook from the training.
|
38
|
+
"""
|
35
39
|
super().__init__(name, data_df, feats_type)
|
36
|
-
|
40
|
+
cuda = "cuda" if torch.cuda.is_available() else "cpu"
|
41
|
+
self.device = self.util.config_val("MODEL", "device", cuda)
|
37
42
|
self.model_initialized = False
|
38
43
|
|
39
44
|
def init_model(self):
|
@@ -1,35 +1,39 @@
|
|
1
1
|
# feats_trill.py
|
2
|
-
import tensorflow_hub as hub
|
3
2
|
import os
|
3
|
+
|
4
|
+
import pandas as pd
|
4
5
|
import tensorflow as tf
|
5
|
-
|
6
|
+
import tensorflow_hub as hub
|
6
7
|
from tqdm import tqdm
|
7
|
-
|
8
|
+
|
8
9
|
import audiofile as af
|
9
|
-
|
10
|
-
import nkululeko.glob_conf as glob_conf
|
10
|
+
|
11
11
|
from nkululeko.feat_extract.featureset import Featureset
|
12
|
+
import nkululeko.glob_conf as glob_conf
|
13
|
+
from nkululeko.utils.util import Util
|
14
|
+
|
12
15
|
|
13
16
|
# Import TF 2.X and make sure we're running eager.
|
14
17
|
assert tf.executing_eagerly()
|
15
18
|
|
16
19
|
|
17
20
|
class TRILLset(Featureset):
|
18
|
-
"""A feature extractor for the Google TRILL embeddings
|
21
|
+
"""A feature extractor for the Google TRILL embeddings.
|
19
22
|
|
20
|
-
|
23
|
+
See https://ai.googleblog.com/2020/06/improving-speech-representations-and.html.
|
24
|
+
"""
|
21
25
|
|
22
26
|
# Initialization of the class
|
23
27
|
def __init__(self, name, data_df, feats_type):
|
24
|
-
"""
|
25
|
-
Initialize the class with name, data and Util instance
|
26
|
-
Also loads the model from hub
|
28
|
+
"""Initialize the class with name, data and Util instance.
|
27
29
|
|
28
|
-
|
29
|
-
:
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
Also loads the model from hub
|
31
|
+
Args:
|
32
|
+
:param name: Name of the class
|
33
|
+
:type name: str
|
34
|
+
:param data_df: Data of the class
|
35
|
+
:type data_df: DataFrame
|
36
|
+
:return: None
|
33
37
|
"""
|
34
38
|
super().__init__(name, data_df, feats_type)
|
35
39
|
# Load the model from the configured path
|
@@ -38,25 +42,21 @@ class TRILLset(Featureset):
|
|
38
42
|
"trill.model",
|
39
43
|
"https://tfhub.dev/google/nonsemantic-speech-benchmark/trill/3",
|
40
44
|
)
|
41
|
-
self.
|
45
|
+
self.model = hub.load(model_path)
|
42
46
|
self.feats_type = feats_type
|
43
47
|
|
44
48
|
def extract(self):
|
45
49
|
store = self.util.get_path("store")
|
46
50
|
storage = f"{store}{self.name}.pkl"
|
47
|
-
extract = self.util.config_val(
|
48
|
-
"FEATS", "needs_feature_extraction", False)
|
51
|
+
extract = self.util.config_val("FEATS", "needs_feature_extraction", False)
|
49
52
|
no_reuse = eval(self.util.config_val("FEATS", "no_reuse", "False"))
|
50
53
|
if extract or no_reuse or not os.path.isfile(storage):
|
51
|
-
self.util.debug(
|
52
|
-
"extracting TRILL embeddings, this might take a while...")
|
54
|
+
self.util.debug("extracting TRILL embeddings, this might take a while...")
|
53
55
|
emb_series = pd.Series(index=self.data_df.index, dtype=object)
|
54
|
-
length = len(self.data_df.index)
|
55
56
|
for idx, file in enumerate(tqdm(self.data_df.index.get_level_values(0))):
|
56
|
-
emb = self.
|
57
|
-
emb_series[idx] = emb
|
58
|
-
self.df = pd.DataFrame(
|
59
|
-
emb_series.values.tolist(), index=self.data_df.index)
|
57
|
+
emb = self.get_embeddings(file)
|
58
|
+
emb_series.iloc[idx] = emb
|
59
|
+
self.df = pd.DataFrame(emb_series.values.tolist(), index=self.data_df.index)
|
60
60
|
self.df.to_pickle(storage)
|
61
61
|
try:
|
62
62
|
glob_conf.config["DATA"]["needs_feature_extraction"] = "false"
|
@@ -70,15 +70,15 @@ class TRILLset(Featureset):
|
|
70
70
|
if len(wav.shape) > 1:
|
71
71
|
wav = tf.reduce_mean(wav, axis=0)
|
72
72
|
|
73
|
-
emb_dict = self.
|
73
|
+
emb_dict = self.model(samples=wav, sample_rate=tf.constant(16000))
|
74
74
|
return emb_dict["embedding"]
|
75
75
|
|
76
|
-
def
|
76
|
+
def get_embeddings(self, file):
|
77
77
|
wav = af.read(file)[0]
|
78
|
-
emb_short = self.
|
78
|
+
emb_short = self.get_embeddings_signal(wav, 16000)
|
79
79
|
return emb_short
|
80
80
|
|
81
|
-
def
|
81
|
+
def get_embeddings_signal(self, signal, sr):
|
82
82
|
wav = tf.convert_to_tensor(signal)
|
83
83
|
emb_short = self.embed_wav(wav)
|
84
84
|
# you get one embedding per frame, we use the mean for all the frames
|
@@ -86,7 +86,7 @@ class TRILLset(Featureset):
|
|
86
86
|
return emb_short
|
87
87
|
|
88
88
|
def extract_sample(self, signal, sr):
|
89
|
-
if self.
|
89
|
+
if self.model == None:
|
90
90
|
self.__init__("na", None)
|
91
|
-
feats = self.
|
91
|
+
feats = self.get_embeddings_signal(signal, sr)
|
92
92
|
return feats
|
@@ -21,7 +21,11 @@ class Wav2vec2(Featureset):
|
|
21
21
|
"""Class to extract wav2vec2 embeddings"""
|
22
22
|
|
23
23
|
def __init__(self, name, data_df, feat_type):
|
24
|
-
"""Constructor.
|
24
|
+
"""Constructor.
|
25
|
+
|
26
|
+
If_train is needed to distinguish from test/dev sets,
|
27
|
+
because they use the codebook from the training
|
28
|
+
"""
|
25
29
|
super().__init__(name, data_df, feat_type)
|
26
30
|
cuda = "cuda" if torch.cuda.is_available() else "cpu"
|
27
31
|
self.device = self.util.config_val("MODEL", "device", cuda)
|
@@ -39,8 +43,7 @@ class Wav2vec2(Featureset):
|
|
39
43
|
)
|
40
44
|
config = transformers.AutoConfig.from_pretrained(model_path)
|
41
45
|
layer_num = config.num_hidden_layers
|
42
|
-
hidden_layer = int(self.util.config_val(
|
43
|
-
"FEATS", "wav2vec2.layer", "0"))
|
46
|
+
hidden_layer = int(self.util.config_val("FEATS", "wav2vec2.layer", "0"))
|
44
47
|
config.num_hidden_layers = layer_num - hidden_layer
|
45
48
|
self.util.debug(f"using hidden layer #{config.num_hidden_layers}")
|
46
49
|
self.processor = Wav2Vec2FeatureExtractor.from_pretrained(model_path)
|
@@ -55,8 +58,7 @@ class Wav2vec2(Featureset):
|
|
55
58
|
"""Extract the features or load them from disk if present."""
|
56
59
|
store = self.util.get_path("store")
|
57
60
|
storage = f"{store}{self.name}.pkl"
|
58
|
-
extract = self.util.config_val(
|
59
|
-
"FEATS", "needs_feature_extraction", False)
|
61
|
+
extract = self.util.config_val("FEATS", "needs_feature_extraction", False)
|
60
62
|
no_reuse = eval(self.util.config_val("FEATS", "no_reuse", "False"))
|
61
63
|
if extract or no_reuse or not os.path.isfile(storage):
|
62
64
|
if not self.model_initialized:
|
@@ -77,8 +79,7 @@ class Wav2vec2(Featureset):
|
|
77
79
|
emb = self.get_embeddings(signal, sampling_rate, file)
|
78
80
|
emb_series[idx] = emb
|
79
81
|
# print(f"emb_series shape: {emb_series.shape}")
|
80
|
-
self.df = pd.DataFrame(
|
81
|
-
emb_series.values.tolist(), index=self.data_df.index)
|
82
|
+
self.df = pd.DataFrame(emb_series.values.tolist(), index=self.data_df.index)
|
82
83
|
# print(f"df shape: {self.df.shape}")
|
83
84
|
self.df.to_pickle(storage)
|
84
85
|
try:
|
@@ -32,19 +32,22 @@ class Whisper(Featureset):
|
|
32
32
|
model_name = f"openai/{self.feat_type}"
|
33
33
|
self.model = WhisperModel.from_pretrained(model_name).to(self.device)
|
34
34
|
print(f"intialized Whisper model on {self.device}")
|
35
|
-
self.feature_extractor = AutoFeatureExtractor.from_pretrained(
|
35
|
+
self.feature_extractor = AutoFeatureExtractor.from_pretrained(
|
36
|
+
model_name)
|
36
37
|
self.model_initialized = True
|
37
38
|
|
38
39
|
def extract(self):
|
39
40
|
"""Extract the features or load them from disk if present."""
|
40
41
|
store = self.util.get_path("store")
|
41
42
|
storage = f"{store}{self.name}.pkl"
|
42
|
-
extract = self.util.config_val(
|
43
|
+
extract = self.util.config_val(
|
44
|
+
"FEATS", "needs_feature_extraction", False)
|
43
45
|
no_reuse = eval(self.util.config_val("FEATS", "no_reuse", "False"))
|
44
46
|
if extract or no_reuse or not os.path.isfile(storage):
|
45
47
|
if not self.model_initialized:
|
46
48
|
self.init_model()
|
47
|
-
self.util.debug(
|
49
|
+
self.util.debug(
|
50
|
+
"extracting whisper embeddings, this might take a while...")
|
48
51
|
emb_series = []
|
49
52
|
for (file, start, end), _ in audeer.progress_bar(
|
50
53
|
self.data_df.iterrows(),
|
@@ -16,6 +16,7 @@ import numpy as np
|
|
16
16
|
from sklearn.metrics import recall_score
|
17
17
|
from collections import OrderedDict
|
18
18
|
from PIL import Image
|
19
|
+
from traitlets import default
|
19
20
|
|
20
21
|
from nkululeko.utils.util import Util
|
21
22
|
import nkululeko.glob_conf as glob_conf
|
@@ -48,6 +49,7 @@ class CNN_model(Model):
|
|
48
49
|
self.util.error(f"unknown loss function: {criterion}")
|
49
50
|
self.util.debug(f"using model with cross entropy loss function")
|
50
51
|
# set up the model
|
52
|
+
# cuda = "cuda" if torch.cuda.is_available() else "cpu"
|
51
53
|
self.device = self.util.config_val("MODEL", "device", "cpu")
|
52
54
|
try:
|
53
55
|
layers_string = glob_conf.config["MODEL"]["layers"]
|
@@ -84,7 +86,8 @@ class CNN_model(Model):
|
|
84
86
|
train_set = self.Dataset_image(
|
85
87
|
feats_train, df_train, self.target, transformations
|
86
88
|
)
|
87
|
-
test_set = self.Dataset_image(
|
89
|
+
test_set = self.Dataset_image(
|
90
|
+
feats_test, df_test, self.target, transformations)
|
88
91
|
# Define data loaders
|
89
92
|
self.trainloader = torch.utils.data.DataLoader(
|
90
93
|
train_set,
|
@@ -137,7 +140,8 @@ class CNN_model(Model):
|
|
137
140
|
losses = []
|
138
141
|
for images, labels in self.trainloader:
|
139
142
|
logits = self.model(images.to(self.device))
|
140
|
-
loss = self.criterion(logits, labels.to(
|
143
|
+
loss = self.criterion(logits, labels.to(
|
144
|
+
self.device, dtype=torch.int64))
|
141
145
|
losses.append(loss.item())
|
142
146
|
self.optimizer.zero_grad()
|
143
147
|
loss.backward()
|
@@ -165,14 +169,16 @@ class CNN_model(Model):
|
|
165
169
|
|
166
170
|
self.loss_eval = (np.asarray(losses)).mean()
|
167
171
|
predictions = logits.argmax(dim=1)
|
168
|
-
uar = recall_score(
|
172
|
+
uar = recall_score(
|
173
|
+
targets.numpy(), predictions.numpy(), average="macro")
|
169
174
|
return uar, targets, predictions
|
170
175
|
|
171
176
|
def predict(self):
|
172
177
|
_, truths, predictions = self.evaluate_model(
|
173
178
|
self.model, self.testloader, self.device
|
174
179
|
)
|
175
|
-
uar, _, _ = self.evaluate_model(
|
180
|
+
uar, _, _ = self.evaluate_model(
|
181
|
+
self.model, self.trainloader, self.device)
|
176
182
|
report = Reporter(truths, predictions, self.run, self.epoch)
|
177
183
|
try:
|
178
184
|
report.result.loss = self.loss
|
@@ -209,7 +215,8 @@ class CNN_model(Model):
|
|
209
215
|
dir = self.util.get_path("model_dir")
|
210
216
|
# name = f'{self.util.get_exp_name()}_{run}_{epoch:03d}.model'
|
211
217
|
name = f"{self.util.get_exp_name(only_train=True)}_{self.run}_{self.epoch:03d}.model"
|
212
|
-
|
218
|
+
cuda = "cuda" if torch.cuda.is_available() else "cpu"
|
219
|
+
self.device = self.util.config_val("MODEL", "device", cuda)
|
213
220
|
layers = ast.literal_eval(glob_conf.config["MODEL"]["layers"])
|
214
221
|
self.store_path = dir + name
|
215
222
|
drop = self.util.config_val("MODEL", "drop", False)
|
@@ -222,7 +229,8 @@ class CNN_model(Model):
|
|
222
229
|
def load_path(self, path, run, epoch):
|
223
230
|
self.set_id(run, epoch)
|
224
231
|
with open(path, "rb") as handle:
|
225
|
-
|
232
|
+
cuda = "cuda" if torch.cuda.is_available() else "cpu"
|
233
|
+
self.device = self.util.config_val("MODEL", "device", cuda)
|
226
234
|
layers = ast.literal_eval(glob_conf.config["MODEL"]["layers"])
|
227
235
|
self.store_path = path
|
228
236
|
drop = self.util.config_val("MODEL", "drop", False)
|
@@ -34,8 +34,9 @@ class MLP_model(Model):
|
|
34
34
|
else:
|
35
35
|
self.util.error(f"unknown loss function: {criterion}")
|
36
36
|
self.util.debug(f"using model with cross entropy loss function")
|
37
|
-
# set up the model
|
38
|
-
|
37
|
+
# set up the model, use GPU if availabe
|
38
|
+
cuda = "cuda" if torch.cuda.is_available() else "cpu"
|
39
|
+
self.device = self.util.config_val("MODEL", "device", cuda)
|
39
40
|
try:
|
40
41
|
layers_string = glob_conf.config["MODEL"]["layers"]
|
41
42
|
except KeyError as ke:
|
@@ -86,7 +87,8 @@ class MLP_model(Model):
|
|
86
87
|
losses = []
|
87
88
|
for features, labels in self.trainloader:
|
88
89
|
logits = self.model(features.to(self.device))
|
89
|
-
loss = self.criterion(logits, labels.to(
|
90
|
+
loss = self.criterion(logits, labels.to(
|
91
|
+
self.device, dtype=torch.int64))
|
90
92
|
losses.append(loss.item())
|
91
93
|
self.optimizer.zero_grad()
|
92
94
|
loss.backward()
|
@@ -114,14 +116,16 @@ class MLP_model(Model):
|
|
114
116
|
|
115
117
|
self.loss_eval = (np.asarray(losses)).mean()
|
116
118
|
predictions = logits.argmax(dim=1)
|
117
|
-
uar = recall_score(
|
119
|
+
uar = recall_score(
|
120
|
+
targets.numpy(), predictions.numpy(), average="macro")
|
118
121
|
return uar, targets, predictions
|
119
122
|
|
120
123
|
def predict(self):
|
121
124
|
_, truths, predictions = self.evaluate_model(
|
122
125
|
self.model, self.testloader, self.device
|
123
126
|
)
|
124
|
-
uar, _, _ = self.evaluate_model(
|
127
|
+
uar, _, _ = self.evaluate_model(
|
128
|
+
self.model, self.trainloader, self.device)
|
125
129
|
report = Reporter(truths, predictions, self.run, self.epoch)
|
126
130
|
try:
|
127
131
|
report.result.loss = self.loss
|
@@ -179,6 +183,9 @@ class MLP_model(Model):
|
|
179
183
|
features = np.reshape(features, (-1, 1)).T
|
180
184
|
logits = self.model(features.to(self.device))
|
181
185
|
# logits = self.model(features)
|
186
|
+
# if tensor conver to cpu
|
187
|
+
if isinstance(logits, torch.Tensor):
|
188
|
+
logits = logits.cpu()
|
182
189
|
a = logits.numpy()
|
183
190
|
res = {}
|
184
191
|
for i in range(len(a[0])):
|
@@ -196,7 +203,8 @@ class MLP_model(Model):
|
|
196
203
|
dir = self.util.get_path("model_dir")
|
197
204
|
# name = f'{self.util.get_exp_name()}_{run}_{epoch:03d}.model'
|
198
205
|
name = f"{self.util.get_exp_name(only_train=True)}_{self.run}_{self.epoch:03d}.model"
|
199
|
-
|
206
|
+
cuda = "cuda" if torch.cuda.is_available() else "cpu"
|
207
|
+
self.device = self.util.config_val("MODEL", "device", cuda)
|
200
208
|
layers = ast.literal_eval(glob_conf.config["MODEL"]["layers"])
|
201
209
|
self.store_path = dir + name
|
202
210
|
drop = self.util.config_val("MODEL", "drop", False)
|
@@ -211,7 +219,8 @@ class MLP_model(Model):
|
|
211
219
|
def load_path(self, path, run, epoch):
|
212
220
|
self.set_id(run, epoch)
|
213
221
|
with open(path, "rb") as handle:
|
214
|
-
|
222
|
+
cuda = "cuda" if torch.cuda.is_available() else "cpu"
|
223
|
+
self.device = self.util.config_val("MODEL", "device", cuda)
|
215
224
|
layers = ast.literal_eval(glob_conf.config["MODEL"]["layers"])
|
216
225
|
self.store_path = path
|
217
226
|
drop = self.util.config_val("MODEL", "drop", False)
|
@@ -9,6 +9,7 @@ import torch
|
|
9
9
|
from audmetric import concordance_cc
|
10
10
|
from audmetric import mean_absolute_error
|
11
11
|
from audmetric import mean_squared_error
|
12
|
+
from traitlets import default
|
12
13
|
|
13
14
|
import nkululeko.glob_conf as glob_conf
|
14
15
|
from nkululeko.losses.loss_ccc import ConcordanceCorCoeff
|
@@ -40,7 +41,8 @@ class MLP_Reg_model(Model):
|
|
40
41
|
self.util.error(f"unknown loss function: {criterion}")
|
41
42
|
self.util.debug(f"training model with {criterion} loss function")
|
42
43
|
# set up the model
|
43
|
-
|
44
|
+
cuda = "cuda" if torch.cuda.is_available() else "cpu"
|
45
|
+
self.device = self.util.config_val("MODEL", "device", cuda)
|
44
46
|
layers_string = glob_conf.config["MODEL"]["layers"]
|
45
47
|
self.util.debug(f"using layers {layers_string}")
|
46
48
|
try:
|
@@ -50,7 +52,8 @@ class MLP_Reg_model(Model):
|
|
50
52
|
drop = self.util.config_val("MODEL", "drop", False)
|
51
53
|
if drop:
|
52
54
|
self.util.debug(f"training with dropout: {drop}")
|
53
|
-
self.model = self.MLP(
|
55
|
+
self.model = self.MLP(
|
56
|
+
feats_train.shape[1], layers, 1, drop).to(self.device)
|
54
57
|
self.learning_rate = float(
|
55
58
|
self.util.config_val("MODEL", "learning_rate", 0.0001)
|
56
59
|
)
|
@@ -93,8 +96,10 @@ class MLP_Reg_model(Model):
|
|
93
96
|
_, truths, predictions = self.evaluate_model(
|
94
97
|
self.model, self.testloader, self.device
|
95
98
|
)
|
96
|
-
result, _, _ = self.evaluate_model(
|
97
|
-
|
99
|
+
result, _, _ = self.evaluate_model(
|
100
|
+
self.model, self.trainloader, self.device)
|
101
|
+
report = Reporter(truths.numpy(), predictions.numpy(),
|
102
|
+
self.run, self.epoch)
|
98
103
|
try:
|
99
104
|
report.result.loss = self.loss
|
100
105
|
except AttributeError: # if the model was loaded from disk the loss is unknown
|
@@ -128,9 +133,11 @@ class MLP_Reg_model(Model):
|
|
128
133
|
|
129
134
|
def __getitem__(self, item):
|
130
135
|
index = self.df.index[item]
|
131
|
-
features = self.df_features.loc[index, :].values.astype(
|
136
|
+
features = self.df_features.loc[index, :].values.astype(
|
137
|
+
"float32").squeeze()
|
132
138
|
labels = (
|
133
|
-
np.array([self.df.loc[index, self.label]]
|
139
|
+
np.array([self.df.loc[index, self.label]]
|
140
|
+
).astype("float32").squeeze()
|
134
141
|
)
|
135
142
|
return features, labels
|
136
143
|
|
@@ -187,7 +194,8 @@ class MLP_Reg_model(Model):
|
|
187
194
|
end_index = (index + 1) * loader.batch_size
|
188
195
|
if end_index > len(loader.dataset):
|
189
196
|
end_index = len(loader.dataset)
|
190
|
-
logits[start_index:end_index] = model(
|
197
|
+
logits[start_index:end_index] = model(
|
198
|
+
features.to(device)).reshape(-1)
|
191
199
|
targets[start_index:end_index] = labels
|
192
200
|
loss = self.criterion(
|
193
201
|
logits[start_index:end_index].to(
|