neverlib 0.2.6__py3-none-any.whl → 0.2.8__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 (82) hide show
  1. neverlib/.claude/settings.local.json +9 -0
  2. neverlib/Docs/audio_aug/test_volume.ipynb +416 -0
  3. neverlib/Docs/audio_aug_test/test_volume.ipynb +289 -0
  4. neverlib/Docs/filter/biquad.ipynb +129 -0
  5. neverlib/Docs/filter/filter_family.ipynb +450 -0
  6. neverlib/Docs/filter/highpass.ipynb +139 -0
  7. neverlib/Docs/filter/scipy_filter_family.ipynb +110 -0
  8. neverlib/Docs/vad/VAD_Energy.ipynb +167 -0
  9. neverlib/Docs/vad/VAD_Silero.ipynb +325 -0
  10. neverlib/Docs/vad/VAD_WebRTC.ipynb +189 -0
  11. neverlib/Docs/vad/VAD_funasr.ipynb +192 -0
  12. neverlib/Docs/vad/VAD_rvADfast.ipynb +162 -0
  13. neverlib/Docs/vad/VAD_statistics.ipynb +532 -0
  14. neverlib/Docs/vad/VAD_tenVAD.ipynb +292 -0
  15. neverlib/Docs/vad/VAD_vadlib.ipynb +168 -0
  16. neverlib/Docs/vad/VAD_whisper.ipynb +404 -0
  17. neverlib/QA/gen_init.py +218 -0
  18. neverlib/QA/get_fun.py +19 -0
  19. neverlib/__init__.py +40 -4
  20. neverlib/audio_aug/HarmonicDistortion.py +19 -13
  21. neverlib/audio_aug/__init__.py +82 -12
  22. neverlib/audio_aug/audio_aug.py +19 -14
  23. neverlib/audio_aug/clip_aug.py +15 -18
  24. neverlib/audio_aug/coder_aug.py +44 -24
  25. neverlib/audio_aug/coder_aug2.py +54 -37
  26. neverlib/audio_aug/loss_packet_aug.py +7 -7
  27. neverlib/audio_aug/quant_aug.py +19 -17
  28. neverlib/data/000_short_enhance.wav +0 -0
  29. neverlib/data/3956_speech.wav +0 -0
  30. neverlib/data/3956_sweep.wav +0 -0
  31. neverlib/data/vad_example.wav +0 -0
  32. neverlib/data/white.wav +0 -0
  33. neverlib/data/white_EQ.wav +0 -0
  34. neverlib/data/white_matched.wav +0 -0
  35. neverlib/data_analyze/__init__.py +69 -20
  36. neverlib/data_analyze/dataset_analyzer.py +109 -114
  37. neverlib/data_analyze/quality_metrics.py +87 -89
  38. neverlib/data_analyze/rms_distrubution.py +23 -42
  39. neverlib/data_analyze/spectral_analysis.py +43 -46
  40. neverlib/data_analyze/statistics.py +76 -76
  41. neverlib/data_analyze/temporal_features.py +15 -6
  42. neverlib/data_analyze/visualization.py +208 -144
  43. neverlib/filter/__init__.py +40 -20
  44. neverlib/filter/auto_eq/__init__.py +50 -31
  45. neverlib/filter/auto_eq/de_eq.py +0 -2
  46. neverlib/filter/common.py +24 -5
  47. neverlib/metrics/DNSMOS/bak_ovr.onnx +0 -0
  48. neverlib/metrics/DNSMOS/model_v8.onnx +0 -0
  49. neverlib/metrics/DNSMOS/sig.onnx +0 -0
  50. neverlib/metrics/DNSMOS/sig_bak_ovr.onnx +0 -0
  51. neverlib/metrics/__init__.py +59 -0
  52. neverlib/metrics/dnsmos.py +4 -15
  53. neverlib/metrics/pDNSMOS/sig_bak_ovr.onnx +0 -0
  54. neverlib/metrics/pesq_c/PESQ +0 -0
  55. neverlib/metrics/pesq_c/dsp.c +553 -0
  56. neverlib/metrics/pesq_c/dsp.h +138 -0
  57. neverlib/metrics/pesq_c/pesq.h +294 -0
  58. neverlib/metrics/pesq_c/pesqdsp.c +1047 -0
  59. neverlib/metrics/pesq_c/pesqio.c +392 -0
  60. neverlib/metrics/pesq_c/pesqmain.c +610 -0
  61. neverlib/metrics/pesq_c/pesqmod.c +1417 -0
  62. neverlib/metrics/pesq_c/pesqpar.h +297 -0
  63. neverlib/metrics/snr.py +5 -1
  64. neverlib/metrics/spec.py +31 -21
  65. neverlib/metrics/test_pesq.py +0 -4
  66. neverlib/tests/__init__.py +33 -1
  67. neverlib/tests/test_imports.py +19 -0
  68. neverlib/utils/__init__.py +71 -15
  69. neverlib/utils/audio_split.py +6 -1
  70. neverlib/utils/checkGPU.py +17 -9
  71. neverlib/utils/lazy_expose.py +29 -0
  72. neverlib/utils/utils.py +55 -12
  73. neverlib/vad/PreProcess.py +66 -66
  74. neverlib/vad/__init__.py +71 -25
  75. neverlib/vad/class_get_speech.py +1 -1
  76. neverlib/vad/class_vad.py +3 -3
  77. neverlib/vad/img.png +0 -0
  78. {neverlib-0.2.6.dist-info → neverlib-0.2.8.dist-info}/METADATA +1 -1
  79. {neverlib-0.2.6.dist-info → neverlib-0.2.8.dist-info}/RECORD +82 -39
  80. {neverlib-0.2.6.dist-info → neverlib-0.2.8.dist-info}/WHEEL +0 -0
  81. {neverlib-0.2.6.dist-info → neverlib-0.2.8.dist-info}/licenses/LICENSE +0 -0
  82. {neverlib-0.2.6.dist-info → neverlib-0.2.8.dist-info}/top_level.txt +0 -0
