nkululeko 0.88.4__tar.gz → 0.88.6__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.
Files changed (169) hide show
  1. {nkululeko-0.88.4 → nkululeko-0.88.6}/CHANGELOG.md +10 -0
  2. {nkululeko-0.88.4/nkululeko.egg-info → nkululeko-0.88.6}/PKG-INFO +14 -3
  3. {nkululeko-0.88.4 → nkululeko-0.88.6}/README.md +3 -2
  4. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/constants.py +1 -1
  5. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/data/dataset.py +16 -0
  6. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_agender.py +5 -3
  7. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_spkrec.py +1 -1
  8. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/reporting/reporter.py +30 -20
  9. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/utils/util.py +8 -2
  10. {nkululeko-0.88.4 → nkululeko-0.88.6/nkululeko.egg-info}/PKG-INFO +14 -3
  11. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko.egg-info/SOURCES.txt +0 -2
  12. nkululeko-0.88.4/data/androids_orig/process_database.py +0 -93
  13. nkululeko-0.88.4/data/androids_test/process_database.py +0 -93
  14. {nkululeko-0.88.4 → nkululeko-0.88.6}/LICENSE +0 -0
  15. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/aesdd/process_database.py +0 -0
  16. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/androids/process_database.py +0 -0
  17. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/ased/process_database.py +0 -0
  18. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/asvp-esd/process_database.py +0 -0
  19. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/baved/process_database.py +0 -0
  20. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/cafe/process_database.py +0 -0
  21. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/clac/process_database.py +0 -0
  22. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/cmu-mosei/process_database.py +0 -0
  23. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/demos/process_database.py +0 -0
  24. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/ekorpus/process_database.py +0 -0
  25. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/emns/process_database.py +0 -0
  26. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/emofilm/convert_to_16k.py +0 -0
  27. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/emofilm/process_database.py +0 -0
  28. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/emorynlp/process_database.py +0 -0
  29. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/emov-db/process_database.py +0 -0
  30. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/emovo/process_database.py +0 -0
  31. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/emozionalmente/create.py +0 -0
  32. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/enterface/process_database.py +0 -0
  33. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/esd/process_database.py +0 -0
  34. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/gerparas/process_database.py +0 -0
  35. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/iemocap/process_database.py +0 -0
  36. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/jl/process_database.py +0 -0
  37. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/jtes/process_database.py +0 -0
  38. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/meld/process_database.py +0 -0
  39. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/mesd/process_database.py +0 -0
  40. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/mess/process_database.py +0 -0
  41. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/mlendsnd/process_database.py +0 -0
  42. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/msp-improv/process_database2.py +0 -0
  43. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/msp-podcast/process_database.py +0 -0
  44. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/oreau2/process_database.py +0 -0
  45. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/portuguese/process_database.py +0 -0
  46. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/ravdess/process_database.py +0 -0
  47. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/ravdess/process_database_speaker.py +0 -0
  48. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/savee/process_database.py +0 -0
  49. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/shemo/process_database.py +0 -0
  50. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/subesco/process_database.py +0 -0
  51. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/tess/process_database.py +0 -0
  52. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/thorsten-emotional/process_database.py +0 -0
  53. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/urdu/process_database.py +0 -0
  54. {nkululeko-0.88.4 → nkululeko-0.88.6}/data/vivae/process_database.py +0 -0
  55. {nkululeko-0.88.4 → nkululeko-0.88.6}/docs/source/conf.py +0 -0
  56. {nkululeko-0.88.4 → nkululeko-0.88.6}/meta/demos/demo_best_model.py +0 -0
  57. {nkululeko-0.88.4 → nkululeko-0.88.6}/meta/demos/my_experiment.py +0 -0
  58. {nkululeko-0.88.4 → nkululeko-0.88.6}/meta/demos/my_experiment_local.py +0 -0
  59. {nkululeko-0.88.4 → nkululeko-0.88.6}/meta/demos/plot_faster_anim.py +0 -0
  60. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/__init__.py +0 -0
  61. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/aug_train.py +0 -0
  62. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/augment.py +0 -0
  63. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/augmenting/__init__.py +0 -0
  64. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/augmenting/augmenter.py +0 -0
  65. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/augmenting/randomsplicer.py +0 -0
  66. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/augmenting/randomsplicing.py +0 -0
  67. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/augmenting/resampler.py +0 -0
  68. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/autopredict/__init__.py +0 -0
  69. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/autopredict/ap_age.py +0 -0
  70. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/autopredict/ap_arousal.py +0 -0
  71. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/autopredict/ap_dominance.py +0 -0
  72. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/autopredict/ap_gender.py +0 -0
  73. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/autopredict/ap_mos.py +0 -0
  74. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/autopredict/ap_pesq.py +0 -0
  75. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/autopredict/ap_sdr.py +0 -0
  76. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/autopredict/ap_snr.py +0 -0
  77. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/autopredict/ap_stoi.py +0 -0
  78. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/autopredict/ap_valence.py +0 -0
  79. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/autopredict/estimate_snr.py +0 -0
  80. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/cacheddataset.py +0 -0
  81. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/data/__init__.py +0 -0
  82. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/data/dataset_csv.py +0 -0
  83. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/demo.py +0 -0
  84. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/demo_feats.py +0 -0
  85. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/demo_predictor.py +0 -0
  86. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/ensemble.py +0 -0
  87. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/experiment.py +0 -0
  88. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/explore.py +0 -0
  89. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/export.py +0 -0
  90. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/__init__.py +0 -0
  91. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_agender_agender.py +0 -0
  92. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_analyser.py +0 -0
  93. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_ast.py +0 -0
  94. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_auddim.py +0 -0
  95. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_audmodel.py +0 -0
  96. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_clap.py +0 -0
  97. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_hubert.py +0 -0
  98. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_import.py +0 -0
  99. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_mld.py +0 -0
  100. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_mos.py +0 -0
  101. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_opensmile.py +0 -0
  102. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_oxbow.py +0 -0
  103. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_praat.py +0 -0
  104. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_snr.py +0 -0
  105. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_spectra.py +0 -0
  106. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_squim.py +0 -0
  107. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_trill.py +0 -0
  108. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_wav2vec2.py +0 -0
  109. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_wavlm.py +0 -0
  110. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feats_whisper.py +0 -0
  111. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/featureset.py +0 -0
  112. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feat_extract/feinberg_praat.py +0 -0
  113. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/feature_extractor.py +0 -0
  114. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/file_checker.py +0 -0
  115. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/filter_data.py +0 -0
  116. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/glob_conf.py +0 -0
  117. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/losses/__init__.py +0 -0
  118. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/losses/loss_ccc.py +0 -0
  119. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/losses/loss_softf1loss.py +0 -0
  120. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/modelrunner.py +0 -0
  121. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/models/__init__.py +0 -0
  122. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/models/model.py +0 -0
  123. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/models/model_bayes.py +0 -0
  124. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/models/model_cnn.py +0 -0
  125. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/models/model_gmm.py +0 -0
  126. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/models/model_knn.py +0 -0
  127. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/models/model_knn_reg.py +0 -0
  128. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/models/model_lin_reg.py +0 -0
  129. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/models/model_mlp.py +0 -0
  130. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/models/model_mlp_regression.py +0 -0
  131. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/models/model_svm.py +0 -0
  132. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/models/model_svr.py +0 -0
  133. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/models/model_tree.py +0 -0
  134. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/models/model_tree_reg.py +0 -0
  135. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/models/model_tuned.py +0 -0
  136. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/models/model_xgb.py +0 -0
  137. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/models/model_xgr.py +0 -0
  138. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/multidb.py +0 -0
  139. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/nkuluflag.py +0 -0
  140. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/nkululeko.py +0 -0
  141. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/plots.py +0 -0
  142. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/predict.py +0 -0
  143. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/reporting/__init__.py +0 -0
  144. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/reporting/defines.py +0 -0
  145. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/reporting/latex_writer.py +0 -0
  146. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/reporting/report.py +0 -0
  147. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/reporting/report_item.py +0 -0
  148. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/reporting/result.py +0 -0
  149. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/resample.py +0 -0
  150. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/runmanager.py +0 -0
  151. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/scaler.py +0 -0
  152. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/segment.py +0 -0
  153. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/segmenting/__init__.py +0 -0
  154. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/segmenting/seg_inaspeechsegmenter.py +0 -0
  155. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/segmenting/seg_silero.py +0 -0
  156. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/syllable_nuclei.py +0 -0
  157. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/test.py +0 -0
  158. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/test_predictor.py +0 -0
  159. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/test_pretrain.py +0 -0
  160. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/utils/__init__.py +0 -0
  161. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/utils/files.py +0 -0
  162. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko/utils/stats.py +0 -0
  163. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko.egg-info/dependency_links.txt +0 -0
  164. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko.egg-info/requires.txt +0 -0
  165. {nkululeko-0.88.4 → nkululeko-0.88.6}/nkululeko.egg-info/top_level.txt +0 -0
  166. {nkululeko-0.88.4 → nkululeko-0.88.6}/pyproject.toml +0 -0
  167. {nkululeko-0.88.4 → nkululeko-0.88.6}/setup.cfg +0 -0
  168. {nkululeko-0.88.4 → nkululeko-0.88.6}/setup.py +0 -0
  169. {nkululeko-0.88.4 → nkululeko-0.88.6}/venv/bin/activate_this.py +0 -0
