neverlib 0.2.7__py3-none-any.whl → 0.2.9__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 (430) hide show
  1. neverlib/QA/ImpactNoiseRejection.py +119 -0
  2. neverlib/QA/gen_init.py +107 -6
  3. neverlib/QA/impact_noise_rejection.png +0 -0
  4. neverlib/QA/out.pcm +0 -0
  5. neverlib/QA/out.wav +0 -0
  6. neverlib/__init__.py +19 -0
  7. neverlib/audio_aug/README.md +3 -0
  8. neverlib/audio_aug/__init__.py +2 -4
  9. neverlib/filter/core.py +8 -5
  10. neverlib/metrics/README.md +35 -0
  11. neverlib/metrics/__init__.py +1 -1
  12. neverlib/metrics/pesq_c/PESQ +0 -0
  13. neverlib/signal_gen/babble_noise_generate.py +113 -0
  14. neverlib/tests/__init__.py +16 -1
  15. neverlib/tests/test_imports.py +2 -0
  16. neverlib/utils/README.md +29 -0
  17. neverlib/utils/__init__.py +7 -6
  18. neverlib/utils/audio_split.py +21 -20
  19. neverlib/utils/checkGPU.py +52 -79
  20. neverlib/utils/floder.py +115 -0
  21. neverlib/utils/pcm.py +42 -0
  22. neverlib/utils/utils.py +3 -77
  23. neverlib/vad/PreProcess.py +66 -66
  24. {neverlib-0.2.7.dist-info → neverlib-0.2.9.dist-info}/METADATA +15 -1
  25. neverlib-0.2.9.dist-info/RECORD +119 -0
  26. neverlib/.claude/settings.local.json +0 -9
  27. neverlib/.history/Docs/audio_aug/del_20250827162530.py +0 -0
  28. neverlib/.history/Docs/audio_aug/del_20250827162540.py +0 -2
  29. neverlib/.history/Docs/audio_aug/del_20250827162541.py +0 -7
  30. neverlib/.history/Docs/audio_aug/del_20250827162606.py +0 -7
  31. neverlib/.history/Docs/audio_aug/del_20250827162637.py +0 -8
  32. neverlib/.history/Docs/audio_aug/del_20250827162645.py +0 -8
  33. neverlib/.history/Docs/audio_aug/del_20250827162723.py +0 -9
  34. neverlib/.history/Docs/audio_aug/del_20250827162739.py +0 -9
  35. neverlib/.history/Docs/audio_aug/test_snr_20250806011311.py +0 -0
  36. neverlib/.history/Docs/audio_aug/test_snr_20250806011331.py +0 -75
  37. neverlib/.history/Docs/audio_aug/test_snr_20250806011342.py +0 -57
  38. neverlib/.history/Docs/audio_aug/test_snr_20250806011352.py +0 -57
  39. neverlib/.history/Docs/audio_aug/test_snr_20250806011403.py +0 -57
  40. neverlib/.history/Docs/audio_aug/test_snr_20250806011413.py +0 -57
  41. neverlib/.history/Docs/audio_aug/test_snr_20250806011435.py +0 -55
  42. neverlib/.history/Docs/audio_aug/test_snr_20250827161751.py +0 -55
  43. neverlib/.history/Docs/audio_aug/test_snr_20250827161754.py +0 -55
  44. neverlib/.history/Docs/audio_aug/test_snr_20250827161833.py +0 -54
  45. neverlib/.history/Docs/audio_aug/test_snr_20250827162017.py +0 -56
  46. neverlib/.history/Docs/audio_aug/test_snr_20250827162021.py +0 -57
  47. neverlib/.history/Docs/audio_aug/test_snr_20250827162028.py +0 -57
  48. neverlib/.history/Docs/audio_aug/test_snr_20250827162033.py +0 -55
  49. neverlib/.history/Docs/audio_aug_test/del_20250827162738.py +0 -9
  50. neverlib/.history/Docs/audio_aug_test/del_20250827162819.py +0 -9
  51. neverlib/.history/Docs/audio_aug_test/del_20250827162830.py +0 -9
  52. neverlib/.history/Docs/audio_aug_test/del_20250827162846.py +0 -9
  53. neverlib/.history/Docs/audio_aug_test/del_20250827162851.py +0 -9
  54. neverlib/.history/Docs/audio_aug_test/del_20250827162903.py +0 -10
  55. neverlib/.history/Docs/audio_aug_test/del_20250827162921.py +0 -10
  56. neverlib/.history/Docs/audio_aug_test/del_20250827162926.py +0 -10
  57. neverlib/.history/Docs/audio_aug_test/del_20250827163030.py +0 -10
  58. neverlib/.history/Docs/audio_aug_test/del_20250827163032.py +0 -10
  59. neverlib/.history/Docs/vad/1_20250810032405.py +0 -0
  60. neverlib/.history/Docs/vad/1_20250810032417.py +0 -39
  61. neverlib/.history/QA/html2markdown_20250822234112.md +0 -0
  62. neverlib/.history/QA/html2markdown_20250822234140.py +0 -9
  63. neverlib/.history/QA/html2markdown_20250822234141.md +0 -9
  64. neverlib/.history/QA/html2markdown_20250822234159.py +0 -12
  65. neverlib/.history/QA/html2markdown_20250822234200.py +0 -17
  66. neverlib/.history/QA/html2markdown_20250822234236.py +0 -17
  67. neverlib/.history/QA/html2markdown_20250822234340.py +0 -14
  68. neverlib/.history/QA/html2markdown_20250822234522.py +0 -18
  69. neverlib/.history/QA/html2markdown_20250822234601.py +0 -20
  70. neverlib/.history/QA/html2markdown_20250822234615.py +0 -22
  71. neverlib/.history/QA/html2markdown_20250822234715.py +0 -28
  72. neverlib/.history/QA/html2markdown_20250822234720.py +0 -27
  73. neverlib/.history/QA/html2markdown_20250822234903.py +0 -27
  74. neverlib/.history/__init___20250805234212.py +0 -41
  75. neverlib/.history/__init___20250904102635.py +0 -39
  76. neverlib/.history/__init___20250904102836.py +0 -34
  77. neverlib/.history/__init___20250904102838.py +0 -39
  78. neverlib/.history/__init___20250904102851.py +0 -33
  79. neverlib/.history/audio_aug/audio_aug_20250806010451.py +0 -125
  80. neverlib/.history/audio_aug/audio_aug_20250806010750.py +0 -138
  81. neverlib/.history/audio_aug/audio_aug_20250806010759.py +0 -140
  82. neverlib/.history/audio_aug/audio_aug_20250806010803.py +0 -140
  83. neverlib/.history/audio_aug/audio_aug_20250806010809.py +0 -140
  84. neverlib/.history/audio_aug/audio_aug_20250806011108.py +0 -140
  85. neverlib/.history/audio_aug/audio_aug_20250826155913.py +0 -158
  86. neverlib/.history/audio_aug/audio_aug_20250826164159.py +0 -159
  87. neverlib/.history/audio_aug/audio_aug_20250826164217.py +0 -160
  88. neverlib/.history/audio_aug/audio_aug_20250826164408.py +0 -161
  89. neverlib/.history/audio_aug/audio_aug_20250826164423.py +0 -161
  90. neverlib/.history/audio_aug/audio_aug_20250826164529.py +0 -161
  91. neverlib/.history/audio_aug/audio_aug_20250826164824.py +0 -161
  92. neverlib/.history/audio_aug/audio_aug_20250826164932.py +0 -162
  93. neverlib/.history/audio_aug/audio_aug_20250826164947.py +0 -162
  94. neverlib/.history/audio_aug/audio_aug_20250826165403.py +0 -162
  95. neverlib/.history/audio_aug/audio_aug_20250826165421.py +0 -162
  96. neverlib/.history/audio_aug/audio_aug_20250826165509.py +0 -163
  97. neverlib/.history/audio_aug/audio_aug_20250826165702.py +0 -163
  98. neverlib/.history/audio_aug/audio_aug_20250826165732.py +0 -165
  99. neverlib/.history/audio_aug/audio_aug_20250826170041.py +0 -163
  100. neverlib/.history/audio_aug/audio_aug_20250826170105.py +0 -164
  101. neverlib/.history/audio_aug/audio_aug_20250826170154.py +0 -164
  102. neverlib/.history/audio_aug/audio_aug_20250826170220.py +0 -165
  103. neverlib/.history/audio_aug/audio_aug_20250826170221.py +0 -165
  104. neverlib/.history/audio_aug/audio_aug_20250826170228.py +0 -165
  105. neverlib/.history/audio_aug/audio_aug_20250826170231.py +0 -165
  106. neverlib/.history/audio_aug/audio_aug_20250826212001.py +0 -165
  107. neverlib/.history/audio_aug/audio_aug_20250826220038.py +0 -165
  108. neverlib/.history/audio_aug/audio_aug_20250826220133.py +0 -165
  109. neverlib/.history/audio_aug/audio_aug_20250826220148.py +0 -165
  110. neverlib/.history/audio_aug/audio_aug_20250826220154.py +0 -165
  111. neverlib/.history/audio_aug/audio_aug_20250826220156.py +0 -165
  112. neverlib/.history/audio_aug/audio_aug_20250826220314.py +0 -165
  113. neverlib/.history/audio_aug/audio_aug_20250826220343.py +0 -184
  114. neverlib/.history/audio_aug/audio_aug_20250826220345.py +0 -184
  115. neverlib/.history/audio_aug/audio_aug_20250826220349.py +0 -184
  116. neverlib/.history/audio_aug/audio_aug_20250826220429.py +0 -184
  117. neverlib/.history/audio_aug/audio_aug_20250826220447.py +0 -184
  118. neverlib/.history/audio_aug/audio_aug_20250826220601.py +0 -186
  119. neverlib/.history/audio_aug/audio_aug_20250826220638.py +0 -186
  120. neverlib/.history/audio_aug/audio_aug_20250826220641.py +0 -186
  121. neverlib/.history/audio_aug/audio_aug_20250826220647.py +0 -186
  122. neverlib/.history/audio_aug/audio_aug_20250826220653.py +0 -186
  123. neverlib/.history/audio_aug/audio_aug_20250826220655.py +0 -186
  124. neverlib/.history/audio_aug/audio_aug_20250826220731.py +0 -185
  125. neverlib/.history/audio_aug/audio_aug_20250826220739.py +0 -185
  126. neverlib/.history/audio_aug/audio_aug_20250826220747.py +0 -185
  127. neverlib/.history/audio_aug/audio_aug_20250826220801.py +0 -186
  128. neverlib/.history/audio_aug/audio_aug_20250826220822.py +0 -186
  129. neverlib/.history/audio_aug/audio_aug_20250826220901.py +0 -186
  130. neverlib/.history/audio_aug/audio_aug_20250826221107.py +0 -187
  131. neverlib/.history/audio_aug/audio_aug_20250826221310.py +0 -188
  132. neverlib/.history/audio_aug/audio_aug_20250826221353.py +0 -191
  133. neverlib/.history/audio_aug/audio_aug_20250826221821.py +0 -191
  134. neverlib/.history/audio_aug/audio_aug_20250826221838.py +0 -191
  135. neverlib/.history/audio_aug/audio_aug_20250826221906.py +0 -191
  136. neverlib/.history/audio_aug/audio_aug_20250826221930.py +0 -191
  137. neverlib/.history/audio_aug/audio_aug_20250826221939.py +0 -191
  138. neverlib/.history/audio_aug/audio_aug_20250826221955.py +0 -191
  139. neverlib/.history/audio_aug/audio_aug_20250826222008.py +0 -197
  140. neverlib/.history/audio_aug/audio_aug_20250826222017.py +0 -200
  141. neverlib/.history/audio_aug/audio_aug_20250826222046.py +0 -203
  142. neverlib/.history/audio_aug/audio_aug_20250826222105.py +0 -203
  143. neverlib/.history/audio_aug/audio_aug_20250826222206.py +0 -203
  144. neverlib/.history/audio_aug/audio_aug_20250826222302.py +0 -203
  145. neverlib/.history/audio_aug/audio_aug_20250826222336.py +0 -203
  146. neverlib/.history/audio_aug/audio_aug_20250826222455.py +0 -204
  147. neverlib/.history/audio_aug/audio_aug_20250826222526.py +0 -204
  148. neverlib/.history/audio_aug/audio_aug_20250826222541.py +0 -204
  149. neverlib/.history/audio_aug/audio_aug_20250826222624.py +0 -202
  150. neverlib/.history/audio_aug/audio_aug_20250826222714.py +0 -205
  151. neverlib/.history/audio_aug/audio_aug_20250826222820.py +0 -205
  152. neverlib/.history/audio_aug/audio_aug_20250826222827.py +0 -205
  153. neverlib/.history/audio_aug/audio_aug_20250826222927.py +0 -232
  154. neverlib/.history/audio_aug/audio_aug_20250826223009.py +0 -232
  155. neverlib/.history/audio_aug/audio_aug_20250826223054.py +0 -232
  156. neverlib/.history/audio_aug/audio_aug_20250826223225.py +0 -233
  157. neverlib/.history/audio_aug/audio_aug_20250826223344.py +0 -236
  158. neverlib/.history/audio_aug/audio_aug_20250826223356.py +0 -236
  159. neverlib/.history/audio_aug/audio_aug_20250826223955.py +0 -242
  160. neverlib/.history/audio_aug/audio_aug_20250826224210.py +0 -240
  161. neverlib/.history/audio_aug/audio_aug_20250826224250.py +0 -242
  162. neverlib/.history/audio_aug/audio_aug_20250826224323.py +0 -280
  163. neverlib/.history/audio_aug/audio_aug_20250826224452.py +0 -263
  164. neverlib/.history/audio_aug/audio_aug_20250826224455.py +0 -263
  165. neverlib/.history/audio_aug/audio_aug_20250826224502.py +0 -263
  166. neverlib/.history/audio_aug/audio_aug_20250826224528.py +0 -263
  167. neverlib/.history/audio_aug/audio_aug_20250826224658.py +0 -263
  168. neverlib/.history/audio_aug/audio_aug_20250826224833.py +0 -264
  169. neverlib/.history/audio_aug/audio_aug_20250826225013.py +0 -269
  170. neverlib/.history/audio_aug/audio_aug_20250826225050.py +0 -269
  171. neverlib/.history/audio_aug/audio_aug_20250826225241.py +0 -268
  172. neverlib/.history/audio_aug/audio_aug_20250826225315.py +0 -266
  173. neverlib/.history/audio_aug/audio_aug_20250826225404.py +0 -266
  174. neverlib/.history/audio_aug/audio_aug_20250826225502.py +0 -265
  175. neverlib/.history/audio_aug/audio_aug_20250826225950.py +0 -267
  176. neverlib/.history/audio_aug/audio_aug_20250826225959.py +0 -268
  177. neverlib/.history/audio_aug/audio_aug_20250826230222.py +0 -271
  178. neverlib/.history/audio_aug/audio_aug_20250826230248.py +0 -270
  179. neverlib/.history/audio_aug/audio_aug_20250826230638.py +0 -266
  180. neverlib/.history/audio_aug/audio_aug_20250826230755.py +0 -266
  181. neverlib/.history/audio_aug/audio_aug_20250826230941.py +0 -265
  182. neverlib/.history/audio_aug/audio_aug_20250826231054.py +0 -266
  183. neverlib/.history/audio_aug/audio_aug_20250826231117.py +0 -266
  184. neverlib/.history/audio_aug/audio_aug_20250826231219.py +0 -266
  185. neverlib/.history/audio_aug/audio_aug_20250826232330.py +0 -266
  186. neverlib/.history/audio_aug/audio_aug_20250826232352.py +0 -266
  187. neverlib/.history/audio_aug/audio_aug_20250827152748.py +0 -268
  188. neverlib/.history/audio_aug/audio_aug_20250827152806.py +0 -268
  189. neverlib/.history/audio_aug/audio_aug_20250827152808.py +0 -268
  190. neverlib/.history/audio_aug/audio_aug_20250827152917.py +0 -283
  191. neverlib/.history/audio_aug/audio_aug_20250827152929.py +0 -281
  192. neverlib/.history/audio_aug/audio_aug_20250827153100.py +0 -286
  193. neverlib/.history/audio_aug/audio_aug_20250827153102.py +0 -286
  194. neverlib/.history/audio_aug/audio_aug_20250827153301.py +0 -295
  195. neverlib/.history/audio_aug/audio_aug_20250827153331.py +0 -298
  196. neverlib/.history/audio_aug/audio_aug_20250827153525.py +0 -303
  197. neverlib/.history/audio_aug/audio_aug_20250827153533.py +0 -304
  198. neverlib/.history/audio_aug/audio_aug_20250827153541.py +0 -321
  199. neverlib/.history/audio_aug/audio_aug_20250827153805.py +0 -322
  200. neverlib/.history/audio_aug/audio_aug_20250827153832.py +0 -323
  201. neverlib/.history/audio_aug/audio_aug_20250827153836.py +0 -324
  202. neverlib/.history/audio_aug/audio_aug_20250827153846.py +0 -324
  203. neverlib/.history/audio_aug/audio_aug_20250827153859.py +0 -325
  204. neverlib/.history/audio_aug/audio_aug_20250827154453.py +0 -337
  205. neverlib/.history/audio_aug/audio_aug_20250827154513.py +0 -355
  206. neverlib/.history/audio_aug/audio_aug_20250827154538.py +0 -356
  207. neverlib/.history/audio_aug/audio_aug_20250827154541.py +0 -357
  208. neverlib/.history/audio_aug/audio_aug_20250827154612.py +0 -357
  209. neverlib/.history/audio_aug/audio_aug_20250827154657.py +0 -360
  210. neverlib/.history/audio_aug/audio_aug_20250827154708.py +0 -360
  211. neverlib/.history/audio_aug/audio_aug_20250827154728.py +0 -366
  212. neverlib/.history/audio_aug/audio_aug_20250827154755.py +0 -367
  213. neverlib/.history/audio_aug/audio_aug_20250827154800.py +0 -367
  214. neverlib/.history/audio_aug/audio_aug_20250827154917.py +0 -368
  215. neverlib/.history/audio_aug/audio_aug_20250827154928.py +0 -369
  216. neverlib/.history/audio_aug/audio_aug_20250827154932.py +0 -370
  217. neverlib/.history/audio_aug/audio_aug_20250827154947.py +0 -372
  218. neverlib/.history/audio_aug/audio_aug_20250827155015.py +0 -375
  219. neverlib/.history/audio_aug/audio_aug_20250827155106.py +0 -375
  220. neverlib/.history/audio_aug/audio_aug_20250827155114.py +0 -393
  221. neverlib/.history/audio_aug/audio_aug_20250827155207.py +0 -415
  222. neverlib/.history/audio_aug/audio_aug_20250827155300.py +0 -415
  223. neverlib/.history/audio_aug/audio_aug_20250827155321.py +0 -471
  224. neverlib/.history/audio_aug/audio_aug_20250827164703.py +0 -471
  225. neverlib/.history/audio_aug/audio_aug_20250827164749.py +0 -471
  226. neverlib/.history/audio_aug/audio_aug_20250827165252.py +0 -472
  227. neverlib/.history/audio_aug/audio_aug_20250827165334.py +0 -472
  228. neverlib/.history/audio_aug/audio_aug_20250827165404.py +0 -473
  229. neverlib/.history/audio_aug/audio_aug_20250827165610.py +0 -473
  230. neverlib/.history/audio_aug/audio_aug_20250827165805.py +0 -473
  231. neverlib/.history/audio_aug/audio_aug_20250827170056.py +0 -473
  232. neverlib/.history/audio_aug/audio_aug_20250827170106.py +0 -472
  233. neverlib/.history/audio_aug/audio_aug_20250827170143.py +0 -472
  234. neverlib/.history/audio_aug/audio_aug_20250827170216.py +0 -472
  235. neverlib/.history/audio_aug/audio_aug_20250827170218.py +0 -472
  236. neverlib/.history/audio_aug/audio_aug_20250827170314.py +0 -472
  237. neverlib/.history/audio_aug/audio_aug_20250827171500.py +0 -471
  238. neverlib/.history/audio_aug/audio_aug_20250827172347.py +0 -471
  239. neverlib/.history/audio_aug/audio_aug_20250827172558.py +0 -470
  240. neverlib/.history/audio_aug/audio_aug_20250827172559.py +0 -470
  241. neverlib/.history/audio_aug/audio_aug_20250827172801.py +0 -470
  242. neverlib/.history/audio_aug/audio_aug_20250827182522.py +0 -470
  243. neverlib/.history/audio_aug/audio_aug_20250827182526.py +0 -470
  244. neverlib/.history/audio_aug/audio_aug_20250827182626.py +0 -470
  245. neverlib/.history/audio_aug/audio_aug_20250827182715.py +0 -470
  246. neverlib/.history/audio_aug/audio_aug_20250904185444.py +0 -470
  247. neverlib/.history/audio_aug/audio_aug_20250904185538.py +0 -445
  248. neverlib/.history/dataAnalyze/__init___20250805234204.py +0 -87
  249. neverlib/.history/dataAnalyze/__init___20250806204125.py +0 -14
  250. neverlib/.history/dataAnalyze/__init___20250806204139.py +0 -14
  251. neverlib/.history/dataAnalyze/__init___20250806204159.py +0 -14
  252. neverlib/.history/data_analyze/__init___20250806204158.py +0 -14
  253. neverlib/.history/data_analyze/__init___20250827163248.py +0 -14
  254. neverlib/.history/filter/__init___20250820103351.py +0 -70
  255. neverlib/.history/filter/__init___20250821102348.py +0 -70
  256. neverlib/.history/filter/__init___20250821102405.py +0 -14
  257. neverlib/.history/filter/auto_eq/__init___20250819213121.py +0 -36
  258. neverlib/.history/filter/auto_eq/__init___20250821102241.py +0 -36
  259. neverlib/.history/filter/auto_eq/__init___20250821102259.py +0 -36
  260. neverlib/.history/filter/auto_eq/__init___20250821102307.py +0 -36
  261. neverlib/.history/filter/auto_eq/__init___20250821102310.py +0 -36
  262. neverlib/.history/filter/auto_eq/__init___20250821102318.py +0 -36
  263. neverlib/.history/filter/auto_eq/__init___20250821102507.py +0 -36
  264. neverlib/.history/filter/auto_eq/de_eq_20250820103848.py +0 -361
  265. neverlib/.history/filter/auto_eq/de_eq_20250821102422.py +0 -360
  266. neverlib/.history/filter/auto_eq/freq_eq_20250805234206.py +0 -75
  267. neverlib/.history/filter/auto_eq/freq_eq_20250820140732.py +0 -75
  268. neverlib/.history/filter/auto_eq/freq_eq_20250820140745.py +0 -75
  269. neverlib/.history/filter/auto_eq/freq_eq_20250820140816.py +0 -75
  270. neverlib/.history/filter/auto_eq/freq_eq_20250820140938.py +0 -77
  271. neverlib/.history/filter/auto_eq/freq_eq_20250820141003.py +0 -77
  272. neverlib/.history/filter/auto_eq/freq_eq_20250820141006.py +0 -77
  273. neverlib/.history/filter/auto_eq/freq_eq_20250820141019.py +0 -77
  274. neverlib/.history/filter/auto_eq/freq_eq_20250820141049.py +0 -77
  275. neverlib/.history/filter/auto_eq/freq_eq_20250820141211.py +0 -77
  276. neverlib/.history/filter/auto_eq/freq_eq_20250820141227.py +0 -77
  277. neverlib/.history/filter/auto_eq/freq_eq_20250820141311.py +0 -78
  278. neverlib/.history/filter/auto_eq/freq_eq_20250820141340.py +0 -78
  279. neverlib/.history/filter/auto_eq/freq_eq_20250820141712.py +0 -78
  280. neverlib/.history/filter/auto_eq/freq_eq_20250820141733.py +0 -78
  281. neverlib/.history/filter/auto_eq/freq_eq_20250820141755.py +0 -78
  282. neverlib/.history/filter/auto_eq/freq_eq_20250821102434.py +0 -76
  283. neverlib/.history/filter/auto_eq/freq_eq_20250821102500.py +0 -76
  284. neverlib/.history/filter/auto_eq/freq_eq_20250821102502.py +0 -76
  285. neverlib/.history/filter/auto_eq/freq_eq_20250821143140.py +0 -76
  286. neverlib/.history/filter/auto_eq/freq_eq_20250821153208.py +0 -76
  287. neverlib/.history/filter/auto_eq/freq_eq_20250821153214.py +0 -76
  288. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820102957.py +0 -380
  289. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820113054.py +0 -380
  290. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820113150.py +0 -380
  291. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820113520.py +0 -385
  292. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820113525.py +0 -385
  293. neverlib/.history/filter/auto_eq/ga_eq_basic_20250821102212.py +0 -385
  294. neverlib/.history/filter/auto_eq/ga_eq_basic_20250901110521.py +0 -385
  295. neverlib/.history/filter/auto_eq/ga_eq_basic_20250901110652.py +0 -385
  296. neverlib/.history/filter/common_20250806002134.py +0 -37
  297. neverlib/.history/filter/common_20250821120448.py +0 -49
  298. neverlib/.history/filter/common_20250821120453.py +0 -49
  299. neverlib/.history/metrics/dnsmos_20250806001612.py +0 -160
  300. neverlib/.history/metrics/dnsmos_20250815180659.py +0 -160
  301. neverlib/.history/metrics/dnsmos_20250815180701.py +0 -158
  302. neverlib/.history/metrics/dnsmos_20250815181321.py +0 -154
  303. neverlib/.history/metrics/dnsmos_20250815181327.py +0 -154
  304. neverlib/.history/metrics/dnsmos_20250815181331.py +0 -154
  305. neverlib/.history/metrics/dnsmos_20250815181620.py +0 -154
  306. neverlib/.history/metrics/dnsmos_20250815181631.py +0 -154
  307. neverlib/.history/metrics/dnsmos_20250815181742.py +0 -154
  308. neverlib/.history/metrics/dnsmos_20250815181824.py +0 -153
  309. neverlib/.history/metrics/dnsmos_20250815181834.py +0 -153
  310. neverlib/.history/metrics/dnsmos_20250815181922.py +0 -153
  311. neverlib/.history/metrics/dnsmos_20250815182011.py +0 -147
  312. neverlib/.history/metrics/dnsmos_20250815182036.py +0 -144
  313. neverlib/.history/metrics/dnsmos_20250815182936.py +0 -143
  314. neverlib/.history/metrics/dnsmos_20250815182942.py +0 -143
  315. neverlib/.history/metrics/dnsmos_20250815183032.py +0 -137
  316. neverlib/.history/metrics/dnsmos_20250815183101.py +0 -144
  317. neverlib/.history/metrics/dnsmos_20250815183121.py +0 -144
  318. neverlib/.history/metrics/dnsmos_20250815183123.py +0 -143
  319. neverlib/.history/metrics/dnsmos_20250815183214.py +0 -143
  320. neverlib/.history/metrics/dnsmos_20250815183240.py +0 -143
  321. neverlib/.history/metrics/dnsmos_20250815183248.py +0 -144
  322. neverlib/.history/metrics/dnsmos_20250815183407.py +0 -142
  323. neverlib/.history/metrics/dnsmos_20250815183409.py +0 -142
  324. neverlib/.history/metrics/dnsmos_20250815183431.py +0 -142
  325. neverlib/.history/metrics/dnsmos_20250815183507.py +0 -140
  326. neverlib/.history/metrics/dnsmos_20250815183513.py +0 -139
  327. neverlib/.history/metrics/dnsmos_20250815183618.py +0 -139
  328. neverlib/.history/metrics/dnsmos_20250815183709.py +0 -140
  329. neverlib/.history/metrics/dnsmos_20250815183756.py +0 -137
  330. neverlib/.history/metrics/dnsmos_20250815183815.py +0 -128
  331. neverlib/.history/metrics/dnsmos_20250815183827.py +0 -129
  332. neverlib/.history/metrics/dnsmos_20250815183913.py +0 -117
  333. neverlib/.history/metrics/dnsmos_20250815183914.py +0 -117
  334. neverlib/.history/metrics/dnsmos_20250815184003.py +0 -118
  335. neverlib/.history/metrics/dnsmos_20250815184040.py +0 -118
  336. neverlib/.history/metrics/dnsmos_20250815184049.py +0 -118
  337. neverlib/.history/metrics/dnsmos_20250815184104.py +0 -117
  338. neverlib/.history/metrics/dnsmos_20250815184200.py +0 -117
  339. neverlib/.history/metrics/lpc_lsp_metric_20250816015944.py +0 -128
  340. neverlib/.history/metrics/lpc_lsp_metric_20250816020142.py +0 -128
  341. neverlib/.history/metrics/lpc_lsp_metric_20250816020156.py +0 -128
  342. neverlib/.history/metrics/lpc_lsp_metric_20250816020554.py +0 -130
  343. neverlib/.history/metrics/lpc_lsp_metric_20250816020600.py +0 -125
  344. neverlib/.history/metrics/lpc_lsp_metric_20250816020631.py +0 -120
  345. neverlib/.history/metrics/lpc_lsp_metric_20250816020746.py +0 -118
  346. neverlib/.history/metrics/lpc_me_20250816013111.py +0 -0
  347. neverlib/.history/metrics/lpc_me_20250816013129.py +0 -121
  348. neverlib/.history/metrics/lpc_me_20250816015430.py +0 -103
  349. neverlib/.history/metrics/lpc_me_20250816015535.py +0 -96
  350. neverlib/.history/metrics/lpc_me_20250816015542.py +0 -96
  351. neverlib/.history/metrics/lpc_me_20250816015636.py +0 -97
  352. neverlib/.history/metrics/lpc_me_20250816015658.py +0 -104
  353. neverlib/.history/metrics/lpc_me_20250816015703.py +0 -100
  354. neverlib/.history/metrics/lpc_me_20250816015945.py +0 -128
  355. neverlib/.history/metrics/snr_20250806010538.py +0 -177
  356. neverlib/.history/metrics/snr_20250806211634.py +0 -184
  357. neverlib/.history/metrics/snr_20250827224201.py +0 -182
  358. neverlib/.history/metrics/snr_20250827234019.py +0 -186
  359. neverlib/.history/metrics/snr_20250827234028.py +0 -186
  360. neverlib/.history/metrics/snr_20250827234030.py +0 -186
  361. neverlib/.history/metrics/spec_20250805234209.py +0 -45
  362. neverlib/.history/metrics/spec_20250816135530.py +0 -11
  363. neverlib/.history/metrics/spec_20250816135654.py +0 -16
  364. neverlib/.history/metrics/spec_20250816135736.py +0 -68
  365. neverlib/.history/metrics/spec_20250816135904.py +0 -75
  366. neverlib/.history/metrics/spec_20250816135921.py +0 -82
  367. neverlib/.history/metrics/spec_20250816140111.py +0 -82
  368. neverlib/.history/metrics/spec_20250816140543.py +0 -136
  369. neverlib/.history/metrics/spec_20250816140559.py +0 -172
  370. neverlib/.history/metrics/spec_20250816140602.py +0 -172
  371. neverlib/.history/metrics/spec_20250816140608.py +0 -172
  372. neverlib/.history/metrics/spec_20250816140654.py +0 -148
  373. neverlib/.history/metrics/spec_20250816140705.py +0 -144
  374. neverlib/.history/metrics/spec_20250816140755.py +0 -138
  375. neverlib/.history/metrics/spec_20250816140823.py +0 -170
  376. neverlib/.history/metrics/spec_20250816140832.py +0 -170
  377. neverlib/.history/metrics/spec_20250816140833.py +0 -170
  378. neverlib/.history/metrics/spec_20250816140922.py +0 -147
  379. neverlib/.history/metrics/spec_20250816141148.py +0 -107
  380. neverlib/.history/metrics/spec_20250816141219.py +0 -123
  381. neverlib/.history/metrics/spec_20250816141732.py +0 -178
  382. neverlib/.history/metrics/spec_20250816141740.py +0 -178
  383. neverlib/.history/metrics/spec_20250816142030.py +0 -178
  384. neverlib/.history/metrics/spec_20250816142107.py +0 -135
  385. neverlib/.history/metrics/spec_20250816142126.py +0 -135
  386. neverlib/.history/metrics/spec_20250816142410.py +0 -135
  387. neverlib/.history/metrics/spec_20250816142415.py +0 -136
  388. neverlib/.history/metrics/spec_metric_20250816135156.py +0 -0
  389. neverlib/.history/metrics/spec_metric_20250816135226.py +0 -5
  390. neverlib/.history/metrics/spec_metric_20250816135227.py +0 -10
  391. neverlib/.history/metrics/spec_metric_20250816135306.py +0 -15
  392. neverlib/.history/metrics/spec_metric_20250816135442.py +0 -31
  393. neverlib/.history/metrics/spec_metric_20250816135448.py +0 -31
  394. neverlib/.history/metrics/spec_metric_20250816135520.py +0 -29
  395. neverlib/.history/metrics/spec_metric_20250816135537.py +0 -63
  396. neverlib/.history/metrics/spec_metric_20250816135653.py +0 -65
  397. neverlib/.history/utils/audio_split_20250805234209.py +0 -268
  398. neverlib/.history/utils/audio_split_20250904185309.py +0 -268
  399. neverlib/.history/utils/utils_20250813165516.py +0 -330
  400. neverlib/.history/utils/utils_20250904181341.py +0 -328
  401. neverlib/.history/utils/utils_20250904185546.py +0 -352
  402. neverlib/.history/utils/utils_20250904185548.py +0 -353
  403. neverlib/.history/utils/utils_20250904185603.py +0 -353
  404. neverlib/.history/utils/utils_20250904185636.py +0 -353
  405. neverlib/.history/utils/utils_20250904185658.py +0 -358
  406. neverlib/.history/utils/utils_20250904190053.py +0 -359
  407. neverlib/.history/vad/PreProcess_20250805234211.py +0 -63
  408. neverlib/.history/vad/PreProcess_20250809232455.py +0 -63
  409. neverlib/.history/vad/PreProcess_20250816020725.py +0 -66
  410. neverlib/.history/vad/VAD_Silero_20250805234211.py +0 -50
  411. neverlib/.history/vad/VAD_Silero_20250809232456.py +0 -50
  412. neverlib/.history/vad/VAD_WebRTC_20250805234211.py +0 -61
  413. neverlib/.history/vad/VAD_WebRTC_20250809232456.py +0 -61
  414. neverlib/.history/vad/VAD_funasr_20250805234211.py +0 -54
  415. neverlib/.history/vad/VAD_funasr_20250809232456.py +0 -54
  416. neverlib/.history/vad/VAD_vadlib_20250805234211.py +0 -70
  417. neverlib/.history/vad/VAD_vadlib_20250809232455.py +0 -70
  418. neverlib/.history/vad/VAD_whisper_20250805234211.py +0 -55
  419. neverlib/.history/vad/VAD_whisper_20250809232456.py +0 -55
  420. neverlib/.specstory/.what-is-this.md +0 -69
  421. 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 +0 -424
  422. 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 +0 -247
  423. neverlib/.specstory/history/2025-08-26_11-54Z-oserror-missing-shared-object-file.md +0 -87
  424. 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 +0 -296
  425. neverlib/.specstory/history/2025-08-27_08-29Z-delete-python-file-command.md +0 -211
  426. 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 +0 -357
  427. neverlib-0.2.7.dist-info/RECORD +0 -510
  428. {neverlib-0.2.7.dist-info → neverlib-0.2.9.dist-info}/WHEEL +0 -0
  429. {neverlib-0.2.7.dist-info → neverlib-0.2.9.dist-info}/licenses/LICENSE +0 -0
  430. {neverlib-0.2.7.dist-info → neverlib-0.2.9.dist-info}/top_level.txt +0 -0