@@ -1,20 +1,40 @@
1
- '''
2
- Author: 凌逆战 | Never
3
- Date: 2025-03-17 19:23:33
4
- Description:
5
- '''
6
- """
7
- 节省路径
8
- from neverlib.filter import common
9
- 如果没有用户必须完整路径
10
- from neverlib.filter.common import *
11
- """
12
- from lazy_loader import attach
13
-
14
- __getattr__, __dir__, __all__ = attach(
15
- __name__,
16
- submodules=["common", "core", "biquad"],
17
- submod_attrs={
18
- "common": ["HPFilter", "LPFilter", "HPFilter_torch"],
19
- },
20
- )
1
+ # This file is auto-generated. Do NOT edit manually.
2
+ # Generated by neverlib.QA.gen_init
3
+
4
+ from typing import TYPE_CHECKING, Any
5
+
6
+ if TYPE_CHECKING:
7
+ # 仅在类型检查时导入,提供IDE补全支持
8
+ from .biquad import BiquadFilter
9
+ from .common import HPFilter, HPFilter_torch, LPFilter
10
+ from .core import EQFilter, EQ_test, eq_process, eq_process_test
11
+
12
+ # 运行时使用懒加载
13
+ from lazy_loader import attach
14
+
15
+ __getattr__, __dir__, __all__ = attach(
16
+ __name__,
17
+ submodules=[
18
+ "biquad",
19
+ "common",
20
+ "core",
21
+ ],
22
+ submod_attrs={
23
+ "biquad": ['BiquadFilter'],
24
+ "common": ['HPFilter', 'HPFilter_torch', 'LPFilter'],
25
+ "core": ['EQFilter', 'EQ_test', 'eq_process', 'eq_process_test'],
26
+ }
27
+ )
28
+
29
+ # 显式声明 __all__ 以便 IDE 识别
30
+ if TYPE_CHECKING:
31
+ __all__ = [
32
+ 'BiquadFilter',
33
+ 'HPFilter',
34
+ 'HPFilter_torch',
35
+ 'LPFilter',
36
+ 'EQFilter',
37
+ 'EQ_test',
38
+ 'eq_process',
39
+ 'eq_process_test',
40
+ ]
@@ -1,36 +1,55 @@
1
- '''
2
- Author: 凌逆战 | Never
3
- Date: 2025-08-19 21:26:54
4
- Description:
5
- AudoEQ - 自动EQ补偿模块
6
- Author: 凌逆战 | Never
1
+ # This file is auto-generated. Do NOT edit manually.
2
+ # Generated by neverlib.QA.gen_init
7
3
 
8
- 该模块提供多种自动EQ补偿方法:
9
- - 频谱直接补偿 (auto_eq_spectral_direct)
10
- - 差分进化优化 (auto_eq_de)
11
- - 遗传算法基础版 (auto_eq_ga_basic)
12
- - 遗传算法高级版 (auto_eq_ga_advanced)
13
- '''
4
+ from typing import TYPE_CHECKING, Any
14
5
 
