nkululeko 0.48.1__tar.gz → 0.49.0__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 (71) hide show
  1. {nkululeko-0.48.1 → nkululeko-0.49.0}/CHANGELOG.md +4 -0
  2. {nkululeko-0.48.1/nkululeko.egg-info → nkululeko-0.49.0}/PKG-INFO +5 -1
  3. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/augment.py +7 -1
  4. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/augmenter.py +7 -7
  5. nkululeko-0.49.0/nkululeko/constants.py +1 -0
  6. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/experiment.py +30 -10
  7. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/feinberg_praat.py +0 -1
  8. nkululeko-0.49.0/nkululeko/randomsplicer.py +76 -0
  9. nkululeko-0.49.0/nkululeko/randomsplicing.py +74 -0
  10. {nkululeko-0.48.1 → nkululeko-0.49.0/nkululeko.egg-info}/PKG-INFO +5 -1
  11. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko.egg-info/SOURCES.txt +2 -0
  12. nkululeko-0.48.1/nkululeko/constants.py +0 -1
  13. {nkululeko-0.48.1 → nkululeko-0.49.0}/LICENSE +0 -0
  14. {nkululeko-0.48.1 → nkululeko-0.49.0}/README.md +0 -0
  15. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/__init__.py +0 -0
  16. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/balancer.py +0 -0
  17. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/cacheddataset.py +0 -0
  18. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/dataset.py +0 -0
  19. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/dataset_csv.py +0 -0
  20. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/dataset_ravdess.py +0 -0
  21. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/demo.py +0 -0
  22. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/demo_predictor.py +0 -0
  23. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/explore.py +0 -0
  24. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/feats_analyser.py +0 -0
  25. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/feats_audmodel.py +0 -0
  26. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/feats_audmodel_dim.py +0 -0
  27. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/feats_clap.py +0 -0
  28. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/feats_import.py +0 -0
  29. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/feats_mld.py +0 -0
  30. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/feats_opensmile.py +0 -0
  31. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/feats_oxbow.py +0 -0
  32. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/feats_praat.py +0 -0
  33. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/feats_trill.py +0 -0
  34. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/feats_wav2vec2.py +0 -0
  35. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/feature_extractor.py +0 -0
  36. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/featureset.py +0 -0
  37. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/filter_data.py +0 -0
  38. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/glob_conf.py +0 -0
  39. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/loss_ccc.py +0 -0
  40. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/loss_softf1loss.py +0 -0
  41. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/model.py +0 -0
  42. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/model_bayes.py +0 -0
  43. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/model_cnn.py +0 -0
  44. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/model_gmm.py +0 -0
  45. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/model_knn.py +0 -0
  46. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/model_knn_reg.py +0 -0
  47. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/model_mlp.py +0 -0
  48. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/model_mlp_regression.py +0 -0
  49. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/model_svm.py +0 -0
  50. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/model_svr.py +0 -0
  51. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/model_tree.py +0 -0
  52. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/model_tree_reg.py +0 -0
  53. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/model_xgb.py +0 -0
  54. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/model_xgr.py +0 -0
  55. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/modelrunner.py +0 -0
  56. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/nkululeko.py +0 -0
  57. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/plots.py +0 -0
  58. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/reporter.py +0 -0
  59. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/result.py +0 -0
  60. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/runmanager.py +0 -0
  61. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/scaler.py +0 -0
  62. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/syllable_nuclei.py +0 -0
  63. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/test.py +0 -0
  64. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/test_predictor.py +0 -0
  65. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko/util.py +0 -0
  66. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko.egg-info/dependency_links.txt +0 -0
  67. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko.egg-info/requires.txt +0 -0
  68. {nkululeko-0.48.1 → nkululeko-0.49.0}/nkululeko.egg-info/top_level.txt +0 -0
  69. {nkululeko-0.48.1 → nkululeko-0.49.0}/pyproject.toml +0 -0
  70. {nkululeko-0.48.1 → nkululeko-0.49.0}/setup.cfg +0 -0
  71. {nkululeko-0.48.1 → nkululeko-0.49.0}/setup.py +0 -0
@@ -1,6 +1,10 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ Version 0.49.0
5
+ --------------
6
+ * added random-splicing
7
+
4
8
  Version 0.48.1
5
9
  --------------