@@ -1,353 +0,0 @@
1
- # -*- coding:utf-8 -*-
2
- # Author:凌逆战 | Never
3
- # Date: 2023/9/25
4
- """
5
- folder处理
6
- """
7
- import os
8
- import random
9
- import shutil
10
- import fnmatch
11
- from tqdm import tqdm
12
- from datetime import datetime
13
- import soundfile as sf
14
- import numpy as np
15
- EPS = np.finfo(float).eps
16
-
17
-
18
- def get_path_list(source_path, end="*.wav", shuffle=False):
19
- wav_list = []
20
- for root, dirnames, filenames in os.walk(source_path):
21
- # 实现列表特殊字符的过滤或筛选,返回符合匹配“.wav”字符列表
22
- for filename in fnmatch.filter(filenames, end):
23
- wav_list.append(os.path.join(root, filename))
24
- if os.environ.get("LOCAL_RANK", "0") == "0":
25
- print(source_path, len(wav_list))
26
- if shuffle:
27
- random.shuffle(wav_list)
28
- return wav_list
29
-
30
-
31
- def get_audio_segments(wav_len, audio_path_list, sr=16000):
32
- """
33
- 从音频列表中随机拼接指定长度音频
34
- Args:
35
- wav_len: 需要返回的音频长度
36
- audio_path_list: 音频路径列表
37
- sr: 采样率
38
- Returns:返回指定长度的音频
39
- """
40
- audio_len = 0
41
- wav_list = []
42
- while audio_len < wav_len:
43
- audio_path = random.choice(audio_path_list)
44
- wav, wav_sr = sf.read(audio_path, always_2d=True, dtype='float32')
45
- assert wav_sr == sr, f"音频采样率是{wav_sr}, 期望{sr}"
46
- audio_len += len(wav)
47
- wav_list.append(wav)
48
- wav = np.concatenate(wav_list, axis=0)
49
- if len(wav) > wav_len:
50
- # 随机截取clean_len
51
- start = random.randint(0, len(wav) - wav_len)
52
- wav = wav[start:start + wav_len, :]
53
- return wav
54
-
55
-
56
- def rename_files_and_folders(directory, replace='_-', replacement='_'):
57
- # 将路径的指定字符替换为指定字符
58
- for root, dirs, files in os.walk(directory):
59
- for filename in files:
60
- if replace in filename:
61
- new_filename = filename.replace(replace, replacement)
62
- old_path = os.path.join(root, filename)
63
- new_path = os.path.join(root, new_filename)
64
- os.rename(old_path, new_path)
65
- print(f'Renamed file: {old_path} -> {new_path}')
66
-
67
- for folder in dirs:
68
- if replace in folder:
69
- new_folder = folder.replace(replace, replacement)
70
- old_path = os.path.join(root, folder)
71
- new_path = os.path.join(root, new_folder)
72
- os.rename(old_path, new_path)
73
- print(f'Renamed folder: {old_path} -> {new_path}')
74
-
75
-
76
- def get_file_time(file_path):
77
- # 获取最后修改时间
78
- mod_time = os.path.getmtime(file_path)
79
- # 转为data_time格式: 年-月-日-时-分-秒
80
- datetime_dt = datetime.fromtimestamp(mod_time)
81
-
82
- # 如果时间早于2024-09-04 02:00:00, 则删除
83
- # if datetime_dt < datetime(2024, 9, 4, 2, 0, 0):
84
- # print(file_path)
85
- return datetime_dt
86
-
87
-
88
- def TrainValSplit(dataset_dir, train_dir, val_dir, percentage=0.9):
89
- """ 分割数据集为训练集和验证集
90
- :param dataset_dir: 源数据集地址
91
- :param train_dir: 训练集地址
92
- :param val_dir: 验证集地址
93
- :param percentage: 分割百分比
94
- """
95
- wav_path_list = get_path_list(dataset_dir, end="*.wav", shuffle=True)
96
- total_wav_num = len(wav_path_list)
97
- # 计算训练集和验证集的分割点
98
- split_idx = int(total_wav_num * percentage)
99
- train_path_list, val_path_list = wav_path_list[:split_idx], wav_path_list[split_idx:]
100
-
101
- for train_wavpath in tqdm(train_path_list, desc="Copying train wav"):
102
- target_path = train_wavpath.replace(dataset_dir, train_dir)
103
- if not os.path.exists(os.path.split(target_path)[0]):
104
- os.makedirs(os.path.split(target_path)[0])
105
- shutil.copy(train_wavpath, target_path)
106
-
107
- for val_wavpath in tqdm(val_path_list, desc="Copying val wav"):
108
- target_path = val_wavpath.replace(dataset_dir, val_dir)
109
- if not os.path.exists(os.path.split(target_path)[0]):
110
- os.makedirs(os.path.split(target_path)[0])
111
- shutil.copy(val_wavpath, target_path)
112
-
113
- print("Done!")
114
-
115
-
116
- def TrainValTestSplit(dataset_dir, train_dir, val_dir, test_dir, percentage=[0.8, 0.1, 0.1]):
117
- """ 分割数据集为训练集、验证集和测试集
118
- :param dataset_dir: 源数据集地址
119
- :param train_dir: 训练集地址
120
- :param val_dir: 验证集地址
121
- :param test_dir: 测试集地址
122
- :param percentage: 分割百分比
123
- """
124
- assert sum(percentage) == 1.0, "百分比总和必须等于1.0"
125
-
126
- wav_path_list = sorted(get_path_list(dataset_dir, end="*.wav"))
127
- random.seed(10086)
128
- random.shuffle(wav_path_list) # 打乱列表的顺序
129
- total_wav_num = len(wav_path_list)
130
-
131
- # 计算训练集、验证集和测试集的分割点
132
- train_split_idx = int(total_wav_num * percentage[0])
133
- val_split_idx = train_split_idx + int(total_wav_num * percentage[1])
134
-
135
- train_path_list = wav_path_list[:train_split_idx]
136
- val_path_list = wav_path_list[train_split_idx:val_split_idx]
137
- test_path_list = wav_path_list[val_split_idx:]
138
-
139
- for train_wavpath in tqdm(train_path_list, desc="复制训练集音频"):
140
- target_path = train_wavpath.replace(dataset_dir, train_dir)
141
- if not os.path.exists(os.path.split(target_path)[0]):
142
- os.makedirs(os.path.split(target_path)[0])
143
- shutil.copy(train_wavpath, target_path)
144
-
145
- for val_wavpath in tqdm(val_path_list, desc="复制验证集音频"):
146
- target_path = val_wavpath.replace(dataset_dir, val_dir)
147
- if not os.path.exists(os.path.split(target_path)[0]):
148
- os.makedirs(os.path.split(target_path)[0])
149
- shutil.copy(val_wavpath, target_path)
150
-
151
- for test_wavpath in tqdm(test_path_list, desc="复制测试集音频"):
152
- target_path = test_wavpath.replace(dataset_dir, test_dir)
153
- if not os.path.exists(os.path.split(target_path)[0]):
154
- os.makedirs(os.path.split(target_path)[0])
155
- shutil.copy(test_wavpath, target_path)
156
-
157
- print(f"完成! 训练集: {len(train_path_list)}个文件, 验证集: {len(val_path_list)}个文件, 测试集: {len(test_path_list)}个文件")
158
-
159
-
160
- def get_leaf_folders(directory):
161
- # 获取最底层的文件夹路径
162
- leaf_folders = []
163
- for root, dirs, _ in os.walk(directory):
164
- if not dirs: # 如果当前文件夹没有子文件夹
165
- leaf_folders.append(root)
166
- return leaf_folders
167
-
168
-
169
- def del_empty_folders(path):
170
- """递归删除空文件夹(先删除子文件夹, 再删除父文件夹)"""
171
- if not os.path.isdir(path):
172
- return
173
-
174
- # 获取子文件夹
175
- subfolders = [os.path.join(path, d) for d in os.listdir(path) if os.path.isdir(os.path.join(path, d))]
176
-
177
- # 递归处理子文件夹
178
- for subfolder in subfolders:
179
- del_empty_folders(subfolder)
180
-
181
- # 如果文件夹为空,则删除
182
- if not os.listdir(path):
183
- os.rmdir(path)
184
- print(f"删除空文件夹: {path}")
185
-
186
-
187
- def DatasetSubfloderSplit(source_dir, split_dirs, percentage=None):
188
- """
189
- 将一个数据集按照子文件夹数量分割成train/val/test数据集
190
- Args:
191
- source_dir (str): 源数据集目录
192
- split_dirs (list): 目标目录列表, 如 [train_dir, val_dir] 或 [train_dir, val_dir, test_dir]
193
- percentage (list, optional): 分割比例, 如 [0.9, 0.1] 或 [0.8, 0.1, 0.1]。默认为 None, 此时:
194
- - 如果是两路分割, 默认为 [0.9, 0.1]
195
- - 如果是三路分割, 默认为 [0.8, 0.1, 0.1]
196
- Example:
197
- # 两路分割示例
198
- DatasetSplit(
199
- source_dir=source_dataset_path,
200
- split_dirs=[target_train_path, target_val_path],
201
- percentage=[0.9, 0.1]
202
- )
203
-
204
- # 三路分割示例
205
- DatasetSplit(
206
- source_dir=source_dataset_path,
207
- split_dirs=[target_train_path, target_val_path, target_test_path],
208
- percentage=[0.8, 0.1, 0.1]
209
- )
210
-
211
- # 使用默认比例的两路分割
212
- DatasetSplit(
213
- source_dir=source_dataset_path,
214
- split_dirs=[target_train_path, target_val_path]
215
- )
216
- """
217
- if percentage is None:
218
- percentage = [0.9, 0.1] if len(split_dirs) == 2 else [0.8, 0.1, 0.1]
219
-
220
- # 验证输入参数
221
- if len(split_dirs) not in [2, 3]:
222
- raise ValueError("只支持2路或3路分割(训练集/验证集 或 训练集/验证集/测试集)")
223
- if len(percentage) != len(split_dirs):
224
- raise ValueError("分割比例数量必须与目标目录数量相同")
225
- if sum(percentage) != 1.0:
226
- raise ValueError("分割比例之和必须等于1.0")
227
-
228
- # 获取并打乱文件夹列表
229
- leaf_folder_list = sorted(get_leaf_folders(source_dir))
230
- random.seed(10086)
231
- random.shuffle(leaf_folder_list)
232
- total_folder_num = len(leaf_folder_list)
233
-
234
- # 计算分割点
235
- split_indices = []
236
- acc_percentage = 0
237
- for p in percentage[:-1]: # 最后一个比例不需要计算
238
- acc_percentage += p
239
- split_indices.append(int(total_folder_num * acc_percentage))
240
-
241
- # 分割文件夹列表
242
- split_folder_lists = []
243
- start_idx = 0
244
- for end_idx in split_indices:
245
- split_folder_lists.append(leaf_folder_list[start_idx:end_idx])
246
- start_idx = end_idx
247
- split_folder_lists.append(leaf_folder_list[start_idx:]) # 添加最后一部分
248
-
249
- # 复制文件夹
250
- split_names = ['train', 'val', 'test']
251
- for folders, target_dir, split_name in zip(split_folder_lists, split_dirs, split_names[:len(split_dirs)]):
252
- for folder in tqdm(folders, desc=f"Copying {split_name} folders"):
253
- target_folder = folder.replace(source_dir, target_dir)
254
- os.makedirs(os.path.dirname(target_folder), exist_ok=True)
255
- shutil.copytree(folder, target_folder)
256
-
257
- # 打印统计信息
258
- print(f"Total folders: {total_folder_num}")
259
- for folders, split_name in zip(split_folder_lists, split_names[:len(split_dirs)]):
260
- print(f"{split_name.capitalize()} folders: {len(folders)}")
261
-
262
-
263
- def pcm2wav(pcm_path, wav_path, sr=16000, channels=1, subtype='PCM_16'):
264
- """
265
- 将pcm文件转换为wav文件
266
- :param pcm_path: pcm文件路径
267
- :param wav_path: wav文件路径
268
- :param sr: 采样率
269
- :param channels: 声道数
270
- :param subtype: 子类型
271
- """
272
- pcm_data = np.fromfile(pcm_path, dtype=np.int16)
273
- pcm_data = pcm_data.reshape(-1, channels) # 支持多通道
274
- sf.write(wav_path, pcm_data, sr, subtype=subtype)
275
-
276
-
277
- def wav2pcm(wav_path, pcm_path):
278
- """
279
- 将wav文件转换为pcm文件
280
- :param wav_path: wav文件路径
281
- :param pcm_path: pcm文件路径
282
- """
283
- data, _ = sf.read(wav_path, dtype='int16')
284
- data.tofile(pcm_path)
285
-
286
-
287
- def save_weight_histogram(model, save_dir, mode=["params", "buffers"], ignore_name=["scale", "bias"], bins=100):
288
- """
289
- 保存模型权重分布直方图
290
- Args:
291
- model: PyTorch模型
292
- save_dir: 保存路径
293
- mode: 保存模式, 可选值为["params", "buffers"]
294
- bins: 直方图bin数量
295
- """
296
- import matplotlib.pyplot as plt
297
- # 如果路径存在, 则删除
298
- if os.path.exists(save_dir):
299
- shutil.rmtree(save_dir)
300
-
301
- if "params" in mode:
302
- os.makedirs(os.path.join(save_dir, "param"), exist_ok=True)
303
- for name, param in model.named_parameters():
304
- if any(ignore in name for ignore in ignore_name):
305
- continue
306
- param = param.cpu().data.flatten().numpy()
307
- param_min = param.min()
308
- param_max = param.max()
309
- param_mean = param.mean()
310
- param_std = param.std()
311
-
312
- # 保存模型参数到地址
313
- # 绘制直方图
314
- plt.title(name)
315
- plt.xlabel("value")
316
- plt.ylabel("count")
317
- plt.grid(alpha=0.5)
318
- # 在右上角添加统计信息
319
- plt.text(1, 1, f"max: {param_max:.2f}\n \
320
- min: {param_min:.2f}\n \
321
- mean: {param_mean:.2f}\n \
322
- std: {param_std:.2f}",
323
- ha='right', va='top', transform=plt.gca().transAxes)
324
- plt.hist(param, bins=bins)
325
- plt.savefig(os.path.join(save_dir, "param", f"{name}.png"))
326
- plt.close()
327
- if "buffers" in mode:
328
- os.makedirs(os.path.join(save_dir, "buffer"), exist_ok=True)
329
- for name, buffer in model.named_buffers():
330
- if "running_mean" not in name and "running_var" not in name:
331
- continue
332
- buffer = buffer.cpu().data.flatten().numpy()
333
-
334
- # 计算统计数据
335
- buffer_min = buffer.min()
336
- buffer_max = buffer.max()
337
- buffer_mean = buffer.mean()
338
- buffer_std = buffer.std()
339
-
340
- # 绘制直方图
341
- plt.title(name)
342
- plt.xlabel("value")
343
- plt.ylabel("count")
344
- plt.grid(alpha=0.5)
345
- # 在右上角添加统计信息
346
- plt.text(1, 1, f"max: {buffer_max:.2f}\n \
347
- min: {buffer_min:.2f}\n \
348
- mean: {buffer_mean:.2f}\n \
349
- std: {buffer_std:.2f}",
350
- ha='right', va='top', transform=plt.gca().transAxes)
351
- plt.hist(buffer, bins=bins)
352
- plt.savefig(os.path.join(save_dir, "buffer", f"{name}.png"))
353
- plt.close()
@@ -1,353 +0,0 @@
1
- # -*- coding:utf-8 -*-
2
- # Author:凌逆战 | Never
3
- # Date: 2023/9/25
4
- """
5
- folder处理
6
- """
7
- import os
8
- import random
9
- import shutil
10
- import fnmatch
11
- from tqdm import tqdm
12
- from datetime import datetime
13
- import soundfile as sf
14
- import numpy as np
15
- EPS = np.finfo(float).eps
16
-
17
-
18
- def get_path_list(source_path, end="*.wav", shuffle=False):
19
- wav_list = []
20
- for root, dirnames, filenames in os.walk(source_path):
21
- # 实现列表特殊字符的过滤或筛选,返回符合匹配“.wav”字符列表
22
- for filename in fnmatch.filter(filenames, end):
23
- wav_list.append(os.path.join(root, filename))
24
- if os.environ.get("LOCAL_RANK", "0") == "0":
25
- print(source_path, len(wav_list))
26
- if shuffle:
27
- random.shuffle(wav_list)
28
- return wav_list
29
-
30
-
31
- def get_audio_segments(wav_len, wav_path_list, sr=16000):
32
- """
33
- 从音频列表中随机拼接指定长度音频
34
- Args:
35
- wav_len: 需要返回的音频长度
36
- audio_path_list: 音频路径列表
37
- sr: 采样率
38
- Returns:返回指定长度的音频
39
- """
40
- audio_len = 0
41
- wav_list = []
42
- while audio_len < wav_len:
43
- audio_path = random.choice(wav_path_list)
44
- wav, wav_sr = sf.read(audio_path, always_2d=True, dtype='float32')
45
- assert wav_sr == sr, f"音频采样率是{wav_sr}, 期望{sr}"
46
- audio_len += len(wav)
47
- wav_list.append(wav)
48
- wav = np.concatenate(wav_list, axis=0)
49
- if len(wav) > wav_len:
50
- # 随机截取clean_len
51
- start = random.randint(0, len(wav) - wav_len)
52
- wav = wav[start:start + wav_len, :]
53
- return wav
54
-
55
-
56
- def rename_files_and_folders(directory, replace='_-', replacement='_'):
57
- # 将路径的指定字符替换为指定字符
58
- for root, dirs, files in os.walk(directory):
59
- for filename in files:
60
- if replace in filename:
61
- new_filename = filename.replace(replace, replacement)
62
- old_path = os.path.join(root, filename)
63
- new_path = os.path.join(root, new_filename)
64
- os.rename(old_path, new_path)
65
- print(f'Renamed file: {old_path} -> {new_path}')
66
-
67
- for folder in dirs:
68
- if replace in folder:
69
- new_folder = folder.replace(replace, replacement)
70
- old_path = os.path.join(root, folder)
71
- new_path = os.path.join(root, new_folder)
72
- os.rename(old_path, new_path)
73
- print(f'Renamed folder: {old_path} -> {new_path}')
74
-
75
-
76
- def get_file_time(file_path):
77
- # 获取最后修改时间
78
- mod_time = os.path.getmtime(file_path)
79
- # 转为data_time格式: 年-月-日-时-分-秒
80
- datetime_dt = datetime.fromtimestamp(mod_time)
81
-
82
- # 如果时间早于2024-09-04 02:00:00, 则删除
83
- # if datetime_dt < datetime(2024, 9, 4, 2, 0, 0):
84
- # print(file_path)
85
- return datetime_dt
86
-
87
-
88
- def TrainValSplit(dataset_dir, train_dir, val_dir, percentage=0.9):
89
- """ 分割数据集为训练集和验证集
90
- :param dataset_dir: 源数据集地址
91
- :param train_dir: 训练集地址
92
- :param val_dir: 验证集地址
93
- :param percentage: 分割百分比
94
- """
95
- wav_path_list = get_path_list(dataset_dir, end="*.wav", shuffle=True)
96
- total_wav_num = len(wav_path_list)
97
- # 计算训练集和验证集的分割点
98
- split_idx = int(total_wav_num * percentage)
99
- train_path_list, val_path_list = wav_path_list[:split_idx], wav_path_list[split_idx:]
100
-
101
- for train_wavpath in tqdm(train_path_list, desc="Copying train wav"):
102
- target_path = train_wavpath.replace(dataset_dir, train_dir)
103
- if not os.path.exists(os.path.split(target_path)[0]):
104
- os.makedirs(os.path.split(target_path)[0])
105
- shutil.copy(train_wavpath, target_path)
106
-
107
- for val_wavpath in tqdm(val_path_list, desc="Copying val wav"):
108
- target_path = val_wavpath.replace(dataset_dir, val_dir)
109
- if not os.path.exists(os.path.split(target_path)[0]):
110
- os.makedirs(os.path.split(target_path)[0])
111
- shutil.copy(val_wavpath, target_path)
112
-
113
- print("Done!")
114
-
115
-
116
- def TrainValTestSplit(dataset_dir, train_dir, val_dir, test_dir, percentage=[0.8, 0.1, 0.1]):
117
- """ 分割数据集为训练集、验证集和测试集
118
- :param dataset_dir: 源数据集地址
119
- :param train_dir: 训练集地址
120
- :param val_dir: 验证集地址
121
- :param test_dir: 测试集地址
122
- :param percentage: 分割百分比
123
- """
124
- assert sum(percentage) == 1.0, "百分比总和必须等于1.0"
125
-
126
- wav_path_list = sorted(get_path_list(dataset_dir, end="*.wav"))
127
- random.seed(10086)
128
- random.shuffle(wav_path_list) # 打乱列表的顺序
129
- total_wav_num = len(wav_path_list)
130
-
131
- # 计算训练集、验证集和测试集的分割点
132
- train_split_idx = int(total_wav_num * percentage[0])
133
- val_split_idx = train_split_idx + int(total_wav_num * percentage[1])
134
-
135
- train_path_list = wav_path_list[:train_split_idx]
136
- val_path_list = wav_path_list[train_split_idx:val_split_idx]
137
- test_path_list = wav_path_list[val_split_idx:]
138
-
139
- for train_wavpath in tqdm(train_path_list, desc="复制训练集音频"):
140
- target_path = train_wavpath.replace(dataset_dir, train_dir)
141
- if not os.path.exists(os.path.split(target_path)[0]):
142
- os.makedirs(os.path.split(target_path)[0])
143
- shutil.copy(train_wavpath, target_path)
144
-
145
- for val_wavpath in tqdm(val_path_list, desc="复制验证集音频"):
146
- target_path = val_wavpath.replace(dataset_dir, val_dir)
147
- if not os.path.exists(os.path.split(target_path)[0]):
148
- os.makedirs(os.path.split(target_path)[0])
149
- shutil.copy(val_wavpath, target_path)
150
-
151
- for test_wavpath in tqdm(test_path_list, desc="复制测试集音频"):
152
- target_path = test_wavpath.replace(dataset_dir, test_dir)
153
- if not os.path.exists(os.path.split(target_path)[0]):
154
- os.makedirs(os.path.split(target_path)[0])
155
- shutil.copy(test_wavpath, target_path)
156
-
157
- print(f"完成! 训练集: {len(train_path_list)}个文件, 验证集: {len(val_path_list)}个文件, 测试集: {len(test_path_list)}个文件")
158
-
159
-
160
- def get_leaf_folders(directory):
161
- # 获取最底层的文件夹路径
162
- leaf_folders = []
163
- for root, dirs, _ in os.walk(directory):
164
- if not dirs: # 如果当前文件夹没有子文件夹
165
- leaf_folders.append(root)
166
- return leaf_folders
167
-
168
-
169
- def del_empty_folders(path):
170
- """递归删除空文件夹(先删除子文件夹, 再删除父文件夹)"""
171
- if not os.path.isdir(path):
172
- return
173
-
174
- # 获取子文件夹
175
- subfolders = [os.path.join(path, d) for d in os.listdir(path) if os.path.isdir(os.path.join(path, d))]
176
-
177
- # 递归处理子文件夹
178
- for subfolder in subfolders:
179
- del_empty_folders(subfolder)
180
-
181
- # 如果文件夹为空,则删除
182
- if not os.listdir(path):
183
- os.rmdir(path)
184
- print(f"删除空文件夹: {path}")
185
-
186
-
187
- def DatasetSubfloderSplit(source_dir, split_dirs, percentage=None):
188
- """
189
- 将一个数据集按照子文件夹数量分割成train/val/test数据集
190
- Args:
191
- source_dir (str): 源数据集目录
192
- split_dirs (list): 目标目录列表, 如 [train_dir, val_dir] 或 [train_dir, val_dir, test_dir]
193
- percentage (list, optional): 分割比例, 如 [0.9, 0.1] 或 [0.8, 0.1, 0.1]。默认为 None, 此时:
194
- - 如果是两路分割, 默认为 [0.9, 0.1]
195
- - 如果是三路分割, 默认为 [0.8, 0.1, 0.1]
196
- Example:
197
- # 两路分割示例
198
- DatasetSplit(
199
- source_dir=source_dataset_path,
200
- split_dirs=[target_train_path, target_val_path],
201
- percentage=[0.9, 0.1]
202
- )
203
-
204
- # 三路分割示例
205
- DatasetSplit(
206
- source_dir=source_dataset_path,
207
- split_dirs=[target_train_path, target_val_path, target_test_path],
208
- percentage=[0.8, 0.1, 0.1]
209
- )
210
-
211
- # 使用默认比例的两路分割
212
- DatasetSplit(
213
- source_dir=source_dataset_path,
214
- split_dirs=[target_train_path, target_val_path]
215
- )
216
- """
217
- if percentage is None:
218
- percentage = [0.9, 0.1] if len(split_dirs) == 2 else [0.8, 0.1, 0.1]
219
-
220
- # 验证输入参数
221
- if len(split_dirs) not in [2, 3]:
222
- raise ValueError("只支持2路或3路分割(训练集/验证集 或 训练集/验证集/测试集)")
223
- if len(percentage) != len(split_dirs):
224
- raise ValueError("分割比例数量必须与目标目录数量相同")
225
- if sum(percentage) != 1.0:
226
- raise ValueError("分割比例之和必须等于1.0")
227
-
228
- # 获取并打乱文件夹列表
229
- leaf_folder_list = sorted(get_leaf_folders(source_dir))
230
- random.seed(10086)
231
- random.shuffle(leaf_folder_list)
232
- total_folder_num = len(leaf_folder_list)
233
-
234
- # 计算分割点
235
- split_indices = []
236
- acc_percentage = 0
237
- for p in percentage[:-1]: # 最后一个比例不需要计算
238
- acc_percentage += p
239
- split_indices.append(int(total_folder_num * acc_percentage))
240
-
241
- # 分割文件夹列表
242
- split_folder_lists = []
243
- start_idx = 0
244
- for end_idx in split_indices:
245
- split_folder_lists.append(leaf_folder_list[start_idx:end_idx])
246
- start_idx = end_idx
247
- split_folder_lists.append(leaf_folder_list[start_idx:]) # 添加最后一部分
248
-
249
- # 复制文件夹
250
- split_names = ['train', 'val', 'test']
251
- for folders, target_dir, split_name in zip(split_folder_lists, split_dirs, split_names[:len(split_dirs)]):
252
- for folder in tqdm(folders, desc=f"Copying {split_name} folders"):
253
- target_folder = folder.replace(source_dir, target_dir)
254
- os.makedirs(os.path.dirname(target_folder), exist_ok=True)
255
- shutil.copytree(folder, target_folder)
256
-
257
- # 打印统计信息
258
- print(f"Total folders: {total_folder_num}")
259
- for folders, split_name in zip(split_folder_lists, split_names[:len(split_dirs)]):
260
- print(f"{split_name.capitalize()} folders: {len(folders)}")
261
-
262
-
263
- def pcm2wav(pcm_path, wav_path, sr=16000, channels=1, subtype='PCM_16'):
264
- """
265
- 将pcm文件转换为wav文件
266
- :param pcm_path: pcm文件路径
267
- :param wav_path: wav文件路径
268
- :param sr: 采样率
269
- :param channels: 声道数
270
- :param subtype: 子类型
271
- """
272
- pcm_data = np.fromfile(pcm_path, dtype=np.int16)
273
- pcm_data = pcm_data.reshape(-1, channels) # 支持多通道
274
- sf.write(wav_path, pcm_data, sr, subtype=subtype)
275
-
276
-
277
- def wav2pcm(wav_path, pcm_path):
278
- """
279
- 将wav文件转换为pcm文件
280
- :param wav_path: wav文件路径
281
- :param pcm_path: pcm文件路径
282
- """
283
- data, _ = sf.read(wav_path, dtype='int16')
284
- data.tofile(pcm_path)
285
-
286
-
287
- def save_weight_histogram(model, save_dir, mode=["params", "buffers"], ignore_name=["scale", "bias"], bins=100):
288
- """
289
- 保存模型权重分布直方图
290
- Args:
291
- model: PyTorch模型
292
- save_dir: 保存路径
293
- mode: 保存模式, 可选值为["params", "buffers"]
294
- bins: 直方图bin数量
295
- """
296
- import matplotlib.pyplot as plt
297
- # 如果路径存在, 则删除
298
- if os.path.exists(save_dir):
299
- shutil.rmtree(save_dir)
300
-
301
- if "params" in mode:
302
- os.makedirs(os.path.join(save_dir, "param"), exist_ok=True)
303
- for name, param in model.named_parameters():
304
- if any(ignore in name for ignore in ignore_name):
305
- continue
306
- param = param.cpu().data.flatten().numpy()
307
- param_min = param.min()
308
- param_max = param.max()
309
- param_mean = param.mean()
310
- param_std = param.std()
311
-
312
- # 保存模型参数到地址
313
- # 绘制直方图
314
- plt.title(name)
315
- plt.xlabel("value")
316
- plt.ylabel("count")
317
- plt.grid(alpha=0.5)
318
- # 在右上角添加统计信息
319
- plt.text(1, 1, f"max: {param_max:.2f}\n \
320
- min: {param_min:.2f}\n \
321
- mean: {param_mean:.2f}\n \
322
- std: {param_std:.2f}",
323
- ha='right', va='top', transform=plt.gca().transAxes)
324
- plt.hist(param, bins=bins)
325
- plt.savefig(os.path.join(save_dir, "param", f"{name}.png"))
326
- plt.close()
327
- if "buffers" in mode:
328
- os.makedirs(os.path.join(save_dir, "buffer"), exist_ok=True)
329
- for name, buffer in model.named_buffers():
330
- if "running_mean" not in name and "running_var" not in name:
331
- continue
332
- buffer = buffer.cpu().data.flatten().numpy()
333
-
334
- # 计算统计数据
335
- buffer_min = buffer.min()
336
- buffer_max = buffer.max()
337
- buffer_mean = buffer.mean()
338
- buffer_std = buffer.std()
339
-
340
- # 绘制直方图
341
- plt.title(name)
342
- plt.xlabel("value")
343
- plt.ylabel("count")
344
- plt.grid(alpha=0.5)
345
- # 在右上角添加统计信息
346
- plt.text(1, 1, f"max: {buffer_max:.2f}\n \
347
- min: {buffer_min:.2f}\n \
348
- mean: {buffer_mean:.2f}\n \
349
- std: {buffer_std:.2f}",
350
- ha='right', va='top', transform=plt.gca().transAxes)
351
- plt.hist(buffer, bins=bins)
352
- plt.savefig(os.path.join(save_dir, "buffer", f"{name}.png"))
353
- plt.close()