nkululeko 0.93.10__tar.gz → 0.93.12__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.93.10 → nkululeko-0.93.12}/CHANGELOG.md +9 -1
- {nkululeko-0.93.10/nkululeko.egg-info → nkululeko-0.93.12}/PKG-INFO +12 -4
- {nkululeko-0.93.10 → nkululeko-0.93.12}/README.md +1 -1
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/constants.py +1 -1
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/data/dataset.py +60 -29
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/plots.py +1 -2
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/segment.py +6 -6
- {nkululeko-0.93.10 → nkululeko-0.93.12/nkululeko.egg-info}/PKG-INFO +12 -4
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko.egg-info/SOURCES.txt +1 -47
- nkululeko-0.93.10/data/aesdd/process_database.py +0 -50
- nkululeko-0.93.10/data/androids/process_database.py +0 -94
- nkululeko-0.93.10/data/ased/process_database.py +0 -58
- nkululeko-0.93.10/data/asvp-esd/process_database.py +0 -79
- nkululeko-0.93.10/data/baved/process_database.py +0 -63
- nkululeko-0.93.10/data/cafe/process_database.py +0 -50
- nkululeko-0.93.10/data/clac/process_database.py +0 -47
- nkululeko-0.93.10/data/cmu-mosei/process_database.py +0 -53
- nkululeko-0.93.10/data/demos/process_database.py +0 -67
- nkululeko-0.93.10/data/ekorpus/process_database.py +0 -54
- nkululeko-0.93.10/data/emns/process_database.py +0 -66
- nkululeko-0.93.10/data/emofilm/convert_to_16k.py +0 -38
- nkululeko-0.93.10/data/emofilm/process_database.py +0 -51
- nkululeko-0.93.10/data/emorynlp/process_database.py +0 -59
- nkululeko-0.93.10/data/emov-db/process_database.py +0 -66
- nkululeko-0.93.10/data/emovo/process_database.py +0 -57
- nkululeko-0.93.10/data/emozionalmente/create.py +0 -236
- nkululeko-0.93.10/data/enterface/process_database.py +0 -80
- nkululeko-0.93.10/data/esd/process_database.py +0 -51
- nkululeko-0.93.10/data/gerparas/process_database.py +0 -70
- nkululeko-0.93.10/data/iemocap/process_database.py +0 -83
- nkululeko-0.93.10/data/jl/process_database.py +0 -69
- nkululeko-0.93.10/data/jtes/process_database.py +0 -57
- nkululeko-0.93.10/data/meld/process_database.py +0 -112
- nkululeko-0.93.10/data/mesd/process_database.py +0 -59
- nkululeko-0.93.10/data/mess/process_database.py +0 -54
- nkululeko-0.93.10/data/mlendsnd/process_database.py +0 -59
- nkululeko-0.93.10/data/msp-improv/process_database2.py +0 -60
- nkululeko-0.93.10/data/msp-podcast/process_database.py +0 -89
- nkululeko-0.93.10/data/oreau2/process_database.py +0 -60
- nkululeko-0.93.10/data/portuguese/process_database.py +0 -122
- nkululeko-0.93.10/data/ravdess/process_database.py +0 -102
- nkululeko-0.93.10/data/ravdess/process_database_speaker.py +0 -88
- nkululeko-0.93.10/data/savee/process_database.py +0 -53
- nkululeko-0.93.10/data/shemo/process_database.py +0 -58
- nkululeko-0.93.10/data/subesco/process_database.py +0 -78
- nkululeko-0.93.10/data/tess/process_database.py +0 -52
- nkululeko-0.93.10/data/thorsten-emotional/process_database.py +0 -42
- nkululeko-0.93.10/data/urdu/process_database.py +0 -64
- nkululeko-0.93.10/data/vivae/process_database.py +0 -38
- nkululeko-0.93.10/docs/source/conf.py +0 -96
- nkululeko-0.93.10/meta/demos/demo_best_model.py +0 -32
- nkululeko-0.93.10/meta/demos/my_experiment.py +0 -52
- nkululeko-0.93.10/meta/demos/my_experiment_local.py +0 -48
- nkululeko-0.93.10/meta/demos/plot_faster_anim.py +0 -35
- nkululeko-0.93.10/venv/bin/activate_this.py +0 -32
- {nkululeko-0.93.10 → nkululeko-0.93.12}/LICENSE +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/__init__.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/aug_train.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/augment.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/augmenting/__init__.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/augmenting/augmenter.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/augmenting/randomsplicer.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/augmenting/randomsplicing.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/augmenting/resampler.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/autopredict/__init__.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/autopredict/ap_age.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/autopredict/ap_arousal.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/autopredict/ap_dominance.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/autopredict/ap_gender.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/autopredict/ap_mos.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/autopredict/ap_pesq.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/autopredict/ap_sdr.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/autopredict/ap_sid.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/autopredict/ap_snr.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/autopredict/ap_stoi.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/autopredict/ap_valence.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/autopredict/estimate_snr.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/cacheddataset.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/data/__init__.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/data/dataset_csv.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/demo-ft.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/demo.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/demo_feats.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/demo_predictor.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/ensemble.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/experiment.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/explore.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/export.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/__init__.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_agender.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_agender_agender.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_analyser.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_ast.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_auddim.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_audmodel.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_clap.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_hubert.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_import.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_mld.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_mos.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_opensmile.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_oxbow.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_praat.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_snr.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_spectra.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_spkrec.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_squim.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_trill.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_wav2vec2.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_wavlm.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feats_whisper.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/featureset.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/feinberg_praat.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feat_extract/transformer_feature_extractor.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/feature_extractor.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/file_checker.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/filter_data.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/fixedsegment.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/glob_conf.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/losses/__init__.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/losses/loss_ccc.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/losses/loss_softf1loss.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/modelrunner.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/models/__init__.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/models/model.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/models/model_bayes.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/models/model_cnn.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/models/model_gmm.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/models/model_knn.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/models/model_knn_reg.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/models/model_lin_reg.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/models/model_mlp.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/models/model_mlp_regression.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/models/model_svm.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/models/model_svr.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/models/model_tree.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/models/model_tree_reg.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/models/model_tuned.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/models/model_xgb.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/models/model_xgr.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/multidb.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/nkuluflag.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/nkululeko.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/predict.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/reporting/__init__.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/reporting/defines.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/reporting/latex_writer.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/reporting/report.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/reporting/report_item.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/reporting/reporter.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/reporting/result.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/resample.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/runmanager.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/scaler.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/segmenting/__init__.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/segmenting/seg_inaspeechsegmenter.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/segmenting/seg_pyannote.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/segmenting/seg_silero.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/syllable_nuclei.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/test.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/test_predictor.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/test_pretrain.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/utils/__init__.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/utils/files.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/utils/stats.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko/utils/util.py +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko.egg-info/dependency_links.txt +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko.egg-info/entry_points.txt +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko.egg-info/requires.txt +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/nkululeko.egg-info/top_level.txt +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/pyproject.toml +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/setup.cfg +0 -0
- {nkululeko-0.93.10 → nkululeko-0.93.12}/setup.py +0 -0
@@ -1,8 +1,16 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
+
Version 0.93.12
|
5
|
+
---------------
|
6
|
+
* bugfix: map_continuous_to_cat crashed on empty data
|
7
|
+
|
8
|
+
Version 0.93.11
|
9
|
+
---------------
|
10
|
+
* bugfix: silero segmenter assigned file duration values
|
11
|
+
|
4
12
|
Version 0.93.10
|
5
|
-
|
13
|
+
---------------
|
6
14
|
* added nan check for imported features
|
7
15
|
* added LOGO result output
|
8
16
|
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.2
|
2
2
|
Name: nkululeko
|
3
|
-
Version: 0.93.
|
3
|
+
Version: 0.93.12
|
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
|
@@ -63,7 +63,7 @@ Requires-Dist: pylatex
|
|
63
63
|
## Overview
|
64
64
|
A project to detect speaker characteristics by machine learning experiments with a high-level interface.
|
65
65
|
|
66
|
-
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.
|
66
|
+
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.
|
67
67
|
|
68
68
|
* NEW with nkululeko: [Ensemble learning](http://blog.syntheticspeech.de/2024/06/25/nkululeko-ensemble-classifiers-with-late-fusion/)
|
69
69
|
* NEW: [Finetune transformer-models](http://blog.syntheticspeech.de/2024/05/29/nkululeko-how-to-finetune-a-transformer-model/)
|
@@ -353,8 +353,16 @@ If you use it, please mention the Nkululeko paper:
|
|
353
353
|
Changelog
|
354
354
|
=========
|
355
355
|
|
356
|
+
Version 0.93.12
|
357
|
+
---------------
|
358
|
+
* bugfix: map_continuous_to_cat crashed on empty data
|
359
|
+
|
360
|
+
Version 0.93.11
|
361
|
+
---------------
|
362
|
+
* bugfix: silero segmenter assigned file duration values
|
363
|
+
|
356
364
|
Version 0.93.10
|
357
|
-
|
365
|
+
---------------
|
358
366
|
* added nan check for imported features
|
359
367
|
* added LOGO result output
|
360
368
|
|
@@ -22,7 +22,7 @@
|
|
22
22
|
## Overview
|
23
23
|
A project to detect speaker characteristics by machine learning experiments with a high-level interface.
|
24
24
|
|
25
|
-
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.
|
25
|
+
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.
|
26
26
|
|
27
27
|
* NEW with nkululeko: [Ensemble learning](http://blog.syntheticspeech.de/2024/06/25/nkululeko-ensemble-classifiers-with-late-fusion/)
|
28
28
|
* NEW: [Finetune transformer-models](http://blog.syntheticspeech.de/2024/05/29/nkululeko-how-to-finetune-a-transformer-model/)
|
@@ -1,2 +1,2 @@
|
|
1
|
-
VERSION="0.93.
|
1
|
+
VERSION="0.93.12"
|
2
2
|
SAMPLING_RATE = 16000
|
@@ -34,9 +34,11 @@ class Dataset:
|
|
34
34
|
self.plot = Plots()
|
35
35
|
self.limit = int(self.util.config_val_data(self.name, "limit", 0))
|
36
36
|
self.target_tables_append = eval(
|
37
|
-
self.util.config_val_data(
|
37
|
+
self.util.config_val_data(
|
38
|
+
self.name, "target_tables_append", "False")
|
38
39
|
)
|
39
|
-
self.start_fresh = eval(
|
40
|
+
self.start_fresh = eval(
|
41
|
+
self.util.config_val("DATA", "no_reuse", "False"))
|
40
42
|
self.is_labeled, self.got_speaker, self.got_gender, self.got_age = (
|
41
43
|
False,
|
42
44
|
False,
|
@@ -70,7 +72,8 @@ class Dataset:
|
|
70
72
|
try:
|
71
73
|
self.db = audformat.Database.load(root)
|
72
74
|
except FileNotFoundError:
|
73
|
-
self.util.error(
|
75
|
+
self.util.error(
|
76
|
+
f"{self.name}: no audformat database found at {root}")
|
74
77
|
return root
|
75
78
|
|
76
79
|
def _check_cols(self, df):
|
@@ -92,7 +95,8 @@ class Dataset:
|
|
92
95
|
)
|
93
96
|
self.util.debug(r_string)
|
94
97
|
if glob_conf.report.initial:
|
95
|
-
glob_conf.report.add_item(ReportItem(
|
98
|
+
glob_conf.report.add_item(ReportItem(
|
99
|
+
"Data", "Load report", r_string))
|
96
100
|
glob_conf.report.initial = False
|
97
101
|
|
98
102
|
def load(self):
|
@@ -103,7 +107,8 @@ class Dataset:
|
|
103
107
|
store_file = f"{store}{self.name}.{store_format}"
|
104
108
|
self.root = self._load_db()
|
105
109
|
if not self.start_fresh and os.path.isfile(store_file):
|
106
|
-
self.util.debug(
|
110
|
+
self.util.debug(
|
111
|
+
f"{self.name}: reusing previously stored file {store_file}")
|
107
112
|
self.df = self.util.get_store(store_file, store_format)
|
108
113
|
self.is_labeled = self.target in self.df
|
109
114
|
self.got_gender = "gender" in self.df
|
@@ -118,10 +123,12 @@ class Dataset:
|
|
118
123
|
# map the audio file paths
|
119
124
|
self.db.map_files(lambda x: os.path.join(self.root, x))
|
120
125
|
# the dataframes (potentially more than one) with at least the file names
|
121
|
-
df_files = self.util.config_val_data(
|
126
|
+
df_files = self.util.config_val_data(
|
127
|
+
self.name, "files_tables", "['files']")
|
122
128
|
df_files_tables = ast.literal_eval(df_files)
|
123
129
|
# The label for the target column
|
124
|
-
self.col_label = self.util.config_val_data(
|
130
|
+
self.col_label = self.util.config_val_data(
|
131
|
+
self.name, "label", self.target)
|
125
132
|
(
|
126
133
|
df,
|
127
134
|
self.is_labeled,
|
@@ -157,7 +164,8 @@ class Dataset:
|
|
157
164
|
self.got_age = got_age2 or self.got_age
|
158
165
|
if audformat.is_filewise_index(df_target.index):
|
159
166
|
try:
|
160
|
-
df_target = df_target.loc[df.index.get_level_values(
|
167
|
+
df_target = df_target.loc[df.index.get_level_values(
|
168
|
+
"file")]
|
161
169
|
df_target = df_target.set_index(df.index)
|
162
170
|
except KeyError:
|
163
171
|
# just a try...
|
@@ -206,7 +214,8 @@ class Dataset:
|
|
206
214
|
end = self.df.index.get_level_values(2)
|
207
215
|
self.df["duration"] = (end - start).total_seconds()
|
208
216
|
elif self.df.duration.dtype == "timedelta64[ns]":
|
209
|
-
self.df["duration"] = self.df["duration"].map(
|
217
|
+
self.df["duration"] = self.df["duration"].map(
|
218
|
+
lambda x: x.total_seconds())
|
210
219
|
# Perform some filtering if desired
|
211
220
|
required = self.util.config_val_data(self.name, "required", False)
|
212
221
|
if required:
|
@@ -236,15 +245,18 @@ class Dataset:
|
|
236
245
|
res.append(abs(n - max))
|
237
246
|
return res
|
238
247
|
|
239
|
-
reverse = eval(self.util.config_val_data(
|
248
|
+
reverse = eval(self.util.config_val_data(
|
249
|
+
self.name, "reverse", "False"))
|
240
250
|
if reverse:
|
241
|
-
max = eval(self.util.config_val_data(
|
251
|
+
max = eval(self.util.config_val_data(
|
252
|
+
self.name, "reverse.max", "False"))
|
242
253
|
if max:
|
243
254
|
max = float(max)
|
244
255
|
else:
|
245
256
|
max = self.df[self.target].values.max()
|
246
257
|
self.util.debug(f"reversing target numbers with max values: {max}")
|
247
|
-
self.df[self.target] = reverse_array(
|
258
|
+
self.df[self.target] = reverse_array(
|
259
|
+
self.df[self.target].values, max)
|
248
260
|
|
249
261
|
# check if the target variable should be scaled (z-transformed)
|
250
262
|
scale = self.util.config_val_data(self.name, "scale", False)
|
@@ -317,13 +329,15 @@ class Dataset:
|
|
317
329
|
pass
|
318
330
|
try:
|
319
331
|
# also it might be possible that the age is part of the speaker description
|
320
|
-
df_local["age"] = db[table]["speaker"].get(
|
332
|
+
df_local["age"] = db[table]["speaker"].get(
|
333
|
+
map="age").astype(int)
|
321
334
|
got_age = True
|
322
335
|
except (ValueError, audformat.errors.BadKeyError):
|
323
336
|
pass
|
324
337
|
try:
|
325
338
|
# same for the target, e.g. "age"
|
326
|
-
df_local[self.target] = db[table]["speaker"].get(
|
339
|
+
df_local[self.target] = db[table]["speaker"].get(
|
340
|
+
map=self.target)
|
327
341
|
is_labeled = True
|
328
342
|
except (ValueError, audformat.core.errors.BadKeyError):
|
329
343
|
pass
|
@@ -384,8 +398,10 @@ class Dataset:
|
|
384
398
|
testdf = self.db.tables[self.target + ".test"].df
|
385
399
|
traindf = self.db.tables[self.target + ".train"].df
|
386
400
|
# use only the train and test samples that were not perhaps filtered out by an earlier processing step
|
387
|
-
self.df_test = self.df.loc[self.df.index.intersection(
|
388
|
-
|
401
|
+
self.df_test = self.df.loc[self.df.index.intersection(
|
402
|
+
testdf.index)]
|
403
|
+
self.df_train = self.df.loc[self.df.index.intersection(
|
404
|
+
traindf.index)]
|
389
405
|
elif split_strategy == "train":
|
390
406
|
self.df_train = self.df
|
391
407
|
self.df_test = pd.DataFrame()
|
@@ -408,18 +424,23 @@ class Dataset:
|
|
408
424
|
if entry_train_tables:
|
409
425
|
train_tables = ast.literal_eval(entry_train_tables)
|
410
426
|
for train_table in train_tables:
|
411
|
-
traindf = pd.concat(
|
427
|
+
traindf = pd.concat(
|
428
|
+
[traindf, self.db.tables[train_table].df])
|
412
429
|
# use only the train and test samples that were not perhaps filtered out by an earlier processing step
|
413
430
|
# testdf.index.map(lambda x: os.path.join(self.root, x))
|
414
431
|
# testdf.index = testdf.index.to_series().apply(lambda x: self.root+x)
|
415
432
|
testdf = testdf.set_index(
|
416
|
-
audformat.utils.to_segmented_index(
|
433
|
+
audformat.utils.to_segmented_index(
|
434
|
+
testdf.index, allow_nat=False)
|
417
435
|
)
|
418
436
|
traindf = traindf.set_index(
|
419
|
-
audformat.utils.to_segmented_index(
|
437
|
+
audformat.utils.to_segmented_index(
|
438
|
+
traindf.index, allow_nat=False)
|
420
439
|
)
|
421
|
-
self.df_test = self.df.loc[self.df.index.intersection(
|
422
|
-
|
440
|
+
self.df_test = self.df.loc[self.df.index.intersection(
|
441
|
+
testdf.index)]
|
442
|
+
self.df_train = self.df.loc[self.df.index.intersection(
|
443
|
+
traindf.index)]
|
423
444
|
# it might be necessary to copy the target values
|
424
445
|
try:
|
425
446
|
self.df_test[self.target] = testdf[self.target]
|
@@ -446,10 +467,12 @@ class Dataset:
|
|
446
467
|
self.util.error(f"unknown split strategy: {split_strategy}")
|
447
468
|
|
448
469
|
# check if train or test set should be ignored
|
449
|
-
as_test = eval(self.util.config_val_data(
|
470
|
+
as_test = eval(self.util.config_val_data(
|
471
|
+
self.name, "as_test", "False"))
|
450
472
|
if as_test:
|
451
473
|
self.df_train = pd.DataFrame()
|
452
|
-
as_train = eval(self.util.config_val_data(
|
474
|
+
as_train = eval(self.util.config_val_data(
|
475
|
+
self.name, "as_train", "False"))
|
453
476
|
if as_train:
|
454
477
|
self.df_test = pd.DataFrame()
|
455
478
|
|
@@ -480,7 +503,8 @@ class Dataset:
|
|
480
503
|
|
481
504
|
seed = 42
|
482
505
|
k = 30
|
483
|
-
test_size = int(self.util.config_val_data(
|
506
|
+
test_size = int(self.util.config_val_data(
|
507
|
+
self.name, "test_size", 20)) / 100.0
|
484
508
|
df = self.df
|
485
509
|
# split target
|
486
510
|
targets = df[self.target].to_numpy()
|
@@ -496,7 +520,8 @@ class Dataset:
|
|
496
520
|
stratif_vars = self.util.config_val("DATA", "balance", False)
|
497
521
|
stratif_vars_array = {}
|
498
522
|
if not stratif_vars:
|
499
|
-
self.util.error(
|
523
|
+
self.util.error(
|
524
|
+
"balanced split needs stratif_vars to stratify the splits")
|
500
525
|
else:
|
501
526
|
stratif_vars = ast.literal_eval(stratif_vars)
|
502
527
|
for stratif_var in stratif_vars.keys():
|
@@ -505,7 +530,8 @@ class Dataset:
|
|
505
530
|
continue
|
506
531
|
else:
|
507
532
|
data = df[stratif_var].to_numpy()
|
508
|
-
bins = self.util.config_val(
|
533
|
+
bins = self.util.config_val(
|
534
|
+
"DATA", f"{stratif_var}_bins", False)
|
509
535
|
if bins:
|
510
536
|
data = binning(data, nbins=int(bins))
|
511
537
|
stratif_vars_array[stratif_var] = data
|
@@ -556,7 +582,8 @@ class Dataset:
|
|
556
582
|
|
557
583
|
def split_speakers(self):
|
558
584
|
"""One way to split train and eval sets: Specify percentage of evaluation speakers"""
|
559
|
-
test_percent = int(self.util.config_val_data(
|
585
|
+
test_percent = int(self.util.config_val_data(
|
586
|
+
self.name, "test_size", 20))
|
560
587
|
df = self.df
|
561
588
|
s_num = df.speaker.nunique()
|
562
589
|
test_num = int(s_num * (test_percent / 100))
|
@@ -575,7 +602,8 @@ class Dataset:
|
|
575
602
|
|
576
603
|
def random_split(self):
|
577
604
|
"""One way to split train and eval sets: Specify percentage of random samples"""
|
578
|
-
test_percent = int(self.util.config_val_data(
|
605
|
+
test_percent = int(self.util.config_val_data(
|
606
|
+
self.name, "test_size", 20))
|
579
607
|
df = self.df
|
580
608
|
s_num = len(df)
|
581
609
|
test_num = int(s_num * (test_percent / 100))
|
@@ -676,8 +704,11 @@ class Dataset:
|
|
676
704
|
|
677
705
|
def map_continuous_classification(self, df):
|
678
706
|
"""Map labels to bins for continuous data that should be classified"""
|
707
|
+
if df.empty:
|
708
|
+
return
|
679
709
|
if self.check_continuous_classification():
|
680
|
-
self.util.debug(
|
710
|
+
self.util.debug(
|
711
|
+
f"{self.name}: binning continuous variable to categories")
|
681
712
|
cat_vals = self.util.continuous_to_categorical(df[self.target])
|
682
713
|
df[self.target] = cat_vals.values
|
683
714
|
labels = ast.literal_eval(glob_conf.config["DATA"]["labels"])
|
@@ -628,8 +628,7 @@ class Plots:
|
|
628
628
|
# one up because of the runs
|
629
629
|
fig_dir = self.util.get_path("fig_dir") + "../"
|
630
630
|
exp_name = self.util.get_exp_name(only_data=True)
|
631
|
-
|
632
|
-
filename = f"{fig_dir}{exp_name}EXPL_tree-plot.{format}"
|
631
|
+
filename = f"{fig_dir}{exp_name}EXPL_tree-plot.{self.format}"
|
633
632
|
fig = ax.figure
|
634
633
|
fig.savefig(filename)
|
635
634
|
fig.clear()
|
@@ -62,6 +62,11 @@ def main():
|
|
62
62
|
expr.fill_train_and_tests()
|
63
63
|
util.debug(f"train shape : {expr.df_train.shape}, test shape:{expr.df_test.shape}")
|
64
64
|
|
65
|
+
def calc_dur(x):
|
66
|
+
starts = x[1]
|
67
|
+
ends = x[2]
|
68
|
+
return (ends - starts).total_seconds()
|
69
|
+
|
65
70
|
# segment
|
66
71
|
segmented_file = util.config_val("SEGMENT", "result", "segmented.csv")
|
67
72
|
|
@@ -104,16 +109,11 @@ def main():
|
|
104
109
|
df_seg = df_seg.drop(columns=[target])
|
105
110
|
df_seg = df_seg.rename(columns={"class_label": target})
|
106
111
|
# save file
|
112
|
+
df_seg["duration"] = df_seg.index.to_series().map(lambda x: calc_dur(x))
|
107
113
|
df_seg.to_csv(f"{expr.data_dir}/{segmented_file}")
|
108
114
|
|
109
|
-
def calc_dur(x):
|
110
|
-
starts = x[1]
|
111
|
-
ends = x[2]
|
112
|
-
return (ends - starts).total_seconds()
|
113
|
-
|
114
115
|
if "duration" not in df.columns:
|
115
116
|
df["duration"] = df.index.to_series().map(lambda x: calc_dur(x))
|
116
|
-
df_seg["duration"] = df_seg.index.to_series().map(lambda x: calc_dur(x))
|
117
117
|
num_before = df.shape[0]
|
118
118
|
num_after = df_seg.shape[0]
|
119
119
|
util.debug(
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.2
|
2
2
|
Name: nkululeko
|
3
|
-
Version: 0.93.
|
3
|
+
Version: 0.93.12
|
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
|
@@ -63,7 +63,7 @@ Requires-Dist: pylatex
|
|
63
63
|
## Overview
|
64
64
|
A project to detect speaker characteristics by machine learning experiments with a high-level interface.
|
65
65
|
|
66
|
-
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.
|
66
|
+
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.
|
67
67
|
|
68
68
|
* NEW with nkululeko: [Ensemble learning](http://blog.syntheticspeech.de/2024/06/25/nkululeko-ensemble-classifiers-with-late-fusion/)
|
69
69
|
* NEW: [Finetune transformer-models](http://blog.syntheticspeech.de/2024/05/29/nkululeko-how-to-finetune-a-transformer-model/)
|
@@ -353,8 +353,16 @@ If you use it, please mention the Nkululeko paper:
|
|
353
353
|
Changelog
|
354
354
|
=========
|
355
355
|
|
356
|
+
Version 0.93.12
|
357
|
+
---------------
|
358
|
+
* bugfix: map_continuous_to_cat crashed on empty data
|
359
|
+
|
360
|
+
Version 0.93.11
|
361
|
+
---------------
|
362
|
+
* bugfix: silero segmenter assigned file duration values
|
363
|
+
|
356
364
|
Version 0.93.10
|
357
|
-
|
365
|
+
---------------
|
358
366
|
* added nan check for imported features
|
359
367
|
* added LOGO result output
|
360
368
|
|
@@ -4,51 +4,6 @@ README.md
|
|
4
4
|
pyproject.toml
|
5
5
|
setup.cfg
|
6
6
|
setup.py
|
7
|
-
data/aesdd/process_database.py
|
8
|
-
data/androids/process_database.py
|
9
|
-
data/ased/process_database.py
|
10
|
-
data/asvp-esd/process_database.py
|
11
|
-
data/baved/process_database.py
|
12
|
-
data/cafe/process_database.py
|
13
|
-
data/clac/process_database.py
|
14
|
-
data/cmu-mosei/process_database.py
|
15
|
-
data/demos/process_database.py
|
16
|
-
data/ekorpus/process_database.py
|
17
|
-
data/emns/process_database.py
|
18
|
-
data/emofilm/convert_to_16k.py
|
19
|
-
data/emofilm/process_database.py
|
20
|
-
data/emorynlp/process_database.py
|
21
|
-
data/emov-db/process_database.py
|
22
|
-
data/emovo/process_database.py
|
23
|
-
data/emozionalmente/create.py
|
24
|
-
data/enterface/process_database.py
|
25
|
-
data/esd/process_database.py
|
26
|
-
data/gerparas/process_database.py
|
27
|
-
data/iemocap/process_database.py
|
28
|
-
data/jl/process_database.py
|
29
|
-
data/jtes/process_database.py
|
30
|
-
data/meld/process_database.py
|
31
|
-
data/mesd/process_database.py
|
32
|
-
data/mess/process_database.py
|
33
|
-
data/mlendsnd/process_database.py
|
34
|
-
data/msp-improv/process_database2.py
|
35
|
-
data/msp-podcast/process_database.py
|
36
|
-
data/oreau2/process_database.py
|
37
|
-
data/portuguese/process_database.py
|
38
|
-
data/ravdess/process_database.py
|
39
|
-
data/ravdess/process_database_speaker.py
|
40
|
-
data/savee/process_database.py
|
41
|
-
data/shemo/process_database.py
|
42
|
-
data/subesco/process_database.py
|
43
|
-
data/tess/process_database.py
|
44
|
-
data/thorsten-emotional/process_database.py
|
45
|
-
data/urdu/process_database.py
|
46
|
-
data/vivae/process_database.py
|
47
|
-
docs/source/conf.py
|
48
|
-
meta/demos/demo_best_model.py
|
49
|
-
meta/demos/my_experiment.py
|
50
|
-
meta/demos/my_experiment_local.py
|
51
|
-
meta/demos/plot_faster_anim.py
|
52
7
|
nkululeko/__init__.py
|
53
8
|
nkululeko/aug_train.py
|
54
9
|
nkululeko/augment.py
|
@@ -168,5 +123,4 @@ nkululeko/segmenting/seg_silero.py
|
|
168
123
|
nkululeko/utils/__init__.py
|
169
124
|
nkululeko/utils/files.py
|
170
125
|
nkululeko/utils/stats.py
|
171
|
-
nkululeko/utils/util.py
|
172
|
-
venv/bin/activate_this.py
|
126
|
+
nkululeko/utils/util.py
|
@@ -1,50 +0,0 @@
|
|
1
|
-
import argparse
|
2
|
-
from pathlib import Path
|
3
|
-
|
4
|
-
import pandas as pd
|
5
|
-
|
6
|
-
emotion_map = {
|
7
|
-
"a": "anger",
|
8
|
-
"d": "disgust",
|
9
|
-
"h": "happiness",
|
10
|
-
"f": "fear",
|
11
|
-
"s": "sadness",
|
12
|
-
}
|
13
|
-
|
14
|
-
|
15
|
-
def main():
|
16
|
-
parser = argparse.ArgumentParser()
|
17
|
-
parser.add_argument("--data_dir", type=str, default="AESDD", help="Path of AESDD directory")
|
18
|
-
parser.add_argument("--out_dir", type=str, default=".")
|
19
|
-
args = parser.parse_args()
|
20
|
-
|
21
|
-
data_dir = Path(args.data_dir)
|
22
|
-
out_dir = Path(args.out_dir)
|
23
|
-
|
24
|
-
paths = list(data_dir.glob("**/*.wav"))
|
25
|
-
files = [file for file in paths if file.stem != "s05 (3)"]
|
26
|
-
names = [file.stem for file in files]
|
27
|
-
emotion = [emotion_map[file.stem[0]] for file in files]
|
28
|
-
speaker = [str(int(x[x.find("(") + 1: x.find(")")])) for x in names]
|
29
|
-
gender = [["female", "male"][int(v) % 2] for v in speaker]
|
30
|
-
language =["greek" for file in files]
|
31
|
-
|
32
|
-
# convert to df
|
33
|
-
df = pd.DataFrame({"file": files, "speaker": speaker, "emotion": emotion, "gender": gender})
|
34
|
-
|
35
|
-
# print distribution per emotion
|
36
|
-
# print(df.groupby("emotion").count()['file'])
|
37
|
-
|
38
|
-
# allocate speaker 5 for test set
|
39
|
-
train_df = df[df["speaker"] != "5"]
|
40
|
-
test_df = df.drop(train_df.index)
|
41
|
-
|
42
|
-
# save to CSV
|
43
|
-
df.to_csv(out_dir / "aesdd.csv", index=False)
|
44
|
-
train_df.to_csv(out_dir / "aesdd_train.csv", index=False)
|
45
|
-
test_df.to_csv(out_dir / "aesdd_test.csv", index=False)
|
46
|
-
|
47
|
-
print(f"Total: {len(df)}, Train: {len(train_df)}, Test: {len(test_df)}")
|
48
|
-
|
49
|
-
if __name__ == "__main__":
|
50
|
-
main()
|
@@ -1,94 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
This folder is to import the
|
3
|
-
Androids-corpus depression
|
4
|
-
database to nkululeko.
|
5
|
-
|
6
|
-
I used the version downloadable from [github](https://github.com/CheyneyComputerScience/CREMA-D)
|
7
|
-
|
8
|
-
downloaded April 27th 2023
|
9
|
-
|
10
|
-
I used the version downloadable from [Dropbox, mentioned in this github page](https://github.com/androidscorpus/data)
|
11
|
-
|
12
|
-
Download and unzip the file Androids-corpus.zip to the current folder
|
13
|
-
|
14
|
-
Usage: `python process_database.py`
|
15
|
-
|
16
|
-
"""
|
17
|
-
|
18
|
-
import os
|
19
|
-
|
20
|
-
import audeer
|
21
|
-
import pandas as pd
|
22
|
-
|
23
|
-
dataset_name = 'androids'
|
24
|
-
data_root = './Androids-Corpus/'
|
25
|
-
|
26
|
-
# read in the fold list
|
27
|
-
fold_dict = {}
|
28
|
-
df_fold = pd.read_csv(f'{data_root}fold-lists.csv')
|
29
|
-
for i in range(df_fold.shape[0]):
|
30
|
-
for j in range(df_fold.shape[1]):
|
31
|
-
try:
|
32
|
-
value = df_fold.iloc[i, j].replace('\'', '')
|
33
|
-
except AttributeError:
|
34
|
-
value = 'na'
|
35
|
-
if j in range(7, 12):
|
36
|
-
fold_dict[value] = j - 7
|
37
|
-
else:
|
38
|
-
fold_dict[value] = j
|
39
|
-
directory_list = audeer.list_file_names(data_root, filetype='wav', recursive=True, basenames=True)
|
40
|
-
|
41
|
-
depressions, speakers, educations, genders, ages, tasks, folds = [], [], [], [], [], [], []
|
42
|
-
file_paths = []
|
43
|
-
print(len(directory_list))
|
44
|
-
gender_map = {'F':'female', 'M':'male'}
|
45
|
-
depression_map = {'P':'depressed', 'C':'control'}
|
46
|
-
|
47
|
-
for file in directory_list:
|
48
|
-
# storing file paths
|
49
|
-
# file = file.replace(os.getcwd(), '.')
|
50
|
-
file_paths.append(data_root+file)
|
51
|
-
# storing file emotions
|
52
|
-
fn = audeer.basename_wo_ext(file)
|
53
|
-
|
54
|
-
# The naming convention of the audio files is as follows:
|
55
|
-
# nn_XGmm_t.wav
|
56
|
-
# where nn is a unique integer identifier such that, in a given group, files with the same nn contain the voice of the same speaker (there is a trailing 0 for numbers lower than 10), X is an alphabetic character corresponding to the speaker’s condition (P for depression patient and C for control), G is an alphabetic character that stands for the speaker’s gender (M for male and F for female), mm is a two-digits integer number corresponding to the speaker’s age, and t is an integer number between 1 and 4 accounting for the education level (1 corresponds to primary school and 4 corresponds to university). The letter X was used for the 2 participants who did not provide information about this aspect. There is no indication of the task because recordings corresponding to RT and IT are stored in different directories.
|
57
|
-
if 'Reading-Task'in file:
|
58
|
-
task = 'reading'
|
59
|
-
elif 'Interview-Task' in file:
|
60
|
-
task = 'interview'
|
61
|
-
else:
|
62
|
-
print('ERROR: task undefined')
|
63
|
-
exit(-1)
|
64
|
-
|
65
|
-
part = fn.split('_')
|
66
|
-
dir_name = f'{part[0]}_{part[1]}_{part[2]}'
|
67
|
-
depression = part[1][0]
|
68
|
-
speaker = f'{depression}_{part[0]}'
|
69
|
-
gender = part[1][1]
|
70
|
-
age = part[1][2:4]
|
71
|
-
education = part[2]
|
72
|
-
depressions.append(depression_map[depression])
|
73
|
-
speakers.append(speaker)
|
74
|
-
genders.append(gender_map[gender])
|
75
|
-
ages.append(age)
|
76
|
-
tasks.append(task)
|
77
|
-
educations.append(education)
|
78
|
-
folds.append(fold_dict[dir_name])
|
79
|
-
# print(f'{file} {speaker}')
|
80
|
-
|
81
|
-
|
82
|
-
# dataframe for emotion of files
|
83
|
-
df = pd.DataFrame({'file':file_paths,
|
84
|
-
'speaker':speakers,
|
85
|
-
'gender':genders,
|
86
|
-
'age':ages,
|
87
|
-
'task':tasks,
|
88
|
-
'depression':depressions,
|
89
|
-
'education':educations,
|
90
|
-
'fold':folds})
|
91
|
-
|
92
|
-
df = df.set_index('file')
|
93
|
-
df.head()
|
94
|
-
df.to_csv(f'{dataset_name}.csv')
|
@@ -1,58 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
# -*- coding: utf-8 -*-
|
3
|
-
|
4
|
-
# @filename: process_database.py
|
5
|
-
# @description: Process the ASED database
|
6
|
-
|
7
|
-
|
8
|
-
import argparse
|
9
|
-
import shutil
|
10
|
-
from importlib.resources import path
|
11
|
-
from pathlib import Path
|
12
|
-
|
13
|
-
import pandas as pd
|
14
|
-
from joblib import delayed
|
15
|
-
|
16
|
-
emotion_map = {
|
17
|
-
"a": "anger",
|
18
|
-
"h": "happiness",
|
19
|
-
"n": "neutral",
|
20
|
-
"f": "fear",
|
21
|
-
"s": "sadness",
|
22
|
-
}
|
23
|
-
|
24
|
-
|
25
|
-
def main():
|
26
|
-
parser = argparse.ArgumentParser(
|
27
|
-
usage="python3 process_database.py database output"
|
28
|
-
)
|
29
|
-
parser.add_argument("--data_dir", type=str, default="ASED_V1", help="Path to the ASED database")
|
30
|
-
parser.add_argument("--out_dir", type=str, default=".", help="Path to the output directory")
|
31
|
-
args = parser.parse_args()
|
32
|
-
|
33
|
-
data_dir = Path(args.data_dir)
|
34
|
-
out_dir = Path(args.out_dir)
|
35
|
-
|
36
|
-
paths = list(data_dir.glob("**/*.wav"))
|
37
|
-
emotions = [emotion_map[path.stem[0].lower()] for path in paths]
|
38
|
-
genders = [["female", "male"][int(p.stem[9:11]) - 1] for p in paths]
|
39
|
-
spekaers = [p.stem[-2:] for p in paths]
|
40
|
-
languages = ["amharic" for p in paths]
|
41
|
-
|
42
|
-
# convert to df
|
43
|
-
df = pd.DataFrame({"file": paths, "emotion": emotions, "gender": genders, "speaker": spekaers, "language": languages})
|
44
|
-
|
45
|
-
# allocate speakers >= 55 for test
|
46
|
-
df_test = df[df["speaker"] > "55"]
|
47
|
-
df_train = df.drop(df_test.index)
|
48
|
-
|
49
|
-
|
50
|
-
# save to csv
|
51
|
-
df_train.to_csv(out_dir / "ased_train.csv", index=False)
|
52
|
-
df_test.to_csv(out_dir / "ased_test.csv", index=False)
|
53
|
-
df.to_csv(out_dir / "ased.csv", index=False)
|
54
|
-
|
55
|
-
|
56
|
-
if __name__ == "__main__":
|
57
|
-
main()
|
58
|
-
|