15
- # 频谱直接补偿方法
16
- from .freq_eq import get_freq_eq
6
+ if TYPE_CHECKING:
7
+ # 仅在类型检查时导入,提供IDE补全支持
8
+ from .de_eq import get_filter_function, match_frequency_response, plot_spectra_comparison
9
+ from .freq_eq import get_freq_eq
10
+ from .ga_eq_advanced import EQConfig, EQOptimizer, load_config_from_yaml, main
11
+ from .ga_eq_basic import custom_mutate, evaluate_individual, generate_active_gene, generate_dbgain_gene, generate_fc_gene, generate_q_gene, generate_type_gene, get_combined_eq_response_db, get_magnitude_spectrum_db, get_single_filter_freq_response_db_from_coeffs, individual_creator, main_ga
17
12
 
18
- # 差分进化优化方法
19
- # from .de_eq import (
20
- # get_filter_function,
21
- # match_frequency_response,
22
- # plot_spectra_comparison
23
- # )
13
+ # 运行时使用懒加载
14
+ from lazy_loader import attach
24
15
 
25
- # 遗传算法基础版
26
- # from .ga_eq_basic import (
27
- # individual_creator,
28
- # get_magnitude_spectrum_db,
29
- # get_single_filter_freq_response_db_from_coeffs,
30
- # get_combined_eq_response_db,
31
- # evaluate_individual,
32
- # custom_mutate,
33
- # )
16
+ __getattr__, __dir__, __all__ = attach(
17
+ __name__,
18
+ submodules=[
19
+ "de_eq",
20
+ "freq_eq",
21
+ "ga_eq_advanced",
22
+ "ga_eq_basic",
23
+ ],
24
+ submod_attrs={
25
+ "de_eq": ['get_filter_function', 'match_frequency_response', 'plot_spectra_comparison'],
26
+ "freq_eq": ['get_freq_eq'],
27
+ "ga_eq_advanced": ['EQConfig', 'EQOptimizer', 'load_config_from_yaml', 'main'],
28
+ "ga_eq_basic": ['custom_mutate', 'evaluate_individual', 'generate_active_gene', 'generate_dbgain_gene', 'generate_fc_gene', 'generate_q_gene', 'generate_type_gene', 'get_combined_eq_response_db', 'get_magnitude_spectrum_db', 'get_single_filter_freq_response_db_from_coeffs', 'individual_creator', 'main_ga'],
29
+ }
30
+ )
34
31
 
35
- # 遗传算法高级版
36
- # from .ga_eq_advanced import EQOptimizer
32
+ # 显式声明 __all__ 以便 IDE 识别
33
+ if TYPE_CHECKING:
34
+ __all__ = [
35
+ 'get_filter_function',
36
+ 'match_frequency_response',
37
+ 'plot_spectra_comparison',
38
+ 'get_freq_eq',
39
+ 'EQConfig',
40
+ 'EQOptimizer',
41
+ 'load_config_from_yaml',
42
+ 'main',
43
+ 'custom_mutate',
44
+ 'evaluate_individual',
45
+ 'generate_active_gene',
46
+ 'generate_dbgain_gene',
47
+ 'generate_fc_gene',
48
+ 'generate_q_gene',
49
+ 'generate_type_gene',
50
+ 'get_combined_eq_response_db',
51
+ 'get_magnitude_spectrum_db',
52
+ 'get_single_filter_freq_response_db_from_coeffs',
53
+ 'individual_creator',
54
+ 'main_ga',
55
+ ]
@@ -2,8 +2,6 @@
2
2
  # Author: AI Assistant based on User's Demand
