neverlib 0.2.8__py3-none-any.whl → 0.3.0__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 (466) hide show
  1. neverlib/Docs/audio_aug/test_volume.ipynb +8 -8
  2. neverlib/Docs/filter/biquad.ipynb +1 -1
  3. neverlib/Docs/filter/filter_family.ipynb +4 -4
  4. neverlib/Docs/vad/VAD_WebRTC.ipynb +4 -4
  5. neverlib/Docs/vad/VAD_whisper.ipynb +2 -2
  6. neverlib/LLM/__init__.py +37 -0
  7. neverlib/LLM/bailian.py +342 -0
  8. neverlib/LLM/image.py +73 -0
  9. neverlib/LLM/text.py +32 -0
  10. neverlib/QA/ImpactNoiseRejection.py +119 -0
  11. neverlib/QA/gen_init.py +13 -16
  12. neverlib/__init__.py +5 -5
  13. neverlib/audio_aug/HarmonicDistortion.py +11 -11
  14. neverlib/audio_aug/README.md +3 -0
  15. neverlib/audio_aug/__init__.py +2 -2
  16. neverlib/audio_aug/audio_aug.py +18 -18
  17. neverlib/audio_aug/coder_aug.py +25 -25
  18. neverlib/audio_aug/coder_aug2.py +10 -10
  19. neverlib/audio_aug/loss_packet_aug.py +16 -16
  20. neverlib/audio_aug/quant_aug.py +7 -7
  21. neverlib/data_analyze/README.md +1 -1
  22. neverlib/data_analyze/__init__.py +2 -2
  23. neverlib/data_analyze/dataset_analyzer.py +2 -2
  24. neverlib/data_analyze/quality_metrics.py +12 -12
  25. neverlib/data_analyze/statistics.py +1 -1
  26. neverlib/data_analyze/visualization.py +1 -1
  27. neverlib/filter/README.md +3 -3
  28. neverlib/filter/__init__.py +2 -2
  29. neverlib/filter/auto_eq/README.md +2 -2
  30. neverlib/filter/auto_eq/__init__.py +2 -2
  31. neverlib/filter/auto_eq/de_eq.py +1 -1
  32. neverlib/filter/auto_eq/ga_eq_advanced.py +2 -2
  33. neverlib/filter/auto_eq/ga_eq_basic.py +1 -1
  34. neverlib/filter/biquad.py +1 -1
  35. neverlib/filter/core.py +8 -5
  36. neverlib/metrics/README.md +35 -0
  37. neverlib/metrics/__init__.py +2 -2
  38. neverlib/metrics/dnsmos.py +2 -2
  39. neverlib/metrics/lpc_lsp.py +8 -8
  40. neverlib/metrics/pesq_c/PESQ +0 -0
  41. neverlib/metrics/snr.py +5 -5
  42. neverlib/metrics/spec.py +23 -23
  43. neverlib/metrics/test_pesq.py +3 -3
  44. neverlib/signal_gen/babble_noise_generate.py +113 -0
  45. neverlib/tests/__init__.py +2 -2
  46. neverlib/tests/test_imports.py +1 -1
  47. neverlib/utils/README.md +29 -0
  48. neverlib/utils/__init__.py +24 -16
  49. neverlib/utils/audio_split.py +21 -21
  50. neverlib/utils/checkGPU.py +52 -79
  51. neverlib/utils/floder.py +115 -0
  52. neverlib/utils/lazy_expose.py +1 -1
  53. neverlib/utils/lazy_module.py +6 -6
  54. neverlib/utils/message.py +2 -3
  55. neverlib/utils/pcm.py +42 -0
  56. neverlib/utils/utils.py +108 -91
  57. neverlib/vad/README.md +5 -5
  58. neverlib/vad/__init__.py +2 -2
  59. neverlib/vad/utils.py +1 -1
  60. {neverlib-0.2.8.dist-info → neverlib-0.3.0.dist-info}/METADATA +17 -3
  61. neverlib-0.3.0.dist-info/RECORD +120 -0
  62. neverlib/.claude/settings.local.json +0 -9
  63. neverlib/.history/Docs/audio_aug/del_20250827162530.py +0 -0
  64. neverlib/.history/Docs/audio_aug/del_20250827162540.py +0 -2
  65. neverlib/.history/Docs/audio_aug/del_20250827162541.py +0 -7
  66. neverlib/.history/Docs/audio_aug/del_20250827162606.py +0 -7
  67. neverlib/.history/Docs/audio_aug/del_20250827162637.py +0 -8
  68. neverlib/.history/Docs/audio_aug/del_20250827162645.py +0 -8
  69. neverlib/.history/Docs/audio_aug/del_20250827162723.py +0 -9
  70. neverlib/.history/Docs/audio_aug/del_20250827162739.py +0 -9
  71. neverlib/.history/Docs/audio_aug/test_snr_20250806011311.py +0 -0
  72. neverlib/.history/Docs/audio_aug/test_snr_20250806011331.py +0 -75
  73. neverlib/.history/Docs/audio_aug/test_snr_20250806011342.py +0 -57
  74. neverlib/.history/Docs/audio_aug/test_snr_20250806011352.py +0 -57
  75. neverlib/.history/Docs/audio_aug/test_snr_20250806011403.py +0 -57
  76. neverlib/.history/Docs/audio_aug/test_snr_20250806011413.py +0 -57
  77. neverlib/.history/Docs/audio_aug/test_snr_20250806011435.py +0 -55
  78. neverlib/.history/Docs/audio_aug/test_snr_20250827161751.py +0 -55
  79. neverlib/.history/Docs/audio_aug/test_snr_20250827161754.py +0 -55
  80. neverlib/.history/Docs/audio_aug/test_snr_20250827161833.py +0 -54
  81. neverlib/.history/Docs/audio_aug/test_snr_20250827162017.py +0 -56
  82. neverlib/.history/Docs/audio_aug/test_snr_20250827162021.py +0 -57
  83. neverlib/.history/Docs/audio_aug/test_snr_20250827162028.py +0 -57
  84. neverlib/.history/Docs/audio_aug/test_snr_20250827162033.py +0 -55
  85. neverlib/.history/Docs/audio_aug_test/del_20250827162738.py +0 -9
  86. neverlib/.history/Docs/audio_aug_test/del_20250827162819.py +0 -9
  87. neverlib/.history/Docs/audio_aug_test/del_20250827162830.py +0 -9
  88. neverlib/.history/Docs/audio_aug_test/del_20250827162846.py +0 -9
  89. neverlib/.history/Docs/audio_aug_test/del_20250827162851.py +0 -9
  90. neverlib/.history/Docs/audio_aug_test/del_20250827162903.py +0 -10
  91. neverlib/.history/Docs/audio_aug_test/del_20250827162921.py +0 -10
  92. neverlib/.history/Docs/audio_aug_test/del_20250827162926.py +0 -10
  93. neverlib/.history/Docs/audio_aug_test/del_20250827163030.py +0 -10
  94. neverlib/.history/Docs/audio_aug_test/del_20250827163032.py +0 -10
  95. neverlib/.history/Docs/vad/1_20250810032405.py +0 -0
  96. neverlib/.history/Docs/vad/1_20250810032417.py +0 -39
  97. neverlib/.history/QA/html2markdown_20250822234112.md +0 -0
  98. neverlib/.history/QA/html2markdown_20250822234140.py +0 -9
  99. neverlib/.history/QA/html2markdown_20250822234141.md +0 -9
  100. neverlib/.history/QA/html2markdown_20250822234159.py +0 -12
  101. neverlib/.history/QA/html2markdown_20250822234200.py +0 -17
  102. neverlib/.history/QA/html2markdown_20250822234236.py +0 -17
  103. neverlib/.history/QA/html2markdown_20250822234340.py +0 -14
  104. neverlib/.history/QA/html2markdown_20250822234522.py +0 -18
  105. neverlib/.history/QA/html2markdown_20250822234601.py +0 -20
  106. neverlib/.history/QA/html2markdown_20250822234615.py +0 -22
  107. neverlib/.history/QA/html2markdown_20250822234715.py +0 -28
  108. neverlib/.history/QA/html2markdown_20250822234720.py +0 -27
  109. neverlib/.history/QA/html2markdown_20250822234903.py +0 -27
  110. neverlib/.history/__init___20250805234212.py +0 -41
  111. neverlib/.history/__init___20250904102635.py +0 -39
  112. neverlib/.history/__init___20250904102836.py +0 -34
  113. neverlib/.history/__init___20250904102838.py +0 -39
  114. neverlib/.history/__init___20250904102851.py +0 -33
  115. neverlib/.history/audio_aug/audio_aug_20250806010451.py +0 -125
  116. neverlib/.history/audio_aug/audio_aug_20250806010750.py +0 -138
  117. neverlib/.history/audio_aug/audio_aug_20250806010759.py +0 -140
  118. neverlib/.history/audio_aug/audio_aug_20250806010803.py +0 -140
  119. neverlib/.history/audio_aug/audio_aug_20250806010809.py +0 -140
  120. neverlib/.history/audio_aug/audio_aug_20250806011108.py +0 -140
  121. neverlib/.history/audio_aug/audio_aug_20250826155913.py +0 -158
  122. neverlib/.history/audio_aug/audio_aug_20250826164159.py +0 -159
  123. neverlib/.history/audio_aug/audio_aug_20250826164217.py +0 -160
  124. neverlib/.history/audio_aug/audio_aug_20250826164408.py +0 -161
  125. neverlib/.history/audio_aug/audio_aug_20250826164423.py +0 -161
  126. neverlib/.history/audio_aug/audio_aug_20250826164529.py +0 -161
  127. neverlib/.history/audio_aug/audio_aug_20250826164824.py +0 -161
  128. neverlib/.history/audio_aug/audio_aug_20250826164932.py +0 -162
  129. neverlib/.history/audio_aug/audio_aug_20250826164947.py +0 -162
  130. neverlib/.history/audio_aug/audio_aug_20250826165403.py +0 -162
  131. neverlib/.history/audio_aug/audio_aug_20250826165421.py +0 -162
  132. neverlib/.history/audio_aug/audio_aug_20250826165509.py +0 -163
  133. neverlib/.history/audio_aug/audio_aug_20250826165702.py +0 -163
  134. neverlib/.history/audio_aug/audio_aug_20250826165732.py +0 -165
  135. neverlib/.history/audio_aug/audio_aug_20250826170041.py +0 -163
  136. neverlib/.history/audio_aug/audio_aug_20250826170105.py +0 -164
  137. neverlib/.history/audio_aug/audio_aug_20250826170154.py +0 -164
  138. neverlib/.history/audio_aug/audio_aug_20250826170220.py +0 -165
  139. neverlib/.history/audio_aug/audio_aug_20250826170221.py +0 -165
  140. neverlib/.history/audio_aug/audio_aug_20250826170228.py +0 -165
  141. neverlib/.history/audio_aug/audio_aug_20250826170231.py +0 -165
  142. neverlib/.history/audio_aug/audio_aug_20250826212001.py +0 -165
  143. neverlib/.history/audio_aug/audio_aug_20250826220038.py +0 -165
  144. neverlib/.history/audio_aug/audio_aug_20250826220133.py +0 -165
  145. neverlib/.history/audio_aug/audio_aug_20250826220148.py +0 -165
  146. neverlib/.history/audio_aug/audio_aug_20250826220154.py +0 -165
  147. neverlib/.history/audio_aug/audio_aug_20250826220156.py +0 -165
  148. neverlib/.history/audio_aug/audio_aug_20250826220314.py +0 -165
  149. neverlib/.history/audio_aug/audio_aug_20250826220343.py +0 -184
  150. neverlib/.history/audio_aug/audio_aug_20250826220345.py +0 -184
  151. neverlib/.history/audio_aug/audio_aug_20250826220349.py +0 -184
  152. neverlib/.history/audio_aug/audio_aug_20250826220429.py +0 -184
  153. neverlib/.history/audio_aug/audio_aug_20250826220447.py +0 -184
  154. neverlib/.history/audio_aug/audio_aug_20250826220601.py +0 -186
  155. neverlib/.history/audio_aug/audio_aug_20250826220638.py +0 -186
  156. neverlib/.history/audio_aug/audio_aug_20250826220641.py +0 -186
  157. neverlib/.history/audio_aug/audio_aug_20250826220647.py +0 -186
  158. neverlib/.history/audio_aug/audio_aug_20250826220653.py +0 -186
  159. neverlib/.history/audio_aug/audio_aug_20250826220655.py +0 -186
  160. neverlib/.history/audio_aug/audio_aug_20250826220731.py +0 -185
  161. neverlib/.history/audio_aug/audio_aug_20250826220739.py +0 -185
  162. neverlib/.history/audio_aug/audio_aug_20250826220747.py +0 -185
  163. neverlib/.history/audio_aug/audio_aug_20250826220801.py +0 -186
  164. neverlib/.history/audio_aug/audio_aug_20250826220822.py +0 -186
  165. neverlib/.history/audio_aug/audio_aug_20250826220901.py +0 -186
  166. neverlib/.history/audio_aug/audio_aug_20250826221107.py +0 -187
  167. neverlib/.history/audio_aug/audio_aug_20250826221310.py +0 -188
  168. neverlib/.history/audio_aug/audio_aug_20250826221353.py +0 -191
  169. neverlib/.history/audio_aug/audio_aug_20250826221821.py +0 -191
  170. neverlib/.history/audio_aug/audio_aug_20250826221838.py +0 -191
  171. neverlib/.history/audio_aug/audio_aug_20250826221906.py +0 -191
  172. neverlib/.history/audio_aug/audio_aug_20250826221930.py +0 -191
  173. neverlib/.history/audio_aug/audio_aug_20250826221939.py +0 -191
  174. neverlib/.history/audio_aug/audio_aug_20250826221955.py +0 -191
  175. neverlib/.history/audio_aug/audio_aug_20250826222008.py +0 -197
  176. neverlib/.history/audio_aug/audio_aug_20250826222017.py +0 -200
  177. neverlib/.history/audio_aug/audio_aug_20250826222046.py +0 -203
  178. neverlib/.history/audio_aug/audio_aug_20250826222105.py +0 -203
  179. neverlib/.history/audio_aug/audio_aug_20250826222206.py +0 -203
  180. neverlib/.history/audio_aug/audio_aug_20250826222302.py +0 -203
  181. neverlib/.history/audio_aug/audio_aug_20250826222336.py +0 -203
  182. neverlib/.history/audio_aug/audio_aug_20250826222455.py +0 -204
  183. neverlib/.history/audio_aug/audio_aug_20250826222526.py +0 -204
  184. neverlib/.history/audio_aug/audio_aug_20250826222541.py +0 -204
  185. neverlib/.history/audio_aug/audio_aug_20250826222624.py +0 -202
  186. neverlib/.history/audio_aug/audio_aug_20250826222714.py +0 -205
  187. neverlib/.history/audio_aug/audio_aug_20250826222820.py +0 -205
  188. neverlib/.history/audio_aug/audio_aug_20250826222827.py +0 -205
  189. neverlib/.history/audio_aug/audio_aug_20250826222927.py +0 -232
  190. neverlib/.history/audio_aug/audio_aug_20250826223009.py +0 -232
  191. neverlib/.history/audio_aug/audio_aug_20250826223054.py +0 -232
  192. neverlib/.history/audio_aug/audio_aug_20250826223225.py +0 -233
  193. neverlib/.history/audio_aug/audio_aug_20250826223344.py +0 -236
  194. neverlib/.history/audio_aug/audio_aug_20250826223356.py +0 -236
  195. neverlib/.history/audio_aug/audio_aug_20250826223955.py +0 -242
  196. neverlib/.history/audio_aug/audio_aug_20250826224210.py +0 -240
  197. neverlib/.history/audio_aug/audio_aug_20250826224250.py +0 -242
  198. neverlib/.history/audio_aug/audio_aug_20250826224323.py +0 -280
  199. neverlib/.history/audio_aug/audio_aug_20250826224452.py +0 -263
  200. neverlib/.history/audio_aug/audio_aug_20250826224455.py +0 -263
  201. neverlib/.history/audio_aug/audio_aug_20250826224502.py +0 -263
  202. neverlib/.history/audio_aug/audio_aug_20250826224528.py +0 -263
  203. neverlib/.history/audio_aug/audio_aug_20250826224658.py +0 -263
  204. neverlib/.history/audio_aug/audio_aug_20250826224833.py +0 -264
  205. neverlib/.history/audio_aug/audio_aug_20250826225013.py +0 -269
  206. neverlib/.history/audio_aug/audio_aug_20250826225050.py +0 -269
  207. neverlib/.history/audio_aug/audio_aug_20250826225241.py +0 -268
  208. neverlib/.history/audio_aug/audio_aug_20250826225315.py +0 -266
  209. neverlib/.history/audio_aug/audio_aug_20250826225404.py +0 -266
  210. neverlib/.history/audio_aug/audio_aug_20250826225502.py +0 -265
  211. neverlib/.history/audio_aug/audio_aug_20250826225950.py +0 -267
  212. neverlib/.history/audio_aug/audio_aug_20250826225959.py +0 -268
  213. neverlib/.history/audio_aug/audio_aug_20250826230222.py +0 -271
  214. neverlib/.history/audio_aug/audio_aug_20250826230248.py +0 -270
  215. neverlib/.history/audio_aug/audio_aug_20250826230638.py +0 -266
  216. neverlib/.history/audio_aug/audio_aug_20250826230755.py +0 -266
  217. neverlib/.history/audio_aug/audio_aug_20250826230941.py +0 -265
  218. neverlib/.history/audio_aug/audio_aug_20250826231054.py +0 -266
  219. neverlib/.history/audio_aug/audio_aug_20250826231117.py +0 -266
  220. neverlib/.history/audio_aug/audio_aug_20250826231219.py +0 -266
  221. neverlib/.history/audio_aug/audio_aug_20250826232330.py +0 -266
  222. neverlib/.history/audio_aug/audio_aug_20250826232352.py +0 -266
  223. neverlib/.history/audio_aug/audio_aug_20250827152748.py +0 -268
  224. neverlib/.history/audio_aug/audio_aug_20250827152806.py +0 -268
  225. neverlib/.history/audio_aug/audio_aug_20250827152808.py +0 -268
  226. neverlib/.history/audio_aug/audio_aug_20250827152917.py +0 -283
  227. neverlib/.history/audio_aug/audio_aug_20250827152929.py +0 -281
  228. neverlib/.history/audio_aug/audio_aug_20250827153100.py +0 -286
  229. neverlib/.history/audio_aug/audio_aug_20250827153102.py +0 -286
  230. neverlib/.history/audio_aug/audio_aug_20250827153301.py +0 -295
  231. neverlib/.history/audio_aug/audio_aug_20250827153331.py +0 -298
  232. neverlib/.history/audio_aug/audio_aug_20250827153525.py +0 -303
  233. neverlib/.history/audio_aug/audio_aug_20250827153533.py +0 -304
  234. neverlib/.history/audio_aug/audio_aug_20250827153541.py +0 -321
  235. neverlib/.history/audio_aug/audio_aug_20250827153805.py +0 -322
  236. neverlib/.history/audio_aug/audio_aug_20250827153832.py +0 -323
  237. neverlib/.history/audio_aug/audio_aug_20250827153836.py +0 -324
  238. neverlib/.history/audio_aug/audio_aug_20250827153846.py +0 -324
  239. neverlib/.history/audio_aug/audio_aug_20250827153859.py +0 -325
  240. neverlib/.history/audio_aug/audio_aug_20250827154453.py +0 -337
  241. neverlib/.history/audio_aug/audio_aug_20250827154513.py +0 -355
  242. neverlib/.history/audio_aug/audio_aug_20250827154538.py +0 -356
  243. neverlib/.history/audio_aug/audio_aug_20250827154541.py +0 -357
  244. neverlib/.history/audio_aug/audio_aug_20250827154612.py +0 -357
  245. neverlib/.history/audio_aug/audio_aug_20250827154657.py +0 -360
  246. neverlib/.history/audio_aug/audio_aug_20250827154708.py +0 -360
  247. neverlib/.history/audio_aug/audio_aug_20250827154728.py +0 -366
  248. neverlib/.history/audio_aug/audio_aug_20250827154755.py +0 -367
  249. neverlib/.history/audio_aug/audio_aug_20250827154800.py +0 -367
  250. neverlib/.history/audio_aug/audio_aug_20250827154917.py +0 -368
  251. neverlib/.history/audio_aug/audio_aug_20250827154928.py +0 -369
  252. neverlib/.history/audio_aug/audio_aug_20250827154932.py +0 -370
  253. neverlib/.history/audio_aug/audio_aug_20250827154947.py +0 -372
  254. neverlib/.history/audio_aug/audio_aug_20250827155015.py +0 -375
  255. neverlib/.history/audio_aug/audio_aug_20250827155106.py +0 -375
  256. neverlib/.history/audio_aug/audio_aug_20250827155114.py +0 -393
  257. neverlib/.history/audio_aug/audio_aug_20250827155207.py +0 -415
  258. neverlib/.history/audio_aug/audio_aug_20250827155300.py +0 -415
  259. neverlib/.history/audio_aug/audio_aug_20250827155321.py +0 -471
  260. neverlib/.history/audio_aug/audio_aug_20250827164703.py +0 -471
  261. neverlib/.history/audio_aug/audio_aug_20250827164749.py +0 -471
  262. neverlib/.history/audio_aug/audio_aug_20250827165252.py +0 -472
  263. neverlib/.history/audio_aug/audio_aug_20250827165334.py +0 -472
  264. neverlib/.history/audio_aug/audio_aug_20250827165404.py +0 -473
  265. neverlib/.history/audio_aug/audio_aug_20250827165610.py +0 -473
  266. neverlib/.history/audio_aug/audio_aug_20250827165805.py +0 -473
  267. neverlib/.history/audio_aug/audio_aug_20250827170056.py +0 -473
  268. neverlib/.history/audio_aug/audio_aug_20250827170106.py +0 -472
  269. neverlib/.history/audio_aug/audio_aug_20250827170143.py +0 -472
  270. neverlib/.history/audio_aug/audio_aug_20250827170216.py +0 -472
  271. neverlib/.history/audio_aug/audio_aug_20250827170218.py +0 -472
  272. neverlib/.history/audio_aug/audio_aug_20250827170314.py +0 -472
  273. neverlib/.history/audio_aug/audio_aug_20250827171500.py +0 -471
  274. neverlib/.history/audio_aug/audio_aug_20250827172347.py +0 -471
  275. neverlib/.history/audio_aug/audio_aug_20250827172558.py +0 -470
  276. neverlib/.history/audio_aug/audio_aug_20250827172559.py +0 -470
  277. neverlib/.history/audio_aug/audio_aug_20250827172801.py +0 -470
  278. neverlib/.history/audio_aug/audio_aug_20250827182522.py +0 -470
  279. neverlib/.history/audio_aug/audio_aug_20250827182526.py +0 -470
  280. neverlib/.history/audio_aug/audio_aug_20250827182626.py +0 -470
  281. neverlib/.history/audio_aug/audio_aug_20250827182715.py +0 -470
  282. neverlib/.history/audio_aug/audio_aug_20250904185444.py +0 -470
  283. neverlib/.history/audio_aug/audio_aug_20250904185538.py +0 -445
  284. neverlib/.history/dataAnalyze/__init___20250805234204.py +0 -87
  285. neverlib/.history/dataAnalyze/__init___20250806204125.py +0 -14
  286. neverlib/.history/dataAnalyze/__init___20250806204139.py +0 -14
  287. neverlib/.history/dataAnalyze/__init___20250806204159.py +0 -14
  288. neverlib/.history/data_analyze/__init___20250806204158.py +0 -14
  289. neverlib/.history/data_analyze/__init___20250827163248.py +0 -14
  290. neverlib/.history/filter/__init___20250820103351.py +0 -70
  291. neverlib/.history/filter/__init___20250821102348.py +0 -70
  292. neverlib/.history/filter/__init___20250821102405.py +0 -14
  293. neverlib/.history/filter/auto_eq/__init___20250819213121.py +0 -36
  294. neverlib/.history/filter/auto_eq/__init___20250821102241.py +0 -36
  295. neverlib/.history/filter/auto_eq/__init___20250821102259.py +0 -36
  296. neverlib/.history/filter/auto_eq/__init___20250821102307.py +0 -36
  297. neverlib/.history/filter/auto_eq/__init___20250821102310.py +0 -36
  298. neverlib/.history/filter/auto_eq/__init___20250821102318.py +0 -36
  299. neverlib/.history/filter/auto_eq/__init___20250821102507.py +0 -36
  300. neverlib/.history/filter/auto_eq/de_eq_20250820103848.py +0 -361
  301. neverlib/.history/filter/auto_eq/de_eq_20250821102422.py +0 -360
  302. neverlib/.history/filter/auto_eq/freq_eq_20250805234206.py +0 -75
  303. neverlib/.history/filter/auto_eq/freq_eq_20250820140732.py +0 -75
  304. neverlib/.history/filter/auto_eq/freq_eq_20250820140745.py +0 -75
  305. neverlib/.history/filter/auto_eq/freq_eq_20250820140816.py +0 -75
  306. neverlib/.history/filter/auto_eq/freq_eq_20250820140938.py +0 -77
  307. neverlib/.history/filter/auto_eq/freq_eq_20250820141003.py +0 -77
  308. neverlib/.history/filter/auto_eq/freq_eq_20250820141006.py +0 -77
  309. neverlib/.history/filter/auto_eq/freq_eq_20250820141019.py +0 -77
  310. neverlib/.history/filter/auto_eq/freq_eq_20250820141049.py +0 -77
  311. neverlib/.history/filter/auto_eq/freq_eq_20250820141211.py +0 -77
  312. neverlib/.history/filter/auto_eq/freq_eq_20250820141227.py +0 -77
  313. neverlib/.history/filter/auto_eq/freq_eq_20250820141311.py +0 -78
  314. neverlib/.history/filter/auto_eq/freq_eq_20250820141340.py +0 -78
  315. neverlib/.history/filter/auto_eq/freq_eq_20250820141712.py +0 -78
  316. neverlib/.history/filter/auto_eq/freq_eq_20250820141733.py +0 -78
  317. neverlib/.history/filter/auto_eq/freq_eq_20250820141755.py +0 -78
  318. neverlib/.history/filter/auto_eq/freq_eq_20250821102434.py +0 -76
  319. neverlib/.history/filter/auto_eq/freq_eq_20250821102500.py +0 -76
  320. neverlib/.history/filter/auto_eq/freq_eq_20250821102502.py +0 -76
  321. neverlib/.history/filter/auto_eq/freq_eq_20250821143140.py +0 -76
  322. neverlib/.history/filter/auto_eq/freq_eq_20250821153208.py +0 -76
  323. neverlib/.history/filter/auto_eq/freq_eq_20250821153214.py +0 -76
  324. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820102957.py +0 -380
  325. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820113054.py +0 -380
  326. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820113150.py +0 -380
  327. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820113520.py +0 -385
  328. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820113525.py +0 -385
  329. neverlib/.history/filter/auto_eq/ga_eq_basic_20250821102212.py +0 -385
  330. neverlib/.history/filter/auto_eq/ga_eq_basic_20250901110521.py +0 -385
  331. neverlib/.history/filter/auto_eq/ga_eq_basic_20250901110652.py +0 -385
  332. neverlib/.history/filter/common_20250806002134.py +0 -37
  333. neverlib/.history/filter/common_20250821120448.py +0 -49
  334. neverlib/.history/filter/common_20250821120453.py +0 -49
  335. neverlib/.history/metrics/dnsmos_20250806001612.py +0 -160
  336. neverlib/.history/metrics/dnsmos_20250815180659.py +0 -160
  337. neverlib/.history/metrics/dnsmos_20250815180701.py +0 -158
  338. neverlib/.history/metrics/dnsmos_20250815181321.py +0 -154
  339. neverlib/.history/metrics/dnsmos_20250815181327.py +0 -154
  340. neverlib/.history/metrics/dnsmos_20250815181331.py +0 -154
  341. neverlib/.history/metrics/dnsmos_20250815181620.py +0 -154
  342. neverlib/.history/metrics/dnsmos_20250815181631.py +0 -154
  343. neverlib/.history/metrics/dnsmos_20250815181742.py +0 -154
  344. neverlib/.history/metrics/dnsmos_20250815181824.py +0 -153
  345. neverlib/.history/metrics/dnsmos_20250815181834.py +0 -153
  346. neverlib/.history/metrics/dnsmos_20250815181922.py +0 -153
  347. neverlib/.history/metrics/dnsmos_20250815182011.py +0 -147
  348. neverlib/.history/metrics/dnsmos_20250815182036.py +0 -144
  349. neverlib/.history/metrics/dnsmos_20250815182936.py +0 -143
  350. neverlib/.history/metrics/dnsmos_20250815182942.py +0 -143
  351. neverlib/.history/metrics/dnsmos_20250815183032.py +0 -137
  352. neverlib/.history/metrics/dnsmos_20250815183101.py +0 -144
  353. neverlib/.history/metrics/dnsmos_20250815183121.py +0 -144
  354. neverlib/.history/metrics/dnsmos_20250815183123.py +0 -143
  355. neverlib/.history/metrics/dnsmos_20250815183214.py +0 -143
  356. neverlib/.history/metrics/dnsmos_20250815183240.py +0 -143
  357. neverlib/.history/metrics/dnsmos_20250815183248.py +0 -144
  358. neverlib/.history/metrics/dnsmos_20250815183407.py +0 -142
  359. neverlib/.history/metrics/dnsmos_20250815183409.py +0 -142
  360. neverlib/.history/metrics/dnsmos_20250815183431.py +0 -142
  361. neverlib/.history/metrics/dnsmos_20250815183507.py +0 -140
  362. neverlib/.history/metrics/dnsmos_20250815183513.py +0 -139
  363. neverlib/.history/metrics/dnsmos_20250815183618.py +0 -139
  364. neverlib/.history/metrics/dnsmos_20250815183709.py +0 -140
  365. neverlib/.history/metrics/dnsmos_20250815183756.py +0 -137
  366. neverlib/.history/metrics/dnsmos_20250815183815.py +0 -128
  367. neverlib/.history/metrics/dnsmos_20250815183827.py +0 -129
  368. neverlib/.history/metrics/dnsmos_20250815183913.py +0 -117
  369. neverlib/.history/metrics/dnsmos_20250815183914.py +0 -117
  370. neverlib/.history/metrics/dnsmos_20250815184003.py +0 -118
  371. neverlib/.history/metrics/dnsmos_20250815184040.py +0 -118
  372. neverlib/.history/metrics/dnsmos_20250815184049.py +0 -118
  373. neverlib/.history/metrics/dnsmos_20250815184104.py +0 -117
  374. neverlib/.history/metrics/dnsmos_20250815184200.py +0 -117
  375. neverlib/.history/metrics/lpc_lsp_metric_20250816015944.py +0 -128
  376. neverlib/.history/metrics/lpc_lsp_metric_20250816020142.py +0 -128
  377. neverlib/.history/metrics/lpc_lsp_metric_20250816020156.py +0 -128
  378. neverlib/.history/metrics/lpc_lsp_metric_20250816020554.py +0 -130
  379. neverlib/.history/metrics/lpc_lsp_metric_20250816020600.py +0 -125
  380. neverlib/.history/metrics/lpc_lsp_metric_20250816020631.py +0 -120
  381. neverlib/.history/metrics/lpc_lsp_metric_20250816020746.py +0 -118
  382. neverlib/.history/metrics/lpc_me_20250816013111.py +0 -0
  383. neverlib/.history/metrics/lpc_me_20250816013129.py +0 -121
  384. neverlib/.history/metrics/lpc_me_20250816015430.py +0 -103
  385. neverlib/.history/metrics/lpc_me_20250816015535.py +0 -96
  386. neverlib/.history/metrics/lpc_me_20250816015542.py +0 -96
  387. neverlib/.history/metrics/lpc_me_20250816015636.py +0 -97
  388. neverlib/.history/metrics/lpc_me_20250816015658.py +0 -104
  389. neverlib/.history/metrics/lpc_me_20250816015703.py +0 -100
  390. neverlib/.history/metrics/lpc_me_20250816015945.py +0 -128
  391. neverlib/.history/metrics/snr_20250806010538.py +0 -177
  392. neverlib/.history/metrics/snr_20250806211634.py +0 -184
  393. neverlib/.history/metrics/snr_20250827224201.py +0 -182
  394. neverlib/.history/metrics/snr_20250827234019.py +0 -186
  395. neverlib/.history/metrics/snr_20250827234028.py +0 -186
  396. neverlib/.history/metrics/snr_20250827234030.py +0 -186
  397. neverlib/.history/metrics/spec_20250805234209.py +0 -45
  398. neverlib/.history/metrics/spec_20250816135530.py +0 -11
  399. neverlib/.history/metrics/spec_20250816135654.py +0 -16
  400. neverlib/.history/metrics/spec_20250816135736.py +0 -68
  401. neverlib/.history/metrics/spec_20250816135904.py +0 -75
  402. neverlib/.history/metrics/spec_20250816135921.py +0 -82
  403. neverlib/.history/metrics/spec_20250816140111.py +0 -82
  404. neverlib/.history/metrics/spec_20250816140543.py +0 -136
  405. neverlib/.history/metrics/spec_20250816140559.py +0 -172
  406. neverlib/.history/metrics/spec_20250816140602.py +0 -172
  407. neverlib/.history/metrics/spec_20250816140608.py +0 -172
  408. neverlib/.history/metrics/spec_20250816140654.py +0 -148
  409. neverlib/.history/metrics/spec_20250816140705.py +0 -144
  410. neverlib/.history/metrics/spec_20250816140755.py +0 -138
  411. neverlib/.history/metrics/spec_20250816140823.py +0 -170
  412. neverlib/.history/metrics/spec_20250816140832.py +0 -170
  413. neverlib/.history/metrics/spec_20250816140833.py +0 -170
  414. neverlib/.history/metrics/spec_20250816140922.py +0 -147
  415. neverlib/.history/metrics/spec_20250816141148.py +0 -107
  416. neverlib/.history/metrics/spec_20250816141219.py +0 -123
  417. neverlib/.history/metrics/spec_20250816141732.py +0 -178
  418. neverlib/.history/metrics/spec_20250816141740.py +0 -178
  419. neverlib/.history/metrics/spec_20250816142030.py +0 -178
  420. neverlib/.history/metrics/spec_20250816142107.py +0 -135
  421. neverlib/.history/metrics/spec_20250816142126.py +0 -135
  422. neverlib/.history/metrics/spec_20250816142410.py +0 -135
  423. neverlib/.history/metrics/spec_20250816142415.py +0 -136
  424. neverlib/.history/metrics/spec_metric_20250816135156.py +0 -0
  425. neverlib/.history/metrics/spec_metric_20250816135226.py +0 -5
  426. neverlib/.history/metrics/spec_metric_20250816135227.py +0 -10
  427. neverlib/.history/metrics/spec_metric_20250816135306.py +0 -15
  428. neverlib/.history/metrics/spec_metric_20250816135442.py +0 -31
  429. neverlib/.history/metrics/spec_metric_20250816135448.py +0 -31
  430. neverlib/.history/metrics/spec_metric_20250816135520.py +0 -29
  431. neverlib/.history/metrics/spec_metric_20250816135537.py +0 -63
  432. neverlib/.history/metrics/spec_metric_20250816135653.py +0 -65
  433. neverlib/.history/utils/audio_split_20250805234209.py +0 -268
  434. neverlib/.history/utils/audio_split_20250904185309.py +0 -268
  435. neverlib/.history/utils/utils_20250813165516.py +0 -330
  436. neverlib/.history/utils/utils_20250904181341.py +0 -328
  437. neverlib/.history/utils/utils_20250904185546.py +0 -352
  438. neverlib/.history/utils/utils_20250904185548.py +0 -353
  439. neverlib/.history/utils/utils_20250904185603.py +0 -353
  440. neverlib/.history/utils/utils_20250904185636.py +0 -353
  441. neverlib/.history/utils/utils_20250904185658.py +0 -358
  442. neverlib/.history/utils/utils_20250904190053.py +0 -359
  443. neverlib/.history/vad/PreProcess_20250805234211.py +0 -63
  444. neverlib/.history/vad/PreProcess_20250809232455.py +0 -63
  445. neverlib/.history/vad/PreProcess_20250816020725.py +0 -66
  446. neverlib/.history/vad/VAD_Silero_20250805234211.py +0 -50
  447. neverlib/.history/vad/VAD_Silero_20250809232456.py +0 -50
  448. neverlib/.history/vad/VAD_WebRTC_20250805234211.py +0 -61
  449. neverlib/.history/vad/VAD_WebRTC_20250809232456.py +0 -61
  450. neverlib/.history/vad/VAD_funasr_20250805234211.py +0 -54
  451. neverlib/.history/vad/VAD_funasr_20250809232456.py +0 -54
  452. neverlib/.history/vad/VAD_vadlib_20250805234211.py +0 -70
  453. neverlib/.history/vad/VAD_vadlib_20250809232455.py +0 -70
  454. neverlib/.history/vad/VAD_whisper_20250805234211.py +0 -55
  455. neverlib/.history/vad/VAD_whisper_20250809232456.py +0 -55
  456. neverlib/.specstory/.what-is-this.md +0 -69
  457. 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
  458. 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
  459. neverlib/.specstory/history/2025-08-26_11-54Z-oserror-missing-shared-object-file.md +0 -87
  460. 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
  461. neverlib/.specstory/history/2025-08-27_08-29Z-delete-python-file-command.md +0 -211
  462. 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
  463. neverlib-0.2.8.dist-info/RECORD +0 -510
  464. {neverlib-0.2.8.dist-info → neverlib-0.3.0.dist-info}/WHEEL +0 -0
  465. {neverlib-0.2.8.dist-info → neverlib-0.3.0.dist-info}/licenses/LICENSE +0 -0
  466. {neverlib-0.2.8.dist-info → neverlib-0.3.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,119 @@
1
+ """VPU 冲击声检测 + 可视化(轻量版). """
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import Path
6
+ from typing import List, Tuple
7
+
8
+ import matplotlib.pyplot as plt
9
+ import numpy as np
10
+ import soundfile as sf
11
+
12
+ # 基本参数, 可按需修改
13
+ AUDIO_PATH = Path(__file__).resolve().parent / "out.wav"
14
+ CHANNEL_INDEX = 4
15
+ DC_WINDOW_MS = 40.0
16
+ SHORT_MS = 6.0
17
+ LONG_MS = 60.0
18
+ RATIO_THRESHOLD = 3.0
19
+ MIN_DURATION_MS = 8.0
20
+ MIN_GAP_MS = 35.0
21
+
22
+
23
+ def moving_average(x: np.ndarray, window: int) -> np.ndarray:
24
+ if window <= 1:
25
+ return x
26
+ kernel = np.ones(window, dtype=np.float64) / window
27
+ return np.convolve(x, kernel, mode="same")
28
+
29
+
30
+ def preprocess(signal: np.ndarray, sr: int) -> np.ndarray:
31
+ dc_window = max(int(sr * DC_WINDOW_MS / 1000.0), 1)
32
+ return signal - moving_average(signal, dc_window)
33
+
34
+
35
+ def ratio_score(signal: np.ndarray, sr: int) -> np.ndarray:
36
+ short = max(int(sr * SHORT_MS / 1000.0), 1)
37
+ long = max(int(sr * LONG_MS / 1000.0), 1)
38
+ short_env = moving_average(np.abs(signal), short)
39
+ long_env = moving_average(np.abs(signal), long)
40
+ return short_env / np.maximum(long_env, 1e-6)
41
+
42
+
43
+ def detect_events(mask: np.ndarray, sr: int) -> List[Tuple[float, float]]:
44
+ min_samples = max(int(sr * MIN_DURATION_MS / 1000.0), 1)
45
+ gap_samples = max(int(sr * MIN_GAP_MS / 1000.0), 1)
46
+
47
+ events: List[Tuple[int, int]] = []
48
+ start = -1
49
+ for idx, active in enumerate(mask):
50
+ if active and start < 0:
51
+ start = idx
52
+ elif not active and start >= 0:
53
+ if idx - start >= min_samples:
54
+ events = _append_or_merge(events, start, idx, gap_samples)
55
+ start = -1
56
+
57
+ if start >= 0 and len(mask) - start >= min_samples:
58
+ events = _append_or_merge(events, start, len(mask), gap_samples)
59
+
60
+ return [(s / sr, e / sr) for s, e in events]
61
+
62
+
63
+ def _append_or_merge(events: List[Tuple[int, int]], start: int, end: int, gap: int) -> List[Tuple[int, int]]:
64
+ if events and start - events[-1][1] <= gap:
65
+ previous_start, _ = events[-1]
66
+ events[-1] = (previous_start, end)
67
+ else:
68
+ events.append((start, end))
69
+ return events
70
+
71
+
72
+ def plot_detection(time: np.ndarray, signal: np.ndarray, score: np.ndarray, events: List[Tuple[float, float]]) -> None:
73
+ fig, axes = plt.subplots(2, 1, figsize=(12, 6), sharex=True)
74
+
75
+ axes[0].plot(time, signal, color="steelblue", linewidth=0.8)
76
+ axes[0].set_ylabel("Amplitude")
77
+ axes[0].set_title("VPU 信号与冲击事件")
78
+
79
+ axes[1].plot(time, score, color="crimson", linewidth=0.8)
80
+ axes[1].axhline(RATIO_THRESHOLD, color="gray", linestyle="--", linewidth=0.8, label="阈值")
81
+ axes[1].set_ylabel("短/长包络比")
82
+ axes[1].set_xlabel("时间 (s)")
83
+ axes[1].legend(loc="upper right")
84
+
85
+ for axis in axes:
86
+ for start, end in events:
87
+ axis.axvspan(start, end, color="lime", alpha=0.25)
88
+ axis.grid(alpha=0.2)
89
+
90
+ fig.tight_layout()
91
+ plt.savefig('./impact_noise_rejection.png')
92
+
93
+
94
+ def main() -> None:
95
+ if not AUDIO_PATH.exists():
96
+ raise FileNotFoundError(f"找不到音频文件: {AUDIO_PATH}")
97
+
98
+ data, sr = sf.read(AUDIO_PATH, always_2d=True)
99
+ if CHANNEL_INDEX >= data.shape[1]:
100
+ raise ValueError(f"音频仅有 {data.shape[1]} 通道, 无法访问 VPU 通道 {CHANNEL_INDEX}")
101
+
102
+ signal = data[:, CHANNEL_INDEX].astype(np.float64)
103
+ signal = preprocess(signal, sr)
104
+ score = ratio_score(signal, sr)
105
+ events = detect_events(score > RATIO_THRESHOLD, sr)
106
+
107
+ if events:
108
+ print("检测到的冲击事件:")
109
+ for start, end in events:
110
+ print(f" 起始 {start:.3f}s 结束 {end:.3f}s 持续 {(end-start)*1000:.1f}ms")
111
+ else:
112
+ print("未检测到明显的冲击事件. ")
113
+
114
+ time_axis = np.arange(len(signal)) / sr
115
+ plot_detection(time_axis, signal, score, events)
116
+
117
+
118
+ if __name__ == "__main__":
119
+ main()
neverlib/QA/gen_init.py CHANGED
@@ -1,4 +1,4 @@
1
- # 自动生成指定包目录下的 __init__.py(懒加载格式:lazy_loader.attach
1
+ # 自动生成指定包目录下的 __init__.py(懒加载格式:lazy_loader.attach)
2
2
  # 并且支持IDE友好的 __init__.py 版本
3
3
 
4
4
  import ast
@@ -8,7 +8,7 @@ from typing import Dict, List, Set
8
8
 
9
9
  def _extract_exports_from_module(py_file: Path) -> List[str]:
10
10
  """
11
- 优先读取模块内显式定义的 __all__,否则收集顶层的类与函数名(排除以下划线开头的)。
11
+ 优先读取模块内显式定义的 __all__, 否则收集顶层的类与函数名(排除以下划线开头的)
12
12
  """
13
13
  try:
14
14
  source = py_file.read_text(encoding='utf-8')
@@ -46,8 +46,8 @@ def _extract_exports_from_module(py_file: Path) -> List[str]:
46
46
 
47
47
  def generate_init_for_directory(package_dir: Path, ide_friendly: bool = False) -> Path:
48
48
  """
49
- 为指定目录生成懒加载版 __init__.py(覆盖写入)。
50
- - 仅扫描一级子模块(同级 .py 文件),忽略以下划线开头的模块与 __init__.py 本身。
49
+ 为指定目录生成懒加载版 __init__.py(覆盖写入).
50
+ - 仅扫描一级子模块(同级 .py 文件), 忽略以下划线开头的模块与 __init__.py 本身.
51
51
  - 生成结构:
52
52
  from lazy_loader import attach
53
53
 
@@ -59,7 +59,7 @@ def generate_init_for_directory(package_dir: Path, ide_friendly: bool = False) -
59
59
 
60
60
  Args:
61
61
  package_dir: 包目录路径
62
- ide_friendly: 是否生成IDE友好版本(使用TYPE_CHECKING
62
+ ide_friendly: 是否生成IDE友好版本(使用TYPE_CHECKING)
63
63
  """
64
64
  package_dir = package_dir.resolve()
65
65
  if not package_dir.is_dir():
@@ -87,7 +87,7 @@ def generate_init_for_directory(package_dir: Path, ide_friendly: bool = False) -
87
87
  lines.append('from typing import TYPE_CHECKING, Any')
88
88
  lines.append('')
89
89
  lines.append('if TYPE_CHECKING:')
90
- lines.append(' # 仅在类型检查时导入,提供IDE补全支持')
90
+ lines.append(' # 仅在类型检查时导入, 提供IDE补全支持')
91
91
 
92
92
  # 生成 TYPE_CHECKING 导入
93
93
  for module_name in sorted(module_to_exports.keys()):
@@ -158,7 +158,7 @@ def generate_all_packages(root_dir: Path, ide_friendly: bool = False) -> List[Pa
158
158
  if package_dir == root_dir or package_dir in processed_dirs:
159
159
  continue
160
160
 
161
- # 检查是否包含其他Python文件(不是只有__init__.py
161
+ # 检查是否包含其他Python文件(不是只有__init__.py)
162
162
  has_other_py_files = any(
163
163
  f.name != '__init__.py' and f.suffix == '.py'
164
164
  for f in package_dir.iterdir()
@@ -181,13 +181,10 @@ def main():
181
181
 
182
182
  parser = argparse.ArgumentParser(description='为指定包目录自动生成 __init__.py')
183
183
  parser.add_argument('-p', '--package-dir', dest='package_dir',
184
- help='包目录路径,比如 /path/to/pkg 或 ./neverlib/utils')
185
- parser.add_argument('--all', action='store_true',
186
- help='为所有子包生成 __init__.py')
187
- parser.add_argument('--ide-friendly', action='store_true',
188
- help='生成IDE友好版本(使用TYPE_CHECKING)')
189
- parser.add_argument('--backup', action='store_true',
190
- help='备份原始文件')
184
+ help='包目录路径, 比如 /path/to/pkg 或 ./neverlib/utils')
185
+ parser.add_argument('--all', default=True, help='为所有子包生成 __init__.py')
186
+ parser.add_argument('--ide-friendly', default=True, help='生成IDE友好版本(使用TYPE_CHECKING)')
187
+ parser.add_argument('--backup', default=False, help='备份原始文件')
191
188
  args = parser.parse_args()
192
189
 
193
190
  if args.all:
@@ -209,9 +206,9 @@ def main():
209
206
  init_path = generate_init_for_directory(target_dir, ide_friendly=args.ide_friendly)
210
207
  print(f'已生成: {init_path}')
211
208
  if args.ide_friendly:
212
- print('✅ 已生成IDE友好版本(支持代码补全和类型检查)')
209
+ print('✅ 已生成IDE友好版本(支持代码补全和类型检查)')
213
210
  else:
214
- print('ℹ️ 生成标准懒加载版本,如需IDE支持请使用 --ide-friendly 参数')
211
+ print('ℹ️ 生成标准懒加载版本, 如需IDE支持请使用 --ide-friendly 参数')
215
212
 
216
213
 
217
214
  if __name__ == '__main__':
neverlib/__init__.py CHANGED
@@ -3,8 +3,8 @@ Author: 凌逆战 | Never
3
3
  Date: 2025-09-07
4
4
  Description: neverlib - 音频处理和VAD工具集
5
5
 
6
- 这是一个提供音频处理、增强、分析和语音活动检测(VAD)功能的Python库。
7
- 该库使用懒加载机制,可以根据需要导入模块,提高启动速度并减少内存占用。
6
+ 这是一个提供音频处理、增强、分析和语音活动检测(VAD)功能的Python库.
7
+ 该库使用懒加载机制, 可以根据需要导入模块, 提高启动速度并减少内存占用.
8
8
 
9
9
  主要功能模块:
10
10
  - utils: 实用工具函数
@@ -14,7 +14,7 @@ Description: neverlib - 音频处理和VAD工具集
14
14
  - data_analyze: 数据分析工具
15
15
  - metrics: 音频质量评估指标
16
16
 
17
- 注意: 所有功能需要通过具体子模块导入,例如:
17
+ 注意: 所有功能需要通过具体子模块导入, 例如:
18
18
  from neverlib.audio_aug import limiter
19
19
  from neverlib.vad import EnergyVad_C
20
20
  from neverlib.filter import HPFilter
@@ -45,13 +45,13 @@ if TYPE_CHECKING:
45
45
  from .filter import HPFilter
46
46
  from .audio_aug import volume_norm
47
47
 
48
- # 懒加载子包,减少初始导入开销
48
+ # 懒加载子包, 减少初始导入开销
49
49
  from lazy_loader import attach
50
50
 
51
51
  __getattr__, __dir__, __all__ = attach(
52
52
  __name__,
53
53
  submodules=["audio_aug", "data_analyze", "filter", "metrics", "utils", "vad", ],
54
- # 只导出子模块,不直接导出函数
54
+ # 只导出子模块, 不直接导出函数
55
55
  submod_attrs={
56
56
  "utils": ["get_path_list"],
57
57
  "filter": ["HPFilter"],
@@ -9,22 +9,22 @@ import soundfile as sf
9
9
 
10
10
  def apply_harmonic_distortion(wav, drive=1.0, mix=1.0):
11
11
  """
12
- 使用 tanh 函数模拟简单的谐波失真(饱和效果)。
12
+ 使用 tanh 函数模拟简单的谐波失真(饱和效果).
13
13
 
14
14
  参数:
15
- wav (np.ndarray): 输入的音频波形。
16
- drive (float): 驱动/输入增益。建议范围 [1.0, 10.0]。值越大失真越严重。
17
- mix (float): 干/湿信号混合比例。范围 [0.0, 1.0]
18
- 0.0 表示纯净原声, 1.0 表示完全失真的声音。
15
+ wav (np.ndarray): 输入的音频波形.
16
+ drive (float): 驱动/输入增益. 建议范围 [1.0, 10.0]. 值越大失真越严重.
17
+ mix (float): 干/湿信号混合比例. 范围 [0.0, 1.0].
18
+ 0.0 表示纯净原声, 1.0 表示完全失真的声音.
19
19
 
20
20
  返回:
21
- np.ndarray: 经过谐波失真的音频波形。
21
+ np.ndarray: 经过谐波失真的音频波形.
22
22
  """
23
23
  # 确保 drive 和 mix 在合理范围
24
24
  drive = max(1.0, drive)
25
25
  mix = np.clip(mix, 0.0, 1.0)
26
26
 
27
- # 1. 归一化(可选但推荐), 以获得更可控的效果
27
+ # 1. 归一化(可选但推荐), 以获得更可控的效果
28
28
  peak = np.max(np.abs(wav))
29
29
  if peak == 0:
30
30
  return wav
@@ -45,12 +45,12 @@ def apply_harmonic_distortion(wav, drive=1.0, mix=1.0):
45
45
 
46
46
  def apply_pedalboard_distortion(wav, sr, drive_db=15.0):
47
47
  """
48
- 使用 pedalboard 库模拟高质量的谐波失真。
48
+ 使用 pedalboard 库模拟高质量的谐波失真.
49
49
 
50
50
  参数:
51
- wav (np.ndarray): 输入的音频波形。
52
- sr (int): 采样率。
53
- drive_db (float): 驱动增益, 单位是分贝(dB)。值越大失真越严重。
51
+ wav (np.ndarray): 输入的音频波形.
52
+ sr (int): 采样率.
53
+ drive_db (float): 驱动增益, 单位是分贝(dB). 值越大失真越严重.
54
54
  """
55
55
  try:
56
56
  import pedalboard as pdb
@@ -0,0 +1,3 @@
1
+ https://github.com/iver56/audiomentations
2
+ https://github.com/gfdb/wav2aug
3
+ https://github.com/documentation-ai/DocumentationAI-Docs
@@ -4,7 +4,7 @@
4
4
  from typing import TYPE_CHECKING, Any
5
5
 
6
6
  if TYPE_CHECKING:
7
- # 仅在类型检查时导入,提供IDE补全支持
7
+ # 仅在类型检查时导入, 提供IDE补全支持
8
8
  from .HarmonicDistortion import apply_harmonic_distortion, apply_pedalboard_distortion
9
9
  from .TFMask import FreqMask, TimeMask
10
10
  from .audio_aug import add_reverb, get_snr_use_vad, limiter, measure_loudness, snr_aug_Interpolation, snr_aug_changeClean, snr_aug_changeNoise, snr_aug_vad_Interpolation, snr_diff_changeClean, snr_diff_changeNoise, volume_aug, volume_aug_dbrms, volume_aug_linmax, volume_aug_lufs, volume_convert, volume_norm
@@ -79,4 +79,4 @@ if TYPE_CHECKING:
79
79
  'simulate_packet_loss_vectorized',
80
80
  'apply_mulaw_quantization',
81
81
  'apply_uniform_quantization',
82
- ]
82
+ ]
@@ -66,7 +66,7 @@ def snr_aug_changeNoise(clean, noise, target_snr, hpf=False, sr=16000, order=4,
66
66
 
67
67
  def snr_aug_changeClean(clean, noise, target_snr, clip_check=True, hpf=False, sr=16000, order=4, cutoff=100):
68
68
  """
69
- 保持噪声不变,改变纯净语音的幅度以达到目标信噪比
69
+ 保持噪声不变, 改变纯净语音的幅度以达到目标信噪比
70
70
  snr = 10 * log10(k*signal_power/ noise_power)
71
71
  """
72
72
  assert clean.shape == noise.shape, "clean and noise must have the same shape"
@@ -258,7 +258,7 @@ def volume_aug(wav, range, rate, method="linmax"):
258
258
  def volume_aug_dbrms(wav, target_level, hpf=False, sr=16000, order=4, cutoff=100):
259
259
  """
260
260
  音量增强, 使用dbrms方法
261
- 为了避免有冲击响应影响了最大值,所以使用dBRMS方法, 一定要选好范围,不然容易削波
261
+ 为了避免有冲击响应影响了最大值, 所以使用dBRMS方法, 一定要选好范围, 不然容易削波
262
262
  Args:
263
263
  wav: 音频
264
264
  target_level: 目标音量, 单位dB
@@ -303,12 +303,12 @@ def volume_aug_linmax(wav, target_level, hpf=False, sr=16000, order=4, cutoff=10
303
303
  def volume_aug_lufs(wav, target_lufs, hpf=False, sr=16000, order=4, cutoff=100):
304
304
  """
305
305
  音量增强, 使用lufs方法,
306
- LUFS是“感知响度” → 跟人耳听感对齐,而且符合国际响度标准。
306
+ LUFS是“感知响度” → 跟人耳听感对齐, 而且符合国际响度标准.
307
307
 
308
- LUFS 使用 感知加权(K-weighting
309
- - 高频增强(模拟人耳在 3~6kHz 的敏感)
310
- - 低频衰减(降低 <100Hz 对响度的影响)。
311
- 使用 短时块(400ms)能量 + 响度门限(-70 LUFS 过滤极静音段。
308
+ LUFS 使用 感知加权(K-weighting)
309
+ - 高频增强(模拟人耳在 3~6kHz 的敏感)
310
+ - 低频衰减(降低 <100Hz 对响度的影响).
311
+ 使用 短时块(400ms)能量 + 响度门限(-70 LUFS) 过滤极静音段.
312
312
 
313
313
  Args:
314
314
  wav: 音频
@@ -319,7 +319,7 @@ def volume_aug_lufs(wav, target_lufs, hpf=False, sr=16000, order=4, cutoff=100):
319
319
  cutoff: 截止频率
320
320
 
321
321
  补充信息:
322
- ## 推荐的 target_lufs 值(行业参考)
322
+ ## 推荐的 target_lufs 值(行业参考)
323
323
  平台 推荐目标 LUFS
324
324
  YouTube / Spotify -14
325
325
  Apple Music -16
@@ -336,7 +336,7 @@ def volume_aug_lufs(wav, target_lufs, hpf=False, sr=16000, order=4, cutoff=100):
336
336
  if hpf:
337
337
  wav_tmp = HPFilter(wav_tmp, sr=sr, order=4, cutoff=1000)
338
338
 
339
- # Step2: 创建 LUFS 测量器(ITU-R BS.1770
339
+ # Step2: 创建 LUFS 测量器(ITU-R BS.1770)
340
340
  meter = pyln.Meter(sr, block_size=0.400) # block_size=400ms
341
341
 
342
342
  # Step3: 测量当前 LUFS
@@ -353,18 +353,18 @@ def volume_aug_lufs(wav, target_lufs, hpf=False, sr=16000, order=4, cutoff=100):
353
353
 
354
354
  def measure_loudness(wav, sr):
355
355
  """
356
- 测量音频的 Peak / RMS / LUFS,以及峰均比(Crest Factor
356
+ 测量音频的 Peak / RMS / LUFS, 以及峰均比(Crest Factor)
357
357
 
358
358
  参数:
359
- wav: np.ndarray, 音频波形(范围 [-1, 1]
359
+ wav: np.ndarray, 音频波形(范围 [-1, 1])
360
360
  sr: int, 采样率
361
361
 
362
362
  返回:
363
363
  dict:
364
364
  - peak_dbfs: 峰值(dBFS)
365
365
  - rms_dbfs: 均方根电平(dBFS)
366
- - lufs: 感知响度(LUFSITU-R BS.1770-4标准)
367
- - crest_factor_db: 峰均比(dB),峰值与RMS的差值
366
+ - lufs: 感知响度(LUFS, ITU-R BS.1770-4标准)
367
+ - crest_factor_db: 峰均比(dB), 峰值与RMS的差值
368
368
  """
369
369
  EPS = 1e-9
370
370
 
@@ -399,23 +399,23 @@ def volume_convert(value,
399
399
 
400
400
  参数:
401
401
  value: float
402
- 输入值(可能是线性幅度、dBFS、LUFS
402
+ 输入值(可能是线性幅度、dBFS、LUFS)
403
403
  from_unit: str
404
404
  输入单位: "linear", "dBFS", "RMS_dBFS", "LUFS"
405
405
  to_unit: str
406
406
  输出单位: "linear", "dBFS", "RMS_dBFS", "LUFS"
407
407
  crest_factor_db: float | None
408
- 峰均比(用于 Peak <-> RMS 的转换)
408
+ 峰均比(用于 Peak <-> RMS 的转换)
409
409
  lufs_offset: float | None
410
- LUFS 与 RMS 的差值(用于 RMS <-> LUFS 转换)
411
- 例如, 对人声,LUFS ≈ RMS_dBFS - 1.5
410
+ LUFS 与 RMS 的差值(用于 RMS <-> LUFS 转换)
411
+ 例如, 对人声, LUFS ≈ RMS_dBFS - 1.5
412
412
 
413
413
  返回:
414
414
  float
415
415
  """
416
416
  EPS = 1e-9
417
417
 
418
- # Step 1: 统一转换成线性幅度(以满刻度 1.0 为基准)
418
+ # Step 1: 统一转换成线性幅度(以满刻度 1.0 为基准)
419
419
  if from_unit == "linear":
420
420
  lin_val = value
421
421
  elif from_unit in ("dBFS", "Peak_dBFS"):
@@ -6,19 +6,19 @@ Description:
6
6
  """
7
7
  语音编码器数据增强
8
8
  MP3 (MPEG-1 Audio Layer III)
9
- - 主要用途:音乐分发、播客。互联网音频的“元老”和事实标准。
10
- - 压缩特性:在中低码率下, 高频部分可能会有“嗖嗖”声或模糊感 (swishing artifacts)
11
- - 数据增强目的:模拟通用网络音频压缩。
9
+ - 主要用途:音乐分发、播客. 互联网音频的“元老”和事实标准.
10
+ - 压缩特性:在中低码率下, 高频部分可能会有“嗖嗖”声或模糊感 (swishing artifacts).
11
+ - 数据增强目的:模拟通用网络音频压缩.
12
12
 
13
13
  AAC (Advanced Audio Coding)
14
- - 主要用途:流媒体、视频文件、现代设备。被认为是 MP3 的继任者。
15
- - 压缩特性:在同等码率下, 通常比 MP3 保留更多高频细节, 音质更好。
16
- - 数据增强目的:模拟现代流媒体和移动设备上的音频压缩。
14
+ - 主要用途:流媒体、视频文件、现代设备. 被认为是 MP3 的继任者.
15
+ - 压缩特性:在同等码率下, 通常比 MP3 保留更多高频细节, 音质更好.
16
+ - 数据增强目的:模拟现代流媒体和移动设备上的音频压缩.
17
17
 
18
18
  AMR (Adaptive Multi-Rate)
19
- - 主要用途:语音通话、移动通信。专为语音优化。
20
- - 压缩特性:严格为语音设计, 会滤除大部分非语音频率(如音乐), 导致音乐听起来“电话音”效果。
21
- - 数据增强目的:固定采样率:AMR-NB (窄带) 为 8kHz, AMR-WB (宽带) 为 16kHz。这一点至关重要!
19
+ - 主要用途:语音通话、移动通信. 专为语音优化.
20
+ - 压缩特性:严格为语音设计, 会滤除大部分非语音频率(如音乐), 导致音乐听起来“电话音”效果.
21
+ - 数据增强目的:固定采样率:AMR-NB (窄带) 为 8kHz, AMR-WB (宽带) 为 16kHz. 这一点至关重要!
22
22
  """
23
23
  import random
24
24
  import numpy as np
@@ -48,8 +48,8 @@ def flac_aug(wav, sr):
48
48
 
49
49
  def opus_aug_save(wav: np.ndarray, sr: int, output_filepath: str):
50
50
  """
51
- 对音频进行 Opus 压缩, 并直接保存到文件。
52
- 使用 PyAV 实现, 比特率是随机的。
51
+ 对音频进行 Opus 压缩, 并直接保存到文件.
52
+ 使用 PyAV 实现, 比特率是随机的.
53
53
  """
54
54
  try:
55
55
  import av
@@ -91,8 +91,8 @@ def opus_aug_save(wav: np.ndarray, sr: int, output_filepath: str):
91
91
 
92
92
  def aac_aug_save(wav: np.ndarray, sr: int, output_filepath: str):
93
93
  """
94
- 对音频进行 AAC 压缩, 并直接保存到文件。
95
- 使用 PyAV 实现, 比特率是随机的。
94
+ 对音频进行 AAC 压缩, 并直接保存到文件.
95
+ 使用 PyAV 实现, 比特率是随机的.
96
96
  """
97
97
  try:
98
98
  import av
@@ -139,23 +139,23 @@ def flac_encode_save(wav: np.ndarray,
139
139
  compression_level: int = 5,
140
140
  bits_per_sample=None):
141
141
  """
142
- 使用 pyFLAC 将 NumPy 音频数组编码为 FLAC 文件并保存。
142
+ 使用 pyFLAC 将 NumPy 音频数组编码为 FLAC 文件并保存.
143
143
 
144
144
  参数:
145
- wav (np.ndarray): 输入的音频数据。可以是 float 类型 (范围 -1.0 到 1.0)
146
- 或 int16/int32 类型。
147
- sr (int): 音频的采样率。
148
- output_filepath (str): 输出的 .flac 文件路径。
149
- compression_level (int, optional): FLAC 压缩级别, 范围 0 (最快) 到 8 (最高压缩, 最慢)
150
- 默认为 5, 是一个很好的平衡点。
151
- bits_per_sample (int, optional): 每个样本的位数。通常是 16 或 24
152
- 如果为 None, 函数会根据输入 wav 的 dtype 自动推断。
153
- 默认为 None
145
+ wav (np.ndarray): 输入的音频数据. 可以是 float 类型 (范围 -1.0 到 1.0)
146
+ 或 int16/int32 类型.
147
+ sr (int): 音频的采样率.
148
+ output_filepath (str): 输出的 .flac 文件路径.
149
+ compression_level (int, optional): FLAC 压缩级别, 范围 0 (最快) 到 8 (最高压缩, 最慢).
150
+ 默认为 5, 是一个很好的平衡点.
151
+ bits_per_sample (int, optional): 每个样本的位数. 通常是 16 或 24.
152
+ 如果为 None, 函数会根据输入 wav 的 dtype 自动推断.
153
+ 默认为 None.
154
154
  """
155
155
 
156
156
  # --- 1. 数据类型和位深处理 ---
157
- # pyFLAC 的 Encoder 需要 int16 或 int32 格式的 NumPy 数组。
158
- # 我们需要根据输入数据进行转换。
157
+ # pyFLAC 的 Encoder 需要 int16 或 int32 格式的 NumPy 数组.
158
+ # 我们需要根据输入数据进行转换.
159
159
 
160
160
  if bits_per_sample is None:
161
161
  # 自动推断位深
@@ -22,17 +22,17 @@ def check_codec_available(codec):
22
22
 
23
23
  def apply_codec_distortion(wav, sr, codec='libopus', bitrate='24k'):
24
24
  """
25
- 使用 FFmpeg 对音频应用指定的编解码器和码率, 以模拟有损压缩失真。
25
+ 使用 FFmpeg 对音频应用指定的编解码器和码率, 以模拟有损压缩失真.
26
26
 
27
27
  参数:
28
- wav (np.ndarray): 输入的音频波形。
29
- sr (int): 采样率。
30
- codec (str): FFmpeg 支持的编码器名称。
31
- 例如: 'aac', 'libopus', 'amr_nb', 'amr_wb', 'mp3'
32
- bitrate (str): 目标码率, FFmpeg 格式。例如: '64k', '24k', '12.2k'
28
+ wav (np.ndarray): 输入的音频波形.
29
+ sr (int): 采样率.
30
+ codec (str): FFmpeg 支持的编码器名称.
31
+ 例如: 'aac', 'libopus', 'amr_nb', 'amr_wb', 'mp3'.
32
+ bitrate (str): 目标码率, FFmpeg 格式. 例如: '64k', '24k', '12.2k'.
33
33
 
34
34
  返回:
35
- np.ndarray: 经过编解码器失真的音频波形。
35
+ np.ndarray: 经过编解码器失真的音频波形.
36
36
  """
37
37
  # 检查编解码器是否可用
38
38
  if not check_codec_available(codec):
@@ -108,17 +108,17 @@ if __name__ == "__main__":
108
108
  wav_path = "/data/never/Desktop/kws_train/QA/wav_data/TIMIT.wav"
109
109
  wav, wav_sr = sf.read(wav_path, always_2d=True)
110
110
 
111
- # 1. 模拟 Opus 编解码器(常用于VoIP, WebRTC
111
+ # 1. 模拟 Opus 编解码器(常用于VoIP, WebRTC)
112
112
  print("应用 Opus 编解码器失真...")
113
113
  opus_wav = apply_codec_distortion(wav, wav_sr, codec='libopus', bitrate='24k')
114
114
  sf.write('augmented_opus.wav', opus_wav, wav_sr)
115
115
 
116
- # 2. 模拟 AAC 编解码器(常用于流媒体, Apple设备)
116
+ # 2. 模拟 AAC 编解码器(常用于流媒体, Apple设备)
117
117
  print("应用 AAC 编解码器失真...")
118
118
  aac_wav = apply_codec_distortion(wav, wav_sr, codec='aac', bitrate='64k')
119
119
  sf.write('augmented_aac.wav', aac_wav, wav_sr)
120
120
 
121
- # 3. 模拟 AMR-NB 编解码器(常用于传统移动通信)
121
+ # 3. 模拟 AMR-NB 编解码器(常用于传统移动通信)
122
122
  # AMR-NB 的码率是固定的几个值之一
123
123
  amr_bitrates = [
124
124
  '4.75k', '5.15k', '5.9k', '6.7k', '7.4k', '7.95k', '10.2k', '12.2k'
@@ -3,19 +3,19 @@ Author: 凌逆战 | Never
3
3
  Date: 2025-07-29 16:28:23
4
4
  Description: 丢包数据增强
5
5
  “置零” vs “缺失”:两种不同的模拟思路
6
- 结论:对于音质修复, 强烈推荐使用“置零”法, 而不是“删除”法。
6
+ 结论:对于音质修复, 强烈推荐使用“置零”法, 而不是“删除”法.
7
7
 
8
8
  理由如下:
9
9
 
10
- - 保持时序对齐 (Temporal Alignment): 在音质修复任务中, 模型需要一个一一对应的关系。输入 damaged_audio 的第 t 秒, 应该对应输出 repaired_audio 的第 t 秒, 也对应原始 original_audio 的第 t 秒。
11
- 如果使用“删除”法, 输入音频变短, 这种对齐关系就被破坏了, 模型无法学习 (损坏的t时刻) -> (修复的t时刻) 的映射。
12
- - 简化模型训练: 输入和输出的长度保持一致, 意味着你可以直接使用标准的模型架构(如 U-Net), 而不需要处理复杂的可变长度序列问题。
13
- - 更贴近修复任务的本质: 音质修复, 特别是丢包补偿 (Packet Loss Concealment, PLC), 其任务本质是**“根据上下文, 猜测并填充一段丢失的音频”**。
10
+ - 保持时序对齐 (Temporal Alignment): 在音质修复任务中, 模型需要一个一一对应的关系. 输入 damaged_audio 的第 t 秒, 应该对应输出 repaired_audio 的第 t 秒, 也对应原始 original_audio 的第 t 秒.
11
+ 如果使用“删除”法, 输入音频变短, 这种对齐关系就被破坏了, 模型无法学习 (损坏的t时刻) -> (修复的t时刻) 的映射.
12
+ - 简化模型训练: 输入和输出的长度保持一致, 意味着你可以直接使用标准的模型架构(如 U-Net), 而不需要处理复杂的可变长度序列问题.
13
+ - 更贴近修复任务的本质: 音质修复, 特别是丢包补偿 (Packet Loss Concealment, PLC), 其任务本质是**“根据上下文, 猜测并填充一段丢失的音频”**.
14
14
 
15
- “置零”法完美地创造了这样一个场景:模型看到了上下文, 也看到了一个明确的“空白”(零区域), 它的任务就是把这个空白填上。
16
- “删除”法则改变了问题的性质, 变成了“检测不连续点并试图将其平滑化”, 这与 PLC 的目标不完全一致。
15
+ “置零”法完美地创造了这样一个场景:模型看到了上下文, 也看到了一个明确的“空白”(零区域), 它的任务就是把这个空白填上.
16
+ “删除”法则改变了问题的性质, 变成了“检测不连续点并试图将其平滑化”, 这与 PLC 的目标不完全一致.
17
17
 
18
- “置零”是在深度学习框架下对“真正丢弃”问题的一种高效、可解的数学建模。 我们牺牲了一点点物理上的真实性, 换来了模型训练的可行性和高效性。
18
+ “置零”是在深度学习框架下对“真正丢弃”问题的一种高效、可解的数学建模. 我们牺牲了一点点物理上的真实性, 换来了模型训练的可行性和高效性.
19
19
  '''
20
20
  import numpy as np
21
21
  import soundfile as sf
@@ -29,20 +29,20 @@ def simulate_packet_loss_vectorized(
29
29
  burst_prob: float = 0.2
30
30
  ) -> np.ndarray:
31
31
  """
32
- 模拟带有突发性的网络丢包(向量化版本)。
33
- 使用 NumPy 的向量化操作以获得极高的性能, 避免在 Python 中使用 for 循环。
32
+ 模拟带有突发性的网络丢包(向量化版本).
33
+ 使用 NumPy 的向量化操作以获得极高的性能, 避免在 Python 中使用 for 循环.
34
34
 
35
35
  参数:
36
- - wav: 原始音频波形 (NumPy 数组)
37
- - sample_rate: 采样率。
38
- - packet_duration_ms: 每个数据包的时长(毫秒)。
36
+ - wav: 原始音频波形 (NumPy 数组).
37
+ - sample_rate: 采样率.
38
+ - packet_duration_ms: 每个数据包的时长(毫秒).
39
39
  packet_duration_ms_list= np.arange(10, 60, 5) # 包时长一般为10-60ms, 5ms间隔
40
40
  packet_duration_ms = random.choice(packet_duration_ms_list)
41
- - loss_rate: 基础丢包率。
42
- - burst_prob: 突发丢包概率。
41
+ - loss_rate: 基础丢包率.
42
+ - burst_prob: 突发丢包概率.
43
43
 
44
44
  返回:
45
- - 损坏后的音频波形(与原始长度相同)。
45
+ - 损坏后的音频波形(与原始长度相同).
46
46
  """
47
47
  # 0. 复制数组, 避免修改原始输入
48
48
  damaged_wav = wav.copy()
@@ -9,14 +9,14 @@ import soundfile as sf
9
9
 
10
10
  def apply_uniform_quantization(wav, bit_depth=8):
11
11
  """
12
- 对音频应用均匀量化, 模拟较低位深度的效果。
12
+ 对音频应用均匀量化, 模拟较低位深度的效果.
13
13
 
14
14
  参数:
15
- wav (np.ndarray): 输入的音频波形, 值应在 [-1.0, 1.0] 范围内。
16
- bit_depth (int): 目标模拟的位深度。
15
+ wav (np.ndarray): 输入的音频波形, 值应在 [-1.0, 1.0] 范围内.
16
+ bit_depth (int): 目标模拟的位深度.
17
17
 
18
18
  返回:
19
- np.ndarray: 量化后的音频波形。
19
+ np.ndarray: 量化后的音频波形.
20
20
  """
21
21
  # 计算量化级别数
22
22
  num_levels = 2 ** bit_depth
@@ -36,11 +36,11 @@ def apply_uniform_quantization(wav, bit_depth=8):
36
36
 
37
37
  def apply_mulaw_quantization(wav, bit_depth=8):
38
38
  """
39
- 【最终正确版】使用 mu_compress 和 mu_expand 模拟 μ-law 量化失真。
39
+ 【最终正确版】使用 mu_compress 和 mu_expand 模拟 μ-law 量化失真.
40
40
 
41
41
  参数:
42
- wav (np.ndarray): 输入音频。
43
- bit_depth (int): 目标模拟的位深度。
42
+ wav (np.ndarray): 输入音频.
43
+ bit_depth (int): 目标模拟的位深度.
44
44
  """
45
45
  try:
46
46
  import librosa
@@ -1,6 +1,6 @@
1
1
  # 音频数据分析模块 (Audio Data Analysis Module)
2
2
 
3
- 这个模块提供了完整的音频数据分析功能, 包括特征提取、质量评估、统计分析和可视化等。
3
+ 这个模块提供了完整的音频数据分析功能, 包括特征提取、质量评估、统计分析和可视化等.
4
4
 
5
5
  ## 模块结构
6
6