neverlib 0.2.4__py3-none-any.whl → 0.2.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. neverlib/.history/Docs/audio_aug/del_20250827162530.py +0 -0
  2. neverlib/.history/Docs/audio_aug/del_20250827162540.py +2 -0
  3. neverlib/.history/Docs/audio_aug/del_20250827162541.py +7 -0
  4. neverlib/.history/Docs/audio_aug/del_20250827162606.py +7 -0
  5. neverlib/.history/Docs/audio_aug/del_20250827162637.py +8 -0
  6. neverlib/.history/Docs/audio_aug/del_20250827162645.py +8 -0
  7. neverlib/.history/Docs/audio_aug/del_20250827162723.py +9 -0
  8. neverlib/.history/Docs/audio_aug/del_20250827162739.py +9 -0
  9. neverlib/.history/Docs/audio_aug/test_snr_20250827161751.py +55 -0
  10. neverlib/.history/Docs/audio_aug/test_snr_20250827161754.py +55 -0
  11. neverlib/.history/Docs/audio_aug/test_snr_20250827161833.py +54 -0
  12. neverlib/.history/Docs/audio_aug/test_snr_20250827162017.py +56 -0
  13. neverlib/.history/Docs/audio_aug/test_snr_20250827162021.py +57 -0
  14. neverlib/.history/Docs/audio_aug/test_snr_20250827162028.py +57 -0
  15. neverlib/.history/Docs/audio_aug_test/del_20250827162738.py +9 -0
  16. neverlib/.history/Docs/audio_aug_test/del_20250827162819.py +9 -0
  17. neverlib/.history/Docs/audio_aug_test/del_20250827162830.py +9 -0
  18. neverlib/.history/Docs/audio_aug_test/del_20250827162846.py +9 -0
  19. neverlib/.history/Docs/audio_aug_test/del_20250827162851.py +9 -0
  20. neverlib/.history/Docs/audio_aug_test/del_20250827162903.py +10 -0
  21. neverlib/.history/Docs/audio_aug_test/del_20250827162921.py +10 -0
  22. neverlib/.history/Docs/audio_aug_test/del_20250827162926.py +10 -0
  23. neverlib/.history/Docs/audio_aug_test/del_20250827163030.py +10 -0
  24. neverlib/.history/Docs/audio_aug_test/del_20250827163032.py +10 -0
  25. neverlib/.history/QA/html2markdown_20250822234112.md +0 -0
  26. neverlib/.history/QA/html2markdown_20250822234140.py +9 -0
  27. neverlib/.history/QA/html2markdown_20250822234141.md +9 -0
  28. neverlib/.history/QA/html2markdown_20250822234159.py +12 -0
  29. neverlib/.history/QA/html2markdown_20250822234200.py +17 -0
  30. neverlib/.history/QA/html2markdown_20250822234236.py +17 -0
  31. neverlib/.history/QA/html2markdown_20250822234340.py +14 -0
  32. neverlib/.history/QA/html2markdown_20250822234522.py +18 -0
  33. neverlib/.history/QA/html2markdown_20250822234601.py +20 -0
  34. neverlib/.history/QA/html2markdown_20250822234615.py +22 -0
  35. neverlib/.history/QA/html2markdown_20250822234715.py +28 -0
  36. neverlib/.history/QA/html2markdown_20250822234720.py +27 -0
  37. neverlib/.history/QA/html2markdown_20250822234903.py +27 -0
  38. neverlib/.history/__init___20250805234212.py +41 -0
  39. neverlib/.history/__init___20250904102635.py +39 -0
  40. neverlib/.history/__init___20250904102836.py +34 -0
  41. neverlib/.history/__init___20250904102838.py +39 -0
  42. neverlib/.history/__init___20250904102851.py +33 -0
  43. neverlib/.history/audio_aug/audio_aug_20250826155913.py +158 -0
  44. neverlib/.history/audio_aug/audio_aug_20250826164159.py +159 -0
  45. neverlib/.history/audio_aug/audio_aug_20250826164217.py +160 -0
  46. neverlib/.history/audio_aug/audio_aug_20250826164408.py +161 -0
  47. neverlib/.history/audio_aug/audio_aug_20250826164423.py +161 -0
  48. neverlib/.history/audio_aug/audio_aug_20250826164529.py +161 -0
  49. neverlib/.history/audio_aug/audio_aug_20250826164824.py +161 -0
  50. neverlib/.history/audio_aug/audio_aug_20250826164932.py +162 -0
  51. neverlib/.history/audio_aug/audio_aug_20250826164947.py +162 -0
  52. neverlib/.history/audio_aug/audio_aug_20250826165403.py +162 -0
  53. neverlib/.history/audio_aug/audio_aug_20250826165421.py +162 -0
  54. neverlib/.history/audio_aug/audio_aug_20250826165509.py +163 -0
  55. neverlib/.history/audio_aug/audio_aug_20250826165702.py +163 -0
  56. neverlib/.history/audio_aug/audio_aug_20250826165732.py +165 -0
  57. neverlib/.history/audio_aug/audio_aug_20250826170041.py +163 -0
  58. neverlib/.history/audio_aug/audio_aug_20250826170105.py +164 -0
  59. neverlib/.history/audio_aug/audio_aug_20250826170154.py +164 -0
  60. neverlib/.history/audio_aug/audio_aug_20250826170220.py +165 -0
  61. neverlib/.history/audio_aug/audio_aug_20250826170221.py +165 -0
  62. neverlib/.history/audio_aug/audio_aug_20250826170228.py +165 -0
  63. neverlib/.history/audio_aug/audio_aug_20250826170231.py +165 -0
  64. neverlib/.history/audio_aug/audio_aug_20250826212001.py +165 -0
  65. neverlib/.history/audio_aug/audio_aug_20250826220038.py +165 -0
  66. neverlib/.history/audio_aug/audio_aug_20250826220133.py +165 -0
  67. neverlib/.history/audio_aug/audio_aug_20250826220148.py +165 -0
  68. neverlib/.history/audio_aug/audio_aug_20250826220154.py +165 -0
  69. neverlib/.history/audio_aug/audio_aug_20250826220156.py +165 -0
  70. neverlib/.history/audio_aug/audio_aug_20250826220314.py +165 -0
  71. neverlib/.history/audio_aug/audio_aug_20250826220343.py +184 -0
  72. neverlib/.history/audio_aug/audio_aug_20250826220345.py +184 -0
  73. neverlib/.history/audio_aug/audio_aug_20250826220349.py +184 -0
  74. neverlib/.history/audio_aug/audio_aug_20250826220429.py +184 -0
  75. neverlib/.history/audio_aug/audio_aug_20250826220447.py +184 -0
  76. neverlib/.history/audio_aug/audio_aug_20250826220601.py +186 -0
  77. neverlib/.history/audio_aug/audio_aug_20250826220638.py +186 -0
  78. neverlib/.history/audio_aug/audio_aug_20250826220641.py +186 -0
  79. neverlib/.history/audio_aug/audio_aug_20250826220647.py +186 -0
  80. neverlib/.history/audio_aug/audio_aug_20250826220653.py +186 -0
  81. neverlib/.history/audio_aug/audio_aug_20250826220655.py +186 -0
  82. neverlib/.history/audio_aug/audio_aug_20250826220731.py +185 -0
  83. neverlib/.history/audio_aug/audio_aug_20250826220739.py +185 -0
  84. neverlib/.history/audio_aug/audio_aug_20250826220747.py +185 -0
  85. neverlib/.history/audio_aug/audio_aug_20250826220801.py +186 -0
  86. neverlib/.history/audio_aug/audio_aug_20250826220822.py +186 -0
  87. neverlib/.history/audio_aug/audio_aug_20250826220901.py +186 -0
  88. neverlib/.history/audio_aug/audio_aug_20250826221107.py +187 -0
  89. neverlib/.history/audio_aug/audio_aug_20250826221310.py +188 -0
  90. neverlib/.history/audio_aug/audio_aug_20250826221353.py +191 -0
  91. neverlib/.history/audio_aug/audio_aug_20250826221821.py +191 -0
  92. neverlib/.history/audio_aug/audio_aug_20250826221838.py +191 -0
  93. neverlib/.history/audio_aug/audio_aug_20250826221906.py +191 -0
  94. neverlib/.history/audio_aug/audio_aug_20250826221930.py +191 -0
  95. neverlib/.history/audio_aug/audio_aug_20250826221939.py +191 -0
  96. neverlib/.history/audio_aug/audio_aug_20250826221955.py +191 -0
  97. neverlib/.history/audio_aug/audio_aug_20250826222008.py +197 -0
  98. neverlib/.history/audio_aug/audio_aug_20250826222017.py +200 -0
  99. neverlib/.history/audio_aug/audio_aug_20250826222046.py +203 -0
  100. neverlib/.history/audio_aug/audio_aug_20250826222105.py +203 -0
  101. neverlib/.history/audio_aug/audio_aug_20250826222206.py +203 -0
  102. neverlib/.history/audio_aug/audio_aug_20250826222302.py +203 -0
  103. neverlib/.history/audio_aug/audio_aug_20250826222336.py +203 -0
  104. neverlib/.history/audio_aug/audio_aug_20250826222455.py +204 -0
  105. neverlib/.history/audio_aug/audio_aug_20250826222526.py +204 -0
  106. neverlib/.history/audio_aug/audio_aug_20250826222541.py +204 -0
  107. neverlib/.history/audio_aug/audio_aug_20250826222624.py +202 -0
  108. neverlib/.history/audio_aug/audio_aug_20250826222714.py +205 -0
  109. neverlib/.history/audio_aug/audio_aug_20250826222820.py +205 -0
  110. neverlib/.history/audio_aug/audio_aug_20250826222827.py +205 -0
  111. neverlib/.history/audio_aug/audio_aug_20250826222927.py +232 -0
  112. neverlib/.history/audio_aug/audio_aug_20250826223009.py +232 -0
  113. neverlib/.history/audio_aug/audio_aug_20250826223054.py +232 -0
  114. neverlib/.history/audio_aug/audio_aug_20250826223225.py +233 -0
  115. neverlib/.history/audio_aug/audio_aug_20250826223344.py +236 -0
  116. neverlib/.history/audio_aug/audio_aug_20250826223356.py +236 -0
  117. neverlib/.history/audio_aug/audio_aug_20250826223955.py +242 -0
  118. neverlib/.history/audio_aug/audio_aug_20250826224210.py +240 -0
  119. neverlib/.history/audio_aug/audio_aug_20250826224250.py +242 -0
  120. neverlib/.history/audio_aug/audio_aug_20250826224323.py +280 -0
  121. neverlib/.history/audio_aug/audio_aug_20250826224452.py +263 -0
  122. neverlib/.history/audio_aug/audio_aug_20250826224455.py +263 -0
  123. neverlib/.history/audio_aug/audio_aug_20250826224502.py +263 -0
  124. neverlib/.history/audio_aug/audio_aug_20250826224528.py +263 -0
  125. neverlib/.history/audio_aug/audio_aug_20250826224658.py +263 -0
  126. neverlib/.history/audio_aug/audio_aug_20250826224833.py +264 -0
  127. neverlib/.history/audio_aug/audio_aug_20250826225013.py +269 -0
  128. neverlib/.history/audio_aug/audio_aug_20250826225050.py +269 -0
  129. neverlib/.history/audio_aug/audio_aug_20250826225241.py +268 -0
  130. neverlib/.history/audio_aug/audio_aug_20250826225315.py +266 -0
  131. neverlib/.history/audio_aug/audio_aug_20250826225404.py +266 -0
  132. neverlib/.history/audio_aug/audio_aug_20250826225502.py +265 -0
  133. neverlib/.history/audio_aug/audio_aug_20250826225950.py +267 -0
  134. neverlib/.history/audio_aug/audio_aug_20250826225959.py +268 -0
  135. neverlib/.history/audio_aug/audio_aug_20250826230222.py +271 -0
  136. neverlib/.history/audio_aug/audio_aug_20250826230248.py +270 -0
  137. neverlib/.history/audio_aug/audio_aug_20250826230638.py +266 -0
  138. neverlib/.history/audio_aug/audio_aug_20250826230755.py +266 -0
  139. neverlib/.history/audio_aug/audio_aug_20250826230941.py +265 -0
  140. neverlib/.history/audio_aug/audio_aug_20250826231054.py +266 -0
  141. neverlib/.history/audio_aug/audio_aug_20250826231117.py +266 -0
  142. neverlib/.history/audio_aug/audio_aug_20250826231219.py +266 -0
  143. neverlib/.history/audio_aug/audio_aug_20250826232330.py +266 -0
  144. neverlib/.history/audio_aug/audio_aug_20250826232352.py +266 -0
  145. neverlib/.history/audio_aug/audio_aug_20250827152748.py +268 -0
  146. neverlib/.history/audio_aug/audio_aug_20250827152806.py +268 -0
  147. neverlib/.history/audio_aug/audio_aug_20250827152808.py +268 -0
  148. neverlib/.history/audio_aug/audio_aug_20250827152917.py +283 -0
  149. neverlib/.history/audio_aug/audio_aug_20250827152929.py +281 -0
  150. neverlib/.history/audio_aug/audio_aug_20250827153100.py +286 -0
  151. neverlib/.history/audio_aug/audio_aug_20250827153102.py +286 -0
  152. neverlib/.history/audio_aug/audio_aug_20250827153301.py +295 -0
  153. neverlib/.history/audio_aug/audio_aug_20250827153331.py +298 -0
  154. neverlib/.history/audio_aug/audio_aug_20250827153525.py +303 -0
  155. neverlib/.history/audio_aug/audio_aug_20250827153533.py +304 -0
  156. neverlib/.history/audio_aug/audio_aug_20250827153541.py +321 -0
  157. neverlib/.history/audio_aug/audio_aug_20250827153805.py +322 -0
  158. neverlib/.history/audio_aug/audio_aug_20250827153832.py +323 -0
  159. neverlib/.history/audio_aug/audio_aug_20250827153836.py +324 -0
  160. neverlib/.history/audio_aug/audio_aug_20250827153846.py +324 -0
  161. neverlib/.history/audio_aug/audio_aug_20250827153859.py +325 -0
  162. neverlib/.history/audio_aug/audio_aug_20250827154453.py +337 -0
  163. neverlib/.history/audio_aug/audio_aug_20250827154513.py +355 -0
  164. neverlib/.history/audio_aug/audio_aug_20250827154538.py +356 -0
  165. neverlib/.history/audio_aug/audio_aug_20250827154541.py +357 -0
  166. neverlib/.history/audio_aug/audio_aug_20250827154612.py +357 -0
  167. neverlib/.history/audio_aug/audio_aug_20250827154657.py +360 -0
  168. neverlib/.history/audio_aug/audio_aug_20250827154708.py +360 -0
  169. neverlib/.history/audio_aug/audio_aug_20250827154728.py +366 -0
  170. neverlib/.history/audio_aug/audio_aug_20250827154755.py +367 -0
  171. neverlib/.history/audio_aug/audio_aug_20250827154800.py +367 -0
  172. neverlib/.history/audio_aug/audio_aug_20250827154917.py +368 -0
  173. neverlib/.history/audio_aug/audio_aug_20250827154928.py +369 -0
  174. neverlib/.history/audio_aug/audio_aug_20250827154932.py +370 -0
  175. neverlib/.history/audio_aug/audio_aug_20250827154947.py +372 -0
  176. neverlib/.history/audio_aug/audio_aug_20250827155015.py +375 -0
  177. neverlib/.history/audio_aug/audio_aug_20250827155106.py +375 -0
  178. neverlib/.history/audio_aug/audio_aug_20250827155114.py +393 -0
  179. neverlib/.history/audio_aug/audio_aug_20250827155207.py +415 -0
  180. neverlib/.history/audio_aug/audio_aug_20250827155300.py +415 -0
  181. neverlib/.history/audio_aug/audio_aug_20250827155321.py +471 -0
  182. neverlib/.history/audio_aug/audio_aug_20250827164703.py +471 -0
  183. neverlib/.history/audio_aug/audio_aug_20250827164749.py +471 -0
  184. neverlib/.history/audio_aug/audio_aug_20250827165252.py +472 -0
  185. neverlib/.history/audio_aug/audio_aug_20250827165334.py +472 -0
  186. neverlib/.history/audio_aug/audio_aug_20250827165404.py +473 -0
  187. neverlib/.history/audio_aug/audio_aug_20250827165610.py +473 -0
  188. neverlib/.history/audio_aug/audio_aug_20250827165805.py +473 -0
  189. neverlib/.history/audio_aug/audio_aug_20250827170056.py +473 -0
  190. neverlib/.history/audio_aug/audio_aug_20250827170106.py +472 -0
  191. neverlib/.history/audio_aug/audio_aug_20250827170143.py +472 -0
  192. neverlib/.history/audio_aug/audio_aug_20250827170216.py +472 -0
  193. neverlib/.history/audio_aug/audio_aug_20250827170218.py +472 -0
  194. neverlib/.history/audio_aug/audio_aug_20250827170314.py +472 -0
  195. neverlib/.history/audio_aug/audio_aug_20250827171500.py +471 -0
  196. neverlib/.history/audio_aug/audio_aug_20250827172347.py +471 -0
  197. neverlib/.history/audio_aug/audio_aug_20250827172558.py +470 -0
  198. neverlib/.history/audio_aug/audio_aug_20250827172559.py +470 -0
  199. neverlib/.history/audio_aug/audio_aug_20250827172801.py +470 -0
  200. neverlib/.history/audio_aug/audio_aug_20250827182522.py +470 -0
  201. neverlib/.history/audio_aug/audio_aug_20250827182526.py +470 -0
  202. neverlib/.history/audio_aug/audio_aug_20250827182626.py +470 -0
  203. neverlib/.history/audio_aug/audio_aug_20250827182715.py +470 -0
  204. neverlib/.history/audio_aug/audio_aug_20250904185444.py +470 -0
  205. neverlib/.history/audio_aug/audio_aug_20250904185538.py +445 -0
  206. neverlib/.history/data_analyze/__init___20250806204158.py +14 -0
  207. neverlib/.history/data_analyze/__init___20250827163248.py +14 -0
  208. neverlib/.history/filter/auto_eq/freq_eq_20250821143140.py +76 -0
  209. neverlib/.history/filter/auto_eq/freq_eq_20250821153208.py +76 -0
  210. neverlib/.history/filter/auto_eq/freq_eq_20250821153214.py +76 -0
  211. neverlib/.history/filter/auto_eq/ga_eq_basic_20250901110521.py +385 -0
  212. neverlib/.history/filter/auto_eq/ga_eq_basic_20250901110652.py +385 -0
  213. neverlib/.history/filter/common_20250806002134.py +37 -0
  214. neverlib/.history/filter/common_20250821120448.py +49 -0
  215. neverlib/.history/filter/common_20250821120453.py +49 -0
  216. neverlib/.history/metrics/snr_20250827224201.py +182 -0
  217. neverlib/.history/metrics/snr_20250827234019.py +186 -0
  218. neverlib/.history/metrics/snr_20250827234028.py +186 -0
  219. neverlib/.history/metrics/snr_20250827234030.py +186 -0
  220. neverlib/.history/utils/audio_split_20250805234209.py +268 -0
  221. neverlib/.history/utils/audio_split_20250904185309.py +268 -0
  222. neverlib/.history/utils/utils_20250813165516.py +330 -0
  223. neverlib/.history/utils/utils_20250904181341.py +328 -0
  224. neverlib/.history/utils/utils_20250904185546.py +352 -0
  225. neverlib/.history/utils/utils_20250904185548.py +353 -0
  226. neverlib/.history/utils/utils_20250904185603.py +353 -0
  227. neverlib/.history/utils/utils_20250904185636.py +353 -0
  228. neverlib/.history/utils/utils_20250904185658.py +358 -0
  229. neverlib/.history/utils/utils_20250904190053.py +359 -0
  230. neverlib/.specstory/history/2025-08-22_02-10Z-/345/256/214/345/226/204/345/207/275/346/225/260/347/232/204/345/212/237/350/203/275/345/222/214/345/217/230/351/207/217/345/220/215/345/273/272/350/256/256.md +247 -0
  231. neverlib/.specstory/history/2025-08-26_11-54Z-oserror-missing-shared-object-file.md +87 -0
  232. neverlib/.specstory/history/2025-08-27_08-07Z-/345/256/214/345/226/204/346/265/213/350/257/225/346/226/207/346/241/243/347/232/204/350/256/250/350/256/272.md +296 -0
  233. neverlib/.specstory/history/2025-08-27_08-29Z-delete-python-file-command.md +211 -0
  234. neverlib/.specstory/history/2025-08-27_09-05Z-/345/234/250jupyter/344/270/255/346/222/255/346/224/276/351/237/263/351/242/221/347/232/204/344/273/243/347/240/201/344/277/256/346/224/271.md +357 -0
  235. neverlib/Docs/audio_aug_test/test_snr.py +55 -0
  236. neverlib/Docs/audio_aug_test/test_volume.py +0 -0
  237. neverlib/QA/html2markdown.py +27 -0
  238. neverlib/__init__.py +10 -20
  239. neverlib/audio_aug/__init__.py +6 -1
  240. neverlib/audio_aug/audio_aug.py +360 -55
  241. neverlib/data_analyze/__init__.py +8 -2
  242. neverlib/data_analyze/temporal_features.py +1 -1
  243. neverlib/filter/__init__.py +9 -3
  244. neverlib/filter/auto_eq/freq_eq.py +1 -1
  245. neverlib/filter/auto_eq/ga_eq_basic.py +3 -3
  246. neverlib/filter/common.py +12 -0
  247. neverlib/metrics/snr.py +5 -3
  248. neverlib/utils/__init__.py +14 -7
  249. neverlib/utils/lazy_module.py +81 -0
  250. neverlib/utils/message.py +3 -8
  251. neverlib/utils/utils.py +32 -3
  252. neverlib/vad/__init__.py +16 -9
  253. neverlib/vad/utils.py +20 -6
  254. {neverlib-0.2.4.dist-info → neverlib-0.2.6.dist-info}/METADATA +21 -17
  255. neverlib-0.2.6.dist-info/RECORD +467 -0
  256. neverlib-0.2.4.dist-info/RECORD +0 -229
  257. /neverlib/{Docs/audio_aug/test_snr.py → .history/Docs/audio_aug/test_snr_20250827162033.py} +0 -0
  258. {neverlib-0.2.4.dist-info → neverlib-0.2.6.dist-info}/WHEEL +0 -0
  259. {neverlib-0.2.4.dist-info → neverlib-0.2.6.dist-info}/licenses/LICENSE +0 -0
  260. {neverlib-0.2.4.dist-info → neverlib-0.2.6.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,359 @@
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(sentence_len, wav_path_list, sr=16000, insert_silence=None):
32
+ """
33
+ 从音频列表中随机拼接指定长度音频
34
+ Args:
35
+ sentence_len: 需要返回的音频长度
36
+ wav_path_list: 音频路径列表
37
+ sr: 采样率
38
+ insert_silence: 插入静音的长度
39
+ Returns:返回指定长度的音频
40
+ """
41
+ merge_wav_len = 0
42
+ wav_list = []
43
+ while merge_wav_len < sentence_len:
44
+ wav_path = random.choice(wav_path_list)
45
+ wav, wav_sr = sf.read(wav_path, always_2d=True, dtype='float32')
46
+ assert wav_sr == sr, f"音频采样率是{wav_sr}, 期望{sr}"
47
+ merge_wav_len += len(wav)
48
+ wav_list.append(wav)
49
+ if insert_silence is not None:
50
+ silence_len = random.randint(0, insert_silence)
51
+ silence = np.zeros((silence_len, ), dtype=np.float32)
52
+ merge_wav_len += silence_len
53
+ wav_list.append(silence)
54
+ wav = np.concatenate(wav_list, axis=0)
55
+ if len(wav) > sentence_len:
56
+ # 随机截取clean_len
57
+ start = random.randint(0, merge_wav_len - sentence_len)
58
+ wav = wav[start:start + sentence_len, :]
59
+ return wav
60
+
61
+
62
+ def rename_files_and_folders(directory, replace='_-', replacement='_'):
63
+ # 将路径的指定字符替换为指定字符
64
+ for root, dirs, files in os.walk(directory):
65
+ for filename in files:
66
+ if replace in filename:
67
+ new_filename = filename.replace(replace, replacement)
68
+ old_path = os.path.join(root, filename)
69
+ new_path = os.path.join(root, new_filename)
70
+ os.rename(old_path, new_path)
71
+ print(f'Renamed file: {old_path} -> {new_path}')
72
+
73
+ for folder in dirs:
74
+ if replace in folder:
75
+ new_folder = folder.replace(replace, replacement)
76
+ old_path = os.path.join(root, folder)
77
+ new_path = os.path.join(root, new_folder)
78
+ os.rename(old_path, new_path)
79
+ print(f'Renamed folder: {old_path} -> {new_path}')
80
+
81
+
82
+ def get_file_time(file_path):
83
+ # 获取最后修改时间
84
+ mod_time = os.path.getmtime(file_path)
85
+ # 转为data_time格式: 年-月-日-时-分-秒
86
+ datetime_dt = datetime.fromtimestamp(mod_time)
87
+
88
+ # 如果时间早于2024-09-04 02:00:00, 则删除
89
+ # if datetime_dt < datetime(2024, 9, 4, 2, 0, 0):
90
+ # print(file_path)
91
+ return datetime_dt
92
+
93
+
94
+ def TrainValSplit(dataset_dir, train_dir, val_dir, percentage=0.9):
95
+ """ 分割数据集为训练集和验证集
96
+ :param dataset_dir: 源数据集地址
97
+ :param train_dir: 训练集地址
98
+ :param val_dir: 验证集地址
99
+ :param percentage: 分割百分比
100
+ """
101
+ wav_path_list = get_path_list(dataset_dir, end="*.wav", shuffle=True)
102
+ total_wav_num = len(wav_path_list)
103
+ # 计算训练集和验证集的分割点
104
+ split_idx = int(total_wav_num * percentage)
105
+ train_path_list, val_path_list = wav_path_list[:split_idx], wav_path_list[split_idx:]
106
+
107
+ for train_wavpath in tqdm(train_path_list, desc="Copying train wav"):
108
+ target_path = train_wavpath.replace(dataset_dir, train_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(train_wavpath, target_path)
112
+
113
+ for val_wavpath in tqdm(val_path_list, desc="Copying val wav"):
114
+ target_path = val_wavpath.replace(dataset_dir, val_dir)
115
+ if not os.path.exists(os.path.split(target_path)[0]):
116
+ os.makedirs(os.path.split(target_path)[0])
117
+ shutil.copy(val_wavpath, target_path)
118
+
119
+ print("Done!")
120
+
121
+
122
+ def TrainValTestSplit(dataset_dir, train_dir, val_dir, test_dir, percentage=[0.8, 0.1, 0.1]):
123
+ """ 分割数据集为训练集、验证集和测试集
124
+ :param dataset_dir: 源数据集地址
125
+ :param train_dir: 训练集地址
126
+ :param val_dir: 验证集地址
127
+ :param test_dir: 测试集地址
128
+ :param percentage: 分割百分比
129
+ """
130
+ assert sum(percentage) == 1.0, "百分比总和必须等于1.0"
131
+
132
+ wav_path_list = sorted(get_path_list(dataset_dir, end="*.wav"))
133
+ random.seed(10086)
134
+ random.shuffle(wav_path_list) # 打乱列表的顺序
135
+ total_wav_num = len(wav_path_list)
136
+
137
+ # 计算训练集、验证集和测试集的分割点
138
+ train_split_idx = int(total_wav_num * percentage[0])
139
+ val_split_idx = train_split_idx + int(total_wav_num * percentage[1])
140
+
141
+ train_path_list = wav_path_list[:train_split_idx]
142
+ val_path_list = wav_path_list[train_split_idx:val_split_idx]
143
+ test_path_list = wav_path_list[val_split_idx:]
144
+
145
+ for train_wavpath in tqdm(train_path_list, desc="复制训练集音频"):
146
+ target_path = train_wavpath.replace(dataset_dir, train_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(train_wavpath, target_path)
150
+
151
+ for val_wavpath in tqdm(val_path_list, desc="复制验证集音频"):
152
+ target_path = val_wavpath.replace(dataset_dir, val_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(val_wavpath, target_path)
156
+
157
+ for test_wavpath in tqdm(test_path_list, desc="复制测试集音频"):
158
+ target_path = test_wavpath.replace(dataset_dir, test_dir)
159
+ if not os.path.exists(os.path.split(target_path)[0]):
160
+ os.makedirs(os.path.split(target_path)[0])
161
+ shutil.copy(test_wavpath, target_path)
162
+
163
+ print(f"完成! 训练集: {len(train_path_list)}个文件, 验证集: {len(val_path_list)}个文件, 测试集: {len(test_path_list)}个文件")
164
+
165
+
166
+ def get_leaf_folders(directory):
167
+ # 获取最底层的文件夹路径
168
+ leaf_folders = []
169
+ for root, dirs, _ in os.walk(directory):
170
+ if not dirs: # 如果当前文件夹没有子文件夹
171
+ leaf_folders.append(root)
172
+ return leaf_folders
173
+
174
+
175
+ def del_empty_folders(path):
176
+ """递归删除空文件夹(先删除子文件夹, 再删除父文件夹)"""
177
+ if not os.path.isdir(path):
178
+ return
179
+
180
+ # 获取子文件夹
181
+ subfolders = [os.path.join(path, d) for d in os.listdir(path) if os.path.isdir(os.path.join(path, d))]
182
+
183
+ # 递归处理子文件夹
184
+ for subfolder in subfolders:
185
+ del_empty_folders(subfolder)
186
+
187
+ # 如果文件夹为空,则删除
188
+ if not os.listdir(path):
189
+ os.rmdir(path)
190
+ print(f"删除空文件夹: {path}")
191
+
192
+
193
+ def DatasetSubfloderSplit(source_dir, split_dirs, percentage=None):
194
+ """
195
+ 将一个数据集按照子文件夹数量分割成train/val/test数据集
196
+ Args:
197
+ source_dir (str): 源数据集目录
198
+ split_dirs (list): 目标目录列表, 如 [train_dir, val_dir] 或 [train_dir, val_dir, test_dir]
199
+ percentage (list, optional): 分割比例, 如 [0.9, 0.1] 或 [0.8, 0.1, 0.1]。默认为 None, 此时:
200
+ - 如果是两路分割, 默认为 [0.9, 0.1]
201
+ - 如果是三路分割, 默认为 [0.8, 0.1, 0.1]
202
+ Example:
203
+ # 两路分割示例
204
+ DatasetSplit(
205
+ source_dir=source_dataset_path,
206
+ split_dirs=[target_train_path, target_val_path],
207
+ percentage=[0.9, 0.1]
208
+ )
209
+
210
+ # 三路分割示例
211
+ DatasetSplit(
212
+ source_dir=source_dataset_path,
213
+ split_dirs=[target_train_path, target_val_path, target_test_path],
214
+ percentage=[0.8, 0.1, 0.1]
215
+ )
216
+
217
+ # 使用默认比例的两路分割
218
+ DatasetSplit(
219
+ source_dir=source_dataset_path,
220
+ split_dirs=[target_train_path, target_val_path]
221
+ )
222
+ """
223
+ if percentage is None:
224
+ percentage = [0.9, 0.1] if len(split_dirs) == 2 else [0.8, 0.1, 0.1]
225
+
226
+ # 验证输入参数
227
+ if len(split_dirs) not in [2, 3]:
228
+ raise ValueError("只支持2路或3路分割(训练集/验证集 或 训练集/验证集/测试集)")
229
+ if len(percentage) != len(split_dirs):
230
+ raise ValueError("分割比例数量必须与目标目录数量相同")
231
+ if sum(percentage) != 1.0:
232
+ raise ValueError("分割比例之和必须等于1.0")
233
+
234
+ # 获取并打乱文件夹列表
235
+ leaf_folder_list = sorted(get_leaf_folders(source_dir))
236
+ random.seed(10086)
237
+ random.shuffle(leaf_folder_list)
238
+ total_folder_num = len(leaf_folder_list)
239
+
240
+ # 计算分割点
241
+ split_indices = []
242
+ acc_percentage = 0
243
+ for p in percentage[:-1]: # 最后一个比例不需要计算
244
+ acc_percentage += p
245
+ split_indices.append(int(total_folder_num * acc_percentage))
246
+
247
+ # 分割文件夹列表
248
+ split_folder_lists = []
249
+ start_idx = 0
250
+ for end_idx in split_indices:
251
+ split_folder_lists.append(leaf_folder_list[start_idx:end_idx])
252
+ start_idx = end_idx
253
+ split_folder_lists.append(leaf_folder_list[start_idx:]) # 添加最后一部分
254
+
255
+ # 复制文件夹
256
+ split_names = ['train', 'val', 'test']
257
+ for folders, target_dir, split_name in zip(split_folder_lists, split_dirs, split_names[:len(split_dirs)]):
258
+ for folder in tqdm(folders, desc=f"Copying {split_name} folders"):
259
+ target_folder = folder.replace(source_dir, target_dir)
260
+ os.makedirs(os.path.dirname(target_folder), exist_ok=True)
261
+ shutil.copytree(folder, target_folder)
262
+
263
+ # 打印统计信息
264
+ print(f"Total folders: {total_folder_num}")
265
+ for folders, split_name in zip(split_folder_lists, split_names[:len(split_dirs)]):
266
+ print(f"{split_name.capitalize()} folders: {len(folders)}")
267
+
268
+
269
+ def pcm2wav(pcm_path, wav_path, sr=16000, channels=1, subtype='PCM_16'):
270
+ """
271
+ 将pcm文件转换为wav文件
272
+ :param pcm_path: pcm文件路径
273
+ :param wav_path: wav文件路径
274
+ :param sr: 采样率
275
+ :param channels: 声道数
276
+ :param subtype: 子类型
277
+ """
278
+ pcm_data = np.fromfile(pcm_path, dtype=np.int16)
279
+ pcm_data = pcm_data.reshape(-1, channels) # 支持多通道
280
+ sf.write(wav_path, pcm_data, sr, subtype=subtype)
281
+
282
+
283
+ def wav2pcm(wav_path, pcm_path):
284
+ """
285
+ 将wav文件转换为pcm文件
286
+ :param wav_path: wav文件路径
287
+ :param pcm_path: pcm文件路径
288
+ """
289
+ data, _ = sf.read(wav_path, dtype='int16')
290
+ data.tofile(pcm_path)
291
+
292
+
293
+ def save_weight_histogram(model, save_dir, mode=["params", "buffers"], ignore_name=["scale", "bias"], bins=100):
294
+ """
295
+ 保存模型权重分布直方图
296
+ Args:
297
+ model: PyTorch模型
298
+ save_dir: 保存路径
299
+ mode: 保存模式, 可选值为["params", "buffers"]
300
+ bins: 直方图bin数量
301
+ """
302
+ import matplotlib.pyplot as plt
303
+ # 如果路径存在, 则删除
304
+ if os.path.exists(save_dir):
305
+ shutil.rmtree(save_dir)
306
+
307
+ if "params" in mode:
308
+ os.makedirs(os.path.join(save_dir, "param"), exist_ok=True)
309
+ for name, param in model.named_parameters():
310
+ if any(ignore in name for ignore in ignore_name):
311
+ continue
312
+ param = param.cpu().data.flatten().numpy()
313
+ param_min = param.min()
314
+ param_max = param.max()
315
+ param_mean = param.mean()
316
+ param_std = param.std()
317
+
318
+ # 保存模型参数到地址
319
+ # 绘制直方图
320
+ plt.title(name)
321
+ plt.xlabel("value")
322
+ plt.ylabel("count")
323
+ plt.grid(alpha=0.5)
324
+ # 在右上角添加统计信息
325
+ plt.text(1, 1, f"max: {param_max:.2f}\n \
326
+ min: {param_min:.2f}\n \
327
+ mean: {param_mean:.2f}\n \
328
+ std: {param_std:.2f}",
329
+ ha='right', va='top', transform=plt.gca().transAxes)
330
+ plt.hist(param, bins=bins)
331
+ plt.savefig(os.path.join(save_dir, "param", f"{name}.png"))
332
+ plt.close()
333
+ if "buffers" in mode:
334
+ os.makedirs(os.path.join(save_dir, "buffer"), exist_ok=True)
335
+ for name, buffer in model.named_buffers():
336
+ if "running_mean" not in name and "running_var" not in name:
337
+ continue
338
+ buffer = buffer.cpu().data.flatten().numpy()
339
+
340
+ # 计算统计数据
341
+ buffer_min = buffer.min()
342
+ buffer_max = buffer.max()
343
+ buffer_mean = buffer.mean()
344
+ buffer_std = buffer.std()
345
+
346
+ # 绘制直方图
347
+ plt.title(name)
348
+ plt.xlabel("value")
349
+ plt.ylabel("count")
350
+ plt.grid(alpha=0.5)
351
+ # 在右上角添加统计信息
352
+ plt.text(1, 1, f"max: {buffer_max:.2f}\n \
353
+ min: {buffer_min:.2f}\n \
354
+ mean: {buffer_mean:.2f}\n \
355
+ std: {buffer_std:.2f}",
356
+ ha='right', va='top', transform=plt.gca().transAxes)
357
+ plt.hist(buffer, bins=bins)
358
+ plt.savefig(os.path.join(save_dir, "buffer", f"{name}.png"))
359
+ plt.close()
@@ -0,0 +1,247 @@
1
+ <!-- Generated by SpecStory -->
2
+
3
+ # 完善函数的功能和变量名建议 (2025-08-22 02:10Z)
4
+
5
+ _**User**_
6
+
7
+ 帮我完善这个函数,包括功能建议和变量名建议
8
+
9
+ ---
10
+
11
+ _**Assistant**_
12
+
13
+ 我来帮你完善这个函数。让我先仔细分析一下当前的代码,然后提供改进建议。
14
+
15
+
16
+ ---
17
+
18
+ Read file: audio_aug/audio_aug.py
19
+
20
+ ---
21
+
22
+ 基于对代码的分析,我来为你的 `snr_aug_changeClean` 函数提供完善建议:
23
+
24
+ ## 功能改进建议
25
+
26
+ ### 1. 参数验证和类型提示
27
+ - 添加参数类型提示
28
+ - 增加参数范围验证
29
+ - 添加更详细的错误信息
30
+
31
+ ### 2. 功能增强
32
+ - 支持批量处理
33
+ - 添加可选的功率计算方法
34
+ - 增加日志记录功能
35
+ - 支持不同的归一化策略
36
+
37
+ ### 3. 性能优化
38
+ - 使用向量化操作
39
+ - 添加缓存机制(如果需要重复计算)
40
+
41
+ ## 变量名改进建议
42
+
43
+ ### 当前变量名问题:
44
+ - `clean_scale` → `clean_amplitude_factor` 或 `clean_gain`
45
+ - `noisy` → `noisy_signal` 或 `augmented_signal`
46
+ - `scale_factor` → `clip_prevention_factor` 或 `normalization_factor`
47
+
48
+ ## 完善后的函数代码
49
+
50
+ ```python:audio_aug/audio_aug.py
51
+ def snr_aug_changeClean(
52
+ clean_signal: np.ndarray,
53
+ noise_signal: np.ndarray,
54
+ target_snr_db: float,
55
+ clip_check: bool = True,
56
+ power_method: str = "mean",
57
+ eps: float = 1e-8
58
+ ) -> tuple[np.ndarray, np.ndarray]:
59
+ """
60
+ 保持噪声不变,改变纯净语音的幅度以达到目标信噪比
61
+
62
+ Args:
63
+ clean_signal: 纯净语音信号,形状为 (T,) 或 (T, C)
64
+ noise_signal: 噪声信号,形状必须与clean_signal相同
65
+ target_snr_db: 目标信噪比,单位为dB
66
+ clip_check: 是否进行削波检查,默认True
67
+ power_method: 功率计算方法,"mean"或"rms",默认"mean"
68
+ eps: 数值稳定性常数,默认1e-8
69
+
70
+ Returns:
71
+ tuple: (增强后的含噪信号, 调整后的纯净信号)
72
+
73
+ Raises:
74
+ ValueError: 当参数无效时
75
+ AssertionError: 当信号形状不匹配时
76
+ """
77
+ # 参数验证
78
+ if target_snr_db < -50 or target_snr_db > 100:
79
+ raise ValueError(f"目标信噪比应在-50到100dB之间,当前值: {target_snr_db}")
80
+
81
+ if clean_signal.shape != noise_signal.shape:
82
+ raise AssertionError(f"信号形状不匹配: clean_signal{clean_signal.shape} != noise_signal{noise_signal.shape}")
83
+
84
+ # 计算信号功率
85
+ if power_method == "mean":
86
+ clean_power = np.mean(clean_signal ** 2)
87
+ noise_power = np.mean(noise_signal ** 2)
88
+ elif power_method == "rms":
89
+ clean_power = np.sqrt(np.mean(clean_signal ** 2)) ** 2
90
+ noise_power = np.sqrt(np.mean(noise_signal ** 2)) ** 2
91
+ else:
92
+ raise ValueError(f"不支持的功率计算方法: {power_method},请使用 'mean' 或 'rms'")
93
+
94
+ # 计算纯净信号需要的幅度因子
95
+ clean_amplitude_factor = np.sqrt(
96
+ noise_power * 10 ** (target_snr_db / 10) / (clean_power + eps)
97
+ )
98
+
99
+ # 生成含噪信号
100
+ augmented_signal = clean_signal * clean_amplitude_factor + noise_signal
101
+
102
+ # 削波检查和预防
103
+ if clip_check:
104
+ max_amplitude = np.max(np.abs(augmented_signal))
105
+ if max_amplitude > 1.0:
106
+ normalization_factor = 1.0 / max_amplitude
107
+ augmented_signal *= normalization_factor
108
+ # 同时调整纯净信号以保持一致性
109
+ adjusted_clean_signal = clean_signal * clean_amplitude_factor * normalization_factor
110
+ else:
111
+ adjusted_clean_signal = clean_signal * clean_amplitude_factor
112
+ else:
113
+ adjusted_clean_signal = clean_signal * clean_amplitude_factor
114
+
115
+ return augmented_signal, adjusted_clean_signal
116
+ ```
117
+
118
+ ## 主要改进点总结
119
+
120
+ 1. **参数验证**: 添加了信噪比范围检查和功率计算方法验证
121
+ 2. **类型提示**: 使用Python类型提示提高代码可读性
122
+ 3. **变量命名**: 使用更清晰、描述性的变量名
123
+ 4. **功能扩展**: 支持不同的功率计算方法(均值或RMS)
124
+ 5. **错误处理**: 提供更详细的错误信息和异常处理
125
+ 6. **文档完善**: 详细的docstring说明参数、返回值和异常
126
+ 7. **代码结构**: 更清晰的逻辑分组和注释
127
+
128
+ 这些改进使函数更加健壮、可读和可维护,同时保持了原有的核心功能。
129
+
130
+ ---
131
+
132
+ _**User**_
133
+
134
+ 均值或RMS 有区别吗?
135
+
136
+ ---
137
+
138
+ _**Assistant**_
139
+
140
+ 是的,均值和RMS在计算信号功率时确实有区别!让我详细解释一下:
141
+
142
+ ## 均值和RMS的区别
143
+
144
+ ### 1. **均值方法 (Mean)**
145
+ ```python
146
+ clean_power = np.mean(clean_signal ** 2)
147
+ ```
148
+ - 计算所有样本点平方值的算术平均值
149
+ - 对异常值(outliers)比较敏感
150
+ - 适用于信号幅度相对稳定的情况
151
+
152
+ ### 2. **RMS方法 (Root Mean Square)**
153
+ ```python
154
+ clean_power = np.sqrt(np.mean(clean_signal ** 2))
155
+ ```
156
+ - 先计算平方值的均值,再开平方根
157
+ - 更准确地反映信号的有效值
158
+ - 在音频处理中更常用,因为RMS值与感知响度更相关
159
+
160
+ ## 实际差异示例
161
+
162
+ 让我用一个简单的例子来说明:
163
+
164
+ ```python
165
+ import numpy as np
166
+
167
+ # 模拟一个音频信号
168
+ signal = np.array([0.1, 0.2, 0.15, 0.25, 0.18])
169
+
170
+ # 均值方法
171
+ mean_power = np.mean(signal ** 2)
172
+ print(f"均值功率: {mean_power:.6f}")
173
+
174
+ # RMS方法
175
+ rms_power = np.sqrt(np.mean(signal ** 2)) ** 2
176
+ print(f"RMS功率: {rms_power:.6f}")
177
+
178
+ # 注意:RMS功率实际上等于均值功率!
179
+ print(f"两者相等: {np.isclose(mean_power, rms_power)}")
180
+ ```
181
+
182
+ ## 关键发现
183
+
184
+ **实际上,对于功率计算,均值和RMS是等价的!**
185
+
186
+ - `np.mean(signal ** 2)` = 均值功率
187
+ - `np.sqrt(np.mean(signal ** 2)) ** 2` = RMS功率
188
+
189
+ 这是因为:
190
+ 1. RMS = √(均值(signal²))
191
+ 2. RMS功率 = RMS² = (√(均值(signal²)))² = 均值(signal²)
192
+
193
+ ## 建议
194
+
195
+ 既然两种方法结果相同,我建议简化函数:
196
+
197
+ ```python:audio_aug/audio_aug.py
198
+ def snr_aug_changeClean(
199
+ clean_signal: np.ndarray,
200
+ noise_signal: np.ndarray,
201
+ target_snr_db: float,
202
+ clip_check: bool = True,
203
+ eps: float = 1e-8
204
+ ) -> tuple[np.ndarray, np.ndarray]:
205
+ """
206
+ 保持噪声不变,改变纯净语音的幅度以达到目标信噪比
207
+
208
+ Args:
209
+ clean_signal: 纯净语音信号
210
+ noise_signal: 噪声信号
211
+ target_snr_db: 目标信噪比(dB)
212
+ clip_check: 是否进行削波检查
213
+ eps: 数值稳定性常数
214
+
215
+ Returns:
216
+ tuple: (增强后的含噪信号, 调整后的纯净信号)
217
+ """
218
+ # 参数验证
219
+ if target_snr_db < -50 or target_snr_db > 100:
220
+ raise ValueError(f"目标信噪比应在-50到100dB之间,当前值: {target_snr_db}")
221
+
222
+ if clean_signal.shape != noise_signal.shape:
223
+ raise AssertionError(f"信号形状不匹配: clean_signal{clean_signal.shape} != noise_signal{noise_signal.shape}")
224
+
225
+ # 计算信号功率(使用均值方法即可)
226
+ clean_power = np.mean(clean_signal ** 2)
227
+ noise_power = np.mean(noise_signal ** 2)
228
+
229
+ # 计算纯净信号需要的幅度因子
230
+ clean_amplitude_factor = np.sqrt(
231
+ noise_power * 10 ** (target_snr_db / 10) / (clean_power + eps)
232
+ )
233
+
234
+ # ... 其余代码保持不变 ...
235
+ ```
236
+
237
+ ## 总结
238
+
239
+ - **均值和RMS在功率计算上结果相同**
240
+ - **不需要提供两种方法选择**
241
+ - **均值方法更直接,计算效率更高**
242
+ - **在音频处理中,均值功率是标准做法**
243
+
244
+ 所以之前的建议中关于功率计算方法的选择是多余的,直接使用均值方法即可。
245
+
246
+ ---
247
+
@@ -0,0 +1,87 @@
1
+ <!-- Generated by SpecStory -->
2
+
3
+ # OSError: missing shared object file (2025-08-26 11:54Z)
4
+
5
+ _**User**_
6
+
7
+ OSError: libc++.so.1: cannot open shared object file: No such file or directory
8
+
9
+
10
+ ---
11
+
12
+ _**Assistant**_
13
+
14
+ 我看到您遇到了一个关于 `libc++.so.1` 共享库文件缺失的错误。这是一个常见的系统依赖问题。让我先查看一下您的代码文件,了解具体情况,然后帮您解决这个问题。
15
+
16
+
17
+ ---
18
+
19
+ Read file: Docs/vad/VAD_tenVAD.ipynb
20
+
21
+ ---
22
+
23
+ 我看到您的代码中使用了 `ten_vad` 模块。这个 `libc++.so.1` 错误通常是因为系统缺少 C++ 标准库的共享库文件。让我检查一下您的系统环境并提供解决方案。
24
+
25
+
26
+ ---
27
+
28
+ ```bash
29
+ ldconfig -p | grep libc++
30
+ ```
31
+
32
+ ---
33
+
34
+ _**User**_
35
+
36
+ (py311torch211) never@172-16-64-33:/data03/never/Desktop/neverlib/neverlib$ ldconfig -p | grep libc++
37
+ (py311torch211) never@172-16-64-33:/data03/never/Desktop/neverlib/neverlib$
38
+
39
+ ---
40
+
41
+ _**Assistant**_
42
+
43
+ 看起来您的系统中没有找到 `libc++.so.1` 文件。这个错误通常发生在使用预编译的 C++ 库(如某些深度学习框架或音频处理库)时。让我帮您解决这个问题。
44
+
45
+ 有几种解决方案:
46
+
47
+ ## 方案1:安装 libc++ 开发库
48
+ ```bash
49
+ # Ubuntu/Debian 系统
50
+ sudo apt-get update
51
+ sudo apt-get install libc++-dev libc++abi-dev
52
+
53
+ # 或者安装 clang 相关包
54
+ sudo apt-get install clang libc++1 libc++abi1
55
+ ```
56
+
57
+ ## 方案2:创建符号链接(如果系统中已有类似版本)
58
+ ```bash
59
+ # 检查是否有其他版本的 libc++
60
+ ls -la /usr/lib/x86_64-linux-gnu/ | grep libc++
61
+
62
+ # 如果有类似版本,创建符号链接
63
+ sudo ln -s /usr/lib/x86_64-linux-gnu/libc++.so.X /usr/lib/x86_64-linux-gnu/libc++.so.1
64
+ ```
65
+
66
+ ## 方案3:设置 LD_LIBRARY_PATH
67
+ ```bash
68
+ # 如果库文件在其他位置,可以设置环境变量
69
+ export LD_LIBRARY_PATH=/path/to/libc++:$LD_LIBRARY_PATH
70
+ ```
71
+
72
+ ## 方案4:重新安装 ten_vad 相关依赖
73
+ ```bash
74
+ # 重新安装可能包含 C++ 库的包
75
+ pip uninstall ten-vad
76
+ pip install ten-vad --no-cache-dir
77
+
78
+ # 或者从源码编译安装
79
+ pip install ten-vad --no-binary :all:
80
+ ```
81
+
82
+ 建议您先尝试方案1,安装系统级的 C++ 库。如果问题仍然存在,请告诉我具体的错误信息,我可以提供更针对性的解决方案。
83
+
84
+ 您想先尝试哪种方案?
85
+
86
+ ---
87
+