3
3
  # Date: 2023-10-27 (Using Differential Evolution)
4
4
  # Modified: 2025-01-05 (Adapted for new filters.py structure)
5
- import sys
6
- sys.path.append("..")
7
5
  import numpy as np
8
6
  import librosa
9
7
  import soundfile as sf
neverlib/filter/common.py CHANGED
@@ -3,10 +3,8 @@ Author: 凌逆战 | Never
3
3
  Date: 2025-08-05 23:42:08
4
4
  Description: 一些基础和通用的滤波器
5
5
  '''
6
- import torch
7
6
  import numpy as np
8
7
  from scipy import signal
9
- import torchaudio.functional as F
10
8
 
11
9
 
12
10
  def HPFilter(wav, sr=16000, order=6, cutoff=100):
@@ -17,7 +15,12 @@ def HPFilter(wav, sr=16000, order=6, cutoff=100):
17
15
  :param cutoff: 截止频率
18
16
  :return:
19
17
  """
20
- b, a = signal.butter(order, cutoff, btype='highpass', analog=False, output='ba', fs=sr)
18
+ b, a = signal.butter(order,
19
+ cutoff,
20
+ btype='highpass',
21
+ analog=False,
22
+ output='ba',
23
+ fs=sr)
21
24
  wav = signal.lfilter(b, a, wav, axis=0)
22
25
  return wav.astype(np.float32)
23
26
 
@@ -30,16 +33,32 @@ def LPFilter(wav, sr=16000, order=6, cutoff=100):
30
33
  :param cutoff: 截止频率
31
34
  :return:
32
35
  """
33
- b, a = signal.butter(order, cutoff, btype='lowpass', analog=False, output='ba', fs=sr)
36
+ b, a = signal.butter(order,
37
+ cutoff,
38
+ btype='lowpass',
39
+ analog=False,
40
+ output='ba',
41
+ fs=sr)
34
42
  wav = signal.lfilter(b, a, wav, axis=0)
35
43
  return wav.astype(np.float32)
36
44
 
45
+
37
46
  def HPFilter_torch(wav, sr=16000, order=6, cutoff=100):
38
47
  """
39
48
  Args:
40
49
  wav: (B,T)
41
50
  """
42
- b, a = signal.butter(order, cutoff, btype='highpass', analog=False, output='ba', fs=sr)
51
+ try:
52
+ import torch
53
+ import torchaudio.functional as F
54
+ except Exception as e:
55
+ raise ImportError("需要安装 torch 和 torchaudio 才能使用 HPFilter_torch") from e
56
+ b, a = signal.butter(order,
57
+ cutoff,
58
+ btype='highpass',
59
+ analog=False,
60
+ output='ba',
61
+ fs=sr)
43
62
 
44
63
  # 将滤波器系数转换为 torch 张量
45
64
  b = torch.tensor(b, dtype=torch.float32)
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,59 @@
1
+ # This file is auto-generated. Do NOT edit manually.
2
+ # Generated by neverlib.QA.gen_init
3
+
4
+ from typing import TYPE_CHECKING, Any
5
+
6
+ if TYPE_CHECKING:
7
+ # 仅在类型检查时导入,提供IDE补全支持
8
+ from .dnsmos import ComputeScore
9
+ from .lpc_lsp import framing, lpc_lsp_distance, lpc_to_lsp
10
+ from .snr import get_snr, get_snr_from_noisy, psnr, seg_snr, si_sdr
11
+ from .spec import lsd, mcd, sd
12
+ from .test_pesq import mos2pesq, pesq2mos
13
+ from .time import dc_offset, mean_rms_amplitude, peak_amplitude, rms_amplitude
14
+
15
+ # 运行时使用懒加载
16
+ from lazy_loader import attach
17
+
18
+ __getattr__, __dir__, __all__ = attach(
19
+ __name__,
20
+ submodules=[
21
+ "dnsmos",
22
+ "lpc_lsp",
23
+ "snr",
24
+ "spec",
25
+ "test_pesq",
26
+ "time",
27
+ ],
28
+ submod_attrs={
29
+ "dnsmos": ['ComputeScore'],
30
+ "lpc_lsp": ['framing', 'lpc_lsp_distance', 'lpc_to_lsp'],
31
+ "snr": ['get_snr', 'get_snr_from_noisy', 'psnr', 'seg_snr', 'si_sdr'],
32
+ "spec": ['lsd', 'mcd', 'sd'],
33
+ "test_pesq": ['mos2pesq', 'pesq2mos'],
34
+ "time": ['dc_offset', 'mean_rms_amplitude', 'peak_amplitude', 'rms_amplitude'],
35
+ }
36
+ )
37
+
38
+ # 显式声明 __all__ 以便 IDE 识别
39
+ if TYPE_CHECKING:
40
+ __all__ = [
41
+ 'ComputeScore',
42
+ 'framing',
43
+ 'lpc_lsp_distance',
44
+ 'lpc_to_lsp',
45
+ 'get_snr',
46
+ 'get_snr_from_noisy',
47
+ 'psnr',
48
+ 'seg_snr',
49
+ 'si_sdr',
50
+ 'lsd',
51
+ 'mcd',
52
+ 'sd',
53
+ 'mos2pesq',
54
+ 'pesq2mos',
55
+ 'dc_offset',
56
+ 'mean_rms_amplitude',
57
+ 'peak_amplitude',
58
+ 'rms_amplitude',
59
+ ]
@@ -5,17 +5,10 @@ Description:
5
5
  要计算个性化 MOS 分数(干扰说话者受到惩罚),请提供“-p”参数,例如:python dnsmos.py -t ./SampleClips -o sample.csv -p
6
6
  要计算常规 MOS 分数,请省略“-p”参数。例如:python dnsmos.py -t ./SampleClips -o sample.csv
7
7
  '''
