neverlib 0.2.2__py3-none-any.whl → 0.2.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. neverlib/.history/Docs/audio_aug/test_snr_20250806011311.py +0 -0
  2. neverlib/.history/Docs/audio_aug/test_snr_20250806011331.py +75 -0
  3. neverlib/.history/Docs/audio_aug/test_snr_20250806011342.py +57 -0
  4. neverlib/.history/Docs/audio_aug/test_snr_20250806011352.py +57 -0
  5. neverlib/.history/Docs/audio_aug/test_snr_20250806011403.py +57 -0
  6. neverlib/.history/Docs/audio_aug/test_snr_20250806011413.py +57 -0
  7. neverlib/.history/Docs/audio_aug/test_snr_20250806011435.py +55 -0
  8. neverlib/.history/Docs/vad/1_20250810032405.py +0 -0
  9. neverlib/.history/Docs/vad/1_20250810032417.py +39 -0
  10. neverlib/.history/audio_aug/audio_aug_20250806010451.py +125 -0
  11. neverlib/.history/audio_aug/audio_aug_20250806010750.py +138 -0
  12. neverlib/.history/audio_aug/audio_aug_20250806010759.py +140 -0
  13. neverlib/.history/audio_aug/audio_aug_20250806010803.py +140 -0
  14. neverlib/.history/audio_aug/audio_aug_20250806010809.py +140 -0
  15. neverlib/.history/audio_aug/audio_aug_20250806011108.py +140 -0
  16. neverlib/.history/dataAnalyze/__init___20250805234204.py +87 -0
  17. neverlib/.history/dataAnalyze/__init___20250806204125.py +14 -0
  18. neverlib/.history/dataAnalyze/__init___20250806204139.py +14 -0
  19. neverlib/.history/dataAnalyze/__init___20250806204159.py +14 -0
  20. neverlib/.history/filter/__init___20250820103351.py +70 -0
  21. neverlib/.history/filter/__init___20250821102348.py +70 -0
  22. neverlib/.history/filter/__init___20250821102405.py +14 -0
  23. neverlib/.history/filter/auto_eq/__init___20250819213121.py +36 -0
  24. neverlib/.history/filter/auto_eq/__init___20250821102241.py +36 -0
  25. neverlib/.history/filter/auto_eq/__init___20250821102259.py +36 -0
  26. neverlib/.history/filter/auto_eq/__init___20250821102307.py +36 -0
  27. neverlib/.history/filter/auto_eq/__init___20250821102310.py +36 -0
  28. neverlib/.history/filter/auto_eq/__init___20250821102318.py +36 -0
  29. neverlib/.history/filter/auto_eq/__init___20250821102507.py +36 -0
  30. neverlib/.history/filter/auto_eq/de_eq_20250820103848.py +361 -0
  31. neverlib/.history/filter/auto_eq/de_eq_20250821102422.py +360 -0
  32. neverlib/.history/filter/auto_eq/freq_eq_20250805234206.py +75 -0
  33. neverlib/.history/filter/auto_eq/freq_eq_20250820140732.py +75 -0
  34. neverlib/.history/filter/auto_eq/freq_eq_20250820140745.py +75 -0
  35. neverlib/.history/filter/auto_eq/freq_eq_20250820140816.py +75 -0
  36. neverlib/.history/filter/auto_eq/freq_eq_20250820140938.py +77 -0
  37. neverlib/.history/filter/auto_eq/freq_eq_20250820141003.py +77 -0
  38. neverlib/.history/filter/auto_eq/freq_eq_20250820141006.py +77 -0
  39. neverlib/.history/filter/auto_eq/freq_eq_20250820141019.py +77 -0
  40. neverlib/.history/filter/auto_eq/freq_eq_20250820141049.py +77 -0
  41. neverlib/.history/filter/auto_eq/freq_eq_20250820141211.py +77 -0
  42. neverlib/.history/filter/auto_eq/freq_eq_20250820141227.py +77 -0
  43. neverlib/.history/filter/auto_eq/freq_eq_20250820141311.py +78 -0
  44. neverlib/.history/filter/auto_eq/freq_eq_20250820141340.py +78 -0
  45. neverlib/.history/filter/auto_eq/freq_eq_20250820141712.py +78 -0
  46. neverlib/.history/filter/auto_eq/freq_eq_20250820141733.py +78 -0
  47. neverlib/.history/filter/auto_eq/freq_eq_20250820141755.py +78 -0
  48. neverlib/.history/filter/auto_eq/freq_eq_20250821102434.py +76 -0
  49. neverlib/.history/filter/auto_eq/freq_eq_20250821102500.py +76 -0
  50. neverlib/.history/filter/auto_eq/freq_eq_20250821102502.py +76 -0
  51. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820102957.py +380 -0
  52. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820113054.py +380 -0
  53. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820113150.py +380 -0
  54. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820113520.py +385 -0
  55. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820113525.py +385 -0
  56. neverlib/.history/filter/auto_eq/ga_eq_basic_20250821102212.py +385 -0
  57. neverlib/.history/metrics/dnsmos_20250806001612.py +160 -0
  58. neverlib/.history/metrics/dnsmos_20250815180659.py +160 -0
  59. neverlib/.history/metrics/dnsmos_20250815180701.py +158 -0
  60. neverlib/.history/metrics/dnsmos_20250815181321.py +154 -0
  61. neverlib/.history/metrics/dnsmos_20250815181327.py +154 -0
  62. neverlib/.history/metrics/dnsmos_20250815181331.py +154 -0
  63. neverlib/.history/metrics/dnsmos_20250815181620.py +154 -0
  64. neverlib/.history/metrics/dnsmos_20250815181631.py +154 -0
  65. neverlib/.history/metrics/dnsmos_20250815181742.py +154 -0
  66. neverlib/.history/metrics/dnsmos_20250815181824.py +153 -0
  67. neverlib/.history/metrics/dnsmos_20250815181834.py +153 -0
  68. neverlib/.history/metrics/dnsmos_20250815181922.py +153 -0
  69. neverlib/.history/metrics/dnsmos_20250815182011.py +147 -0
  70. neverlib/.history/metrics/dnsmos_20250815182036.py +144 -0
  71. neverlib/.history/metrics/dnsmos_20250815182936.py +143 -0
  72. neverlib/.history/metrics/dnsmos_20250815182942.py +143 -0
  73. neverlib/.history/metrics/dnsmos_20250815183032.py +137 -0
  74. neverlib/.history/metrics/dnsmos_20250815183101.py +144 -0
  75. neverlib/.history/metrics/dnsmos_20250815183121.py +144 -0
  76. neverlib/.history/metrics/dnsmos_20250815183123.py +143 -0
  77. neverlib/.history/metrics/dnsmos_20250815183214.py +143 -0
  78. neverlib/.history/metrics/dnsmos_20250815183240.py +143 -0
  79. neverlib/.history/metrics/dnsmos_20250815183248.py +144 -0
  80. neverlib/.history/metrics/dnsmos_20250815183407.py +142 -0
  81. neverlib/.history/metrics/dnsmos_20250815183409.py +142 -0
  82. neverlib/.history/metrics/dnsmos_20250815183431.py +142 -0
  83. neverlib/.history/metrics/dnsmos_20250815183507.py +140 -0
  84. neverlib/.history/metrics/dnsmos_20250815183513.py +139 -0
  85. neverlib/.history/metrics/dnsmos_20250815183618.py +139 -0
  86. neverlib/.history/metrics/dnsmos_20250815183709.py +140 -0
  87. neverlib/.history/metrics/dnsmos_20250815183756.py +137 -0
  88. neverlib/.history/metrics/dnsmos_20250815183815.py +128 -0
  89. neverlib/.history/metrics/dnsmos_20250815183827.py +129 -0
  90. neverlib/.history/metrics/dnsmos_20250815183913.py +117 -0
  91. neverlib/.history/metrics/dnsmos_20250815183914.py +117 -0
  92. neverlib/.history/metrics/dnsmos_20250815184003.py +118 -0
  93. neverlib/.history/metrics/dnsmos_20250815184040.py +118 -0
  94. neverlib/.history/metrics/dnsmos_20250815184049.py +118 -0
  95. neverlib/.history/metrics/dnsmos_20250815184104.py +117 -0
  96. neverlib/.history/metrics/dnsmos_20250815184200.py +117 -0
  97. neverlib/.history/metrics/lpc_lsp_metric_20250816015944.py +128 -0
  98. neverlib/.history/metrics/lpc_lsp_metric_20250816020142.py +128 -0
  99. neverlib/.history/metrics/lpc_lsp_metric_20250816020156.py +128 -0
  100. neverlib/.history/metrics/lpc_lsp_metric_20250816020554.py +130 -0
  101. neverlib/.history/metrics/lpc_lsp_metric_20250816020600.py +125 -0
  102. neverlib/.history/metrics/lpc_lsp_metric_20250816020631.py +120 -0
  103. neverlib/.history/metrics/lpc_lsp_metric_20250816020746.py +118 -0
  104. neverlib/.history/metrics/lpc_me_20250816013111.py +0 -0
  105. neverlib/.history/metrics/lpc_me_20250816013129.py +121 -0
  106. neverlib/.history/metrics/lpc_me_20250816015430.py +103 -0
  107. neverlib/.history/metrics/lpc_me_20250816015535.py +96 -0
  108. neverlib/.history/metrics/lpc_me_20250816015542.py +96 -0
  109. neverlib/.history/metrics/lpc_me_20250816015636.py +97 -0
  110. neverlib/.history/metrics/lpc_me_20250816015658.py +104 -0
  111. neverlib/.history/metrics/lpc_me_20250816015703.py +100 -0
  112. neverlib/.history/metrics/lpc_me_20250816015945.py +128 -0
  113. neverlib/.history/metrics/snr_20250806010538.py +177 -0
  114. neverlib/.history/metrics/snr_20250806211634.py +184 -0
  115. neverlib/.history/metrics/spec_20250805234209.py +45 -0
  116. neverlib/.history/metrics/spec_20250816135530.py +11 -0
  117. neverlib/.history/metrics/spec_20250816135654.py +16 -0
  118. neverlib/.history/metrics/spec_20250816135736.py +68 -0
  119. neverlib/.history/metrics/spec_20250816135904.py +75 -0
  120. neverlib/.history/metrics/spec_20250816135921.py +82 -0
  121. neverlib/.history/metrics/spec_20250816140111.py +82 -0
  122. neverlib/.history/metrics/spec_20250816140543.py +136 -0
  123. neverlib/.history/metrics/spec_20250816140559.py +172 -0
  124. neverlib/.history/metrics/spec_20250816140602.py +172 -0
  125. neverlib/.history/metrics/spec_20250816140608.py +172 -0
  126. neverlib/.history/metrics/spec_20250816140654.py +148 -0
  127. neverlib/.history/metrics/spec_20250816140705.py +144 -0
  128. neverlib/.history/metrics/spec_20250816140755.py +138 -0
  129. neverlib/.history/metrics/spec_20250816140823.py +170 -0
  130. neverlib/.history/metrics/spec_20250816140832.py +170 -0
  131. neverlib/.history/metrics/spec_20250816140833.py +170 -0
  132. neverlib/.history/metrics/spec_20250816140922.py +147 -0
  133. neverlib/.history/metrics/spec_20250816141148.py +107 -0
  134. neverlib/.history/metrics/spec_20250816141219.py +123 -0
  135. neverlib/.history/metrics/spec_20250816141732.py +178 -0
  136. neverlib/.history/metrics/spec_20250816141740.py +178 -0
  137. neverlib/.history/metrics/spec_20250816142030.py +178 -0
  138. neverlib/.history/metrics/spec_20250816142107.py +135 -0
  139. neverlib/.history/metrics/spec_20250816142126.py +135 -0
  140. neverlib/.history/metrics/spec_20250816142410.py +135 -0
  141. neverlib/.history/metrics/spec_20250816142415.py +136 -0
  142. neverlib/.history/metrics/spec_metric_20250816135156.py +0 -0
  143. neverlib/.history/metrics/spec_metric_20250816135226.py +5 -0
  144. neverlib/.history/metrics/spec_metric_20250816135227.py +10 -0
  145. neverlib/.history/metrics/spec_metric_20250816135306.py +15 -0
  146. neverlib/.history/metrics/spec_metric_20250816135442.py +31 -0
  147. neverlib/.history/metrics/spec_metric_20250816135448.py +31 -0
  148. neverlib/.history/metrics/spec_metric_20250816135520.py +29 -0
  149. neverlib/.history/metrics/spec_metric_20250816135537.py +63 -0
  150. neverlib/.history/metrics/spec_metric_20250816135653.py +65 -0
  151. neverlib/.history/vad/PreProcess_20250805234211.py +63 -0
  152. neverlib/.history/vad/PreProcess_20250809232455.py +63 -0
  153. neverlib/.history/vad/PreProcess_20250816020725.py +66 -0
  154. neverlib/.history/vad/VAD_Silero_20250805234211.py +50 -0
  155. neverlib/.history/vad/VAD_Silero_20250809232456.py +50 -0
  156. neverlib/.history/vad/VAD_WebRTC_20250805234211.py +61 -0
  157. neverlib/.history/vad/VAD_WebRTC_20250809232456.py +61 -0
  158. neverlib/.history/vad/VAD_funasr_20250805234211.py +54 -0
  159. neverlib/.history/vad/VAD_funasr_20250809232456.py +54 -0
  160. neverlib/.history/vad/VAD_vadlib_20250805234211.py +70 -0
  161. neverlib/.history/vad/VAD_vadlib_20250809232455.py +70 -0
  162. neverlib/.history/vad/VAD_whisper_20250805234211.py +55 -0
  163. neverlib/.history/vad/VAD_whisper_20250809232456.py +55 -0
  164. neverlib/.specstory/.what-is-this.md +69 -0
  165. neverlib/.specstory/history/2025-08-05_17-06Z-/350/277/231/344/270/200/346/255/245/347/232/204/347/233/256/347/232/204/346/230/257/344/273/200/344/271/210.md +424 -0
  166. neverlib/Docs/audio_aug/test_snr.py +55 -0
  167. neverlib/__init__.py +2 -2
  168. neverlib/audio_aug/HarmonicDistortion.py +79 -0
  169. neverlib/audio_aug/TFDrop.py +41 -0
  170. neverlib/audio_aug/TFMask.py +56 -0
  171. neverlib/audio_aug/__init__.py +1 -1
  172. neverlib/audio_aug/audio_aug.py +19 -5
  173. neverlib/audio_aug/clip_aug.py +41 -0
  174. neverlib/audio_aug/coder_aug.py +209 -0
  175. neverlib/audio_aug/coder_aug2.py +118 -0
  176. neverlib/audio_aug/loss_packet_aug.py +103 -0
  177. neverlib/audio_aug/quant_aug.py +78 -0
  178. neverlib/data_analyze/README.md +234 -0
  179. neverlib/data_analyze/__init__.py +14 -0
  180. neverlib/data_analyze/dataset_analyzer.py +590 -0
  181. neverlib/data_analyze/quality_metrics.py +364 -0
  182. neverlib/data_analyze/rms_distrubution.py +62 -0
  183. neverlib/data_analyze/spectral_analysis.py +218 -0
  184. neverlib/data_analyze/statistics.py +406 -0
  185. neverlib/data_analyze/temporal_features.py +126 -0
  186. neverlib/data_analyze/visualization.py +468 -0
  187. neverlib/filter/README.md +101 -0
  188. neverlib/filter/__init__.py +7 -0
  189. neverlib/filter/auto_eq/README.md +165 -0
  190. neverlib/filter/auto_eq/__init__.py +36 -0
  191. neverlib/filter/auto_eq/de_eq.py +360 -0
  192. neverlib/filter/auto_eq/freq_eq.py +76 -0
  193. neverlib/filter/auto_eq/ga_eq_advanced.py +577 -0
  194. neverlib/filter/auto_eq/ga_eq_basic.py +385 -0
  195. neverlib/filter/biquad.py +45 -0
  196. neverlib/filter/common.py +5 -6
  197. neverlib/filter/core.py +339 -0
  198. neverlib/metrics/dnsmos.py +117 -0
  199. neverlib/metrics/lpc_lsp.py +118 -0
  200. neverlib/metrics/snr.py +184 -0
  201. neverlib/metrics/spec.py +136 -0
  202. neverlib/metrics/test_pesq.py +35 -0
  203. neverlib/metrics/time.py +68 -0
  204. neverlib/tests/test_vad.py +21 -0
  205. neverlib/utils/audio_split.py +2 -1
  206. neverlib/utils/message.py +4 -4
  207. neverlib/utils/utils.py +36 -16
  208. neverlib/vad/PreProcess.py +6 -3
  209. neverlib/vad/README.md +10 -10
  210. neverlib/vad/VAD_Energy.py +1 -1
  211. neverlib/vad/VAD_Silero.py +2 -2
  212. neverlib/vad/VAD_WebRTC.py +2 -2
  213. neverlib/vad/VAD_funasr.py +2 -2
  214. neverlib/vad/VAD_statistics.py +3 -3
  215. neverlib/vad/VAD_vadlib.py +3 -3
  216. neverlib/vad/VAD_whisper.py +2 -2
  217. neverlib/vad/__init__.py +1 -1
  218. neverlib/vad/class_get_speech.py +4 -4
  219. neverlib/vad/class_vad.py +1 -1
  220. neverlib/vad/utils.py +47 -5
  221. {neverlib-0.2.2.dist-info → neverlib-0.2.4.dist-info}/METADATA +120 -120
  222. neverlib-0.2.4.dist-info/RECORD +229 -0
  223. {neverlib-0.2.2.dist-info → neverlib-0.2.4.dist-info}/WHEEL +1 -1
  224. neverlib/Documents/vad/VAD_Energy.ipynb +0 -159
  225. neverlib/Documents/vad/VAD_Silero.ipynb +0 -305
  226. neverlib/Documents/vad/VAD_WebRTC.ipynb +0 -183
  227. neverlib/Documents/vad/VAD_funasr.ipynb +0 -179
  228. neverlib/Documents/vad/VAD_ppasr.ipynb +0 -175
  229. neverlib/Documents/vad/VAD_statistics.ipynb +0 -522
  230. neverlib/Documents/vad/VAD_vadlib.ipynb +0 -184
  231. neverlib/Documents/vad/VAD_whisper.ipynb +0 -430
  232. neverlib/utils/waveform_analyzer.py +0 -51
  233. neverlib/wav_data/000_short.wav +0 -0
  234. neverlib-0.2.2.dist-info/RECORD +0 -40
  235. {neverlib-0.2.2.dist-info → neverlib-0.2.4.dist-info}/licenses/LICENSE +0 -0
  236. {neverlib-0.2.2.dist-info → neverlib-0.2.4.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,75 @@
1
+ '''
2
+ Author: 凌逆战 | Never
3
+ Date: 2025-03-24 10:00:14
4
+ Description:
5
+ '''
6
+ # -*- coding:utf-8 -*-
7
+ # Author:凌逆战 | Never
8
+ # Date: 2024/1/29
9
+ """
10
+ snr增强, 对安静的测试集加指定snr的白噪
11
+ """
12
+ import numpy as np
13
+ import random
14
+ import soundfile as sf
15
+ from neverlib.metrics.snr import get_snr
16
+ from neverlib.audio_aug import snr_aug_changeNoise, snr_aug_changeNoise_v2
17
+ from neverlib.utils import EPS
18
+
19
+
20
+ def add_noise(clean, snr_range, snr_aug_rate):
21
+ """
22
+ Args:
23
+ clean: (*, C)
24
+ snr_range: snr范围 [min, max]
25
+ snr_aug_rate: snr增强率
26
+ Returns:
27
+ """
28
+ if random.random() < snr_aug_rate:
29
+ snr = random.uniform(snr_range[0], snr_range[1])
30
+ noise = np.random.randn(*clean.shape) # 生成和clean等长的白噪
31
+ noisy = snr_aug_changeNoise(clean, noise, snr)
32
+ else:
33
+ noisy = clean
34
+ snr = 100
35
+ return noisy, snr
36
+
37
+
38
+ def snr_aug1(clean, snr):
39
+ """ 白噪
40
+ Args:
41
+ clean: (*, C)
42
+ snr: snr值
43
+ Returns:
44
+ """
45
+ noise = np.random.randn(*clean.shape) # 生成和clean等长的白噪
46
+
47
+ noisy, _ = snr_aug_changeNoise(clean, noise, snr)
48
+
49
+ return noisy
50
+
51
+
52
+ def snr_aug2(clean, snr):
53
+ """
54
+ Args:
55
+ clean: (*, C)
56
+ snr_range: snr范围 [min, max]
57
+ snr_aug_rate: snr增强率
58
+ Returns:
59
+ """
60
+ noise = np.random.randn(*clean.shape) # 生成和clean等长的白噪
61
+ noisy, _ = snr_aug_changeNoise_v2(clean, noise, snr)
62
+ return noisy
63
+
64
+
65
+ if __name__ == "__main__":
66
+ clean_path = "../wav_data/TIMIT.wav"
67
+ clean, fs = sf.read(clean_path, always_2d=True, dtype="float32")
68
+
69
+ noisy1 = snr_aug1(clean, 10)
70
+ noisy2 = snr_aug2(clean, 10)
71
+ print(clean.shape)
72
+ print(noisy1.shape, noisy2.shape)
73
+
74
+ print(get_snr(clean, noisy1 - clean)) # 10.000000000480982
75
+ print(get_snr(clean, noisy2 - clean)) # 9.999870642663442
@@ -0,0 +1,57 @@
1
+ '''
2
+ Author: 凌逆战 | Never
3
+ Date: 2025-03-24 10:00:14
4
+ Description:
5
+ '''
6
+ # -*- coding:utf-8 -*-
7
+ # Author:凌逆战 | Never
8
+ # Date: 2024/1/29
9
+ """
10
+ snr增强, 对安静的测试集加指定snr的白噪
11
+ """
12
+ import numpy as np
13
+ import random
14
+ import soundfile as sf
15
+ from neverlib.metrics.snr import get_snr
16
+ from neverlib.audio_aug import snr_aug_changeNoise, snr_aug_changeNoise_v2
17
+ from neverlib.utils import EPS
18
+
19
+
20
+ def snr_aug1(clean, snr):
21
+ """ 白噪
22
+ Args:
23
+ clean: (*, C)
24
+ snr: snr值
25
+ Returns:
26
+ """
27
+ noise = np.random.randn(*clean.shape) # 生成和clean等长的白噪
28
+
29
+ noisy, _ = snr_aug_changeNoise(clean, noise, snr)
30
+
31
+ return noisy
32
+
33
+
34
+ def snr_aug2(clean, snr):
35
+ """
36
+ Args:
37
+ clean: (*, C)
38
+ snr_range: snr范围 [min, max]
39
+ snr_aug_rate: snr增强率
40
+ Returns:
41
+ """
42
+ noise = np.random.randn(*clean.shape) # 生成和clean等长的白噪
43
+ noisy, _ = snr_aug_changeNoise_v2(clean, noise, snr)
44
+ return noisy
45
+
46
+
47
+ if __name__ == "__main__":
48
+ clean_path = "../wav_data/TIMIT.wav"
49
+ clean, fs = sf.read(clean_path, always_2d=True, dtype="float32")
50
+
51
+ noisy1 = snr_aug1(clean, 10)
52
+ noisy2 = snr_aug2(clean, 10)
53
+ print(clean.shape)
54
+ print(noisy1.shape, noisy2.shape)
55
+
56
+ print(get_snr(clean, noisy1 - clean)) # 10.000000000480982
57
+ print(get_snr(clean, noisy2 - clean)) # 9.999870642663442
@@ -0,0 +1,57 @@
1
+ '''
2
+ Author: 凌逆战 | Never
3
+ Date: 2025-03-24 10:00:14
4
+ Description:
5
+ '''
6
+ # -*- coding:utf-8 -*-
7
+ # Author:凌逆战 | Never
8
+ # Date: 2024/1/29
9
+ """
10
+ snr增强, 对安静的测试集加指定snr的白噪
11
+ """
12
+ import numpy as np
13
+ import random
14
+ import soundfile as sf
15
+ from neverlib.metrics.snr import get_snr
16
+ from neverlib.audio_aug import snr_aug_changeNoise, snr_aug_changeNoise_v2
17
+ from neverlib.utils import EPS
18
+
19
+
20
+ def snr_aug1(clean, snr):
21
+ """ 白噪
22
+ Args:
23
+ clean: (*, C)
24
+ snr: snr值
25
+ Returns:
26
+ """
27
+ noise = np.random.randn(*clean.shape) # 生成和clean等长的白噪
28
+
29
+ noisy, _ = snr_aug_changeNoise(clean, noise, snr)
30
+
31
+ return noisy
32
+
33
+
34
+ def snr_aug2(clean, snr):
35
+ """
36
+ Args:
37
+ clean: (*, C)
38
+ snr_range: snr范围 [min, max]
39
+ snr_aug_rate: snr增强率
40
+ Returns:
41
+ """
42
+ noise = np.random.randn(*clean.shape) # 生成和clean等长的白噪
43
+ noisy, _ = snr_aug_changeNoise_v2(clean, noise, snr)
44
+ return noisy
45
+
46
+
47
+ if __name__ == "__main__":
48
+ clean_path = "../../wav_data/TIMIT.wav"
49
+ clean, fs = sf.read(clean_path, always_2d=True, dtype="float32")
50
+
51
+ noisy1 = snr_aug1(clean, 10)
52
+ noisy2 = snr_aug2(clean, 10)
53
+ print(clean.shape)
54
+ print(noisy1.shape, noisy2.shape)
55
+
56
+ print(get_snr(clean, noisy1 - clean)) # 10.000000000480982
57
+ print(get_snr(clean, noisy2 - clean)) # 9.999870642663442
@@ -0,0 +1,57 @@
1
+ '''
2
+ Author: 凌逆战 | Never
3
+ Date: 2025-03-24 10:00:14
4
+ Description:
5
+ '''
6
+ # -*- coding:utf-8 -*-
7
+ # Author:凌逆战 | Never
8
+ # Date: 2024/1/29
9
+ """
10
+ snr增强, 对安静的测试集加指定snr的白噪
11
+ """
12
+ import numpy as np
13
+ import random
14
+ import soundfile as sf
15
+ from neverlib.metrics.snr import get_snr
16
+ from neverlib.audio_aug import snr_aug_changeNoise, snr_aug_changeNoise_v2
17
+ from neverlib.utils import EPS
18
+
19
+
20
+ def snr_aug1(clean, snr):
21
+ """ 白噪
22
+ Args:
23
+ clean: (*, C)
24
+ snr: snr值
25
+ Returns:
26
+ """
27
+ noise = np.random.randn(*clean.shape) # 生成和clean等长的白噪
28
+
29
+ noisy, _ = snr_aug_changeNoise(clean, noise, snr)
30
+
31
+ return noisy
32
+
33
+
34
+ def snr_aug2(clean, snr):
35
+ """
36
+ Args:
37
+ clean: (*, C)
38
+ snr_range: snr范围 [min, max]
39
+ snr_aug_rate: snr增强率
40
+ Returns:
41
+ """
42
+ noise = np.random.randn(*clean.shape) # 生成和clean等长的白噪
43
+ noisy, _ = snr_aug_changeNoise_v2(clean, noise, snr)
44
+ return noisy
45
+
46
+
47
+ if __name__ == "__main__":
48
+ clean_path = "../../data/TIMIT.wav"
49
+ clean, fs = sf.read(clean_path, always_2d=True, dtype="float32")
50
+
51
+ noisy1 = snr_aug1(clean, 10)
52
+ noisy2 = snr_aug2(clean, 10)
53
+ print(clean.shape)
54
+ print(noisy1.shape, noisy2.shape)
55
+
56
+ print(get_snr(clean, noisy1 - clean)) # 10.000000000480982
57
+ print(get_snr(clean, noisy2 - clean)) # 9.999870642663442
@@ -0,0 +1,57 @@
1
+ '''
2
+ Author: 凌逆战 | Never
3
+ Date: 2025-03-24 10:00:14
4
+ Description:
5
+ '''
6
+ # -*- coding:utf-8 -*-
7
+ # Author:凌逆战 | Never
8
+ # Date: 2024/1/29
9
+ """
10
+ snr增强, 对安静的测试集加指定snr的白噪
11
+ """
12
+ import numpy as np
13
+ import random
14
+ import soundfile as sf
15
+ from neverlib.metrics.snr import get_snr
16
+ from neverlib.audio_aug import snr_aug_changeNoise, snr_aug_changeNoise_v2
17
+ from neverlib.utils import EPS
18
+
19
+
20
+ def snr_aug1(clean, snr):
21
+ """ 白噪
22
+ Args:
23
+ clean: (*, C)
24
+ snr: snr值
25
+ Returns:
26
+ """
27
+ noise = np.random.randn(*clean.shape) # 生成和clean等长的白噪
28
+
29
+ noisy, _ = snr_aug_changeNoise(clean, noise, snr)
30
+
31
+ return noisy
32
+
33
+
34
+ def snr_aug2(clean, snr):
35
+ """
36
+ Args:
37
+ clean: (*, C)
38
+ snr_range: snr范围 [min, max]
39
+ snr_aug_rate: snr增强率
40
+ Returns:
41
+ """
42
+ noise = np.random.randn(*clean.shape) # 生成和clean等长的白噪
43
+ noisy, _ = snr_aug_changeNoise_v2(clean, noise, snr)
44
+ return noisy
45
+
46
+
47
+ if __name__ == "__main__":
48
+ clean_path = "../../data/white.wav"
49
+ clean, fs = sf.read(clean_path, always_2d=True, dtype="float32")
50
+
51
+ noisy1 = snr_aug1(clean, 10)
52
+ noisy2 = snr_aug2(clean, 10)
53
+ print(clean.shape)
54
+ print(noisy1.shape, noisy2.shape)
55
+
56
+ print(get_snr(clean, noisy1 - clean)) # 10.000000000480982
57
+ print(get_snr(clean, noisy2 - clean)) # 9.999870642663442
@@ -0,0 +1,55 @@
1
+ '''
2
+ Author: 凌逆战 | Never
3
+ Date: 2025-03-24 10:00:14
4
+ Description:
5
+ '''
6
+ # -*- coding:utf-8 -*-
7
+ # Author:凌逆战 | Never
8
+ # Date: 2024/1/29
9
+ """
10
+ snr增强, 对安静的测试集加指定snr的白噪
11
+ """
12
+ import numpy as np
13
+ import random
14
+ import soundfile as sf
15
+ from neverlib.metrics.snr import get_snr
16
+ from neverlib.audio_aug import snr_aug_changeNoise, snr_aug_changeNoise_v2
17
+ from neverlib.utils import EPS
18
+
19
+
20
+ def snr_aug1(clean, snr):
21
+ """ 白噪
22
+ Args:
23
+ clean: (*, C)
24
+ snr: snr值
25
+ Returns:
26
+ """
27
+ noise = np.random.randn(*clean.shape) # 生成和clean等长的白噪
28
+
29
+ noisy, _ = snr_aug_changeNoise(clean, noise, snr)
30
+
31
+ return noisy
32
+
33
+
34
+ def snr_aug2(clean, snr):
35
+ """
36
+ Args:
37
+ clean: (*, C)
38
+ snr_range: snr范围 [min, max]
39
+ snr_aug_rate: snr增强率
40
+ Returns:
41
+ """
42
+ noise = np.random.randn(*clean.shape) # 生成和clean等长的白噪
43
+ noisy, _ = snr_aug_changeNoise_v2(clean, noise, snr)
44
+ return noisy
45
+
46
+
47
+ if __name__ == "__main__":
48
+ clean_path = "../../data/white.wav"
49
+ clean, fs = sf.read(clean_path, always_2d=True, dtype="float32")
50
+
51
+ noisy1 = snr_aug1(clean, 10)
52
+ noisy2 = snr_aug2(clean, 10)
53
+
54
+ print(get_snr(clean, noisy1 - clean)) # 10.000000000480982
55
+ print(get_snr(clean, noisy2 - clean)) # 9.999870642663442
File without changes
@@ -0,0 +1,39 @@
1
+ '''
2
+ Author: 凌逆战 | Never
3
+ Date: 2025-08-05 23:42:06
4
+ Description:
5
+ '''
6
+ # -*- coding:utf-8 -*-
7
+ # Author:凌逆战 | Never.Ling
8
+ # Date: 2022/8/2
9
+ """
10
+ 案例来源:https://github.com/snakers4/silero-vad
11
+ API文档:https://github.com/snakers4/silero-vad/blob/master/utils_vad.py
12
+ """
13
+ from rVADfast import rVADfast
14
+ import soundfile as sf
15
+ import numpy as np
16
+ import matplotlib.pyplot as plt
17
+ from neverlib.filter import HPFilter
18
+ from neverlib.audio_aug import volume_norm
19
+
20
+
21
+ sr = 16000
22
+ vad = rVADfast()
23
+ wav_path = "../../data/vad_example.wav"
24
+ wav, wav_sr = sf.read(wav_path, always_2d=False, dtype="float32") # (xxx, ch)
25
+ assert wav_sr == sr, f"音频采样率为{wav_sr},期望{sr}"
26
+ wav = HPFilter(wav, sr=16000, order=6, cutoff=100)
27
+ wav = volume_norm(wav)
28
+
29
+ vad_labels, vad_timestamps = vad(wav, wav_sr)
30
+ print(len(wav))
31
+ print(len(vad_labels))
32
+ print(len(vad_timestamps))
33
+
34
+
35
+
36
+
37
+
38
+
39
+
@@ -0,0 +1,125 @@
1
+ # -*- coding:utf-8 -*-
2
+ # Author:凌逆战 | Never
3
+ # Date: 2024/9/27
4
+ """
5
+
6
+ """
7
+ import random
8
+ import numpy as np
9
+ import soundfile as sf
10
+ from scipy import signal
11
+ from neverlib.utils import EPS
12
+
13
+
14
+ def volume_norm(wav):
15
+ """
16
+ 音量归一化
17
+ :param wav: (T,)
18
+ :return: (T,)
19
+ """
20
+ wav = wav / (np.max(np.abs(wav)) + 1e-8)
21
+ return wav
22
+
23
+
24
+ def add_reverb(wav, rir, ratio=1, mode="same"):
25
+ """添加混响,
26
+ Args:
27
+ wav: [T, channel]
28
+ rir: [T, channel]
29
+ ratio: 0-1
30
+ mode: "same" for SE or "full" for kws
31
+ """
32
+ if random.random() < ratio:
33
+ wav = signal.fftconvolve(wav, rir, mode=mode) # (28671, 3)
34
+ # note: 建议过完添加混响后再进行归一化, 否则可能会出现溢出
35
+ # wav = volume_norm(wav)
36
+ return wav
37
+
38
+
39
+ def snr_aug_changeNoise(clean, noise, snr):
40
+ """
41
+ 保持语音不变, 改变噪声的幅度
42
+ snr = 10 * log10(signal_power / k*noise_power)
43
+ """
44
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
45
+ clean_power = np.mean(clean ** 2) # 纯净语音功率
46
+ noise_power = np.mean(noise ** 2) # 噪声功率
47
+ noise_scale = np.sqrt(clean_power / (noise_power * 10 ** (snr / 10) + EPS))
48
+ noisy = clean + noise_scale * noise
49
+ return noisy, noise_scale
50
+
51
+
52
+ def snr_aug_changeClean(clean, noise, snr):
53
+ """
54
+ 保持噪声不变, 改变语音的幅度
55
+ snr = 10 * log10(k*signal_power/ noise_power)
56
+ """
57
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
58
+ clean_power = np.mean(clean ** 2)
59
+ noise_power = np.mean(noise ** 2)
60
+ clean_scale = np.sqrt(noise_power * 10 ** (snr / 10) / (clean_power + 1e-8))
61
+ noisy = clean * clean_scale + noise
62
+
63
+ return noisy, clean_scale
64
+
65
+
66
+ def snr_aug_Interpolation(clean, noise, snr):
67
+ """
68
+ 在已知clean_len<=noise_len的情况下
69
+ 将clean插入到noise中的snr aug方法
70
+ Args:
71
+ clean: 语音
72
+ noise: 噪声
73
+ snr: snr=random.uniform(*snr_range)
74
+ """
75
+ clean_len, noise_len = clean.shape[0], noise.shape[0]
76
+ assert clean_len <= noise_len, f"clean_len must be less than noise_len."
77
+ noisy = noise.copy()
78
+ index = random.randint(0, noise_len - clean_len)
79
+ noise = noise[index:index + clean_len, :]
80
+ noisy_tmp, _ = snr_aug_changeClean(clean, noise, snr)
81
+ noisy[index:index + clean_len, :] = noisy_tmp
82
+ return noisy
83
+
84
+
85
+ def get_audio_segments(wav_len, audio_path_list, sr=16000):
86
+ """
87
+ 从音频列表中随机拼接指定长度音频
88
+ Args:
89
+ wav_len: 需要返回的音频长度
90
+ audio_path_list: 音频路径列表
91
+ sr: 采样率
92
+ Returns:返回指定长度的音频
93
+ """
94
+ audio_len = 0
95
+ wav_list = []
96
+ while audio_len < wav_len:
97
+ audio_path = random.choice(audio_path_list)
98
+ wav, wav_sr = sf.read(audio_path, always_2d=True, dtype='float32')
99
+ assert wav_sr == sr, f"音频采样率是{wav_sr}, 期望{sr}"
100
+ audio_len += len(wav)
101
+ wav_list.append(wav)
102
+ wav = np.concatenate(wav_list, axis=0)
103
+ if len(wav) > wav_len:
104
+ # 随机截取clean_len
105
+ start = random.randint(0, len(wav) - wav_len)
106
+ wav = wav[start:start + wav_len, :]
107
+ return wav
108
+
109
+
110
+ def volume_aug(wav, range, rate, method="linmax"):
111
+ """音量增强 """
112
+ if random.random() < rate:
113
+ target_level = random.uniform(range[0], range[1])
114
+ if method == "dbrms":
115
+ wav_rms = (wav ** 2).mean() ** 0.5
116
+ scalar = 10 ** (target_level / 20) / (np.max(wav_rms) + EPS)
117
+ elif method == "linmax":
118
+ ipt_max = np.max(np.abs(wav))
119
+ # wav/wav_max*target_level=target_level_wav
120
+ # 处理后音频的 最大值就是target_level
121
+ scalar = target_level / (ipt_max + EPS)
122
+ else:
123
+ raise ValueError("method must be 'dbrms' or 'linmax'")
124
+ wav *= scalar
125
+ return wav
@@ -0,0 +1,138 @@
1
+ # -*- coding:utf-8 -*-
2
+ # Author:凌逆战 | Never
3
+ # Date: 2024/9/27
4
+ """
5
+
6
+ """
7
+ import random
8
+ import numpy as np
9
+ import soundfile as sf
10
+ from scipy import signal
11
+ from neverlib.utils import EPS
12
+
13
+
14
+ def volume_norm(wav):
15
+ """
16
+ 音量归一化
17
+ :param wav: (T,)
18
+ :return: (T,)
19
+ """
20
+ wav = wav / (np.max(np.abs(wav)) + 1e-8)
21
+ return wav
22
+
23
+
24
+ def add_reverb(wav, rir, ratio=1, mode="same"):
25
+ """添加混响,
26
+ Args:
27
+ wav: [T, channel]
28
+ rir: [T, channel]
29
+ ratio: 0-1
30
+ mode: "same" for SE or "full" for kws
31
+ """
32
+ if random.random() < ratio:
33
+ wav = signal.fftconvolve(wav, rir, mode=mode) # (28671, 3)
34
+ # note: 建议过完添加混响后再进行归一化, 否则可能会出现溢出
35
+ # wav = volume_norm(wav)
36
+ return wav
37
+
38
+
39
+ def snr_aug_changeNoise(clean, noise, snr):
40
+ """
41
+ 保持语音不变, 改变噪声的幅度
42
+ snr = 10 * log10(signal_power / k*noise_power)
43
+ """
44
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
45
+ clean_power = np.mean(clean ** 2) # 纯净语音功率
46
+ noise_power = np.mean(noise ** 2) # 噪声功率
47
+ noise_scale = np.sqrt(clean_power / (noise_power * 10 ** (snr / 10) + EPS))
48
+ noisy = clean + noise_scale * noise
49
+ return noisy, noise_scale
50
+
51
+
52
+ def snr_aug_changeNoise(clean, noise, snr):
53
+ """
54
+ 保持语音不变, 改变噪声的幅度
55
+ snr = 10 * log10(signal_power / k*noise_power)
56
+ """
57
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
58
+ clean_power = np.mean(clean ** 2) # 纯净语音功率
59
+ noise_power = np.mean(noise ** 2) # 噪声功率
60
+ noise_scale = np.sqrt(clean_power / (noise_power * 10 ** (snr / 10) + EPS))
61
+ noisy = clean + noise_scale * noise
62
+ return noisy, noise_scale
63
+
64
+
65
+ def snr_aug_changeClean(clean, noise, snr):
66
+ """
67
+ 保持噪声不变, 改变语音的幅度
68
+ snr = 10 * log10(k*signal_power/ noise_power)
69
+ """
70
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
71
+ clean_power = np.mean(clean ** 2)
72
+ noise_power = np.mean(noise ** 2)
73
+ clean_scale = np.sqrt(noise_power * 10 ** (snr / 10) / (clean_power + 1e-8))
74
+ noisy = clean * clean_scale + noise
75
+
76
+ return noisy, clean_scale
77
+
78
+
79
+ def snr_aug_Interpolation(clean, noise, snr):
80
+ """
81
+ 在已知clean_len<=noise_len的情况下
82
+ 将clean插入到noise中的snr aug方法
83
+ Args:
84
+ clean: 语音
85
+ noise: 噪声
86
+ snr: snr=random.uniform(*snr_range)
87
+ """
88
+ clean_len, noise_len = clean.shape[0], noise.shape[0]
89
+ assert clean_len <= noise_len, f"clean_len must be less than noise_len."
90
+ noisy = noise.copy()
91
+ index = random.randint(0, noise_len - clean_len)
92
+ noise = noise[index:index + clean_len, :]
93
+ noisy_tmp, _ = snr_aug_changeClean(clean, noise, snr)
94
+ noisy[index:index + clean_len, :] = noisy_tmp
95
+ return noisy
96
+
97
+
98
+ def get_audio_segments(wav_len, audio_path_list, sr=16000):
99
+ """
100
+ 从音频列表中随机拼接指定长度音频
101
+ Args:
102
+ wav_len: 需要返回的音频长度
103
+ audio_path_list: 音频路径列表
104
+ sr: 采样率
105
+ Returns:返回指定长度的音频
106
+ """
107
+ audio_len = 0
108
+ wav_list = []
109
+ while audio_len < wav_len:
110
+ audio_path = random.choice(audio_path_list)
111
+ wav, wav_sr = sf.read(audio_path, always_2d=True, dtype='float32')
112
+ assert wav_sr == sr, f"音频采样率是{wav_sr}, 期望{sr}"
113
+ audio_len += len(wav)
114
+ wav_list.append(wav)
115
+ wav = np.concatenate(wav_list, axis=0)
116
+ if len(wav) > wav_len:
117
+ # 随机截取clean_len
118
+ start = random.randint(0, len(wav) - wav_len)
119
+ wav = wav[start:start + wav_len, :]
120
+ return wav
121
+
122
+
123
+ def volume_aug(wav, range, rate, method="linmax"):
124
+ """音量增强 """
125
+ if random.random() < rate:
126
+ target_level = random.uniform(range[0], range[1])
127
+ if method == "dbrms":
128
+ wav_rms = (wav ** 2).mean() ** 0.5
129
+ scalar = 10 ** (target_level / 20) / (np.max(wav_rms) + EPS)
130
+ elif method == "linmax":
131
+ ipt_max = np.max(np.abs(wav))
132
+ # wav/wav_max*target_level=target_level_wav
133
+ # 处理后音频的 最大值就是target_level
134
+ scalar = target_level / (ipt_max + EPS)
135
+ else:
136
+ raise ValueError("method must be 'dbrms' or 'linmax'")
137
+ wav *= scalar
138
+ return wav