@@ -1,6 +1,16 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ Version 0.88.6
5
+ --------------
6
+ * added test speaker assign
7
+
8
+ Version 0.88.5
9
+ --------------
10
+ * add a unique name to the uncertainty plot
11
+ * fix error in speaker embedding (still need speechbrain < 1.0)
12
+ * add get_target_name function in util
13
+
4
14
  Version 0.88.4
5
15
  --------------
6
16
  * added more ensemble methods, e.g. based on uncertainty
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nkululeko
3
- Version: 0.88.4
3
+ Version: 0.88.6
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
@@ -68,7 +68,8 @@ A project to detect speaker characteristics by machine learning experiments with
68
68
 
69
69
  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.
70
70
 
71
- * NEW with nkululeko: [Finetune transformer-models](http://blog.syntheticspeech.de/2024/05/29/nkululeko-how-to-finetune-a-transformer-model/)
71
+ * NEW with nkululek: [Ensemble learning](http://blog.syntheticspeech.de/2024/06/25/nkululeko-ensemble-classifiers-with-late-fusion/)
72
+ * NEW: [Finetune transformer-models](http://blog.syntheticspeech.de/2024/05/29/nkululeko-how-to-finetune-a-transformer-model/)
72
73
  * The latest features can be seen in [the ini-file](./ini_file.md) options that are used to control Nkululeko
73
74
  * Below is a [Hello World example](#helloworld) that should set you up fastly, also on [Google Colab](https://colab.research.google.com/drive/1GYNBd5cdZQ1QC3Jm58qoeMaJg3UuPhjw?usp=sharing#scrollTo=4G_SjuF9xeQf), and [with Kaggle](https://www.kaggle.com/felixburk/nkululeko-hello-world-example)
74
75
  * [Here's a blog post on how to set up nkululeko on your computer.](http://blog.syntheticspeech.de/2021/08/30/how-to-set-up-your-first-nkululeko-project/)
@@ -203,7 +204,7 @@ All of them take *--config <my_config.ini>* as an argument.
203
204
  * **nkululeko.nkululeko**: do machine learning experiments combining features and learners
204
205
  * **nkululeko.ensemble**: [combine several nkululeko experiments](http://blog.syntheticspeech.de/2024/06/25/nkululeko-ensemble-classifiers-with-late-fusion/) and report on late fusion results
205
206
  * *configurations*: which experiments to combine
206
- * *--method* (optional): mean, max, sum, max_class, uncertainty_threshold, uncertainty_weighted, confidence_weighted
207
+ * *--method* (optional): majority_voting, mean, max, sum, max_class, uncertainty_threshold, uncertainty_weighted, confidence_weighted
207
208
  * *--threshold*: uncertainty threshold (1.0 means no threshold)
208
209
  * *--outfile* (optional): name of CSV file for output
209
210
  * *--no_labels* (optional): indicate that no ground truth is given
@@ -359,6 +360,16 @@ F. Burkhardt, Johannes Wagner, Hagen Wierstorf, Florian Eyben and Björn Schulle
359
360
  Changelog
360
361
  =========
361
362
 
363
+ Version 0.88.6
364
+ --------------
365
+ * added test speaker assign
366
+
367
+ Version 0.88.5
368
+ --------------
369
+ * add a unique name to the uncertainty plot
370
+ * fix error in speaker embedding (still need speechbrain < 1.0)
371
+ * add get_target_name function in util
372
+
362
373
  Version 0.88.4
363
374
  --------------
364
375
  * added more ensemble methods, e.g. based on uncertainty
@@ -24,7 +24,8 @@ A project to detect speaker characteristics by machine learning experiments with
24
24
 
25
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
- * NEW with nkululeko: [Finetune transformer-models](http://blog.syntheticspeech.de/2024/05/29/nkululeko-how-to-finetune-a-transformer-model/)
27
+ * NEW with nkululek: [Ensemble learning](http://blog.syntheticspeech.de/2024/06/25/nkululeko-ensemble-classifiers-with-late-fusion/)
28
+ * NEW: [Finetune transformer-models](http://blog.syntheticspeech.de/2024/05/29/nkululeko-how-to-finetune-a-transformer-model/)
28
29
  * The latest features can be seen in [the ini-file](./ini_file.md) options that are used to control Nkululeko
29
30
  * Below is a [Hello World example](#helloworld) that should set you up fastly, also on [Google Colab](https://colab.research.google.com/drive/1GYNBd5cdZQ1QC3Jm58qoeMaJg3UuPhjw?usp=sharing#scrollTo=4G_SjuF9xeQf), and [with Kaggle](https://www.kaggle.com/felixburk/nkululeko-hello-world-example)
30
31
  * [Here's a blog post on how to set up nkululeko on your computer.](http://blog.syntheticspeech.de/2021/08/30/how-to-set-up-your-first-nkululeko-project/)
@@ -159,7 +160,7 @@ All of them take *--config <my_config.ini>* as an argument.
159
160
  * **nkululeko.nkululeko**: do machine learning experiments combining features and learners
160
161
  * **nkululeko.ensemble**: [combine several nkululeko experiments](http://blog.syntheticspeech.de/2024/06/25/nkululeko-ensemble-classifiers-with-late-fusion/) and report on late fusion results
161
162
  * *configurations*: which experiments to combine
162
- * *--method* (optional): mean, max, sum, max_class, uncertainty_threshold, uncertainty_weighted, confidence_weighted
163
+ * *--method* (optional): majority_voting, mean, max, sum, max_class, uncertainty_threshold, uncertainty_weighted, confidence_weighted
163
164
  * *--threshold*: uncertainty threshold (1.0 means no threshold)
164
165
  * *--outfile* (optional): name of CSV file for output
165
166
  * *--no_labels* (optional): indicate that no ground truth is given
@@ -1,2 +1,2 @@
1
- VERSION="0.88.4"
1
+ VERSION="0.88.6"
2
2
  SAMPLING_RATE = 16000
@@ -423,6 +423,9 @@ class Dataset:
423
423
  self.util.debug(f"{self.name}: trying to reuse data splits")
424
424
  self.df_test = pd.read_pickle(storage_test)
425
425
  self.df_train = pd.read_pickle(storage_train)
426
+ elif isinstance(ast.literal_eval(split_strategy), list):
427
+ # treat this as a list of test speakers
428
+ self.assign_speakers(ast.literal_eval(split_strategy))
426
429
  else:
427
430
  self.util.error(f"unknown split strategy: {split_strategy}")
428
431
 
@@ -515,6 +518,19 @@ class Dataset:
515
518
  # because this generates new train/test sample quantaties, the feature extraction has to be done again
516
519
  glob_conf.config["FEATS"]["needs_feature_extraction"] = "True"
517
520
 
521
+ def assign_speakers(self, speakers):
522
+ """One way to split train and eval sets: Specify test speaker names."""
523
+ self.df_test = self.df[self.df.speaker.isin(speakers)]
524
+ if len(self.df_test) == 0:
525
+ self.util.error(f"no speakers found in {speakers}")
526
+ self.df_train = self.df[~self.df.index.isin(self.df_test.index)]
527
+ self.util.debug(
528
+ f"{self.name} (speakers assigned): [{self.df_train.shape[0]}/{self.df_test.shape[0]}]"
529
+ " samples in train/test"
530
+ )
531
+ # because this generates new train/test sample quantaties, the feature extraction has to be done again
532
+ glob_conf.config["FEATS"]["needs_feature_extraction"] = "True"
533
+
518
534
  def split_speakers(self):
519
535
  """One way to split train and eval sets: Specify percentage of evaluation speakers"""
520
536
  test_percent = int(self.util.config_val_data(self.name, "test_size", 20))
@@ -1,13 +1,14 @@
1
1
  # feats_agender.py
2
+
2
3
  from nkululeko.feat_extract.featureset import Featureset
3
4
  import os
4
- import pandas as pd
5
+ # import pandas as pd
5
6
  import audeer
6
7
  import nkululeko.glob_conf as glob_conf
7
8
  import audonnx
8
9
  import numpy as np
9
10
  import audinterface
10
-
11
+ import torch
11
12
 
12
13
  class AgenderSet(Featureset):
13
14
  """
@@ -32,7 +33,8 @@ class AgenderSet(Featureset):
32
33
  archive_path = audeer.download_url(
33
34
  model_url, cache_root, verbose=True)
34
35
  audeer.extract_archive(archive_path, model_root)
35
- device = self.util.config_val("MODEL", "device", "cpu")
36
+ cuda = "cuda" if torch.cuda.is_available() else "cpu"
37
+ device = self.util.config_val("MODEL", "device", cuda)
36
38
  self.model = audonnx.load(model_root, device=device)
37
39
  self.util.debug(f"initialized agender model")
38
40
  self.model_loaded = True
@@ -24,7 +24,7 @@ class Spkrec(Featureset):
24
24
  def __init__(self, name, data_df, feat_type):
25
25
  """Constructor. is_train is needed to distinguish from test/dev sets,
26
26
  because they use the codebook from the training"""
27
- super().__init__(name, data_df)
27
+ super().__init__(name, data_df, feat_type)
28
28
  # check if device is not set, use cuda if available
29
29
  cuda = "cuda" if torch.cuda.is_available() else "cpu"
30
30
  self.device = self.util.config_val("MODEL", "device", cuda)
@@ -2,28 +2,32 @@ import ast
2
2
  import glob
3
3
  import json
4
4
  import math
5
- import os
6
5
 
7
- from confidence_intervals import evaluate_with_conf_int
8
6
  import matplotlib.pyplot as plt
9
7
  import numpy as np
8
+
9
+ # from torch import is_tensor
10
+ from audmetric import (
11
+ accuracy,
12
+ concordance_cc,
13
+ mean_absolute_error,
14
+ mean_squared_error,
15
+ unweighted_average_recall,
16
+ )
17
+
18
+ # import os
19
+ from confidence_intervals import evaluate_with_conf_int
10
20
  from scipy.special import softmax
11
- from scipy.stats import entropy
12
- from scipy.stats import pearsonr
13
- from sklearn.metrics import ConfusionMatrixDisplay
14
- from sklearn.metrics import auc
15
- from sklearn.metrics import classification_report
16
- from sklearn.metrics import confusion_matrix
17
- from sklearn.metrics import r2_score
18
- from sklearn.metrics import roc_auc_score
19
- from sklearn.metrics import roc_curve
20
- from torch import is_tensor
21
-
22
- from audmetric import accuracy
23
- from audmetric import concordance_cc
24
- from audmetric import mean_absolute_error
25
- from audmetric import mean_squared_error
26
- from audmetric import unweighted_average_recall
21
+ from scipy.stats import entropy, pearsonr
22
+ from sklearn.metrics import (
23
+ ConfusionMatrixDisplay,
24
+ auc,
25
+ classification_report,
26
+ confusion_matrix,
27
+ r2_score,
28
+ roc_auc_score,
29
+ roc_curve,
30
+ )
27
31
 
28
32
  import nkululeko.glob_conf as glob_conf
29
33
  from nkululeko.plots import Plots
@@ -167,7 +171,7 @@ class Reporter:
167
171
  probas["uncertainty"] = uncertainty
168
172
  probas["correct"] = probas.predicted == probas.truth
169
173
  sp = self.util.get_pred_name()
170
-
174
+
171
175
  self.probas = probas
172
176
  probas.to_csv(sp)
173
177
  self.util.debug(f"Saved probabilities to {sp}")
@@ -175,7 +179,13 @@ class Reporter:
175
179
  ax, caption = plots.plotcatcont(
176
180
  probas, "correct", "uncertainty", "uncertainty", "correct"
177
181
  )
178
- plots.save_plot(ax, caption, "Uncertainty", "uncertainty", "samples")
182
+ plots.save_plot(
183
+ ax,
184
+ caption,
185
+ "Uncertainty",
186
+ "uncertainty_samples",
187
+ self.util.get_exp_name(),
188
+ )
179
189
 
180
190
  def set_id(self, run, epoch):
181
191
  """Make the report identifiable with run and epoch index."""
@@ -157,8 +157,9 @@ class Util:
157
157
 
158
158
  def get_pred_name(self):
159
159
  store = self.get_path("store")
160
+ target = self.get_target_name()
160
161
  pred_name = self.get_model_description()
161
- return f"{store}/pred_{pred_name}.csv"
162
+ return f"{store}/pred_{target}_{pred_name}.csv"
162
163
 
163
164
  def is_categorical(self, pd_series):
164
165
  """Check if a dataframe column is categorical"""
@@ -217,9 +218,14 @@ class Util:
217
218
  return_string = f"{ds}"
218
219
  if not only_data:
219
220
  mt = self.get_model_description()
220
- return_string = return_string + "_" + mt
221
+ target = self.get_target_name()
222
+ return_string = return_string + "_" + target + "_" + mt
221
223
  return return_string.replace("__", "_")
222
224
 
225
+ def get_target_name(self):
226
+ """Get a string as name from all target sets that are used."""
227
+ return self.config["DATA"]["target"]
228
+
223
229
  def get_model_type(self):
224
230
  return self.config["MODEL"]["type"]
225
231
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nkululeko
3
- Version: 0.88.4
3
+ Version: 0.88.6
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
@@ -68,7 +68,8 @@ A project to detect speaker characteristics by machine learning experiments with
68
68
 
69
69
  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.
70
70
 
71
- * NEW with nkululeko: [Finetune transformer-models](http://blog.syntheticspeech.de/2024/05/29/nkululeko-how-to-finetune-a-transformer-model/)
71
+ * NEW with nkululek: [Ensemble learning](http://blog.syntheticspeech.de/2024/06/25/nkululeko-ensemble-classifiers-with-late-fusion/)
72
+ * NEW: [Finetune transformer-models](http://blog.syntheticspeech.de/2024/05/29/nkululeko-how-to-finetune-a-transformer-model/)
72
73
  * The latest features can be seen in [the ini-file](./ini_file.md) options that are used to control Nkululeko
73
74
  * Below is a [Hello World example](#helloworld) that should set you up fastly, also on [Google Colab](https://colab.research.google.com/drive/1GYNBd5cdZQ1QC3Jm58qoeMaJg3UuPhjw?usp=sharing#scrollTo=4G_SjuF9xeQf), and [with Kaggle](https://www.kaggle.com/felixburk/nkululeko-hello-world-example)
74
75
  * [Here's a blog post on how to set up nkululeko on your computer.](http://blog.syntheticspeech.de/2021/08/30/how-to-set-up-your-first-nkululeko-project/)
@@ -203,7 +204,7 @@ All of them take *--config <my_config.ini>* as an argument.
203
204
  * **nkululeko.nkululeko**: do machine learning experiments combining features and learners
204
205
  * **nkululeko.ensemble**: [combine several nkululeko experiments](http://blog.syntheticspeech.de/2024/06/25/nkululeko-ensemble-classifiers-with-late-fusion/) and report on late fusion results
205
206
  * *configurations*: which experiments to combine
206
- * *--method* (optional): mean, max, sum, max_class, uncertainty_threshold, uncertainty_weighted, confidence_weighted
207
+ * *--method* (optional): majority_voting, mean, max, sum, max_class, uncertainty_threshold, uncertainty_weighted, confidence_weighted
207
208
  * *--threshold*: uncertainty threshold (1.0 means no threshold)
208
209
  * *--outfile* (optional): name of CSV file for output
209
210
  * *--no_labels* (optional): indicate that no ground truth is given
@@ -359,6 +360,16 @@ F. Burkhardt, Johannes Wagner, Hagen Wierstorf, Florian Eyben and Björn Schulle
359
360
  Changelog
360
361
  =========
361
362
 
363
+ Version 0.88.6
364
+ --------------
365
+ * added test speaker assign
366
+
367
+ Version 0.88.5
368
+ --------------
369
+ * add a unique name to the uncertainty plot
370
+ * fix error in speaker embedding (still need speechbrain < 1.0)
371
+ * add get_target_name function in util
372
+
362
373
  Version 0.88.4
363
374
  --------------
364
375
  * added more ensemble methods, e.g. based on uncertainty
@@ -6,8 +6,6 @@ setup.cfg
6
6
  setup.py
7
7
  data/aesdd/process_database.py
8
8
  data/androids/process_database.py
9
- data/androids_orig/process_database.py
10
- data/androids_test/process_database.py
11
9
  data/ased/process_database.py
12
10
  data/asvp-esd/process_database.py
13
11
  data/baved/process_database.py
@@ -1,93 +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 pandas as pd
19
- import os
20
- import audeer
21
-
22
- dataset_name = 'androids'
23
- data_root = './Androids-Corpus/'
24
-
25
- # read in the fold list
26
- fold_dict = {}
27
- df_fold = pd.read_csv(f'{data_root}fold-lists.csv')
28
- for i in range(df_fold.shape[0]):
29
- for j in range(df_fold.shape[1]):
30
- try:
31
- value = df_fold.iloc[i, j].replace('\'', '')
32
- except AttributeError:
33
- value = 'na'
34
- if j in range(7, 12):
35
- fold_dict[value] = j - 7
36
- else:
37
- fold_dict[value] = j
38
- directory_list = audeer.list_file_names(data_root, filetype='wav', recursive=True, basenames=True)
39
-
40
- depressions, speakers, educations, genders, ages, tasks, folds = [], [], [], [], [], [], []
41
- file_paths = []
42
- print(len(directory_list))
43
- gender_map = {'F':'female', 'M':'male'}
44
- depression_map = {'P':'depressed', 'C':'control'}
45
-
46
- for file in directory_list:
47
- # storing file paths
48
- # file = file.replace(os.getcwd(), '.')
49
- file_paths.append(data_root+file)
50
- # storing file emotions
51
- fn = audeer.basename_wo_ext(file)
52
-
53
- # The naming convention of the audio files is as follows:
54
- # nn_XGmm_t.wav
55
- # 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.
56
- if 'Reading-Task'in file:
57
- task = 'reading'
58
- elif 'Interview-Task' in file:
59
- task = 'interview'
60
- else:
61
- print('ERROR: task undefined')
62
- exit(-1)
63
-
64
- part = fn.split('_')
65
- dir_name = f'{part[0]}_{part[1]}_{part[2]}'
66
- depression = part[1][0]
67
- speaker = f'{depression}_{part[0]}'
68
- gender = part[1][1]
69
- age = part[1][2:4]
70
- education = part[2]
71
- depressions.append(depression_map[depression])
72
- speakers.append(speaker)
73
- genders.append(gender_map[gender])
74
- ages.append(age)
75
- tasks.append(task)
76
- educations.append(education)
77
- folds.append(fold_dict[dir_name])
78
- # print(f'{file} {speaker}')
79
-
80
-
81
- # dataframe for emotion of files
82
- df = pd.DataFrame({'file':file_paths,
83
- 'speaker':speakers,
84
- 'gender':genders,
85
- 'age':ages,
86
- 'task':tasks,
87
- 'depression':depressions,
88
- 'education':educations,
89
- 'fold':folds})
90
-
91
- df = df.set_index('file')
92
- df.head()
93
- df.to_csv(f'{dataset_name}.csv')
@@ -1,93 +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 pandas as pd
19
- import os
20
- import audeer
21
-
22
- dataset_name = 'androids'
23
- data_root = './Androids-Corpus/'
24
-
25
- # read in the fold list
26
- fold_dict = {}
27
- df_fold = pd.read_csv(f'{data_root}fold-lists.csv')
28
- for i in range(df_fold.shape[0]):
29
- for j in range(df_fold.shape[1]):
30
- try:
31
- value = df_fold.iloc[i, j].replace('\'', '')
32
- except AttributeError:
33
- value = 'na'
34
- if j in range(7, 12):
35
- fold_dict[value] = j - 7
36
- else:
37
- fold_dict[value] = j
38
- directory_list = audeer.list_file_names(data_root, filetype='wav', recursive=True, basenames=True)
39
-
40
- depressions, speakers, educations, genders, ages, tasks, folds = [], [], [], [], [], [], []
41
- file_paths = []
42
- print(len(directory_list))
43
- gender_map = {'F':'female', 'M':'male'}
44
- depression_map = {'P':'depressed', 'C':'control'}
45
-
46
- for file in directory_list:
47
- # storing file paths
48
- # file = file.replace(os.getcwd(), '.')
49
- file_paths.append(data_root+file)
50
- # storing file emotions
51
- fn = audeer.basename_wo_ext(file)
52
-
53
- # The naming convention of the audio files is as follows:
54
- # nn_XGmm_t.wav
55
- # 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.
56
- if 'Reading-Task'in file:
57
- task = 'reading'
58
- elif 'Interview-Task' in file:
59
- task = 'interview'
60
- else:
61
- print('ERROR: task undefined')
62
- exit(-1)
63
-
64
- part = fn.split('_')
65
- dir_name = f'{part[0]}_{part[1]}_{part[2]}'
66
- depression = part[1][0]
67
- speaker = f'{depression}_{part[0]}'
68
- gender = part[1][1]
69
- age = part[1][2:4]
70
- education = part[2]
71
- depressions.append(depression_map[depression])
72
- speakers.append(speaker)
73
- genders.append(gender_map[gender])
74
- ages.append(age)
75
- tasks.append(task)
76
- educations.append(education)
77
- folds.append(fold_dict[dir_name])
78
- # print(f'{file} {speaker}')
79
-
80
-
81
- # dataframe for emotion of files
82
- df = pd.DataFrame({'file':file_paths,
83
- 'speaker':speakers,
84
- 'gender':genders,
85
- 'age':ages,
86
- 'task':tasks,
87
- 'depression':depressions,
88
- 'education':educations,
89
- 'fold':folds})
90
-
91
- df = df.set_index('file')
92
- df.head()
93
- df.to_csv(f'{dataset_name}.csv')
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes