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,268 @@
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
+ from neverlib.filter import HPFilter
13
+
14
+
15
+ def volume_norm(wav):
16
+ """
17
+ 音量归一化
18
+ :param wav: (T,)
19
+ :return: (T,)
20
+ """
21
+ wav = wav / (np.max(np.abs(wav)) + 1e-8)
22
+ return wav
23
+
24
+
25
+ def add_reverb(wav, rir, ratio=1, mode="same"):
26
+ """添加混响,
27
+ Args:
28
+ wav: [T, channel]
29
+ rir: [T, channel]
30
+ ratio: 0-1
31
+ mode: "same" for SE or "full" for kws
32
+ """
33
+ if random.random() < ratio:
34
+ wav = signal.fftconvolve(wav, rir, mode=mode) # (28671, 3)
35
+ # note: 建议过完添加混响后再进行归一化, 否则可能会出现溢出
36
+ # 防止削波
37
+ if np.max(np.abs(wav)) > 1:
38
+ scale_factor = 1 / np.max(np.abs(wav))
39
+ wav *= scale_factor
40
+ return wav
41
+
42
+
43
+ def snr_aug_changeNoise(clean, noise, target_snr, hp=False, sr=16000, order=4, cutoff=100):
44
+ """
45
+ 保持语音不变, 改变噪声的幅度
46
+ HP: 高通滤波, 如果你的数据工频干扰较高, 建议设置为True, 否则snr会不准
47
+ snr = 10 * log10(signal_power / k*noise_power)
48
+ """
49
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
50
+ clean_tmp, noise_tmp = clean.copy(), noise.copy()
51
+ if hp:
52
+ clean_tmp = HPFilter(clean_tmp, sr=sr, order=order, cutoff=cutoff)
53
+ noise_tmp = HPFilter(noise_tmp, sr=sr, order=order, cutoff=cutoff)
54
+ # 纯净语音功率, 噪声功率
55
+ clean_power, noise_power = np.mean(clean_tmp ** 2), np.mean(noise_tmp ** 2)
56
+ noise_scale = np.sqrt(clean_power / (noise_power * 10 ** (target_snr / 10) + EPS))
57
+ noisy = clean + noise_scale * noise
58
+ # 防止削波
59
+ if np.max(np.abs(noisy)) > 1:
60
+ scale_factor = 1 / np.max(np.abs(noisy))
61
+ noisy *= scale_factor
62
+ clean *= scale_factor
63
+ return noisy, clean
64
+
65
+
66
+ def snr_aug_changeClean(clean, noise, target_snr, clip_check=True, hp=False, sr=16000, order=4, cutoff=100):
67
+ """
68
+ 保持噪声不变,改变纯净语音的幅度以达到目标信噪比
69
+ snr = 10 * log10(k*signal_power/ noise_power)
70
+ """
71
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
72
+ clean_tmp, noise_tmp = clean.copy(), noise.copy()
73
+ if hp:
74
+ clean_tmp = HPFilter(clean_tmp, sr=sr, order=order, cutoff=cutoff)
75
+ noise_tmp = HPFilter(noise_tmp, sr=sr, order=order, cutoff=cutoff)
76
+ # 纯净语音功率, 噪声功率
77
+ clean_power, noise_power = np.mean(clean_tmp ** 2), np.mean(noise_tmp ** 2)
78
+ # 计算纯净信号需要的幅度因子
79
+ clean_scale = np.sqrt(noise_power * 10 ** (target_snr / 10) / (clean_power + EPS))
80
+ noisy = clean * clean_scale + noise
81
+ # 防止削波
82
+ if clip_check:
83
+ if np.max(np.abs(noisy)) > 1:
84
+ scale_factor = 1 / np.max(np.abs(noisy))
85
+ noisy *= scale_factor
86
+ clean *= (scale_factor * clean_scale)
87
+ return noisy, clean
88
+
89
+
90
+ def snr_diff_changeNoise(clean, noise, target_snr, hp=False, sr=16000, order=4, cutoff=100):
91
+ """
92
+ 保持语音不变, 改变噪声的幅度, 和snr_aug_changeNoise作用等效
93
+ snr = 10 * log10(signal_power / k*noise_power)
94
+ """
95
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
96
+ clean_tmp, noise_tmp = clean.copy(), noise.copy()
97
+ if hp:
98
+ clean_tmp = HPFilter(clean_tmp, sr=sr, order=order, cutoff=cutoff)
99
+ noise_tmp = HPFilter(noise_tmp, sr=sr, order=order, cutoff=cutoff)
100
+ # 纯净语音功率, 噪声功率
101
+ clean_power, noise_power = np.mean(clean_tmp ** 2), np.mean(noise_tmp ** 2)
102
+ source_snr = 10 * np.log10(clean_power / (noise_power + EPS) + EPS)
103
+ noise_dB = source_snr - target_snr # 噪声还差多少dB
104
+ noise_gain = 10 ** (noise_dB / 20)
105
+ noisy = clean + noise_gain * noise
106
+ # 防止削波
107
+ if np.max(np.abs(noisy)) > 1:
108
+ scale_factor = 1 / np.max(np.abs(noisy))
109
+ noisy *= scale_factor
110
+ clean *= scale_factor
111
+ return noisy, clean
112
+
113
+
114
+ def snr_diff_changeClean(clean, noise, target_snr, clip_check=True, hp=False, sr=16000, order=4, cutoff=100):
115
+ """
116
+ 保持噪声不变, 改变纯净语音的幅度, 和snr_aug_changeClean作用等效
117
+ snr = 10 * log10(signal_power / k*noise_power)
118
+ """
119
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
120
+ clean_tmp, noise_tmp = clean.copy(), noise.copy()
121
+ if hp:
122
+ clean_tmp = HPFilter(clean_tmp, sr=sr, order=order, cutoff=cutoff)
123
+ noise_tmp = HPFilter(noise_tmp, sr=sr, order=order, cutoff=cutoff)
124
+ # 纯净语音功率, 噪声功率
125
+ clean_power, noise_power = np.mean(clean_tmp ** 2), np.mean(noise_tmp ** 2)
126
+ source_snr = 10 * np.log10(clean_power / (noise_power + EPS) + EPS)
127
+ clean_dB = target_snr - source_snr # 纯净语音还差多少dB
128
+ clean_gain = 10 ** (clean_dB / 20)
129
+ noisy = clean_gain * clean + noise
130
+ # 防止削波
131
+ if clip_check:
132
+ if np.max(np.abs(noisy)) > 1:
133
+ scale_factor = 1 / np.max(np.abs(noisy))
134
+ noisy *= scale_factor
135
+ clean *= (scale_factor * clean_gain)
136
+ return noisy, clean
137
+
138
+
139
+ def snr_aug_Interpolation(clean, noise, target_snr, hp=False, sr=16000, order=4, cutoff=100):
140
+ """
141
+ 在已知clean_len<=noise_len的情况下
142
+ 将clean插入到noise中的snr aug方法
143
+ Args:
144
+ clean: 语音
145
+ noise: 噪声
146
+ snr: snr=random.uniform(*snr_range)
147
+ """
148
+ clean_len, noise_len = clean.shape[0], noise.shape[0]
149
+ assert clean_len <= noise_len, f"clean_len must be less than noise_len."
150
+ clean_tmp, noise_tmp = clean.copy(), noise.copy()
151
+ if hp:
152
+ clean_tmp = HPFilter(clean_tmp, sr=sr, order=order, cutoff=cutoff)
153
+ noise_tmp = HPFilter(noise_tmp, sr=sr, order=order, cutoff=cutoff)
154
+ noisy = noise.copy()
155
+ index = random.randint(0, noise_len - clean_len)
156
+ noise_tmp = noise_tmp[index:index + clean_len, :]
157
+ # 这里必须把clip_check设置为False, 否则外面的noise和里面的不一致
158
+ noisy_tmp, clean_tmp = snr_aug_changeClean(clean_tmp, noise_tmp, target_snr, clip_check=False, hp=False)
159
+ noisy[index:index + clean_len, :] = noisy_tmp
160
+ # 防止削波
161
+ if np.max(np.abs(noisy)) > 1:
162
+ scale_factor = 1 / np.max(np.abs(noisy))
163
+ noisy *= scale_factor
164
+ clean *= scale_factor
165
+ return noisy, np.pad(clean, ((index, noise_len - index - clean_len), (0, 0)))
166
+
167
+
168
+ def get_snr_use_vad(wav, vad, sr=16000):
169
+ # 通过vad获得语音原始的snr
170
+ wav = HPFilter(wav, sr=sr, order=6, cutoff=100)
171
+ vadstart, vadend = vad["start"], vad["end"]
172
+ noise = np.concatenate([wav[:vadstart], wav[vadend:]], axis=0)
173
+ speech_segment = wav[vadstart:vadend]
174
+
175
+ # 计算信噪比
176
+ # 统计语音段的均方功率谱
177
+ P_speech_noise = np.mean(speech_segment ** 2) # 语音+噪声功率
178
+ # P_speech_noise = np.mean(wav ** 2) # 如果用全局的, 会存在噪声功率过大的问题, 导致snr过低
179
+ P_noise = np.mean(noise ** 2) # 纯噪声功率
180
+
181
+ # 计算净语音功率(确保非负)
182
+ P_speech = max(P_speech_noise - P_noise, 1e-8)
183
+ if P_noise < 1e-8:
184
+ P_noise = 1e-8
185
+
186
+ snr = 10 * np.log10(P_speech / P_noise) # 计算 SNR
187
+ # snr保留小数点后一位
188
+ return round(snr, 1)
189
+
190
+
191
+ def snr_aug_vad_Interpolation(clean, noise, target_snr, vad, hp=False, sr=16000, order=4, cutoff=100):
192
+ """
193
+ 在已知clean_len<=noise_len的情况下, 将clean插入到noise中的snr aug方法,
194
+ 使用VAD信息, 精确地找到语音位置
195
+ Args:
196
+ clean: 语音
197
+ noise: 噪声
198
+ vad: {"start": xxx, "end": xxx}
199
+ """
200
+ clean_len, noise_len = clean.shape[0], noise.shape[0]
201
+ assert clean_len <= noise_len, f"clean_len must be less than noise_len."
202
+ clean_tmp, noise_tmp = clean.copy(), noise.copy()
203
+ noisy = noise.copy()
204
+ index = random.randint(0, noise_len - clean_len)
205
+ noise = noise[index:index + clean_len, :] # 现在语音和噪声长度一致
206
+ if hp:
207
+ clean_tmp = HPFilter(clean_tmp, sr=sr, order=order, cutoff=cutoff)
208
+ noise_tmp = HPFilter(noise_tmp, sr=sr, order=order, cutoff=cutoff)
209
+ # 只根据语音段求SNR
210
+ clean_vad = clean_tmp[vad["start"]:vad["end"]]
211
+ noise_tmp = noise_tmp[vad["start"]:vad["end"]]
212
+ power_clean, power_noise = np.mean(clean_vad ** 2), np.mean(noise_tmp ** 2)
213
+ snr_in = 10 * np.log10(power_clean / (power_noise + EPS) + EPS)
214
+ clean_dB = target_snr - snr_in # 语音还差多少dB
215
+ # noise_dB = snr_in - target_snr # 噪声还差多少dB
216
+ clean_gain = 10 ** (clean_dB / 20)
217
+ noisy_tmp = clean_gain * clean + noise
218
+
219
+ noisy[index:index + clean_len, :] = noisy_tmp
220
+ # 防止削波
221
+ if np.max(np.abs(noisy)) > 1:
222
+ scale_factor = 1 / np.max(np.abs(noisy))
223
+ noisy *= scale_factor
224
+ clean *= (scale_factor * clean_gain)
225
+ return noisy, np.pad(clean, ((index, noise_len - index - clean_len), (0, 0)))
226
+
227
+
228
+ def get_audio_segments(wav_len, audio_path_list, sr=16000):
229
+ """
230
+ 从音频列表中随机拼接指定长度音频
231
+ Args:
232
+ wav_len: 需要返回的音频长度
233
+ audio_path_list: 音频路径列表
234
+ sr: 采样率
235
+ Returns:返回指定长度的音频
236
+ """
237
+ audio_len = 0
238
+ wav_list = []
239
+ while audio_len < wav_len:
240
+ audio_path = random.choice(audio_path_list)
241
+ wav, wav_sr = sf.read(audio_path, always_2d=True, dtype='float32')
242
+ assert wav_sr == sr, f"音频采样率是{wav_sr}, 期望{sr}"
243
+ audio_len += len(wav)
244
+ wav_list.append(wav)
245
+ wav = np.concatenate(wav_list, axis=0)
246
+ if len(wav) > wav_len:
247
+ # 随机截取clean_len
248
+ start = random.randint(0, len(wav) - wav_len)
249
+ wav = wav[start:start + wav_len, :]
250
+ return wav
251
+
252
+
253
+ def volume_aug(wav, range, rate, method="linmax"):
254
+ """音量增强 """
255
+ if random.random() < rate:
256
+ target_level = random.uniform(range[0], range[1])
257
+ if method == "dbrms":
258
+ wav_rms = (wav ** 2).mean() ** 0.5
259
+ scalar = 10 ** (target_level / 20) / (np.max(wav_rms) + EPS)
260
+ elif method == "linmax":
261
+ ipt_max = np.max(np.abs(wav))
262
+ # wav/wav_max*target_level=target_level_wav
263
+ # 处理后音频的 最大值就是target_level
264
+ scalar = target_level / (ipt_max + EPS)
265
+ else:
266
+ raise ValueError("method must be 'dbrms' or 'linmax'")
267
+ wav *= scalar
268
+ return wav
@@ -0,0 +1,283 @@
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
+ from neverlib.filter import HPFilter
13
+
14
+ def limiter(wav, threshold=0.999):
15
+ """
16
+ 简单限幅器, threshold=0.999 ~ -0.1dBFS
17
+ 超过阈值的样本被压缩到阈值限制
18
+ """
19
+ peak = np.max(np.abs(wav))
20
+ if peak > threshold:
21
+ scalar = threshold / (wav + EPS)
22
+ wav = wav * scalar
23
+ return wav
24
+
25
+
26
+
27
+
28
+ def add_reverb(wav, rir, ratio=1, mode="same"):
29
+ """添加混响,
30
+ Args:
31
+ wav: [T, channel]
32
+ rir: [T, channel]
33
+ ratio: 0-1
34
+ mode: "same" for SE or "full" for kws
35
+ """
36
+ if random.random() < ratio:
37
+ wav = signal.fftconvolve(wav, rir, mode=mode) # (28671, 3)
38
+ # note: 建议过完添加混响后再进行归一化, 否则可能会出现溢出
39
+ # 防止削波
40
+ if np.max(np.abs(wav)) > 1:
41
+ scale_factor = 1 / np.max(np.abs(wav))
42
+ wav *= scale_factor
43
+ return wav
44
+
45
+
46
+ def snr_aug_changeNoise(clean, noise, target_snr, hp=False, sr=16000, order=4, cutoff=100):
47
+ """
48
+ 保持语音不变, 改变噪声的幅度
49
+ HP: 高通滤波, 如果你的数据工频干扰较高, 建议设置为True, 否则snr会不准
50
+ snr = 10 * log10(signal_power / k*noise_power)
51
+ """
52
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
53
+ clean_tmp, noise_tmp = clean.copy(), noise.copy()
54
+ if hp:
55
+ clean_tmp = HPFilter(clean_tmp, sr=sr, order=order, cutoff=cutoff)
56
+ noise_tmp = HPFilter(noise_tmp, sr=sr, order=order, cutoff=cutoff)
57
+ # 纯净语音功率, 噪声功率
58
+ clean_power, noise_power = np.mean(clean_tmp ** 2), np.mean(noise_tmp ** 2)
59
+ noise_scale = np.sqrt(clean_power / (noise_power * 10 ** (target_snr / 10) + EPS))
60
+ noisy = clean + noise_scale * noise
61
+ # 防止削波
62
+ if np.max(np.abs(noisy)) > 1:
63
+ scale_factor = 1 / np.max(np.abs(noisy))
64
+ noisy *= scale_factor
65
+ clean *= scale_factor
66
+ return noisy, clean
67
+
68
+
69
+ def snr_aug_changeClean(clean, noise, target_snr, clip_check=True, hp=False, sr=16000, order=4, cutoff=100):
70
+ """
71
+ 保持噪声不变,改变纯净语音的幅度以达到目标信噪比
72
+ snr = 10 * log10(k*signal_power/ noise_power)
73
+ """
74
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
75
+ clean_tmp, noise_tmp = clean.copy(), noise.copy()
76
+ if hp:
77
+ clean_tmp = HPFilter(clean_tmp, sr=sr, order=order, cutoff=cutoff)
78
+ noise_tmp = HPFilter(noise_tmp, sr=sr, order=order, cutoff=cutoff)
79
+ # 纯净语音功率, 噪声功率
80
+ clean_power, noise_power = np.mean(clean_tmp ** 2), np.mean(noise_tmp ** 2)
81
+ # 计算纯净信号需要的幅度因子
82
+ clean_scale = np.sqrt(noise_power * 10 ** (target_snr / 10) / (clean_power + EPS))
83
+ noisy = clean * clean_scale + noise
84
+ # 防止削波
85
+ if clip_check:
86
+ if np.max(np.abs(noisy)) > 1:
87
+ scale_factor = 1 / np.max(np.abs(noisy))
88
+ noisy *= scale_factor
89
+ clean *= (scale_factor * clean_scale)
90
+ return noisy, clean
91
+
92
+
93
+ def snr_diff_changeNoise(clean, noise, target_snr, hp=False, sr=16000, order=4, cutoff=100):
94
+ """
95
+ 保持语音不变, 改变噪声的幅度, 和snr_aug_changeNoise作用等效
96
+ snr = 10 * log10(signal_power / k*noise_power)
97
+ """
98
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
99
+ clean_tmp, noise_tmp = clean.copy(), noise.copy()
100
+ if hp:
101
+ clean_tmp = HPFilter(clean_tmp, sr=sr, order=order, cutoff=cutoff)
102
+ noise_tmp = HPFilter(noise_tmp, sr=sr, order=order, cutoff=cutoff)
103
+ # 纯净语音功率, 噪声功率
104
+ clean_power, noise_power = np.mean(clean_tmp ** 2), np.mean(noise_tmp ** 2)
105
+ source_snr = 10 * np.log10(clean_power / (noise_power + EPS) + EPS)
106
+ noise_dB = source_snr - target_snr # 噪声还差多少dB
107
+ noise_gain = 10 ** (noise_dB / 20)
108
+ noisy = clean + noise_gain * noise
109
+ # 防止削波
110
+ if np.max(np.abs(noisy)) > 1:
111
+ scale_factor = 1 / np.max(np.abs(noisy))
112
+ noisy *= scale_factor
113
+ clean *= scale_factor
114
+ return noisy, clean
115
+
116
+
117
+ def snr_diff_changeClean(clean, noise, target_snr, clip_check=True, hp=False, sr=16000, order=4, cutoff=100):
118
+ """
119
+ 保持噪声不变, 改变纯净语音的幅度, 和snr_aug_changeClean作用等效
120
+ snr = 10 * log10(signal_power / k*noise_power)
121
+ """
122
+ assert clean.shape == noise.shape, "clean and noise must have the same shape"
123
+ clean_tmp, noise_tmp = clean.copy(), noise.copy()
124
+ if hp:
125
+ clean_tmp = HPFilter(clean_tmp, sr=sr, order=order, cutoff=cutoff)
126
+ noise_tmp = HPFilter(noise_tmp, sr=sr, order=order, cutoff=cutoff)
127
+ # 纯净语音功率, 噪声功率
128
+ clean_power, noise_power = np.mean(clean_tmp ** 2), np.mean(noise_tmp ** 2)
129
+ source_snr = 10 * np.log10(clean_power / (noise_power + EPS) + EPS)
130
+ clean_dB = target_snr - source_snr # 纯净语音还差多少dB
131
+ clean_gain = 10 ** (clean_dB / 20)
132
+ noisy = clean_gain * clean + noise
133
+ # 防止削波
134
+ if clip_check:
135
+ if np.max(np.abs(noisy)) > 1:
136
+ scale_factor = 1 / np.max(np.abs(noisy))
137
+ noisy *= scale_factor
138
+ clean *= (scale_factor * clean_gain)
139
+ return noisy, clean
140
+
141
+
142
+ def snr_aug_Interpolation(clean, noise, target_snr, hp=False, sr=16000, order=4, cutoff=100):
143
+ """
144
+ 在已知clean_len<=noise_len的情况下
145
+ 将clean插入到noise中的snr aug方法
146
+ Args:
147
+ clean: 语音
148
+ noise: 噪声
149
+ snr: snr=random.uniform(*snr_range)
150
+ """
151
+ clean_len, noise_len = clean.shape[0], noise.shape[0]
152
+ assert clean_len <= noise_len, f"clean_len must be less than noise_len."
153
+ clean_tmp, noise_tmp = clean.copy(), noise.copy()
154
+ if hp:
155
+ clean_tmp = HPFilter(clean_tmp, sr=sr, order=order, cutoff=cutoff)
156
+ noise_tmp = HPFilter(noise_tmp, sr=sr, order=order, cutoff=cutoff)
157
+ noisy = noise.copy()
158
+ index = random.randint(0, noise_len - clean_len)
159
+ noise_tmp = noise_tmp[index:index + clean_len, :]
160
+ # 这里必须把clip_check设置为False, 否则外面的noise和里面的不一致
161
+ noisy_tmp, clean_tmp = snr_aug_changeClean(clean_tmp, noise_tmp, target_snr, clip_check=False, hp=False)
162
+ noisy[index:index + clean_len, :] = noisy_tmp
163
+ # 防止削波
164
+ if np.max(np.abs(noisy)) > 1:
165
+ scale_factor = 1 / np.max(np.abs(noisy))
166
+ noisy *= scale_factor
167
+ clean *= scale_factor
168
+ return noisy, np.pad(clean, ((index, noise_len - index - clean_len), (0, 0)))
169
+
170
+
171
+ def get_snr_use_vad(wav, vad, sr=16000):
172
+ # 通过vad获得语音原始的snr
173
+ wav = HPFilter(wav, sr=sr, order=6, cutoff=100)
174
+ vadstart, vadend = vad["start"], vad["end"]
175
+ noise = np.concatenate([wav[:vadstart], wav[vadend:]], axis=0)
176
+ speech_segment = wav[vadstart:vadend]
177
+
178
+ # 计算信噪比
179
+ # 统计语音段的均方功率谱
180
+ P_speech_noise = np.mean(speech_segment ** 2) # 语音+噪声功率
181
+ # P_speech_noise = np.mean(wav ** 2) # 如果用全局的, 会存在噪声功率过大的问题, 导致snr过低
182
+ P_noise = np.mean(noise ** 2) # 纯噪声功率
183
+
184
+ # 计算净语音功率(确保非负)
185
+ P_speech = max(P_speech_noise - P_noise, 1e-8)
186
+ if P_noise < 1e-8:
187
+ P_noise = 1e-8
188
+
189
+ snr = 10 * np.log10(P_speech / P_noise) # 计算 SNR
190
+ # snr保留小数点后一位
191
+ return round(snr, 1)
192
+
193
+
194
+ def snr_aug_vad_Interpolation(clean, noise, target_snr, vad, hp=False, sr=16000, order=4, cutoff=100):
195
+ """
196
+ 在已知clean_len<=noise_len的情况下, 将clean插入到noise中的snr aug方法,
197
+ 使用VAD信息, 精确地找到语音位置
198
+ Args:
199
+ clean: 语音
200
+ noise: 噪声
201
+ vad: {"start": xxx, "end": xxx}
202
+ """
203
+ clean_len, noise_len = clean.shape[0], noise.shape[0]
204
+ assert clean_len <= noise_len, f"clean_len must be less than noise_len."
205
+ clean_tmp, noise_tmp = clean.copy(), noise.copy()
206
+ noisy = noise.copy()
207
+ index = random.randint(0, noise_len - clean_len)
208
+ noise = noise[index:index + clean_len, :] # 现在语音和噪声长度一致
209
+ if hp:
210
+ clean_tmp = HPFilter(clean_tmp, sr=sr, order=order, cutoff=cutoff)
211
+ noise_tmp = HPFilter(noise_tmp, sr=sr, order=order, cutoff=cutoff)
212
+ # 只根据语音段求SNR
213
+ clean_vad = clean_tmp[vad["start"]:vad["end"]]
214
+ noise_tmp = noise_tmp[vad["start"]:vad["end"]]
215
+ power_clean, power_noise = np.mean(clean_vad ** 2), np.mean(noise_tmp ** 2)
216
+ snr_in = 10 * np.log10(power_clean / (power_noise + EPS) + EPS)
217
+ clean_dB = target_snr - snr_in # 语音还差多少dB
218
+ # noise_dB = snr_in - target_snr # 噪声还差多少dB
219
+ clean_gain = 10 ** (clean_dB / 20)
220
+ noisy_tmp = clean_gain * clean + noise
221
+
222
+ noisy[index:index + clean_len, :] = noisy_tmp
223
+ # 防止削波
224
+ if np.max(np.abs(noisy)) > 1:
225
+ scale_factor = 1 / np.max(np.abs(noisy))
226
+ noisy *= scale_factor
227
+ clean *= (scale_factor * clean_gain)
228
+ return noisy, np.pad(clean, ((index, noise_len - index - clean_len), (0, 0)))
229
+
230
+
231
+ def get_audio_segments(wav_len, audio_path_list, sr=16000):
232
+ """
233
+ 从音频列表中随机拼接指定长度音频
234
+ Args:
235
+ wav_len: 需要返回的音频长度
236
+ audio_path_list: 音频路径列表
237
+ sr: 采样率
238
+ Returns:返回指定长度的音频
239
+ """
240
+ audio_len = 0
241
+ wav_list = []
242
+ while audio_len < wav_len:
243
+ audio_path = random.choice(audio_path_list)
244
+ wav, wav_sr = sf.read(audio_path, always_2d=True, dtype='float32')
245
+ assert wav_sr == sr, f"音频采样率是{wav_sr}, 期望{sr}"
246
+ audio_len += len(wav)
247
+ wav_list.append(wav)
248
+ wav = np.concatenate(wav_list, axis=0)
249
+ if len(wav) > wav_len:
250
+ # 随机截取clean_len
251
+ start = random.randint(0, len(wav) - wav_len)
252
+ wav = wav[start:start + wav_len, :]
253
+ return wav
254
+
255
+
256
+ # ----------------------------------------------------------------
257
+ # 音量增强
258
+ # ----------------------------------------------------------------
259
+ def volume_norm(wav):
260
+ """
261
+ 音量归一化
262
+ :param wav: (T,)
263
+ :return: (T,)
264
+ """
265
+ wav = wav / (np.max(np.abs(wav)) + 1e-8)
266
+ return wav
267
+
268
+ def volume_aug(wav, range, rate, method="linmax"):
269
+ """音量增强 """
270
+ if random.random() < rate:
271
+ target_level = random.uniform(range[0], range[1])
272
+ if method == "dbrms":
273
+ wav_rms = (wav ** 2).mean() ** 0.5
274
+ scalar = 10 ** (target_level / 20) / (np.max(wav_rms) + EPS)
275
+ elif method == "linmax":
276
+ ipt_max = np.max(np.abs(wav))
277
+ # wav/wav_max*target_level=target_level_wav
278
+ # 处理后音频的 最大值就是target_level
279
+ scalar = target_level / (ipt_max + EPS)
280
+ else:
281
+ raise ValueError("method must be 'dbrms' or 'linmax'")
282
+ wav *= scalar
283
+ return wav