neverlib 0.2.4__py3-none-any.whl → 0.2.6__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 (260) hide show
  1. neverlib/.history/Docs/audio_aug/del_20250827162530.py +0 -0
  2. neverlib/.history/Docs/audio_aug/del_20250827162540.py +2 -0
  3. neverlib/.history/Docs/audio_aug/del_20250827162541.py +7 -0
  4. neverlib/.history/Docs/audio_aug/del_20250827162606.py +7 -0
  5. neverlib/.history/Docs/audio_aug/del_20250827162637.py +8 -0
  6. neverlib/.history/Docs/audio_aug/del_20250827162645.py +8 -0
  7. neverlib/.history/Docs/audio_aug/del_20250827162723.py +9 -0
  8. neverlib/.history/Docs/audio_aug/del_20250827162739.py +9 -0
  9. neverlib/.history/Docs/audio_aug/test_snr_20250827161751.py +55 -0
  10. neverlib/.history/Docs/audio_aug/test_snr_20250827161754.py +55 -0
  11. neverlib/.history/Docs/audio_aug/test_snr_20250827161833.py +54 -0
  12. neverlib/.history/Docs/audio_aug/test_snr_20250827162017.py +56 -0
  13. neverlib/.history/Docs/audio_aug/test_snr_20250827162021.py +57 -0
  14. neverlib/.history/Docs/audio_aug/test_snr_20250827162028.py +57 -0
  15. neverlib/.history/Docs/audio_aug_test/del_20250827162738.py +9 -0
  16. neverlib/.history/Docs/audio_aug_test/del_20250827162819.py +9 -0
  17. neverlib/.history/Docs/audio_aug_test/del_20250827162830.py +9 -0
  18. neverlib/.history/Docs/audio_aug_test/del_20250827162846.py +9 -0
  19. neverlib/.history/Docs/audio_aug_test/del_20250827162851.py +9 -0
  20. neverlib/.history/Docs/audio_aug_test/del_20250827162903.py +10 -0
  21. neverlib/.history/Docs/audio_aug_test/del_20250827162921.py +10 -0
  22. neverlib/.history/Docs/audio_aug_test/del_20250827162926.py +10 -0
  23. neverlib/.history/Docs/audio_aug_test/del_20250827163030.py +10 -0
  24. neverlib/.history/Docs/audio_aug_test/del_20250827163032.py +10 -0
  25. neverlib/.history/QA/html2markdown_20250822234112.md +0 -0
  26. neverlib/.history/QA/html2markdown_20250822234140.py +9 -0
  27. neverlib/.history/QA/html2markdown_20250822234141.md +9 -0
  28. neverlib/.history/QA/html2markdown_20250822234159.py +12 -0
  29. neverlib/.history/QA/html2markdown_20250822234200.py +17 -0
  30. neverlib/.history/QA/html2markdown_20250822234236.py +17 -0
  31. neverlib/.history/QA/html2markdown_20250822234340.py +14 -0
  32. neverlib/.history/QA/html2markdown_20250822234522.py +18 -0
  33. neverlib/.history/QA/html2markdown_20250822234601.py +20 -0
  34. neverlib/.history/QA/html2markdown_20250822234615.py +22 -0
  35. neverlib/.history/QA/html2markdown_20250822234715.py +28 -0
  36. neverlib/.history/QA/html2markdown_20250822234720.py +27 -0
  37. neverlib/.history/QA/html2markdown_20250822234903.py +27 -0
  38. neverlib/.history/__init___20250805234212.py +41 -0
  39. neverlib/.history/__init___20250904102635.py +39 -0
  40. neverlib/.history/__init___20250904102836.py +34 -0
  41. neverlib/.history/__init___20250904102838.py +39 -0
  42. neverlib/.history/__init___20250904102851.py +33 -0
  43. neverlib/.history/audio_aug/audio_aug_20250826155913.py +158 -0
  44. neverlib/.history/audio_aug/audio_aug_20250826164159.py +159 -0
  45. neverlib/.history/audio_aug/audio_aug_20250826164217.py +160 -0
  46. neverlib/.history/audio_aug/audio_aug_20250826164408.py +161 -0
  47. neverlib/.history/audio_aug/audio_aug_20250826164423.py +161 -0
  48. neverlib/.history/audio_aug/audio_aug_20250826164529.py +161 -0
  49. neverlib/.history/audio_aug/audio_aug_20250826164824.py +161 -0
  50. neverlib/.history/audio_aug/audio_aug_20250826164932.py +162 -0
  51. neverlib/.history/audio_aug/audio_aug_20250826164947.py +162 -0
  52. neverlib/.history/audio_aug/audio_aug_20250826165403.py +162 -0
  53. neverlib/.history/audio_aug/audio_aug_20250826165421.py +162 -0
  54. neverlib/.history/audio_aug/audio_aug_20250826165509.py +163 -0
  55. neverlib/.history/audio_aug/audio_aug_20250826165702.py +163 -0
  56. neverlib/.history/audio_aug/audio_aug_20250826165732.py +165 -0
  57. neverlib/.history/audio_aug/audio_aug_20250826170041.py +163 -0
  58. neverlib/.history/audio_aug/audio_aug_20250826170105.py +164 -0
  59. neverlib/.history/audio_aug/audio_aug_20250826170154.py +164 -0
  60. neverlib/.history/audio_aug/audio_aug_20250826170220.py +165 -0
  61. neverlib/.history/audio_aug/audio_aug_20250826170221.py +165 -0
  62. neverlib/.history/audio_aug/audio_aug_20250826170228.py +165 -0
  63. neverlib/.history/audio_aug/audio_aug_20250826170231.py +165 -0
  64. neverlib/.history/audio_aug/audio_aug_20250826212001.py +165 -0
  65. neverlib/.history/audio_aug/audio_aug_20250826220038.py +165 -0
  66. neverlib/.history/audio_aug/audio_aug_20250826220133.py +165 -0
  67. neverlib/.history/audio_aug/audio_aug_20250826220148.py +165 -0
  68. neverlib/.history/audio_aug/audio_aug_20250826220154.py +165 -0
  69. neverlib/.history/audio_aug/audio_aug_20250826220156.py +165 -0
  70. neverlib/.history/audio_aug/audio_aug_20250826220314.py +165 -0
  71. neverlib/.history/audio_aug/audio_aug_20250826220343.py +184 -0
  72. neverlib/.history/audio_aug/audio_aug_20250826220345.py +184 -0
  73. neverlib/.history/audio_aug/audio_aug_20250826220349.py +184 -0
  74. neverlib/.history/audio_aug/audio_aug_20250826220429.py +184 -0
  75. neverlib/.history/audio_aug/audio_aug_20250826220447.py +184 -0
  76. neverlib/.history/audio_aug/audio_aug_20250826220601.py +186 -0
  77. neverlib/.history/audio_aug/audio_aug_20250826220638.py +186 -0
  78. neverlib/.history/audio_aug/audio_aug_20250826220641.py +186 -0
  79. neverlib/.history/audio_aug/audio_aug_20250826220647.py +186 -0
  80. neverlib/.history/audio_aug/audio_aug_20250826220653.py +186 -0
  81. neverlib/.history/audio_aug/audio_aug_20250826220655.py +186 -0
  82. neverlib/.history/audio_aug/audio_aug_20250826220731.py +185 -0
  83. neverlib/.history/audio_aug/audio_aug_20250826220739.py +185 -0
  84. neverlib/.history/audio_aug/audio_aug_20250826220747.py +185 -0
  85. neverlib/.history/audio_aug/audio_aug_20250826220801.py +186 -0
  86. neverlib/.history/audio_aug/audio_aug_20250826220822.py +186 -0
  87. neverlib/.history/audio_aug/audio_aug_20250826220901.py +186 -0
  88. neverlib/.history/audio_aug/audio_aug_20250826221107.py +187 -0
  89. neverlib/.history/audio_aug/audio_aug_20250826221310.py +188 -0
  90. neverlib/.history/audio_aug/audio_aug_20250826221353.py +191 -0
  91. neverlib/.history/audio_aug/audio_aug_20250826221821.py +191 -0
  92. neverlib/.history/audio_aug/audio_aug_20250826221838.py +191 -0
  93. neverlib/.history/audio_aug/audio_aug_20250826221906.py +191 -0
  94. neverlib/.history/audio_aug/audio_aug_20250826221930.py +191 -0
  95. neverlib/.history/audio_aug/audio_aug_20250826221939.py +191 -0
  96. neverlib/.history/audio_aug/audio_aug_20250826221955.py +191 -0
  97. neverlib/.history/audio_aug/audio_aug_20250826222008.py +197 -0
  98. neverlib/.history/audio_aug/audio_aug_20250826222017.py +200 -0
  99. neverlib/.history/audio_aug/audio_aug_20250826222046.py +203 -0
  100. neverlib/.history/audio_aug/audio_aug_20250826222105.py +203 -0
  101. neverlib/.history/audio_aug/audio_aug_20250826222206.py +203 -0
  102. neverlib/.history/audio_aug/audio_aug_20250826222302.py +203 -0
  103. neverlib/.history/audio_aug/audio_aug_20250826222336.py +203 -0
  104. neverlib/.history/audio_aug/audio_aug_20250826222455.py +204 -0
  105. neverlib/.history/audio_aug/audio_aug_20250826222526.py +204 -0
  106. neverlib/.history/audio_aug/audio_aug_20250826222541.py +204 -0
  107. neverlib/.history/audio_aug/audio_aug_20250826222624.py +202 -0
  108. neverlib/.history/audio_aug/audio_aug_20250826222714.py +205 -0
  109. neverlib/.history/audio_aug/audio_aug_20250826222820.py +205 -0
  110. neverlib/.history/audio_aug/audio_aug_20250826222827.py +205 -0
  111. neverlib/.history/audio_aug/audio_aug_20250826222927.py +232 -0
  112. neverlib/.history/audio_aug/audio_aug_20250826223009.py +232 -0
  113. neverlib/.history/audio_aug/audio_aug_20250826223054.py +232 -0
  114. neverlib/.history/audio_aug/audio_aug_20250826223225.py +233 -0
  115. neverlib/.history/audio_aug/audio_aug_20250826223344.py +236 -0
  116. neverlib/.history/audio_aug/audio_aug_20250826223356.py +236 -0
  117. neverlib/.history/audio_aug/audio_aug_20250826223955.py +242 -0
  118. neverlib/.history/audio_aug/audio_aug_20250826224210.py +240 -0
  119. neverlib/.history/audio_aug/audio_aug_20250826224250.py +242 -0
  120. neverlib/.history/audio_aug/audio_aug_20250826224323.py +280 -0
  121. neverlib/.history/audio_aug/audio_aug_20250826224452.py +263 -0
  122. neverlib/.history/audio_aug/audio_aug_20250826224455.py +263 -0
  123. neverlib/.history/audio_aug/audio_aug_20250826224502.py +263 -0
  124. neverlib/.history/audio_aug/audio_aug_20250826224528.py +263 -0
  125. neverlib/.history/audio_aug/audio_aug_20250826224658.py +263 -0
  126. neverlib/.history/audio_aug/audio_aug_20250826224833.py +264 -0
  127. neverlib/.history/audio_aug/audio_aug_20250826225013.py +269 -0
  128. neverlib/.history/audio_aug/audio_aug_20250826225050.py +269 -0
  129. neverlib/.history/audio_aug/audio_aug_20250826225241.py +268 -0
  130. neverlib/.history/audio_aug/audio_aug_20250826225315.py +266 -0
  131. neverlib/.history/audio_aug/audio_aug_20250826225404.py +266 -0
  132. neverlib/.history/audio_aug/audio_aug_20250826225502.py +265 -0
  133. neverlib/.history/audio_aug/audio_aug_20250826225950.py +267 -0
  134. neverlib/.history/audio_aug/audio_aug_20250826225959.py +268 -0
  135. neverlib/.history/audio_aug/audio_aug_20250826230222.py +271 -0
  136. neverlib/.history/audio_aug/audio_aug_20250826230248.py +270 -0
  137. neverlib/.history/audio_aug/audio_aug_20250826230638.py +266 -0
  138. neverlib/.history/audio_aug/audio_aug_20250826230755.py +266 -0
  139. neverlib/.history/audio_aug/audio_aug_20250826230941.py +265 -0
  140. neverlib/.history/audio_aug/audio_aug_20250826231054.py +266 -0
  141. neverlib/.history/audio_aug/audio_aug_20250826231117.py +266 -0
  142. neverlib/.history/audio_aug/audio_aug_20250826231219.py +266 -0
  143. neverlib/.history/audio_aug/audio_aug_20250826232330.py +266 -0
  144. neverlib/.history/audio_aug/audio_aug_20250826232352.py +266 -0
  145. neverlib/.history/audio_aug/audio_aug_20250827152748.py +268 -0
  146. neverlib/.history/audio_aug/audio_aug_20250827152806.py +268 -0
  147. neverlib/.history/audio_aug/audio_aug_20250827152808.py +268 -0
  148. neverlib/.history/audio_aug/audio_aug_20250827152917.py +283 -0
  149. neverlib/.history/audio_aug/audio_aug_20250827152929.py +281 -0
  150. neverlib/.history/audio_aug/audio_aug_20250827153100.py +286 -0
  151. neverlib/.history/audio_aug/audio_aug_20250827153102.py +286 -0
  152. neverlib/.history/audio_aug/audio_aug_20250827153301.py +295 -0
  153. neverlib/.history/audio_aug/audio_aug_20250827153331.py +298 -0
  154. neverlib/.history/audio_aug/audio_aug_20250827153525.py +303 -0
  155. neverlib/.history/audio_aug/audio_aug_20250827153533.py +304 -0
  156. neverlib/.history/audio_aug/audio_aug_20250827153541.py +321 -0
  157. neverlib/.history/audio_aug/audio_aug_20250827153805.py +322 -0
  158. neverlib/.history/audio_aug/audio_aug_20250827153832.py +323 -0
  159. neverlib/.history/audio_aug/audio_aug_20250827153836.py +324 -0
  160. neverlib/.history/audio_aug/audio_aug_20250827153846.py +324 -0
  161. neverlib/.history/audio_aug/audio_aug_20250827153859.py +325 -0
  162. neverlib/.history/audio_aug/audio_aug_20250827154453.py +337 -0
  163. neverlib/.history/audio_aug/audio_aug_20250827154513.py +355 -0
  164. neverlib/.history/audio_aug/audio_aug_20250827154538.py +356 -0
  165. neverlib/.history/audio_aug/audio_aug_20250827154541.py +357 -0
  166. neverlib/.history/audio_aug/audio_aug_20250827154612.py +357 -0
  167. neverlib/.history/audio_aug/audio_aug_20250827154657.py +360 -0
  168. neverlib/.history/audio_aug/audio_aug_20250827154708.py +360 -0
  169. neverlib/.history/audio_aug/audio_aug_20250827154728.py +366 -0
  170. neverlib/.history/audio_aug/audio_aug_20250827154755.py +367 -0
  171. neverlib/.history/audio_aug/audio_aug_20250827154800.py +367 -0
  172. neverlib/.history/audio_aug/audio_aug_20250827154917.py +368 -0
  173. neverlib/.history/audio_aug/audio_aug_20250827154928.py +369 -0
  174. neverlib/.history/audio_aug/audio_aug_20250827154932.py +370 -0
  175. neverlib/.history/audio_aug/audio_aug_20250827154947.py +372 -0
  176. neverlib/.history/audio_aug/audio_aug_20250827155015.py +375 -0
  177. neverlib/.history/audio_aug/audio_aug_20250827155106.py +375 -0
  178. neverlib/.history/audio_aug/audio_aug_20250827155114.py +393 -0
  179. neverlib/.history/audio_aug/audio_aug_20250827155207.py +415 -0
  180. neverlib/.history/audio_aug/audio_aug_20250827155300.py +415 -0
  181. neverlib/.history/audio_aug/audio_aug_20250827155321.py +471 -0
  182. neverlib/.history/audio_aug/audio_aug_20250827164703.py +471 -0
  183. neverlib/.history/audio_aug/audio_aug_20250827164749.py +471 -0
  184. neverlib/.history/audio_aug/audio_aug_20250827165252.py +472 -0
  185. neverlib/.history/audio_aug/audio_aug_20250827165334.py +472 -0
  186. neverlib/.history/audio_aug/audio_aug_20250827165404.py +473 -0
  187. neverlib/.history/audio_aug/audio_aug_20250827165610.py +473 -0
  188. neverlib/.history/audio_aug/audio_aug_20250827165805.py +473 -0
  189. neverlib/.history/audio_aug/audio_aug_20250827170056.py +473 -0
  190. neverlib/.history/audio_aug/audio_aug_20250827170106.py +472 -0
  191. neverlib/.history/audio_aug/audio_aug_20250827170143.py +472 -0
  192. neverlib/.history/audio_aug/audio_aug_20250827170216.py +472 -0
  193. neverlib/.history/audio_aug/audio_aug_20250827170218.py +472 -0
  194. neverlib/.history/audio_aug/audio_aug_20250827170314.py +472 -0
  195. neverlib/.history/audio_aug/audio_aug_20250827171500.py +471 -0
  196. neverlib/.history/audio_aug/audio_aug_20250827172347.py +471 -0
  197. neverlib/.history/audio_aug/audio_aug_20250827172558.py +470 -0
  198. neverlib/.history/audio_aug/audio_aug_20250827172559.py +470 -0
  199. neverlib/.history/audio_aug/audio_aug_20250827172801.py +470 -0
  200. neverlib/.history/audio_aug/audio_aug_20250827182522.py +470 -0
  201. neverlib/.history/audio_aug/audio_aug_20250827182526.py +470 -0
  202. neverlib/.history/audio_aug/audio_aug_20250827182626.py +470 -0
  203. neverlib/.history/audio_aug/audio_aug_20250827182715.py +470 -0
  204. neverlib/.history/audio_aug/audio_aug_20250904185444.py +470 -0
  205. neverlib/.history/audio_aug/audio_aug_20250904185538.py +445 -0
  206. neverlib/.history/data_analyze/__init___20250806204158.py +14 -0
  207. neverlib/.history/data_analyze/__init___20250827163248.py +14 -0
  208. neverlib/.history/filter/auto_eq/freq_eq_20250821143140.py +76 -0
  209. neverlib/.history/filter/auto_eq/freq_eq_20250821153208.py +76 -0
  210. neverlib/.history/filter/auto_eq/freq_eq_20250821153214.py +76 -0
  211. neverlib/.history/filter/auto_eq/ga_eq_basic_20250901110521.py +385 -0
  212. neverlib/.history/filter/auto_eq/ga_eq_basic_20250901110652.py +385 -0
  213. neverlib/.history/filter/common_20250806002134.py +37 -0
  214. neverlib/.history/filter/common_20250821120448.py +49 -0
  215. neverlib/.history/filter/common_20250821120453.py +49 -0
  216. neverlib/.history/metrics/snr_20250827224201.py +182 -0
  217. neverlib/.history/metrics/snr_20250827234019.py +186 -0
  218. neverlib/.history/metrics/snr_20250827234028.py +186 -0
  219. neverlib/.history/metrics/snr_20250827234030.py +186 -0
  220. neverlib/.history/utils/audio_split_20250805234209.py +268 -0
  221. neverlib/.history/utils/audio_split_20250904185309.py +268 -0
  222. neverlib/.history/utils/utils_20250813165516.py +330 -0
  223. neverlib/.history/utils/utils_20250904181341.py +328 -0
  224. neverlib/.history/utils/utils_20250904185546.py +352 -0
  225. neverlib/.history/utils/utils_20250904185548.py +353 -0
  226. neverlib/.history/utils/utils_20250904185603.py +353 -0
  227. neverlib/.history/utils/utils_20250904185636.py +353 -0
  228. neverlib/.history/utils/utils_20250904185658.py +358 -0
  229. neverlib/.history/utils/utils_20250904190053.py +359 -0
  230. neverlib/.specstory/history/2025-08-22_02-10Z-/345/256/214/345/226/204/345/207/275/346/225/260/347/232/204/345/212/237/350/203/275/345/222/214/345/217/230/351/207/217/345/220/215/345/273/272/350/256/256.md +247 -0
  231. neverlib/.specstory/history/2025-08-26_11-54Z-oserror-missing-shared-object-file.md +87 -0
  232. neverlib/.specstory/history/2025-08-27_08-07Z-/345/256/214/345/226/204/346/265/213/350/257/225/346/226/207/346/241/243/347/232/204/350/256/250/350/256/272.md +296 -0
  233. neverlib/.specstory/history/2025-08-27_08-29Z-delete-python-file-command.md +211 -0
  234. neverlib/.specstory/history/2025-08-27_09-05Z-/345/234/250jupyter/344/270/255/346/222/255/346/224/276/351/237/263/351/242/221/347/232/204/344/273/243/347/240/201/344/277/256/346/224/271.md +357 -0
  235. neverlib/Docs/audio_aug_test/test_snr.py +55 -0
  236. neverlib/Docs/audio_aug_test/test_volume.py +0 -0
  237. neverlib/QA/html2markdown.py +27 -0
  238. neverlib/__init__.py +10 -20
  239. neverlib/audio_aug/__init__.py +6 -1
  240. neverlib/audio_aug/audio_aug.py +360 -55
  241. neverlib/data_analyze/__init__.py +8 -2
  242. neverlib/data_analyze/temporal_features.py +1 -1
  243. neverlib/filter/__init__.py +9 -3
  244. neverlib/filter/auto_eq/freq_eq.py +1 -1
  245. neverlib/filter/auto_eq/ga_eq_basic.py +3 -3
  246. neverlib/filter/common.py +12 -0
  247. neverlib/metrics/snr.py +5 -3
  248. neverlib/utils/__init__.py +14 -7
  249. neverlib/utils/lazy_module.py +81 -0
  250. neverlib/utils/message.py +3 -8
  251. neverlib/utils/utils.py +32 -3
  252. neverlib/vad/__init__.py +16 -9
  253. neverlib/vad/utils.py +20 -6
  254. {neverlib-0.2.4.dist-info → neverlib-0.2.6.dist-info}/METADATA +21 -17
  255. neverlib-0.2.6.dist-info/RECORD +467 -0
  256. neverlib-0.2.4.dist-info/RECORD +0 -229
  257. /neverlib/{Docs/audio_aug/test_snr.py → .history/Docs/audio_aug/test_snr_20250827162033.py} +0 -0
  258. {neverlib-0.2.4.dist-info → neverlib-0.2.6.dist-info}/WHEEL +0 -0
  259. {neverlib-0.2.4.dist-info → neverlib-0.2.6.dist-info}/licenses/LICENSE +0 -0
  260. {neverlib-0.2.4.dist-info → neverlib-0.2.6.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,162 @@
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
+ # 防止削波
36
+ if np.max(np.abs(wav)) > 1:
37
+ scale_factor = 1 / np.max(np.abs(wav))
38
+ wav *= scale_factor
39
+ return wav
40
+
41
+
42
+ def snr_aug_changeNoise(clean, noise, snr):
43
+ """
44
+ 保持语音不变, 改变噪声的幅度
45
+ snr = 10 * log10(signal_power / k*noise_power)
46
+ """
47
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
48
+ clean_power = np.mean(clean ** 2) # 纯净语音功率
49
+ noise_power = np.mean(noise ** 2) # 噪声功率
50
+ noise_scale = np.sqrt(clean_power / (noise_power * 10 ** (snr / 10) + EPS))
51
+ noisy = clean + noise_scale * noise
52
+ # 防止削波
53
+ if np.max(np.abs(noisy)) > 1:
54
+ scale_factor = 1 / np.max(np.abs(noisy))
55
+ noisy *= scale_factor
56
+ clean *= scale_factor
57
+ return noisy, clean
58
+
59
+
60
+ def snr_aug_changeNoise_v2(clean, noise, snr):
61
+ """
62
+ 保持语音不变, 改变噪声的幅度
63
+ snr = 10 * log10(signal_power / k*noise_power)
64
+ """
65
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
66
+ clean_power = np.mean(clean ** 2) # 纯净语音功率
67
+ noise_power = np.mean(noise ** 2) # 噪声功率
68
+ snr_in = 10 * np.log10(clean_power / (noise_power + EPS) + EPS)
69
+ snr_gain = snr_in - snr
70
+ gain = 10 ** (snr_gain / 20)
71
+ noisy = clean + gain * noise
72
+ # 防止削波
73
+ if np.max(np.abs(noisy)) > 1:
74
+ scale_factor = 1 / np.max(np.abs(noisy))
75
+ noisy *= scale_factor
76
+ clean *= scale_factor
77
+ return noisy, clean
78
+
79
+
80
+ def snr_aug_changeClean(clean, noise, snr, clip_check=True):
81
+ """
82
+ 保持噪声不变,改变纯净语音的幅度以达到目标信噪比
83
+ snr = 10 * log10(k*signal_power/ noise_power)
84
+ """
85
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
86
+ clean_power = np.mean(clean ** 2)
87
+ noise_power = np.mean(noise ** 2)
88
+ clean_scale = np.sqrt(noise_power * 10 ** (snr / 10) / (clean_power + 1e-8))
89
+ noisy = clean * clean_scale + noise
90
+ # 防止削波
91
+ if clip_check:
92
+ if np.max(np.abs(noisy)) > 1:
93
+ scale_factor = 1 / np.max(np.abs(noisy))
94
+ noisy *= scale_factor
95
+ clean *= clean_scale * scale_factor
96
+ return noisy, clean * clean_scale
97
+
98
+
99
+ def snr_aug_Interpolation(clean, noise, snr):
100
+ """
101
+ 在已知clean_len<=noise_len的情况下
102
+ 将clean插入到noise中的snr aug方法
103
+ Args:
104
+ clean: 语音
105
+ noise: 噪声
106
+ snr: snr=random.uniform(*snr_range)
107
+ """
108
+ clean_len, noise_len = clean.shape[0], noise.shape[0]
109
+ assert clean_len <= noise_len, f"clean_len must be less than noise_len."
110
+ noisy = noise.copy()
111
+ index = random.randint(0, noise_len - clean_len)
112
+ noise = noise[index:index + clean_len, :]
113
+ noisy_tmp, clean_tmp = snr_aug_changeClean(clean, noise, snr)
114
+ noisy[index:index + clean_len, :] = noisy_tmp
115
+ # 防止削波
116
+ if np.max(np.abs(noisy)) > 1:
117
+ scale_factor = 1 / np.max(np.abs(noisy))
118
+ noisy *= scale_factor
119
+ return noisy
120
+
121
+
122
+ def get_audio_segments(wav_len, audio_path_list, sr=16000):
123
+ """
124
+ 从音频列表中随机拼接指定长度音频
125
+ Args:
126
+ wav_len: 需要返回的音频长度
127
+ audio_path_list: 音频路径列表
128
+ sr: 采样率
129
+ Returns:返回指定长度的音频
130
+ """
131
+ audio_len = 0
132
+ wav_list = []
133
+ while audio_len < wav_len:
134
+ audio_path = random.choice(audio_path_list)
135
+ wav, wav_sr = sf.read(audio_path, always_2d=True, dtype='float32')
136
+ assert wav_sr == sr, f"音频采样率是{wav_sr}, 期望{sr}"
137
+ audio_len += len(wav)
138
+ wav_list.append(wav)
139
+ wav = np.concatenate(wav_list, axis=0)
140
+ if len(wav) > wav_len:
141
+ # 随机截取clean_len
142
+ start = random.randint(0, len(wav) - wav_len)
143
+ wav = wav[start:start + wav_len, :]
144
+ return wav
145
+
146
+
147
+ def volume_aug(wav, range, rate, method="linmax"):
148
+ """音量增强 """
149
+ if random.random() < rate:
150
+ target_level = random.uniform(range[0], range[1])
151
+ if method == "dbrms":
152
+ wav_rms = (wav ** 2).mean() ** 0.5
153
+ scalar = 10 ** (target_level / 20) / (np.max(wav_rms) + EPS)
154
+ elif method == "linmax":
155
+ ipt_max = np.max(np.abs(wav))
156
+ # wav/wav_max*target_level=target_level_wav
157
+ # 处理后音频的 最大值就是target_level
158
+ scalar = target_level / (ipt_max + EPS)
159
+ else:
160
+ raise ValueError("method must be 'dbrms' or 'linmax'")
161
+ wav *= scalar
162
+ return wav
@@ -0,0 +1,163 @@
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
+ # 防止削波
36
+ if np.max(np.abs(wav)) > 1:
37
+ scale_factor = 1 / np.max(np.abs(wav))
38
+ wav *= scale_factor
39
+ return wav
40
+
41
+
42
+ def snr_aug_changeNoise(clean, noise, snr):
43
+ """
44
+ 保持语音不变, 改变噪声的幅度
45
+ snr = 10 * log10(signal_power / k*noise_power)
46
+ """
47
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
48
+ clean_power = np.mean(clean ** 2) # 纯净语音功率
49
+ noise_power = np.mean(noise ** 2) # 噪声功率
50
+ noise_scale = np.sqrt(clean_power / (noise_power * 10 ** (snr / 10) + EPS))
51
+ noisy = clean + noise_scale * noise
52
+ # 防止削波
53
+ if np.max(np.abs(noisy)) > 1:
54
+ scale_factor = 1 / np.max(np.abs(noisy))
55
+ noisy *= scale_factor
56
+ clean *= scale_factor
57
+ return noisy, clean
58
+
59
+
60
+ def snr_aug_changeNoise_v2(clean, noise, snr):
61
+ """
62
+ 保持语音不变, 改变噪声的幅度
63
+ snr = 10 * log10(signal_power / k*noise_power)
64
+ """
65
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
66
+ clean_power = np.mean(clean ** 2) # 纯净语音功率
67
+ noise_power = np.mean(noise ** 2) # 噪声功率
68
+ snr_in = 10 * np.log10(clean_power / (noise_power + EPS) + EPS)
69
+ snr_gain = snr_in - snr
70
+ gain = 10 ** (snr_gain / 20)
71
+ noisy = clean + gain * noise
72
+ # 防止削波
73
+ if np.max(np.abs(noisy)) > 1:
74
+ scale_factor = 1 / np.max(np.abs(noisy))
75
+ noisy *= scale_factor
76
+ clean *= scale_factor
77
+ return noisy, clean
78
+
79
+
80
+ def snr_aug_changeClean(clean, noise, snr, clip_check=True):
81
+ """
82
+ 保持噪声不变,改变纯净语音的幅度以达到目标信噪比
83
+ snr = 10 * log10(k*signal_power/ noise_power)
84
+ """
85
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
86
+ clean_power = np.mean(clean ** 2)
87
+ noise_power = np.mean(noise ** 2)
88
+ # 计算纯净信号需要的幅度因子
89
+ clean_scale = np.sqrt(noise_power * 10 ** (snr / 10) / (clean_power + 1e-8))
90
+ noisy = clean * clean_scale + noise
91
+ # 防止削波
92
+ if clip_check:
93
+ if np.max(np.abs(noisy)) > 1:
94
+ scale_factor = 1 / np.max(np.abs(noisy))
95
+ noisy *= scale_factor
96
+ clean *= clean_scale * scale_factor
97
+ return noisy, clean * clean_scale
98
+
99
+
100
+ def snr_aug_Interpolation(clean, noise, snr):
101
+ """
102
+ 在已知clean_len<=noise_len的情况下
103
+ 将clean插入到noise中的snr aug方法
104
+ Args:
105
+ clean: 语音
106
+ noise: 噪声
107
+ snr: snr=random.uniform(*snr_range)
108
+ """
109
+ clean_len, noise_len = clean.shape[0], noise.shape[0]
110
+ assert clean_len <= noise_len, f"clean_len must be less than noise_len."
111
+ noisy = noise.copy()
112
+ index = random.randint(0, noise_len - clean_len)
113
+ noise = noise[index:index + clean_len, :]
114
+ noisy_tmp, clean_tmp = snr_aug_changeClean(clean, noise, snr)
115
+ noisy[index:index + clean_len, :] = noisy_tmp
116
+ # 防止削波
117
+ if np.max(np.abs(noisy)) > 1:
118
+ scale_factor = 1 / np.max(np.abs(noisy))
119
+ noisy *= scale_factor
120
+ return noisy
121
+
122
+
123
+ def get_audio_segments(wav_len, audio_path_list, sr=16000):
124
+ """
125
+ 从音频列表中随机拼接指定长度音频
126
+ Args:
127
+ wav_len: 需要返回的音频长度
128
+ audio_path_list: 音频路径列表
129
+ sr: 采样率
130
+ Returns:返回指定长度的音频
131
+ """
132
+ audio_len = 0
133
+ wav_list = []
134
+ while audio_len < wav_len:
135
+ audio_path = random.choice(audio_path_list)
136
+ wav, wav_sr = sf.read(audio_path, always_2d=True, dtype='float32')
137
+ assert wav_sr == sr, f"音频采样率是{wav_sr}, 期望{sr}"
138
+ audio_len += len(wav)
139
+ wav_list.append(wav)
140
+ wav = np.concatenate(wav_list, axis=0)
141
+ if len(wav) > wav_len:
142
+ # 随机截取clean_len
143
+ start = random.randint(0, len(wav) - wav_len)
144
+ wav = wav[start:start + wav_len, :]
145
+ return wav
146
+
147
+
148
+ def volume_aug(wav, range, rate, method="linmax"):
149
+ """音量增强 """
150
+ if random.random() < rate:
151
+ target_level = random.uniform(range[0], range[1])
152
+ if method == "dbrms":
153
+ wav_rms = (wav ** 2).mean() ** 0.5
154
+ scalar = 10 ** (target_level / 20) / (np.max(wav_rms) + EPS)
155
+ elif method == "linmax":
156
+ ipt_max = np.max(np.abs(wav))
157
+ # wav/wav_max*target_level=target_level_wav
158
+ # 处理后音频的 最大值就是target_level
159
+ scalar = target_level / (ipt_max + EPS)
160
+ else:
161
+ raise ValueError("method must be 'dbrms' or 'linmax'")
162
+ wav *= scalar
163
+ return wav
@@ -0,0 +1,163 @@
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
+ # 防止削波
36
+ if np.max(np.abs(wav)) > 1:
37
+ scale_factor = 1 / np.max(np.abs(wav))
38
+ wav *= scale_factor
39
+ return wav
40
+
41
+
42
+ def snr_aug_changeNoise(clean, noise, snr):
43
+ """
44
+ 保持语音不变, 改变噪声的幅度
45
+ snr = 10 * log10(signal_power / k*noise_power)
46
+ """
47
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
48
+ clean_power = np.mean(clean ** 2) # 纯净语音功率
49
+ noise_power = np.mean(noise ** 2) # 噪声功率
50
+ noise_scale = np.sqrt(clean_power / (noise_power * 10 ** (snr / 10) + EPS))
51
+ noisy = clean + noise_scale * noise
52
+ # 防止削波
53
+ if np.max(np.abs(noisy)) > 1:
54
+ scale_factor = 1 / np.max(np.abs(noisy))
55
+ noisy *= scale_factor
56
+ clean *= scale_factor
57
+ return noisy, clean
58
+
59
+
60
+ def snr_aug_changeNoise_v2(clean, noise, snr):
61
+ """
62
+ 保持语音不变, 改变噪声的幅度
63
+ snr = 10 * log10(signal_power / k*noise_power)
64
+ """
65
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
66
+ clean_power = np.mean(clean ** 2) # 纯净语音功率
67
+ noise_power = np.mean(noise ** 2) # 噪声功率
68
+ snr_in = 10 * np.log10(clean_power / (noise_power + EPS) + EPS)
69
+ snr_gain = snr_in - snr
70
+ gain = 10 ** (snr_gain / 20)
71
+ noisy = clean + gain * noise
72
+ # 防止削波
73
+ if np.max(np.abs(noisy)) > 1:
74
+ scale_factor = 1 / np.max(np.abs(noisy))
75
+ noisy *= scale_factor
76
+ clean *= scale_factor
77
+ return noisy, clean
78
+
79
+
80
+ def snr_aug_changeClean(clean, noise, snr, clip_check=True):
81
+ """
82
+ 保持噪声不变,改变纯净语音的幅度以达到目标信噪比
83
+ snr = 10 * log10(k*signal_power/ noise_power)
84
+ """
85
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
86
+ clean_power = np.mean(clean ** 2)
87
+ noise_power = np.mean(noise ** 2)
88
+ # 计算纯净信号需要的幅度因子
89
+ clean_scale = np.sqrt(noise_power * 10 ** (snr / 10) / (clean_power + 1e-8))
90
+ noisy = clean * clean_scale + noise
91
+ # 防止削波
92
+ if clip_check:
93
+ if np.max(np.abs(noisy)) > 1:
94
+ scale_factor = 1 / np.max(np.abs(noisy))
95
+ noisy *= scale_factor
96
+ clean = clean * clean_scale * scale_factor
97
+ return noisy, clean
98
+
99
+
100
+ def snr_aug_Interpolation(clean, noise, snr):
101
+ """
102
+ 在已知clean_len<=noise_len的情况下
103
+ 将clean插入到noise中的snr aug方法
104
+ Args:
105
+ clean: 语音
106
+ noise: 噪声
107
+ snr: snr=random.uniform(*snr_range)
108
+ """
109
+ clean_len, noise_len = clean.shape[0], noise.shape[0]
110
+ assert clean_len <= noise_len, f"clean_len must be less than noise_len."
111
+ noisy = noise.copy()
112
+ index = random.randint(0, noise_len - clean_len)
113
+ noise = noise[index:index + clean_len, :]
114
+ noisy_tmp, clean_tmp = snr_aug_changeClean(clean, noise, snr)
115
+ noisy[index:index + clean_len, :] = noisy_tmp
116
+ # 防止削波
117
+ if np.max(np.abs(noisy)) > 1:
118
+ scale_factor = 1 / np.max(np.abs(noisy))
119
+ noisy *= scale_factor
120
+ return noisy
121
+
122
+
123
+ def get_audio_segments(wav_len, audio_path_list, sr=16000):
124
+ """
125
+ 从音频列表中随机拼接指定长度音频
126
+ Args:
127
+ wav_len: 需要返回的音频长度
128
+ audio_path_list: 音频路径列表
129
+ sr: 采样率
130
+ Returns:返回指定长度的音频
131
+ """
132
+ audio_len = 0
133
+ wav_list = []
134
+ while audio_len < wav_len:
135
+ audio_path = random.choice(audio_path_list)
136
+ wav, wav_sr = sf.read(audio_path, always_2d=True, dtype='float32')
137
+ assert wav_sr == sr, f"音频采样率是{wav_sr}, 期望{sr}"
138
+ audio_len += len(wav)
139
+ wav_list.append(wav)
140
+ wav = np.concatenate(wav_list, axis=0)
141
+ if len(wav) > wav_len:
142
+ # 随机截取clean_len
143
+ start = random.randint(0, len(wav) - wav_len)
144
+ wav = wav[start:start + wav_len, :]
145
+ return wav
146
+
147
+
148
+ def volume_aug(wav, range, rate, method="linmax"):
149
+ """音量增强 """
150
+ if random.random() < rate:
151
+ target_level = random.uniform(range[0], range[1])
152
+ if method == "dbrms":
153
+ wav_rms = (wav ** 2).mean() ** 0.5
154
+ scalar = 10 ** (target_level / 20) / (np.max(wav_rms) + EPS)
155
+ elif method == "linmax":
156
+ ipt_max = np.max(np.abs(wav))
157
+ # wav/wav_max*target_level=target_level_wav
158
+ # 处理后音频的 最大值就是target_level
159
+ scalar = target_level / (ipt_max + EPS)
160
+ else:
161
+ raise ValueError("method must be 'dbrms' or 'linmax'")
162
+ wav *= scalar
163
+ return wav
@@ -0,0 +1,165 @@
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
+ # 防止削波
36
+ if np.max(np.abs(wav)) > 1:
37
+ scale_factor = 1 / np.max(np.abs(wav))
38
+ wav *= scale_factor
39
+ return wav
40
+
41
+
42
+ def snr_aug_changeNoise(clean, noise, snr):
43
+ """
44
+ 保持语音不变, 改变噪声的幅度
45
+ snr = 10 * log10(signal_power / k*noise_power)
46
+ """
47
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
48
+ clean_power = np.mean(clean ** 2) # 纯净语音功率
49
+ noise_power = np.mean(noise ** 2) # 噪声功率
50
+ noise_scale = np.sqrt(clean_power / (noise_power * 10 ** (snr / 10) + EPS))
51
+ noisy = clean + noise_scale * noise
52
+ # 防止削波
53
+ if np.max(np.abs(noisy)) > 1:
54
+ scale_factor = 1 / np.max(np.abs(noisy))
55
+ noisy *= scale_factor
56
+ clean *= scale_factor
57
+ return noisy, clean
58
+
59
+
60
+ def snr_aug_changeNoise_v2(clean, noise, snr):
61
+ """
62
+ 保持语音不变, 改变噪声的幅度
63
+ snr = 10 * log10(signal_power / k*noise_power)
64
+ """
65
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
66
+ clean_power = np.mean(clean ** 2) # 纯净语音功率
67
+ noise_power = np.mean(noise ** 2) # 噪声功率
68
+ snr_in = 10 * np.log10(clean_power / (noise_power + EPS) + EPS)
69
+ snr_gain = snr_in - snr
70
+ gain = 10 ** (snr_gain / 20)
71
+ noisy = clean + gain * noise
72
+ # 防止削波
73
+ if np.max(np.abs(noisy)) > 1:
74
+ scale_factor = 1 / np.max(np.abs(noisy))
75
+ noisy *= scale_factor
76
+ clean *= scale_factor
77
+ return noisy, clean
78
+
79
+
80
+ def snr_aug_changeClean(clean, noise, snr, clip_check=True):
81
+ """
82
+ 保持噪声不变,改变纯净语音的幅度以达到目标信噪比
83
+ snr = 10 * log10(k*signal_power/ noise_power)
84
+ """
85
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
86
+ clean_power = np.mean(clean ** 2)
87
+ noise_power = np.mean(noise ** 2)
88
+ # 计算纯净信号需要的幅度因子
89
+ clean_scale = np.sqrt(noise_power * 10 ** (snr / 10) / (clean_power + 1e-8))
90
+ noisy = clean * clean_scale + noise
91
+ # 防止削波
92
+ if clip_check:
93
+ if np.max(np.abs(noisy)) > 1:
94
+ scale_factor = 1 / np.max(np.abs(noisy))
95
+ noisy *= scale_factor
96
+ clean = clean * clean_scale * scale_factor
97
+ else:
98
+ clean = clean * clean_scale
99
+ return noisy, clean
100
+
101
+
102
+ def snr_aug_Interpolation(clean, noise, snr):
103
+ """
104
+ 在已知clean_len<=noise_len的情况下
105
+ 将clean插入到noise中的snr aug方法
106
+ Args:
107
+ clean: 语音
108
+ noise: 噪声
109
+ snr: snr=random.uniform(*snr_range)
110
+ """
111
+ clean_len, noise_len = clean.shape[0], noise.shape[0]
112
+ assert clean_len <= noise_len, f"clean_len must be less than noise_len."
113
+ noisy = noise.copy()
114
+ index = random.randint(0, noise_len - clean_len)
115
+ noise = noise[index:index + clean_len, :]
116
+ noisy_tmp, clean_tmp = snr_aug_changeClean(clean, noise, snr)
117
+ noisy[index:index + clean_len, :] = noisy_tmp
118
+ # 防止削波
119
+ if np.max(np.abs(noisy)) > 1:
120
+ scale_factor = 1 / np.max(np.abs(noisy))
121
+ noisy *= scale_factor
122
+ return noisy
123
+
124
+
125
+ def get_audio_segments(wav_len, audio_path_list, sr=16000):
126
+ """
127
+ 从音频列表中随机拼接指定长度音频
128
+ Args:
129
+ wav_len: 需要返回的音频长度
130
+ audio_path_list: 音频路径列表
131
+ sr: 采样率
132
+ Returns:返回指定长度的音频
133
+ """
134
+ audio_len = 0
135
+ wav_list = []
136
+ while audio_len < wav_len:
137
+ audio_path = random.choice(audio_path_list)
138
+ wav, wav_sr = sf.read(audio_path, always_2d=True, dtype='float32')
139
+ assert wav_sr == sr, f"音频采样率是{wav_sr}, 期望{sr}"
140
+ audio_len += len(wav)
141
+ wav_list.append(wav)
142
+ wav = np.concatenate(wav_list, axis=0)
143
+ if len(wav) > wav_len:
144
+ # 随机截取clean_len
145
+ start = random.randint(0, len(wav) - wav_len)
146
+ wav = wav[start:start + wav_len, :]
147
+ return wav
148
+
149
+
150
+ def volume_aug(wav, range, rate, method="linmax"):
151
+ """音量增强 """
152
+ if random.random() < rate:
153
+ target_level = random.uniform(range[0], range[1])
154
+ if method == "dbrms":
155
+ wav_rms = (wav ** 2).mean() ** 0.5
156
+ scalar = 10 ** (target_level / 20) / (np.max(wav_rms) + EPS)
157
+ elif method == "linmax":
158
+ ipt_max = np.max(np.abs(wav))
159
+ # wav/wav_max*target_level=target_level_wav
160
+ # 处理后音频的 最大值就是target_level
161
+ scalar = target_level / (ipt_max + EPS)
162
+ else:
163
+ raise ValueError("method must be 'dbrms' or 'linmax'")
164
+ wav *= scalar
165
+ return wav