neverlib 0.2.2__py3-none-any.whl → 0.2.4__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 (236) hide show
  1. neverlib/.history/Docs/audio_aug/test_snr_20250806011311.py +0 -0
  2. neverlib/.history/Docs/audio_aug/test_snr_20250806011331.py +75 -0
  3. neverlib/.history/Docs/audio_aug/test_snr_20250806011342.py +57 -0
  4. neverlib/.history/Docs/audio_aug/test_snr_20250806011352.py +57 -0
  5. neverlib/.history/Docs/audio_aug/test_snr_20250806011403.py +57 -0
  6. neverlib/.history/Docs/audio_aug/test_snr_20250806011413.py +57 -0
  7. neverlib/.history/Docs/audio_aug/test_snr_20250806011435.py +55 -0
  8. neverlib/.history/Docs/vad/1_20250810032405.py +0 -0
  9. neverlib/.history/Docs/vad/1_20250810032417.py +39 -0
  10. neverlib/.history/audio_aug/audio_aug_20250806010451.py +125 -0
  11. neverlib/.history/audio_aug/audio_aug_20250806010750.py +138 -0
  12. neverlib/.history/audio_aug/audio_aug_20250806010759.py +140 -0
  13. neverlib/.history/audio_aug/audio_aug_20250806010803.py +140 -0
  14. neverlib/.history/audio_aug/audio_aug_20250806010809.py +140 -0
  15. neverlib/.history/audio_aug/audio_aug_20250806011108.py +140 -0
  16. neverlib/.history/dataAnalyze/__init___20250805234204.py +87 -0
  17. neverlib/.history/dataAnalyze/__init___20250806204125.py +14 -0
  18. neverlib/.history/dataAnalyze/__init___20250806204139.py +14 -0
  19. neverlib/.history/dataAnalyze/__init___20250806204159.py +14 -0
  20. neverlib/.history/filter/__init___20250820103351.py +70 -0
  21. neverlib/.history/filter/__init___20250821102348.py +70 -0
  22. neverlib/.history/filter/__init___20250821102405.py +14 -0
  23. neverlib/.history/filter/auto_eq/__init___20250819213121.py +36 -0
  24. neverlib/.history/filter/auto_eq/__init___20250821102241.py +36 -0
  25. neverlib/.history/filter/auto_eq/__init___20250821102259.py +36 -0
  26. neverlib/.history/filter/auto_eq/__init___20250821102307.py +36 -0
  27. neverlib/.history/filter/auto_eq/__init___20250821102310.py +36 -0
  28. neverlib/.history/filter/auto_eq/__init___20250821102318.py +36 -0
  29. neverlib/.history/filter/auto_eq/__init___20250821102507.py +36 -0
  30. neverlib/.history/filter/auto_eq/de_eq_20250820103848.py +361 -0
  31. neverlib/.history/filter/auto_eq/de_eq_20250821102422.py +360 -0
  32. neverlib/.history/filter/auto_eq/freq_eq_20250805234206.py +75 -0
  33. neverlib/.history/filter/auto_eq/freq_eq_20250820140732.py +75 -0
  34. neverlib/.history/filter/auto_eq/freq_eq_20250820140745.py +75 -0
  35. neverlib/.history/filter/auto_eq/freq_eq_20250820140816.py +75 -0
  36. neverlib/.history/filter/auto_eq/freq_eq_20250820140938.py +77 -0
  37. neverlib/.history/filter/auto_eq/freq_eq_20250820141003.py +77 -0
  38. neverlib/.history/filter/auto_eq/freq_eq_20250820141006.py +77 -0
  39. neverlib/.history/filter/auto_eq/freq_eq_20250820141019.py +77 -0
  40. neverlib/.history/filter/auto_eq/freq_eq_20250820141049.py +77 -0
  41. neverlib/.history/filter/auto_eq/freq_eq_20250820141211.py +77 -0
  42. neverlib/.history/filter/auto_eq/freq_eq_20250820141227.py +77 -0
  43. neverlib/.history/filter/auto_eq/freq_eq_20250820141311.py +78 -0
  44. neverlib/.history/filter/auto_eq/freq_eq_20250820141340.py +78 -0
  45. neverlib/.history/filter/auto_eq/freq_eq_20250820141712.py +78 -0
  46. neverlib/.history/filter/auto_eq/freq_eq_20250820141733.py +78 -0
  47. neverlib/.history/filter/auto_eq/freq_eq_20250820141755.py +78 -0
  48. neverlib/.history/filter/auto_eq/freq_eq_20250821102434.py +76 -0
  49. neverlib/.history/filter/auto_eq/freq_eq_20250821102500.py +76 -0
  50. neverlib/.history/filter/auto_eq/freq_eq_20250821102502.py +76 -0
  51. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820102957.py +380 -0
  52. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820113054.py +380 -0
  53. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820113150.py +380 -0
  54. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820113520.py +385 -0
  55. neverlib/.history/filter/auto_eq/ga_eq_basic_20250820113525.py +385 -0
  56. neverlib/.history/filter/auto_eq/ga_eq_basic_20250821102212.py +385 -0
  57. neverlib/.history/metrics/dnsmos_20250806001612.py +160 -0
  58. neverlib/.history/metrics/dnsmos_20250815180659.py +160 -0
  59. neverlib/.history/metrics/dnsmos_20250815180701.py +158 -0
  60. neverlib/.history/metrics/dnsmos_20250815181321.py +154 -0
  61. neverlib/.history/metrics/dnsmos_20250815181327.py +154 -0
  62. neverlib/.history/metrics/dnsmos_20250815181331.py +154 -0
  63. neverlib/.history/metrics/dnsmos_20250815181620.py +154 -0
  64. neverlib/.history/metrics/dnsmos_20250815181631.py +154 -0
  65. neverlib/.history/metrics/dnsmos_20250815181742.py +154 -0
  66. neverlib/.history/metrics/dnsmos_20250815181824.py +153 -0
  67. neverlib/.history/metrics/dnsmos_20250815181834.py +153 -0
  68. neverlib/.history/metrics/dnsmos_20250815181922.py +153 -0
  69. neverlib/.history/metrics/dnsmos_20250815182011.py +147 -0
  70. neverlib/.history/metrics/dnsmos_20250815182036.py +144 -0
  71. neverlib/.history/metrics/dnsmos_20250815182936.py +143 -0
  72. neverlib/.history/metrics/dnsmos_20250815182942.py +143 -0
  73. neverlib/.history/metrics/dnsmos_20250815183032.py +137 -0
  74. neverlib/.history/metrics/dnsmos_20250815183101.py +144 -0
  75. neverlib/.history/metrics/dnsmos_20250815183121.py +144 -0
  76. neverlib/.history/metrics/dnsmos_20250815183123.py +143 -0
  77. neverlib/.history/metrics/dnsmos_20250815183214.py +143 -0
  78. neverlib/.history/metrics/dnsmos_20250815183240.py +143 -0
  79. neverlib/.history/metrics/dnsmos_20250815183248.py +144 -0
  80. neverlib/.history/metrics/dnsmos_20250815183407.py +142 -0
  81. neverlib/.history/metrics/dnsmos_20250815183409.py +142 -0
  82. neverlib/.history/metrics/dnsmos_20250815183431.py +142 -0
  83. neverlib/.history/metrics/dnsmos_20250815183507.py +140 -0
  84. neverlib/.history/metrics/dnsmos_20250815183513.py +139 -0
  85. neverlib/.history/metrics/dnsmos_20250815183618.py +139 -0
  86. neverlib/.history/metrics/dnsmos_20250815183709.py +140 -0
  87. neverlib/.history/metrics/dnsmos_20250815183756.py +137 -0
  88. neverlib/.history/metrics/dnsmos_20250815183815.py +128 -0
  89. neverlib/.history/metrics/dnsmos_20250815183827.py +129 -0
  90. neverlib/.history/metrics/dnsmos_20250815183913.py +117 -0
  91. neverlib/.history/metrics/dnsmos_20250815183914.py +117 -0
  92. neverlib/.history/metrics/dnsmos_20250815184003.py +118 -0
  93. neverlib/.history/metrics/dnsmos_20250815184040.py +118 -0
  94. neverlib/.history/metrics/dnsmos_20250815184049.py +118 -0
  95. neverlib/.history/metrics/dnsmos_20250815184104.py +117 -0
  96. neverlib/.history/metrics/dnsmos_20250815184200.py +117 -0
  97. neverlib/.history/metrics/lpc_lsp_metric_20250816015944.py +128 -0
  98. neverlib/.history/metrics/lpc_lsp_metric_20250816020142.py +128 -0
  99. neverlib/.history/metrics/lpc_lsp_metric_20250816020156.py +128 -0
  100. neverlib/.history/metrics/lpc_lsp_metric_20250816020554.py +130 -0
  101. neverlib/.history/metrics/lpc_lsp_metric_20250816020600.py +125 -0
  102. neverlib/.history/metrics/lpc_lsp_metric_20250816020631.py +120 -0
  103. neverlib/.history/metrics/lpc_lsp_metric_20250816020746.py +118 -0
  104. neverlib/.history/metrics/lpc_me_20250816013111.py +0 -0
  105. neverlib/.history/metrics/lpc_me_20250816013129.py +121 -0
  106. neverlib/.history/metrics/lpc_me_20250816015430.py +103 -0
  107. neverlib/.history/metrics/lpc_me_20250816015535.py +96 -0
  108. neverlib/.history/metrics/lpc_me_20250816015542.py +96 -0
  109. neverlib/.history/metrics/lpc_me_20250816015636.py +97 -0
  110. neverlib/.history/metrics/lpc_me_20250816015658.py +104 -0
  111. neverlib/.history/metrics/lpc_me_20250816015703.py +100 -0
  112. neverlib/.history/metrics/lpc_me_20250816015945.py +128 -0
  113. neverlib/.history/metrics/snr_20250806010538.py +177 -0
  114. neverlib/.history/metrics/snr_20250806211634.py +184 -0
  115. neverlib/.history/metrics/spec_20250805234209.py +45 -0
  116. neverlib/.history/metrics/spec_20250816135530.py +11 -0
  117. neverlib/.history/metrics/spec_20250816135654.py +16 -0
  118. neverlib/.history/metrics/spec_20250816135736.py +68 -0
  119. neverlib/.history/metrics/spec_20250816135904.py +75 -0
  120. neverlib/.history/metrics/spec_20250816135921.py +82 -0
  121. neverlib/.history/metrics/spec_20250816140111.py +82 -0
  122. neverlib/.history/metrics/spec_20250816140543.py +136 -0
  123. neverlib/.history/metrics/spec_20250816140559.py +172 -0
  124. neverlib/.history/metrics/spec_20250816140602.py +172 -0
  125. neverlib/.history/metrics/spec_20250816140608.py +172 -0
  126. neverlib/.history/metrics/spec_20250816140654.py +148 -0
  127. neverlib/.history/metrics/spec_20250816140705.py +144 -0
  128. neverlib/.history/metrics/spec_20250816140755.py +138 -0
  129. neverlib/.history/metrics/spec_20250816140823.py +170 -0
  130. neverlib/.history/metrics/spec_20250816140832.py +170 -0
  131. neverlib/.history/metrics/spec_20250816140833.py +170 -0
  132. neverlib/.history/metrics/spec_20250816140922.py +147 -0
  133. neverlib/.history/metrics/spec_20250816141148.py +107 -0
  134. neverlib/.history/metrics/spec_20250816141219.py +123 -0
  135. neverlib/.history/metrics/spec_20250816141732.py +178 -0
  136. neverlib/.history/metrics/spec_20250816141740.py +178 -0
  137. neverlib/.history/metrics/spec_20250816142030.py +178 -0
  138. neverlib/.history/metrics/spec_20250816142107.py +135 -0
  139. neverlib/.history/metrics/spec_20250816142126.py +135 -0
  140. neverlib/.history/metrics/spec_20250816142410.py +135 -0
  141. neverlib/.history/metrics/spec_20250816142415.py +136 -0
  142. neverlib/.history/metrics/spec_metric_20250816135156.py +0 -0
  143. neverlib/.history/metrics/spec_metric_20250816135226.py +5 -0
  144. neverlib/.history/metrics/spec_metric_20250816135227.py +10 -0
  145. neverlib/.history/metrics/spec_metric_20250816135306.py +15 -0
  146. neverlib/.history/metrics/spec_metric_20250816135442.py +31 -0
  147. neverlib/.history/metrics/spec_metric_20250816135448.py +31 -0
  148. neverlib/.history/metrics/spec_metric_20250816135520.py +29 -0
  149. neverlib/.history/metrics/spec_metric_20250816135537.py +63 -0
  150. neverlib/.history/metrics/spec_metric_20250816135653.py +65 -0
  151. neverlib/.history/vad/PreProcess_20250805234211.py +63 -0
  152. neverlib/.history/vad/PreProcess_20250809232455.py +63 -0
  153. neverlib/.history/vad/PreProcess_20250816020725.py +66 -0
  154. neverlib/.history/vad/VAD_Silero_20250805234211.py +50 -0
  155. neverlib/.history/vad/VAD_Silero_20250809232456.py +50 -0
  156. neverlib/.history/vad/VAD_WebRTC_20250805234211.py +61 -0
  157. neverlib/.history/vad/VAD_WebRTC_20250809232456.py +61 -0
  158. neverlib/.history/vad/VAD_funasr_20250805234211.py +54 -0
  159. neverlib/.history/vad/VAD_funasr_20250809232456.py +54 -0
  160. neverlib/.history/vad/VAD_vadlib_20250805234211.py +70 -0
  161. neverlib/.history/vad/VAD_vadlib_20250809232455.py +70 -0
  162. neverlib/.history/vad/VAD_whisper_20250805234211.py +55 -0
  163. neverlib/.history/vad/VAD_whisper_20250809232456.py +55 -0
  164. neverlib/.specstory/.what-is-this.md +69 -0
  165. 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 +424 -0
  166. neverlib/Docs/audio_aug/test_snr.py +55 -0
  167. neverlib/__init__.py +2 -2
  168. neverlib/audio_aug/HarmonicDistortion.py +79 -0
  169. neverlib/audio_aug/TFDrop.py +41 -0
  170. neverlib/audio_aug/TFMask.py +56 -0
  171. neverlib/audio_aug/__init__.py +1 -1
  172. neverlib/audio_aug/audio_aug.py +19 -5
  173. neverlib/audio_aug/clip_aug.py +41 -0
  174. neverlib/audio_aug/coder_aug.py +209 -0
  175. neverlib/audio_aug/coder_aug2.py +118 -0
  176. neverlib/audio_aug/loss_packet_aug.py +103 -0
  177. neverlib/audio_aug/quant_aug.py +78 -0
  178. neverlib/data_analyze/README.md +234 -0
  179. neverlib/data_analyze/__init__.py +14 -0
  180. neverlib/data_analyze/dataset_analyzer.py +590 -0
  181. neverlib/data_analyze/quality_metrics.py +364 -0
  182. neverlib/data_analyze/rms_distrubution.py +62 -0
  183. neverlib/data_analyze/spectral_analysis.py +218 -0
  184. neverlib/data_analyze/statistics.py +406 -0
  185. neverlib/data_analyze/temporal_features.py +126 -0
  186. neverlib/data_analyze/visualization.py +468 -0
  187. neverlib/filter/README.md +101 -0
  188. neverlib/filter/__init__.py +7 -0
  189. neverlib/filter/auto_eq/README.md +165 -0
  190. neverlib/filter/auto_eq/__init__.py +36 -0
  191. neverlib/filter/auto_eq/de_eq.py +360 -0
  192. neverlib/filter/auto_eq/freq_eq.py +76 -0
  193. neverlib/filter/auto_eq/ga_eq_advanced.py +577 -0
  194. neverlib/filter/auto_eq/ga_eq_basic.py +385 -0
  195. neverlib/filter/biquad.py +45 -0
  196. neverlib/filter/common.py +5 -6
  197. neverlib/filter/core.py +339 -0
  198. neverlib/metrics/dnsmos.py +117 -0
  199. neverlib/metrics/lpc_lsp.py +118 -0
  200. neverlib/metrics/snr.py +184 -0
  201. neverlib/metrics/spec.py +136 -0
  202. neverlib/metrics/test_pesq.py +35 -0
  203. neverlib/metrics/time.py +68 -0
  204. neverlib/tests/test_vad.py +21 -0
  205. neverlib/utils/audio_split.py +2 -1
  206. neverlib/utils/message.py +4 -4
  207. neverlib/utils/utils.py +36 -16
  208. neverlib/vad/PreProcess.py +6 -3
  209. neverlib/vad/README.md +10 -10
  210. neverlib/vad/VAD_Energy.py +1 -1
  211. neverlib/vad/VAD_Silero.py +2 -2
  212. neverlib/vad/VAD_WebRTC.py +2 -2
  213. neverlib/vad/VAD_funasr.py +2 -2
  214. neverlib/vad/VAD_statistics.py +3 -3
  215. neverlib/vad/VAD_vadlib.py +3 -3
  216. neverlib/vad/VAD_whisper.py +2 -2
  217. neverlib/vad/__init__.py +1 -1
  218. neverlib/vad/class_get_speech.py +4 -4
  219. neverlib/vad/class_vad.py +1 -1
  220. neverlib/vad/utils.py +47 -5
  221. {neverlib-0.2.2.dist-info → neverlib-0.2.4.dist-info}/METADATA +120 -120
  222. neverlib-0.2.4.dist-info/RECORD +229 -0
  223. {neverlib-0.2.2.dist-info → neverlib-0.2.4.dist-info}/WHEEL +1 -1
  224. neverlib/Documents/vad/VAD_Energy.ipynb +0 -159
  225. neverlib/Documents/vad/VAD_Silero.ipynb +0 -305
  226. neverlib/Documents/vad/VAD_WebRTC.ipynb +0 -183
  227. neverlib/Documents/vad/VAD_funasr.ipynb +0 -179
  228. neverlib/Documents/vad/VAD_ppasr.ipynb +0 -175
  229. neverlib/Documents/vad/VAD_statistics.ipynb +0 -522
  230. neverlib/Documents/vad/VAD_vadlib.ipynb +0 -184
  231. neverlib/Documents/vad/VAD_whisper.ipynb +0 -430
  232. neverlib/utils/waveform_analyzer.py +0 -51
  233. neverlib/wav_data/000_short.wav +0 -0
  234. neverlib-0.2.2.dist-info/RECORD +0 -40
  235. {neverlib-0.2.2.dist-info → neverlib-0.2.4.dist-info}/licenses/LICENSE +0 -0
  236. {neverlib-0.2.2.dist-info → neverlib-0.2.4.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,136 @@
1
+ '''
2
+ Author: 凌逆战 | Never
3
+ Date: 2025-08-16 13:51:57
4
+ Description: 频域客观度量指标
5
+ '''
6
+
7
+ import librosa
8
+ import numpy as np
9
+ import soundfile as sf
10
+ from neverlib.utils import EPS
11
+
12
+
13
+ def sd(ref_wav, test_wav, n_fft=2048, hop_length=512, win_length=None):
14
+ """
15
+ 计算两个音频信号之间的频谱距离 (Spectral Distance)。
16
+ 该指标衡量两个信号在频域上的差异程度。
17
+
18
+ Args:
19
+ ref_wav (np.ndarray): 参考音频信号 (一维数组)
20
+ test_wav (np.ndarray): 测试音频信号 (一维数组)
21
+ n_fft (int): FFT点数,决定频率分辨率,默认为2048
22
+ hop_length (int): 帧移,决定时间分辨率,默认为512
23
+ win_length (int, optional): 窗长,如果为None则默认为n_fft
24
+
25
+ Returns:
26
+ float: 频谱距离值,值越小表示两个信号越相似
27
+
28
+ Raises:
29
+ ValueError: 当输入参数无效时
30
+ AssertionError: 当输入信号维度不正确时
31
+ """
32
+ # 输入验证
33
+ if not isinstance(ref_wav, np.ndarray) or not isinstance(test_wav, np.ndarray):
34
+ raise ValueError("输入信号必须是numpy数组")
35
+
36
+ if ref_wav.ndim != 1 or test_wav.ndim != 1:
37
+ raise AssertionError("输入信号必须是一维数组")
38
+
39
+ if len(ref_wav) == 0 or len(test_wav) == 0:
40
+ raise ValueError("输入信号不能为空")
41
+
42
+ if len(ref_wav) != len(test_wav):
43
+ raise ValueError("参考信号和测试信号长度必须相同")
44
+
45
+ # 设置默认窗长
46
+ if win_length is None:
47
+ win_length = n_fft
48
+
49
+ # 确保参数为正整数
50
+ if n_fft <= 0 or hop_length <= 0 or win_length <= 0:
51
+ raise ValueError("n_fft、hop_length和win_length必须为正整数")
52
+
53
+ if hop_length > n_fft:
54
+ raise ValueError("hop_length不能大于n_fft")
55
+
56
+ if win_length > n_fft:
57
+ raise ValueError("win_length不能大于n_fft")
58
+
59
+ try:
60
+ # 计算短时傅里叶变换
61
+ ref_spec = librosa.stft(ref_wav, n_fft=n_fft, hop_length=hop_length, win_length=win_length)
62
+ test_spec = librosa.stft(test_wav, n_fft=n_fft, hop_length=hop_length, win_length=win_length)
63
+
64
+ # 计算频谱距离:均方根误差
65
+ spec_diff = ref_spec - test_spec
66
+ squared_diff = np.abs(spec_diff) ** 2
67
+ mean_squared_diff = np.mean(squared_diff)
68
+ sd_value = np.sqrt(mean_squared_diff)
69
+
70
+ return sd_value
71
+
72
+ except Exception as e:
73
+ raise RuntimeError(f"计算频谱距离时发生错误: {str(e)}")
74
+
75
+
76
+
77
+ def lsd(ref_wav, test_wav, n_fft=2048, hop_length=512, win_length=None):
78
+ """
79
+ 计算两个一维音频信号之间的对数谱距离 (Log-Spectral Distance, LSD)。
80
+ 该实现遵循标准的LSD定义: 整体均方根误差。
81
+
82
+ Args:
83
+ ref_wav (np.ndarray): 原始的、干净的参考信号 (一维数组)。
84
+ test_wav (np.ndarray): 模型估计或处理后的信号 (一维数组)。
85
+ n_fft (int): FFT点数, 决定了频率分辨率。
86
+ hop_length (int): 帧移, 决定了时间分辨率。
87
+ win_length (int, optional): 窗长。如果为None, 则默认为n_fft。
88
+ epsilon (float): 一个非常小的数值, 用于防止对零取对数, 保证数值稳定性。
89
+
90
+ Returns:
91
+ float: 对数谱距离值, 单位为分贝 (dB)。
92
+ """
93
+ assert ref_wav.ndim == 1 and test_wav.ndim == 1, "输入信号必须是一维数组。"
94
+
95
+ if win_length is None:
96
+ win_length = n_fft
97
+
98
+ ref_stft = librosa.stft(ref_wav, n_fft=n_fft, hop_length=hop_length, win_length=win_length) # (F,T)
99
+ test_stft = librosa.stft(test_wav, n_fft=n_fft, hop_length=hop_length, win_length=win_length) # (F,T)
100
+
101
+ ref_power_spec = np.abs(ref_stft) ** 2 # (F,T)
102
+ test_power_spec = np.abs(test_stft) ** 2 # (F,T)
103
+
104
+ ref_log_power_spec = 10 * np.log10(ref_power_spec + EPS)
105
+ test_log_power_spec = 10 * np.log10(test_power_spec + EPS)
106
+
107
+ squared_error = (ref_log_power_spec - test_log_power_spec) ** 2
108
+ lsd_val = np.sqrt(np.mean(squared_error))
109
+
110
+ return lsd_val
111
+
112
+ def mcd(ref_wav, test_wav, sr=16000):
113
+ """
114
+ 梅尔倒谱距离 Mel-Cepstral Distance
115
+ ref_spec: 参考频谱
116
+ test_spec: 测试频谱
117
+ """
118
+ ref_wav, ref_sr = sf.read(ref_wav)
119
+ test_wav, test_sr = sf.read(test_wav)
120
+ assert ref_sr == test_sr == sr, "采样率必须为16000Hz"
121
+ assert len(ref_wav) == len(test_wav), "音频长度必须相同"
122
+
123
+ ref_mfcc = librosa.feature.mfcc(y=ref_wav, sr=sr)
124
+ test_mfcc = librosa.feature.mfcc(y=test_wav, sr=sr)
125
+
126
+ # 计算 MCD (跳过 0 阶)
127
+ diff = ref_mfcc[1:] - test_mfcc[1:]
128
+ mcd = (10.0 / np.log(10)) * np.sqrt(2 * np.mean(np.sum(diff ** 2, axis=0)))
129
+ return mcd
130
+
131
+ if __name__ == "__main__":
132
+ ref_file = "../data/000_short_enhance.wav" # 参考语音文件路径
133
+ test_file = "../data/vad_example.wav" # 测试语音文件路径
134
+
135
+ avg_dist, dist_list = lpc_lsp_distance(ref_file, test_file)
136
+ print(f"平均 LSP MSE 失真: {avg_dist}")
@@ -0,0 +1,172 @@
1
+ '''
2
+ Author: 凌逆战 | Never
3
+ Date: 2025-08-16 13:51:57
4
+ Description: 频域客观度量指标
5
+ '''
6
+
7
+ import librosa
8
+ import numpy as np
9
+ import soundfile as sf
10
+ from neverlib.utils import EPS
11
+
12
+
13
+ def sd(ref_wav, test_wav, n_fft=2048, hop_length=512, win_length=None):
14
+ """
15
+ 计算两个音频信号之间的频谱距离 (Spectral Distance)。
16
+ 该指标衡量两个信号在频域上的差异程度。
17
+
18
+ Args:
19
+ ref_wav (np.ndarray): 参考音频信号 (一维数组)
20
+ test_wav (np.ndarray): 测试音频信号 (一维数组)
21
+ n_fft (int): FFT点数,决定频率分辨率,默认为2048
22
+ hop_length (int): 帧移,决定时间分辨率,默认为512
23
+ win_length (int, optional): 窗长,如果为None则默认为n_fft
24
+
25
+ Returns:
26
+ float: 频谱距离值,值越小表示两个信号越相似
27
+
28
+ Raises:
29
+ ValueError: 当输入参数无效时
30
+ AssertionError: 当输入信号维度不正确时
31
+ """
32
+ # 输入验证
33
+ if not isinstance(ref_wav, np.ndarray) or not isinstance(test_wav, np.ndarray):
34
+ raise ValueError("输入信号必须是numpy数组")
35
+
36
+ if ref_wav.ndim != 1 or test_wav.ndim != 1:
37
+ raise AssertionError("输入信号必须是一维数组")
38
+
39
+ if len(ref_wav) == 0 or len(test_wav) == 0:
40
+ raise ValueError("输入信号不能为空")
41
+
42
+ if len(ref_wav) != len(test_wav):
43
+ raise ValueError("参考信号和测试信号长度必须相同")
44
+
45
+ # 设置默认窗长
46
+ if win_length is None:
47
+ win_length = n_fft
48
+
49
+ # 确保参数为正整数
50
+ if n_fft <= 0 or hop_length <= 0 or win_length <= 0:
51
+ raise ValueError("n_fft、hop_length和win_length必须为正整数")
52
+
53
+ if hop_length > n_fft:
54
+ raise ValueError("hop_length不能大于n_fft")
55
+
56
+ if win_length > n_fft:
57
+ raise ValueError("win_length不能大于n_fft")
58
+
59
+ try:
60
+ # 计算短时傅里叶变换
61
+ ref_spec = librosa.stft(ref_wav, n_fft=n_fft, hop_length=hop_length, win_length=win_length)
62
+ test_spec = librosa.stft(test_wav, n_fft=n_fft, hop_length=hop_length, win_length=win_length)
63
+
64
+ # 计算频谱距离:均方根误差
65
+ spec_diff = ref_spec - test_spec
66
+ squared_diff = np.abs(spec_diff) ** 2
67
+ mean_squared_diff = np.mean(squared_diff)
68
+ sd_value = np.sqrt(mean_squared_diff)
69
+
70
+ return sd_value
71
+
72
+ except Exception as e:
73
+ raise RuntimeError(f"计算频谱距离时发生错误: {str(e)}")
74
+
75
+
76
+
77
+ def lsd(ref_wav, test_wav, n_fft=2048, hop_length=512, win_length=None):
78
+ """
79
+ 计算两个一维音频信号之间的对数谱距离 (Log-Spectral Distance, LSD)。
80
+ 该实现遵循标准的LSD定义: 整体均方根误差。
81
+
82
+ Args:
83
+ ref_wav (np.ndarray): 原始的、干净的参考信号 (一维数组)。
84
+ test_wav (np.ndarray): 模型估计或处理后的信号 (一维数组)。
85
+ n_fft (int): FFT点数, 决定了频率分辨率。
86
+ hop_length (int): 帧移, 决定了时间分辨率。
87
+ win_length (int, optional): 窗长。如果为None, 则默认为n_fft。
88
+ epsilon (float): 一个非常小的数值, 用于防止对零取对数, 保证数值稳定性。
89
+
90
+ Returns:
91
+ float: 对数谱距离值, 单位为分贝 (dB)。
92
+ """
93
+ assert ref_wav.ndim == 1 and test_wav.ndim == 1, "输入信号必须是一维数组。"
94
+
95
+ if win_length is None:
96
+ win_length = n_fft
97
+
98
+ ref_stft = librosa.stft(ref_wav, n_fft=n_fft, hop_length=hop_length, win_length=win_length) # (F,T)
99
+ test_stft = librosa.stft(test_wav, n_fft=n_fft, hop_length=hop_length, win_length=win_length) # (F,T)
100
+
101
+ ref_power_spec = np.abs(ref_stft) ** 2 # (F,T)
102
+ test_power_spec = np.abs(test_stft) ** 2 # (F,T)
103
+
104
+ ref_log_power_spec = 10 * np.log10(ref_power_spec + EPS)
105
+ test_log_power_spec = 10 * np.log10(test_power_spec + EPS)
106
+
107
+ squared_error = (ref_log_power_spec - test_log_power_spec) ** 2
108
+ lsd_val = np.sqrt(np.mean(squared_error))
109
+
110
+ return lsd_val
111
+
112
+ def mcd(ref_wav, test_wav, sr=16000):
113
+ """
114
+ 梅尔倒谱距离 Mel-Cepstral Distance
115
+ ref_spec: 参考频谱
116
+ test_spec: 测试频谱
117
+ """
118
+ ref_wav, ref_sr = sf.read(ref_wav)
119
+ test_wav, test_sr = sf.read(test_wav)
120
+ assert ref_sr == test_sr == sr, "采样率必须为16000Hz"
121
+ assert len(ref_wav) == len(test_wav), "音频长度必须相同"
122
+
123
+ ref_mfcc = librosa.feature.mfcc(y=ref_wav, sr=sr)
124
+ test_mfcc = librosa.feature.mfcc(y=test_wav, sr=sr)
125
+
126
+ # 计算 MCD (跳过 0 阶)
127
+ diff = ref_mfcc[1:] - test_mfcc[1:]
128
+ mcd = (10.0 / np.log(10)) * np.sqrt(2 * np.mean(np.sum(diff ** 2, axis=0)))
129
+ return mcd
130
+
131
+ if __name__ == "__main__":
132
+ # 测试sd函数
133
+ print("=== 测试频谱距离 (SD) 函数 ===")
134
+
135
+ # 创建测试音频数据
136
+ sr = 16000
137
+ duration = 1.0 # 1秒
138
+ t = np.linspace(0, duration, int(sr * duration), False)
139
+
140
+ # 参考信号:正弦波
141
+ ref_wav = np.sin(2 * np.pi * 440 * t) # 440Hz
142
+
143
+ # 测试信号1:相同的正弦波(应该距离为0)
144
+ test_wav1 = np.sin(2 * np.pi * 440 * t)
145
+
146
+ # 测试信号2:不同频率的正弦波
147
+ test_wav2 = np.sin(2 * np.pi * 880 * t) # 880Hz
148
+
149
+ # 测试信号3:添加噪声
150
+ test_wav3 = ref_wav + 0.1 * np.random.randn(len(ref_wav))
151
+
152
+ try:
153
+ # 测试相同信号
154
+ sd1 = sd(ref_wav, test_wav1)
155
+ print(f"相同信号之间的SD: {sd1:.6f} (应该接近0)")
156
+
157
+ # 测试不同频率信号
158
+ sd2 = sd(ref_wav, test_wav2)
159
+ print(f"不同频率信号之间的SD: {sd2:.6f}")
160
+
161
+ # 测试带噪声信号
162
+ sd3 = sd(ref_wav, test_wav3)
163
+ print(f"带噪声信号之间的SD: {sd3:.6f}")
164
+
165
+ # 测试不同参数
166
+ sd4 = sd(ref_wav, test_wav3, n_fft=1024, hop_length=256)
167
+ print(f"使用不同参数的SD: {sd4:.6f}")
168
+
169
+ except Exception as e:
170
+ print(f"测试过程中发生错误: {e}")
171
+
172
+ print("\n=== 测试完成 ===")
@@ -0,0 +1,172 @@
1
+ '''
2
+ Author: 凌逆战 | Never
3
+ Date: 2025-08-16 13:51:57
4
+ Description: 频域客观度量指标
5
+ '''
6
+
7
+ import librosa
8
+ import numpy as np
9
+ import soundfile as sf
10
+ from neverlib.utils import EPS
11
+
12
+
13
+ def sd(ref_wav, test_wav, n_fft=2048, hop_length=512, win_length=None):
14
+ """
15
+ 计算两个音频信号之间的频谱距离 (Spectral Distance)。
16
+ 该指标衡量两个信号在频域上的差异程度。
17
+
18
+ Args:
19
+ ref_wav (np.ndarray): 参考音频信号 (一维数组)
20
+ test_wav (np.ndarray): 测试音频信号 (一维数组)
21
+ n_fft (int): FFT点数,决定频率分辨率,默认为2048
22
+ hop_length (int): 帧移,决定时间分辨率,默认为512
23
+ win_length (int, optional): 窗长,如果为None则默认为n_fft
24
+
25
+ Returns:
26
+ float: 频谱距离值,值越小表示两个信号越相似
27
+
28
+ Raises:
29
+ ValueError: 当输入参数无效时
30
+ AssertionError: 当输入信号维度不正确时
31
+ """
32
+ # 输入验证
33
+ if not isinstance(ref_wav, np.ndarray) or not isinstance(test_wav, np.ndarray):
34
+ raise ValueError("输入信号必须是numpy数组")
35
+
36
+ if ref_wav.ndim != 1 or test_wav.ndim != 1:
37
+ raise AssertionError("输入信号必须是一维数组")
38
+
39
+ if len(ref_wav) == 0 or len(test_wav) == 0:
40
+ raise ValueError("输入信号不能为空")
41
+
42
+ if len(ref_wav) != len(test_wav):
43
+ raise ValueError("参考信号和测试信号长度必须相同")
44
+
45
+ # 设置默认窗长
46
+ if win_length is None:
47
+ win_length = n_fft
48
+
49
+ # 确保参数为正整数
50
+ if n_fft <= 0 or hop_length <= 0 or win_length <= 0:
51
+ raise ValueError("n_fft、hop_length和win_length必须为正整数")
52
+
53
+ if hop_length > n_fft:
54
+ raise ValueError("hop_length不能大于n_fft")
55
+
56
+ if win_length > n_fft:
57
+ raise ValueError("win_length不能大于n_fft")
58
+
59
+ try:
60
+ # 计算短时傅里叶变换
61
+ ref_spec = librosa.stft(ref_wav, n_fft=n_fft, hop_length=hop_length, win_length=win_length)
62
+ test_spec = librosa.stft(test_wav, n_fft=n_fft, hop_length=hop_length, win_length=win_length)
63
+
64
+ # 计算频谱距离:均方根误差
65
+ spec_diff = ref_spec - test_spec
66
+ squared_diff = np.abs(spec_diff) ** 2
67
+ mean_squared_diff = np.mean(squared_diff)
68
+ sd_value = np.sqrt(mean_squared_diff)
69
+
70
+ return sd_value
71
+
72
+ except Exception as e:
73
+ raise RuntimeError(f"计算频谱距离时发生错误: {str(e)}")
74
+
75
+
76
+
77
+ def lsd(ref_wav, test_wav, n_fft=2048, hop_length=512, win_length=None):
78
+ """
79
+ 计算两个一维音频信号之间的对数谱距离 (Log-Spectral Distance, LSD)。
80
+ 该实现遵循标准的LSD定义: 整体均方根误差。
81
+
82
+ Args:
83
+ ref_wav (np.ndarray): 原始的、干净的参考信号 (一维数组)。
84
+ test_wav (np.ndarray): 模型估计或处理后的信号 (一维数组)。
85
+ n_fft (int): FFT点数, 决定了频率分辨率。
86
+ hop_length (int): 帧移, 决定了时间分辨率。
87
+ win_length (int, optional): 窗长。如果为None, 则默认为n_fft。
88
+ epsilon (float): 一个非常小的数值, 用于防止对零取对数, 保证数值稳定性。
89
+
90
+ Returns:
91
+ float: 对数谱距离值, 单位为分贝 (dB)。
92
+ """
93
+ assert ref_wav.ndim == 1 and test_wav.ndim == 1, "输入信号必须是一维数组。"
94
+
95
+ if win_length is None:
96
+ win_length = n_fft
97
+
98
+ ref_stft = librosa.stft(ref_wav, n_fft=n_fft, hop_length=hop_length, win_length=win_length) # (F,T)
99
+ test_stft = librosa.stft(test_wav, n_fft=n_fft, hop_length=hop_length, win_length=win_length) # (F,T)
100
+
101
+ ref_power_spec = np.abs(ref_stft) ** 2 # (F,T)
102
+ test_power_spec = np.abs(test_stft) ** 2 # (F,T)
103
+
104
+ ref_log_power_spec = 10 * np.log10(ref_power_spec + EPS)
105
+ test_log_power_spec = 10 * np.log10(test_power_spec + EPS)
106
+
107
+ squared_error = (ref_log_power_spec - test_log_power_spec) ** 2
108
+ lsd_val = np.sqrt(np.mean(squared_error))
109
+
110
+ return lsd_val
111
+
112
+ def mcd(ref_wav, test_wav, sr=16000):
113
+ """
114
+ 梅尔倒谱距离 Mel-Cepstral Distance
115
+ ref_spec: 参考频谱
116
+ test_spec: 测试频谱
117
+ """
118
+ ref_wav, ref_sr = sf.read(ref_wav)
119
+ test_wav, test_sr = sf.read(test_wav)
120
+ assert ref_sr == test_sr == sr, "采样率必须为16000Hz"
121
+ assert len(ref_wav) == len(test_wav), "音频长度必须相同"
122
+
123
+ ref_mfcc = librosa.feature.mfcc(y=ref_wav, sr=sr)
124
+ test_mfcc = librosa.feature.mfcc(y=test_wav, sr=sr)
125
+
126
+ # 计算 MCD (跳过 0 阶)
127
+ diff = ref_mfcc[1:] - test_mfcc[1:]
128
+ mcd = (10.0 / np.log(10)) * np.sqrt(2 * np.mean(np.sum(diff ** 2, axis=0)))
129
+ return mcd
130
+
131
+ if __name__ == "__main__":
132
+ # 测试sd函数
133
+ print("=== 测试频谱距离 (SD) 函数 ===")
134
+
135
+ # 创建测试音频数据
136
+ sr = 16000
137
+ duration = 1.0 # 1秒
138
+ t = np.linspace(0, duration, int(sr * duration), False)
139
+
140
+ # 参考信号:正弦波
141
+ ref_wav = np.sin(2 * np.pi * 440 * t) # 440Hz
142
+
143
+ # 测试信号1:相同的正弦波(应该距离为0)
144
+ test_wav1 = np.sin(2 * np.pi * 440 * t)
145
+
146
+ # 测试信号2:不同频率的正弦波
147
+ test_wav2 = np.sin(2 * np.pi * 880 * t) # 880Hz
148
+
149
+ # 测试信号3:添加噪声
150
+ test_wav3 = ref_wav + 0.1 * np.random.randn(len(ref_wav))
151
+
152
+ try:
153
+ # 测试相同信号
154
+ sd1 = sd(ref_wav, test_wav1)
155
+ print(f"相同信号之间的SD: {sd1:.6f} (应该接近0)")
156
+
157
+ # 测试不同频率信号
158
+ sd2 = sd(ref_wav, test_wav2)
159
+ print(f"不同频率信号之间的SD: {sd2:.6f}")
160
+
161
+ # 测试带噪声信号
162
+ sd3 = sd(ref_wav, test_wav3)
163
+ print(f"带噪声信号之间的SD: {sd3:.6f}")
164
+
165
+ # 测试不同参数
166
+ sd4 = sd(ref_wav, test_wav3, n_fft=1024, hop_length=256)
167
+ print(f"使用不同参数的SD: {sd4:.6f}")
168
+
169
+ except Exception as e:
170
+ print(f"测试过程中发生错误: {e}")
171
+
172
+ print("\n=== 测试完成 ===")
@@ -0,0 +1,172 @@
1
+ '''
2
+ Author: 凌逆战 | Never
3
+ Date: 2025-08-16 13:51:57
4
+ Description: 频域客观度量指标
5
+ '''
6
+
7
+ import librosa
8
+ import numpy as np
9
+ import soundfile as sf
10
+ from neverlib.utils import EPS
11
+
12
+
13
+ def sd(ref_wav, test_wav, n_fft=2048, hop_length=512, win_length=None):
14
+ """
15
+ 计算两个音频信号之间的频谱距离 (Spectral Distance)。
16
+ 该指标衡量两个信号在频域上的差异程度。
17
+
18
+ Args:
19
+ ref_wav (np.ndarray): 参考音频信号 (一维数组)
20
+ test_wav (np.ndarray): 测试音频信号 (一维数组)
21
+ n_fft (int): FFT点数,决定频率分辨率,默认为2048
22
+ hop_length (int): 帧移,决定时间分辨率,默认为512
23
+ win_length (int, optional): 窗长,如果为None则默认为n_fft
24
+
25
+ Returns:
26
+ float: 频谱距离值,值越小表示两个信号越相似
27
+
28
+ Raises:
29
+ ValueError: 当输入参数无效时
30
+ AssertionError: 当输入信号维度不正确时
31
+ """
32
+ # 输入验证
33
+ if not isinstance(ref_wav, np.ndarray) or not isinstance(test_wav, np.ndarray):
34
+ raise ValueError("输入信号必须是numpy数组")
35
+
36
+ if ref_wav.ndim != 1 or test_wav.ndim != 1:
37
+ raise AssertionError("输入信号必须是一维数组")
38
+
39
+ if len(ref_wav) == 0 or len(test_wav) == 0:
40
+ raise ValueError("输入信号不能为空")
41
+
42
+ if len(ref_wav) != len(test_wav):
43
+ raise ValueError("参考信号和测试信号长度必须相同")
44
+
45
+ # 设置默认窗长
46
+ if win_length is None:
47
+ win_length = n_fft
48
+
49
+ # 确保参数为正整数
50
+ if n_fft <= 0 or hop_length <= 0 or win_length <= 0:
51
+ raise ValueError("n_fft、hop_length和win_length必须为正整数")
52
+
53
+ if hop_length > n_fft:
54
+ raise ValueError("hop_length不能大于n_fft")
55
+
56
+ if win_length > n_fft:
57
+ raise ValueError("win_length不能大于n_fft")
58
+
59
+ try:
60
+ # 计算短时傅里叶变换
61
+ ref_spec = librosa.stft(ref_wav, n_fft=n_fft, hop_length=hop_length, win_length=win_length)
62
+ test_spec = librosa.stft(test_wav, n_fft=n_fft, hop_length=hop_length, win_length=win_length)
63
+
64
+ # 计算频谱距离:均方根误差
65
+ spec_diff = ref_spec - test_spec
66
+ squared_diff = np.abs(spec_diff) ** 2
67
+ mean_squared_diff = np.mean(squared_diff)
68
+ sd_value = np.sqrt(mean_squared_diff)
69
+
70
+ return sd_value
71
+
72
+ except Exception as e:
73
+ raise RuntimeError(f"计算频谱距离时发生错误: {str(e)}")
74
+
75
+
76
+
77
+ def lsd(ref_wav, test_wav, n_fft=2048, hop_length=512, win_length=None):
78
+ """
79
+ 计算两个一维音频信号之间的对数谱距离 (Log-Spectral Distance, LSD)。
80
+ 该实现遵循标准的LSD定义: 整体均方根误差。
81
+
82
+ Args:
83
+ ref_wav (np.ndarray): 原始的、干净的参考信号 (一维数组)。
84
+ test_wav (np.ndarray): 模型估计或处理后的信号 (一维数组)。
85
+ n_fft (int): FFT点数, 决定了频率分辨率。
86
+ hop_length (int): 帧移, 决定了时间分辨率。
87
+ win_length (int, optional): 窗长。如果为None, 则默认为n_fft。
88
+ epsilon (float): 一个非常小的数值, 用于防止对零取对数, 保证数值稳定性。
89
+
90
+ Returns:
91
+ float: 对数谱距离值, 单位为分贝 (dB)。
92
+ """
93
+ assert ref_wav.ndim == 1 and test_wav.ndim == 1, "输入信号必须是一维数组。"
94
+
95
+ if win_length is None:
96
+ win_length = n_fft
97
+
98
+ ref_stft = librosa.stft(ref_wav, n_fft=n_fft, hop_length=hop_length, win_length=win_length) # (F,T)
99
+ test_stft = librosa.stft(test_wav, n_fft=n_fft, hop_length=hop_length, win_length=win_length) # (F,T)
100
+
101
+ ref_power_spec = np.abs(ref_stft) ** 2 # (F,T)
102
+ test_power_spec = np.abs(test_stft) ** 2 # (F,T)
103
+
104
+ ref_log_power_spec = 10 * np.log10(ref_power_spec + EPS)
105
+ test_log_power_spec = 10 * np.log10(test_power_spec + EPS)
106
+
107
+ squared_error = (ref_log_power_spec - test_log_power_spec) ** 2
108
+ lsd_val = np.sqrt(np.mean(squared_error))
109
+
110
+ return lsd_val
111
+
112
+ def mcd(ref_wav, test_wav, sr=16000):
113
+ """
114
+ 梅尔倒谱距离 Mel-Cepstral Distance
115
+ ref_spec: 参考频谱
116
+ test_spec: 测试频谱
117
+ """
118
+ ref_wav, ref_sr = sf.read(ref_wav)
119
+ test_wav, test_sr = sf.read(test_wav)
120
+ assert ref_sr == test_sr == sr, "采样率必须为16000Hz"
121
+ assert len(ref_wav) == len(test_wav), "音频长度必须相同"
122
+
123
+ ref_mfcc = librosa.feature.mfcc(y=ref_wav, sr=sr)
124
+ test_mfcc = librosa.feature.mfcc(y=test_wav, sr=sr)
125
+
126
+ # 计算 MCD (跳过 0 阶)
127
+ diff = ref_mfcc[1:] - test_mfcc[1:]
128
+ mcd = (10.0 / np.log(10)) * np.sqrt(2 * np.mean(np.sum(diff ** 2, axis=0)))
129
+ return mcd
130
+
131
+ if __name__ == "__main__":
132
+ # 测试sd函数
133
+ print("=== 测试频谱距离 (SD) 函数 ===")
134
+
135
+ # 创建测试音频数据
136
+ sr = 16000
137
+ duration = 1.0 # 1秒
138
+ t = np.linspace(0, duration, int(sr * duration), False)
139
+
140
+ # 参考信号:正弦波
141
+ ref_wav = np.sin(2 * np.pi * 440 * t) # 440Hz
142
+
143
+ # 测试信号1:相同的正弦波(应该距离为0)
144
+ test_wav1 = np.sin(2 * np.pi * 440 * t)
145
+
146
+ # 测试信号2:不同频率的正弦波
147
+ test_wav2 = np.sin(2 * np.pi * 880 * t) # 880Hz
148
+
149
+ # 测试信号3:添加噪声
150
+ test_wav3 = ref_wav + 0.1 * np.random.randn(len(ref_wav))
151
+
152
+ try:
153
+ # 测试相同信号
154
+ sd1 = sd(ref_wav, test_wav1)
155
+ print(f"相同信号之间的SD: {sd1:.6f} (应该接近0)")
156
+
157
+ # 测试不同频率信号
158
+ sd2 = sd(ref_wav, test_wav2)
159
+ print(f"不同频率信号之间的SD: {sd2:.6f}")
160
+
161
+ # 测试带噪声信号
162
+ sd3 = sd(ref_wav, test_wav3)
163
+ print(f"带噪声信号之间的SD: {sd3:.6f}")
164
+
165
+ # 测试不同参数
166
+ sd4 = sd(ref_wav, test_wav3, n_fft=1024, hop_length=256)
167
+ print(f"使用不同参数的SD: {sd4:.6f}")
168
+
169
+ except Exception as e:
170
+ print(f"测试过程中发生错误: {e}")
171
+
172
+ print("\n=== 测试完成 ===")