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,140 @@
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
+ snr_in = 10 * np.log10(clean_power / (noise_power + EPS) + EPS)
61
+ snr_gain = snr_in - snr
62
+ gain = 10 ** (snr_gain / 20)
63
+ noisy = clean + gain * noise
64
+ return noisy
65
+
66
+
67
+ def snr_aug_changeClean(clean, noise, snr):
68
+ """
69
+ 保持噪声不变, 改变语音的幅度
70
+ snr = 10 * log10(k*signal_power/ noise_power)
71
+ """
72
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
73
+ clean_power = np.mean(clean ** 2)
74
+ noise_power = np.mean(noise ** 2)
75
+ clean_scale = np.sqrt(noise_power * 10 ** (snr / 10) / (clean_power + 1e-8))
76
+ noisy = clean * clean_scale + noise
77
+
78
+ return noisy, clean_scale
79
+
80
+
81
+ def snr_aug_Interpolation(clean, noise, snr):
82
+ """
83
+ 在已知clean_len<=noise_len的情况下
84
+ 将clean插入到noise中的snr aug方法
85
+ Args:
86
+ clean: 语音
87
+ noise: 噪声
88
+ snr: snr=random.uniform(*snr_range)
89
+ """
90
+ clean_len, noise_len = clean.shape[0], noise.shape[0]
91
+ assert clean_len <= noise_len, f"clean_len must be less than noise_len."
92
+ noisy = noise.copy()
93
+ index = random.randint(0, noise_len - clean_len)
94
+ noise = noise[index:index + clean_len, :]
95
+ noisy_tmp, _ = snr_aug_changeClean(clean, noise, snr)
96
+ noisy[index:index + clean_len, :] = noisy_tmp
97
+ return noisy
98
+
99
+
100
+ def get_audio_segments(wav_len, audio_path_list, sr=16000):
101
+ """
102
+ 从音频列表中随机拼接指定长度音频
103
+ Args:
104
+ wav_len: 需要返回的音频长度
105
+ audio_path_list: 音频路径列表
106
+ sr: 采样率
107
+ Returns:返回指定长度的音频
108
+ """
109
+ audio_len = 0
110
+ wav_list = []
111
+ while audio_len < wav_len:
112
+ audio_path = random.choice(audio_path_list)
113
+ wav, wav_sr = sf.read(audio_path, always_2d=True, dtype='float32')
114
+ assert wav_sr == sr, f"音频采样率是{wav_sr}, 期望{sr}"
115
+ audio_len += len(wav)
116
+ wav_list.append(wav)
117
+ wav = np.concatenate(wav_list, axis=0)
118
+ if len(wav) > wav_len:
119
+ # 随机截取clean_len
120
+ start = random.randint(0, len(wav) - wav_len)
121
+ wav = wav[start:start + wav_len, :]
122
+ return wav
123
+
124
+
125
+ def volume_aug(wav, range, rate, method="linmax"):
126
+ """音量增强 """
127
+ if random.random() < rate:
128
+ target_level = random.uniform(range[0], range[1])
129
+ if method == "dbrms":
130
+ wav_rms = (wav ** 2).mean() ** 0.5
131
+ scalar = 10 ** (target_level / 20) / (np.max(wav_rms) + EPS)
132
+ elif method == "linmax":
133
+ ipt_max = np.max(np.abs(wav))
134
+ # wav/wav_max*target_level=target_level_wav
135
+ # 处理后音频的 最大值就是target_level
136
+ scalar = target_level / (ipt_max + EPS)
137
+ else:
138
+ raise ValueError("method must be 'dbrms' or 'linmax'")
139
+ wav *= scalar
140
+ return wav
@@ -0,0 +1,140 @@
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
+ snr_in = 10 * np.log10(clean_power / (noise_power + EPS) + EPS)
61
+ snr_gain = snr_in - snr
62
+ gain = 10 ** (snr_gain / 20)
63
+ noisy = clean + gain * noise
64
+ return noisy
65
+
66
+
67
+ def snr_aug_changeClean(clean, noise, snr):
68
+ """
69
+ 保持噪声不变, 改变语音的幅度
70
+ snr = 10 * log10(k*signal_power/ noise_power)
71
+ """
72
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
73
+ clean_power = np.mean(clean ** 2)
74
+ noise_power = np.mean(noise ** 2)
75
+ clean_scale = np.sqrt(noise_power * 10 ** (snr / 10) / (clean_power + 1e-8))
76
+ noisy = clean * clean_scale + noise
77
+
78
+ return noisy, clean_scale
79
+
80
+
81
+ def snr_aug_Interpolation(clean, noise, snr):
82
+ """
83
+ 在已知clean_len<=noise_len的情况下
84
+ 将clean插入到noise中的snr aug方法
85
+ Args:
86
+ clean: 语音
87
+ noise: 噪声
88
+ snr: snr=random.uniform(*snr_range)
89
+ """
90
+ clean_len, noise_len = clean.shape[0], noise.shape[0]
91
+ assert clean_len <= noise_len, f"clean_len must be less than noise_len."
92
+ noisy = noise.copy()
93
+ index = random.randint(0, noise_len - clean_len)
94
+ noise = noise[index:index + clean_len, :]
95
+ noisy_tmp, _ = snr_aug_changeClean(clean, noise, snr)
96
+ noisy[index:index + clean_len, :] = noisy_tmp
97
+ return noisy
98
+
99
+
100
+ def get_audio_segments(wav_len, audio_path_list, sr=16000):
101
+ """
102
+ 从音频列表中随机拼接指定长度音频
103
+ Args:
104
+ wav_len: 需要返回的音频长度
105
+ audio_path_list: 音频路径列表
106
+ sr: 采样率
107
+ Returns:返回指定长度的音频
108
+ """
109
+ audio_len = 0
110
+ wav_list = []
111
+ while audio_len < wav_len:
112
+ audio_path = random.choice(audio_path_list)
113
+ wav, wav_sr = sf.read(audio_path, always_2d=True, dtype='float32')
114
+ assert wav_sr == sr, f"音频采样率是{wav_sr}, 期望{sr}"
115
+ audio_len += len(wav)
116
+ wav_list.append(wav)
117
+ wav = np.concatenate(wav_list, axis=0)
118
+ if len(wav) > wav_len:
119
+ # 随机截取clean_len
120
+ start = random.randint(0, len(wav) - wav_len)
121
+ wav = wav[start:start + wav_len, :]
122
+ return wav
123
+
124
+
125
+ def volume_aug(wav, range, rate, method="linmax"):
126
+ """音量增强 """
127
+ if random.random() < rate:
128
+ target_level = random.uniform(range[0], range[1])
129
+ if method == "dbrms":
130
+ wav_rms = (wav ** 2).mean() ** 0.5
131
+ scalar = 10 ** (target_level / 20) / (np.max(wav_rms) + EPS)
132
+ elif method == "linmax":
133
+ ipt_max = np.max(np.abs(wav))
134
+ # wav/wav_max*target_level=target_level_wav
135
+ # 处理后音频的 最大值就是target_level
136
+ scalar = target_level / (ipt_max + EPS)
137
+ else:
138
+ raise ValueError("method must be 'dbrms' or 'linmax'")
139
+ wav *= scalar
140
+ return wav
@@ -0,0 +1,140 @@
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_v2(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
+ snr_in = 10 * np.log10(clean_power / (noise_power + EPS) + EPS)
61
+ snr_gain = snr_in - snr
62
+ gain = 10 ** (snr_gain / 20)
63
+ noisy = clean + gain * noise
64
+ return noisy
65
+
66
+
67
+ def snr_aug_changeClean(clean, noise, snr):
68
+ """
69
+ 保持噪声不变, 改变语音的幅度
70
+ snr = 10 * log10(k*signal_power/ noise_power)
71
+ """
72
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
73
+ clean_power = np.mean(clean ** 2)
74
+ noise_power = np.mean(noise ** 2)
75
+ clean_scale = np.sqrt(noise_power * 10 ** (snr / 10) / (clean_power + 1e-8))
76
+ noisy = clean * clean_scale + noise
77
+
78
+ return noisy, clean_scale
79
+
80
+
81
+ def snr_aug_Interpolation(clean, noise, snr):
82
+ """
83
+ 在已知clean_len<=noise_len的情况下
84
+ 将clean插入到noise中的snr aug方法
85
+ Args:
86
+ clean: 语音
87
+ noise: 噪声
88
+ snr: snr=random.uniform(*snr_range)
89
+ """
90
+ clean_len, noise_len = clean.shape[0], noise.shape[0]
91
+ assert clean_len <= noise_len, f"clean_len must be less than noise_len."
92
+ noisy = noise.copy()
93
+ index = random.randint(0, noise_len - clean_len)
94
+ noise = noise[index:index + clean_len, :]
95
+ noisy_tmp, _ = snr_aug_changeClean(clean, noise, snr)
96
+ noisy[index:index + clean_len, :] = noisy_tmp
97
+ return noisy
98
+
99
+
100
+ def get_audio_segments(wav_len, audio_path_list, sr=16000):
101
+ """
102
+ 从音频列表中随机拼接指定长度音频
103
+ Args:
104
+ wav_len: 需要返回的音频长度
105
+ audio_path_list: 音频路径列表
106
+ sr: 采样率
107
+ Returns:返回指定长度的音频
108
+ """
109
+ audio_len = 0
110
+ wav_list = []
111
+ while audio_len < wav_len:
112
+ audio_path = random.choice(audio_path_list)
113
+ wav, wav_sr = sf.read(audio_path, always_2d=True, dtype='float32')
114
+ assert wav_sr == sr, f"音频采样率是{wav_sr}, 期望{sr}"
115
+ audio_len += len(wav)
116
+ wav_list.append(wav)
117
+ wav = np.concatenate(wav_list, axis=0)
118
+ if len(wav) > wav_len:
119
+ # 随机截取clean_len
120
+ start = random.randint(0, len(wav) - wav_len)
121
+ wav = wav[start:start + wav_len, :]
122
+ return wav
123
+
124
+
125
+ def volume_aug(wav, range, rate, method="linmax"):
126
+ """音量增强 """
127
+ if random.random() < rate:
128
+ target_level = random.uniform(range[0], range[1])
129
+ if method == "dbrms":
130
+ wav_rms = (wav ** 2).mean() ** 0.5
131
+ scalar = 10 ** (target_level / 20) / (np.max(wav_rms) + EPS)
132
+ elif method == "linmax":
133
+ ipt_max = np.max(np.abs(wav))
134
+ # wav/wav_max*target_level=target_level_wav
135
+ # 处理后音频的 最大值就是target_level
136
+ scalar = target_level / (ipt_max + EPS)
137
+ else:
138
+ raise ValueError("method must be 'dbrms' or 'linmax'")
139
+ wav *= scalar
140
+ return wav
@@ -0,0 +1,140 @@
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_v2(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
+ snr_in = 10 * np.log10(clean_power / (noise_power + EPS) + EPS)
61
+ snr_gain = snr_in - snr
62
+ gain = 10 ** (snr_gain / 20)
63
+ noisy = clean + gain * noise
64
+ return noisy, gain
65
+
66
+
67
+ def snr_aug_changeClean(clean, noise, snr):
68
+ """
69
+ 保持噪声不变, 改变语音的幅度
70
+ snr = 10 * log10(k*signal_power/ noise_power)
71
+ """
72
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
73
+ clean_power = np.mean(clean ** 2)
74
+ noise_power = np.mean(noise ** 2)
75
+ clean_scale = np.sqrt(noise_power * 10 ** (snr / 10) / (clean_power + 1e-8))
76
+ noisy = clean * clean_scale + noise
77
+
78
+ return noisy, clean_scale
79
+
80
+
81
+ def snr_aug_Interpolation(clean, noise, snr):
82
+ """
83
+ 在已知clean_len<=noise_len的情况下
84
+ 将clean插入到noise中的snr aug方法
85
+ Args:
86
+ clean: 语音
87
+ noise: 噪声
88
+ snr: snr=random.uniform(*snr_range)
89
+ """
90
+ clean_len, noise_len = clean.shape[0], noise.shape[0]
91
+ assert clean_len <= noise_len, f"clean_len must be less than noise_len."
92
+ noisy = noise.copy()
93
+ index = random.randint(0, noise_len - clean_len)
94
+ noise = noise[index:index + clean_len, :]
95
+ noisy_tmp, _ = snr_aug_changeClean(clean, noise, snr)
96
+ noisy[index:index + clean_len, :] = noisy_tmp
97
+ return noisy
98
+
99
+
100
+ def get_audio_segments(wav_len, audio_path_list, sr=16000):
101
+ """
102
+ 从音频列表中随机拼接指定长度音频
103
+ Args:
104
+ wav_len: 需要返回的音频长度
105
+ audio_path_list: 音频路径列表
106
+ sr: 采样率
107
+ Returns:返回指定长度的音频
108
+ """
109
+ audio_len = 0
110
+ wav_list = []
111
+ while audio_len < wav_len:
112
+ audio_path = random.choice(audio_path_list)
113
+ wav, wav_sr = sf.read(audio_path, always_2d=True, dtype='float32')
114
+ assert wav_sr == sr, f"音频采样率是{wav_sr}, 期望{sr}"
115
+ audio_len += len(wav)
116
+ wav_list.append(wav)
117
+ wav = np.concatenate(wav_list, axis=0)
118
+ if len(wav) > wav_len:
119
+ # 随机截取clean_len
120
+ start = random.randint(0, len(wav) - wav_len)
121
+ wav = wav[start:start + wav_len, :]
122
+ return wav
123
+
124
+
125
+ def volume_aug(wav, range, rate, method="linmax"):
126
+ """音量增强 """
127
+ if random.random() < rate:
128
+ target_level = random.uniform(range[0], range[1])
129
+ if method == "dbrms":
130
+ wav_rms = (wav ** 2).mean() ** 0.5
131
+ scalar = 10 ** (target_level / 20) / (np.max(wav_rms) + EPS)
132
+ elif method == "linmax":
133
+ ipt_max = np.max(np.abs(wav))
134
+ # wav/wav_max*target_level=target_level_wav
135
+ # 处理后音频的 最大值就是target_level
136
+ scalar = target_level / (ipt_max + EPS)
137
+ else:
138
+ raise ValueError("method must be 'dbrms' or 'linmax'")
139
+ wav *= scalar
140
+ return wav
@@ -0,0 +1,87 @@
1
+ """
2
+ 音频数据分析模块
3
+ Audio Data Analysis Module
4
+
5
+ 提供完整的音频数据分析功能, 包括特征提取、质量评估、统计分析和可视化等。
6
+ """
7
+
8
+ # 基础工具
9
+ from .utils import dB, peak_amplitude, rms_amplitude
10
+
11
+ # 频域分析
12
+ from .spectral_analysis import (
13
+ SpectralAnalyzer,
14
+ compute_spectral_features,
15
+ frequency_domain_stats
16
+ )
17
+
18
+ # 时域特征分析
19
+ from .temporal_features import (
20
+ TemporalAnalyzer,
21
+ compute_temporal_features,
22
+ temporal_domain_stats
23
+ )
24
+
25
+ # 音频质量评估
26
+ from .quality_metrics import (
27
+ QualityAnalyzer,
28
+ comprehensive_quality_assessment,
29
+ audio_health_check
30
+ )
31
+
32
+ # 统计分析
33
+ from .statistics import (
34
+ AudioStatistics,
35
+ quick_audio_stats,
36
+ compare_datasets
37
+ )
38
+
39
+ # 可视化
40
+ from .visualization import (
41
+ AudioVisualizer,
42
+ plot_dataset_overview,
43
+ create_analysis_dashboard
44
+ )
45
+
46
+ # 数据集分析
47
+ from .dataset_analyzer import (
48
+ DatasetAnalyzer,
49
+ AudioFileInfo,
50
+ analyze_audio_dataset
51
+ )
52
+
53
+ # RMS分布分析(保持向后兼容)
54
+ try:
55
+ from .rms_distrubution import get_rms_vad
56
+ except ImportError:
57
+ pass
58
+
59
+ __all__ = [
60
+ # 基础工具
61
+ 'dB', 'peak_amplitude', 'rms_amplitude',
62
+
63
+ # 频域分析
64
+ 'SpectralAnalyzer', 'compute_spectral_features', 'frequency_domain_stats',
65
+
66
+ # 时域分析
67
+ 'TemporalAnalyzer', 'compute_temporal_features', 'temporal_domain_stats',
68
+
69
+ # 质量评估
70
+ 'QualityAnalyzer', 'comprehensive_quality_assessment', 'audio_health_check',
71
+
72
+ # 统计分析
73
+ 'AudioStatistics', 'quick_audio_stats', 'compare_datasets',
74
+
75
+ # 可视化
76
+ 'AudioVisualizer', 'plot_dataset_overview', 'create_analysis_dashboard',
77
+
78
+ # 数据集分析
79
+ 'DatasetAnalyzer', 'AudioFileInfo', 'analyze_audio_dataset',
80
+
81
+ # RMS分布分析
82
+ 'get_rms_vad'
83
+ ]
84
+
85
+ __version__ = '1.0.0'
86
+ __author__ = 'NeverLib Team'
87
+ __description__ = 'Comprehensive audio data analysis toolkit'
@@ -0,0 +1,14 @@
1
+ '''
2
+ Author: 凌逆战 | Never
3
+ Date: 2025-08-06 00:56:39
4
+ Description:
5
+ '''
6
+ """
7
+ 音频数据分析模块
8
+ Audio Data Analysis Module
9
+
10
+ 提供完整的音频数据分析功能, 包括特征提取、质量评估、统计分析和可视化等。
11
+ """
12
+
13
+ # 基础工具
14
+ from neverlib.dataAnalyze.temporal_features import dB, peak_amplitude, rms_amplitude
@@ -0,0 +1,14 @@
1
+ '''
2
+ Author: 凌逆战 | Never
3
+ Date: 2025-08-06 00:56:39
4
+ Description:
5
+ '''
6
+ """
7
+ 音频数据分析模块
8
+ Audio Data Analysis Module
9
+
10
+ 提供完整的音频数据分析功能, 包括特征提取、质量评估、统计分析和可视化等。
11
+ """
12
+
13
+ # 基础工具
14
+ from .dataAnalyze.temporal_features import dB, peak_amplitude, rms_amplitude
@@ -0,0 +1,14 @@
1
+ '''
2
+ Author: 凌逆战 | Never
3
+ Date: 2025-08-06 00:56:39
4
+ Description:
5
+ '''
6
+ """
7
+ 音频数据分析模块
8
+ Audio Data Analysis Module
9
+
10
+ 提供完整的音频数据分析功能, 包括特征提取、质量评估、统计分析和可视化等。
11
+ """
12
+
13
+ # 基础工具
14
+ from neverlib.dataAnalyze.temporal_features import dB, peak_amplitude, rms_amplitude