8
- import argparse
9
- import concurrent.futures
10
- import glob
11
- import os
12
8
  import librosa
13
9
  import numpy as np
14
- import onnxruntime as ort
15
- import pandas as pd
10
+ import onnxruntime
16
11
  import soundfile as sf
17
- from tqdm import tqdm
18
- from neverlib.utils import get_path_list
19
12
 
20
13
 
21
14
  class ComputeScore:
@@ -29,8 +22,8 @@ class ComputeScore:
29
22
  else:
30
23
  primary_model_path = "./DNSMOS/sig_bak_ovr.onnx"
31
24
 
32
- self.onnx_sess = ort.InferenceSession(primary_model_path)
33
- self.p808_onnx_sess = ort.InferenceSession(p808_model_path)
25
+ self.onnx_sess = onnxruntime.InferenceSession(primary_model_path)
26
+ self.p808_onnx_sess = onnxruntime.InferenceSession(p808_model_path)
34
27
 
35
28
  def audio_melspec(self, audio, n_mels=120, frame_size=320, hop_length=160, to_db=True):
36
29
  mel_spec = librosa.feature.melspectrogram(y=audio, sr=self.sr, n_fft=frame_size + 1, hop_length=hop_length, n_mels=n_mels)
@@ -102,7 +95,7 @@ class ComputeScore:
102
95
  return out_dict
103
96
 
104
97
 
105
- def main():
98
+ if __name__ == "__main__":
106
99
  SAMPLING_RATE = 16000
107
100
  INPUT_LENGTH = 9.01
108
101
  is_personalized_MOS = False
@@ -111,7 +104,3 @@ def main():
111
104
  compute_score = ComputeScore(is_personalized_MOS, SAMPLING_RATE, INPUT_LENGTH)
112
105
  data = compute_score(testset_dir)
113
106
  print(data)
114
-
115
-
116
- if __name__ == "__main__":
117
- main()
Binary file