6
10
  * bugfix: database object was not loaded when dataframe was reused
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nkululeko
3
- Version: 0.48.1
3
+ Version: 0.49.0
4
4
  Summary: Machine learning audio prediction experiments based on templates
5
5
  Home-page: https://github.com/felixbur/nkululeko
6
6
  Author: Felix Burkhardt
@@ -214,6 +214,10 @@ Nkululeko can be used under the [MIT license](https://choosealicense.com/license
214
214
  Changelog
215
215
  =========
216
216
 
217
+ Version 0.49.0
218
+ --------------
219
+ * added random-splicing
220
+
217
221
  Version 0.48.1
218
222
  --------------
219
223
  * bugfix: database object was not loaded when dataframe was reused
@@ -38,7 +38,13 @@ def main(src_dir):
38
38
  util.debug(f'train shape : {expr.df_train.shape}, test shape:{expr.df_test.shape}')
39
39
 
40
40
  # augment
41
- expr.augment()
41
+ augmenting = util.config_val('DATA', 'augment', False)
42
+ if augmenting:
43
+ expr.augment()
44
+
45
+ random_splicing = util.config_val('DATA', 'random_splice', False)
46
+ if random_splicing:
47
+ expr.random_splice()
42
48
 
43
49
  print('DONE')
44
50
 
@@ -12,8 +12,8 @@ class Augmenter:
12
12
  """
13
13
  augmenting the train split
14
14
  """
15
- def __init__(self, train_df):
16
- self.train_df = train_df
15
+ def __init__(self, df):
16
+ self.df = df
17
17
  self.util = Util()
18
18
  # Define a standard transformation that randomly add augmentations to files
19
19
  self.audioment = Compose([
@@ -30,15 +30,15 @@ class Augmenter:
30
30
  # audeer.mkdir(newpath)
31
31
  return fp.replace(fullpath, np)
32
32
 
33
- def augment(self):
33
+ def augment(self, sample_selection):
34
34
  """
35
35
  augment the training files and return a dataframe with new files index.
36
36
  """
37
- files = self.train_df.index.get_level_values(0).values
37
+ files = self.df.index.get_level_values(0).values
38
38
  store = self.util.get_path('store')
39
39
  filepath = f'{store}augmentations/'
40
40
  audeer.mkdir(filepath)
41
- self.util.debug(f'augmenting the training set to {filepath}')
41
+ self.util.debug(f'augmenting {sample_selection} samples to {filepath}')
42
42
  newpath = ''
43
43
  for i, f in enumerate(files):
44
44
  signal, sr = audiofile.read(f)
@@ -50,9 +50,9 @@ class Augmenter:
50
50
  audiofile.write(f'{newpath}{filename}', signal=sig_aug, sampling_rate=sr)
51
51
  if i%10==0:
52
52
  print(f'augmented {i} of {len(files)}')
53
- df_ret = self.train_df.copy()
53
+ df_ret = self.df.copy()
54
54
  df_ret = df_ret.set_index(map_file_path(df_ret.index, lambda x: self.changepath(x, newpath)))
55
- aug_db_filename = self.util.config_val('DATA', 'augment', 'augment.csv')
55
+ aug_db_filename = self.util.config_val('DATA', 'augment_result', 'augment.csv')
56
56
  target = self.util.config_val('DATA', 'target', 'emotion')
57
57
  df_ret[target] = df_ret['class_label']
58
58
  df_ret = df_ret.drop(columns=['class_label'])
@@ -0,0 +1 @@
1
+ VERSION = '0.49.0'
@@ -292,18 +292,38 @@ class Experiment:
292
292
 
293
293
  def augment(self):
294
294
  """
295
- Augment the training set
295
+ Augment the selected samples
296
296
  """
297
297
  from nkululeko.augmenter import Augmenter
298
- augmenter = Augmenter(self.df_train)
299
- augmenter.augment()
300
-
301
- # def augment_train(self):
302
- # """Augment the train dataframe"""
303
- # from nkululeko.augmenter import Augmenter
304
- # augment_train = Augmenter(self.df_train)
305
- # df_train_aug = augment_train.augment()
306
- # self.df_train = self.df_train.append(df_train_aug)
298
+ sample_selection = self.util.config_val(' DATA', 'augment', 'train')
299
+ if sample_selection=='all':
300
+ df = pd.concat([self.df_train, self.df_test])
301
+ elif sample_selection=='train':
302
+ df = self.df_train
303
+ elif sample_selection=='test':
304
+ df = self.df_test
305
+ else:
306
+ self.util.error(f'unknown augmentation selection specifier {sample_selection}, should be [all | train | test]')
307
+
308
+ augmenter = Augmenter(df)
309
+ augmenter.augment(sample_selection)
310
+
311
+ def random_splice(self):
312
+ """
313
+ Random-splice the selected samples
314
+ """
315
+ from nkululeko.randomsplicer import Randomsplicer
316
+ sample_selection = self.util.config_val(' DATA', 'random_splice', 'train')
317
+ if sample_selection=='all':
318
+ df = pd.concat([self.df_train, self.df_test])
319
+ elif sample_selection=='train':
320
+ df = self.df_train
321
+ elif sample_selection=='test':
322
+ df = self.df_test
323
+ else:
324
+ self.util.error(f'unknown augmentation selection specifier {sample_selection}, should be [all | train | test]')
325
+ randomsplicer = Randomsplicer(df)
326
+ randomsplicer.run(sample_selection)
307
327
 
308
328
 
309
329
  def analyse_features(self, needs_feats):
@@ -119,7 +119,6 @@ def runPCA(df):
119
119
  # PCA
120
120
  pca = PCA(n_components=2)
121
121
  principalComponents = pca.fit_transform(x)
122
- print(type(principalComponents))
123
122
  if np.any(np.isnan(principalComponents)):
124
123
  print ('pc is nan')
125
124
  print(f'count: {np.count_nonzero(np.isnan(principalComponents))}')
@@ -0,0 +1,76 @@
1
+ # randomsplicer.py
2
+
3
+ """
4
+ Code originally by Oliver Pauly
5
+
6
+ Based on an idea by Klaus Scherer
7
+
8
+ K. R. Scherer, “Randomized splicing: A note on a simple technique for masking speech content”
9
+ Journal of Experimental Research in Personality, vol. 5, pp. 155–159, 1971.
10
+
11
+ Evaluated in:
12
+ F. Burkhardt, Anna Derington, Matthias Kahlau, Klaus Scherer, Florian Eyben and Björn Schuller: Masking Speech Contents by Random Splicing: is Emotional Expression Preserved?, Proc. ICASSP, 2023
13
+
14
+ """
15
+
16
+ import pandas as pd
17
+ from nkululeko.util import Util
18
+ import nkululeko.randomsplicing as rsp
19
+ import numpy as np
20
+ import audiofile as af
21
+ import os
22
+ from audformat.utils import map_file_path
23
+ import audeer
24
+
25
+ class Randomsplicer:
26
+ """
27
+ augmenting the train split
28
+ """
29
+ def __init__(self, df):
30
+ self.df = df
31
+ self.util = Util()
32
+
33
+ def changepath(self, fp, np):
34
+ fullpath = os.path.dirname(fp)
35
+ return fp.replace(fullpath, np)
36
+
37
+ def run(self, sample_selection):
38
+ """
39
+ random splice the selected samples and return a dataframe with new files index.
40
+ adjustable parameters:
41
+ * p_reverse: probability of some samples to be in reverse order (default: 0.3)
42
+ * top_db: top db level for silence to be recognized (default: 12)
43
+ """
44
+
45
+ p_reverse=0.3
46
+ top_db=12
47
+
48
+ files = self.df.index.get_level_values(0).values
49
+ store = self.util.get_path('store')
50
+ filepath = f'{store}randomspliced/'
51
+ audeer.mkdir(filepath)
52
+ self.util.debug(f'random splicing {sample_selection} samples to {filepath}')
53
+ newpath = ''
54
+ for i, f in enumerate(files):
55
+ signal, sr = af.read(f)
56
+ filename = os.path.basename(f)
57
+ parent = os.path.dirname(f).split('/')[-1]
58
+ sig_new = rsp.random_splicing(
59
+ signal, sr,
60
+ p_reverse=p_reverse,
61
+ top_db=top_db,
62
+ )
63
+
64
+ newpath = f'{filepath}/{parent}/'
65
+ audeer.mkdir(newpath)
66
+ af.write(f'{newpath}{filename}', signal=sig_new, sampling_rate=sr)
67
+ if i%10==0:
68
+ print(f'random spliced {i} of {len(files)}')
69
+ df_ret = self.df.copy()
70
+ df_ret = df_ret.set_index(map_file_path(df_ret.index, lambda x: self.changepath(x, newpath)))
71
+ db_filename = self.util.config_val('DATA', 'random_splice_result', 'random_spliced.csv')
72
+ target = self.util.config_val('DATA', 'target', 'emotion')
73
+ df_ret[target] = df_ret['class_label']
74
+ df_ret = df_ret.drop(columns=['class_label'])
75
+ df_ret.to_csv(db_filename)
76
+ return df_ret
@@ -0,0 +1,74 @@
1
+ """
2
+ Code originally by Oliver Pauly
3
+
4
+ Based on an idea by Klaus Scherer
5
+
6
+ K. R. Scherer, “Randomized splicing: A note on a simple technique for masking speech content”
7
+ Journal of Experimental Research in Personality, vol. 5, pp. 155–159, 1971.
8
+
9
+ Evaluated in:
10
+ F. Burkhardt, Anna Derington, Matthias Kahlau, Klaus Scherer, Florian Eyben and Björn Schuller: Masking Speech Contents by Random Splicing: is Emotional Expression Preserved?, Proc. ICASSP, 2023
11
+
12
+ """
13
+ import numpy as np
14
+ import librosa
15
+ import audiofile as af
16
+
17
+ def random_splicing(
18
+ signal, sr,
19
+ p_reverse=0.0,
20
+ top_db=12,
21
+ ):
22
+ """
23
+ randomly splice the signal and re-arrange.
24
+
25
+ p_reverse: probability of some samples to be in reverse order
26
+ top_db: top db level for silence to be recognized
27
+
28
+ """
29
+ signal /= np.max(abs(signal))
30
+
31
+ indices = split_wav_naive(signal, top_db=top_db)
32
+
33
+ np.random.shuffle(indices)
34
+
35
+ wav_spliced = remix_random_reverse(signal, indices, p_reverse=p_reverse)
36
+
37
+ return wav_spliced
38
+
39
+
40
+ def split_wav_naive(wav, top_db=12):
41
+
42
+ indices = librosa.effects.split(wav, top_db=top_db)
43
+
44
+ indices = np.array(indices)
45
+ # (re)add the silence-segments
46
+ indices = indices.repeat(2)[1:-1].reshape((-1, 2))
47
+ # add first segment
48
+ indices = np.vstack(((0, indices[0][0]), indices))
49
+ # add last segment
50
+ indices = np.vstack((indices, [indices[-1][-1], wav.shape[0]]))
51
+
52
+ return indices
53
+
54
+
55
+ def remix_random_reverse(wav, indices, p_reverse=0):
56
+
57
+ import random
58
+
59
+ wav_remix = []
60
+
61
+ for seg in indices:
62
+
63
+ start = seg[0]
64
+ end = seg[1]
65
+ wav_seg = wav[start:end]
66
+
67
+ if np.random.rand(1)[0] <= p_reverse:
68
+ wav_seg = wav_seg[::-1]
69
+
70
+ wav_remix.append(wav_seg)
71
+
72
+ wav_remix = np.hstack(wav_remix)
73
+
74
+ return wav_remix
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nkululeko
3
- Version: 0.48.1
3
+ Version: 0.49.0
4
4
  Summary: Machine learning audio prediction experiments based on templates
5
5
  Home-page: https://github.com/felixbur/nkululeko
6
6
  Author: Felix Burkhardt
@@ -214,6 +214,10 @@ Nkululeko can be used under the [MIT license](https://choosealicense.com/license
214
214
  Changelog
215
215
  =========
216
216
 
217
+ Version 0.49.0
218
+ --------------
219
+ * added random-splicing
220
+
217
221
  Version 0.48.1
218
222
  --------------
219
223
  * bugfix: database object was not loaded when dataframe was reused
@@ -52,6 +52,8 @@ nkululeko/model_xgr.py
52
52
  nkululeko/modelrunner.py
53
53
  nkululeko/nkululeko.py
54
54
  nkululeko/plots.py
55
+ nkululeko/randomsplicer.py
56
+ nkululeko/randomsplicing.py
55
57
  nkululeko/reporter.py
56
58
  nkululeko/result.py
57
59
  nkululeko/runmanager.py
@@ -1 +0,0 @@
1
- VERSION = '0.48.1'
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes