neverlib 0.2.9__tar.gz → 0.3.0__tar.gz

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 (138) hide show
  1. {neverlib-0.2.9 → neverlib-0.3.0}/CLAUDE.md +1 -1
  2. {neverlib-0.2.9/neverlib.egg-info → neverlib-0.3.0}/PKG-INFO +3 -3
  3. {neverlib-0.2.9 → neverlib-0.3.0}/README.md +2 -2
  4. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/Docs/audio_aug/test_volume.ipynb +8 -8
  5. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/Docs/filter/biquad.ipynb +1 -1
  6. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/Docs/filter/filter_family.ipynb +4 -4
  7. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/Docs/vad/VAD_WebRTC.ipynb +4 -4
  8. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/Docs/vad/VAD_whisper.ipynb +2 -2
  9. neverlib-0.3.0/neverlib/LLM/__init__.py +37 -0
  10. neverlib-0.3.0/neverlib/LLM/bailian.py +342 -0
  11. neverlib-0.3.0/neverlib/LLM/image.py +73 -0
  12. neverlib-0.3.0/neverlib/LLM/text.py +32 -0
  13. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/QA/ImpactNoiseRejection.py +4 -4
  14. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/QA/gen_init.py +13 -16
  15. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/__init__.py +5 -5
  16. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/audio_aug/HarmonicDistortion.py +11 -11
  17. neverlib-0.3.0/neverlib/audio_aug/__init__.py +82 -0
  18. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/audio_aug/audio_aug.py +18 -18
  19. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/audio_aug/coder_aug.py +25 -25
  20. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/audio_aug/coder_aug2.py +10 -10
  21. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/audio_aug/loss_packet_aug.py +16 -16
  22. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/audio_aug/quant_aug.py +7 -7
  23. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/data_analyze/README.md +1 -1
  24. neverlib-0.3.0/neverlib/data_analyze/__init__.py +69 -0
  25. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/data_analyze/dataset_analyzer.py +2 -2
  26. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/data_analyze/quality_metrics.py +12 -12
  27. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/data_analyze/statistics.py +1 -1
  28. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/data_analyze/visualization.py +1 -1
  29. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/filter/README.md +3 -3
  30. neverlib-0.3.0/neverlib/filter/__init__.py +40 -0
  31. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/filter/auto_eq/README.md +2 -2
  32. neverlib-0.3.0/neverlib/filter/auto_eq/__init__.py +55 -0
  33. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/filter/auto_eq/de_eq.py +1 -1
  34. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/filter/auto_eq/ga_eq_advanced.py +2 -2
  35. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/filter/auto_eq/ga_eq_basic.py +1 -1
  36. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/filter/biquad.py +1 -1
  37. neverlib-0.3.0/neverlib/metrics/__init__.py +59 -0
  38. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/dnsmos.py +2 -2
  39. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/lpc_lsp.py +8 -8
  40. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/snr.py +5 -5
  41. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/spec.py +23 -23
  42. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/test_pesq.py +3 -3
  43. neverlib-0.3.0/neverlib/tests/__init__.py +33 -0
  44. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/tests/test_imports.py +1 -1
  45. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/utils/README.md +1 -1
  46. neverlib-0.3.0/neverlib/utils/__init__.py +79 -0
  47. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/utils/audio_split.py +1 -1
  48. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/utils/checkGPU.py +2 -2
  49. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/utils/floder.py +6 -6
  50. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/utils/lazy_expose.py +1 -1
  51. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/utils/lazy_module.py +6 -6
  52. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/utils/message.py +2 -3
  53. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/utils/utils.py +108 -2
  54. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/vad/README.md +5 -5
  55. neverlib-0.3.0/neverlib/vad/__init__.py +71 -0
  56. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/vad/utils.py +1 -1
  57. {neverlib-0.2.9 → neverlib-0.3.0/neverlib.egg-info}/PKG-INFO +3 -3
  58. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib.egg-info/SOURCES.txt +4 -3
  59. {neverlib-0.2.9 → neverlib-0.3.0}/pyproject.toml +2 -2
  60. neverlib-0.2.9/neverlib/QA/impact_noise_rejection.png +0 -0
  61. neverlib-0.2.9/neverlib/QA/out.pcm +0 -0
  62. neverlib-0.2.9/neverlib/QA/out.wav +0 -0
  63. neverlib-0.2.9/neverlib/audio_aug/__init__.py +0 -28
  64. neverlib-0.2.9/neverlib/data_analyze/__init__.py +0 -25
  65. neverlib-0.2.9/neverlib/filter/__init__.py +0 -17
  66. neverlib-0.2.9/neverlib/filter/auto_eq/__init__.py +0 -19
  67. neverlib-0.2.9/neverlib/metrics/__init__.py +0 -23
  68. neverlib-0.2.9/neverlib/tests/__init__.py +0 -16
  69. neverlib-0.2.9/neverlib/utils/__init__.py +0 -27
  70. neverlib-0.2.9/neverlib/vad/__init__.py +0 -33
  71. {neverlib-0.2.9 → neverlib-0.3.0}/LICENSE +0 -0
  72. {neverlib-0.2.9 → neverlib-0.3.0}/MANIFEST.in +0 -0
  73. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/Docs/audio_aug_test/test_snr.py +0 -0
  74. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/Docs/audio_aug_test/test_volume.ipynb +0 -0
  75. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/Docs/audio_aug_test/test_volume.py +0 -0
  76. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/Docs/filter/highpass.ipynb +0 -0
  77. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/Docs/filter/scipy_filter_family.ipynb +0 -0
  78. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/Docs/vad/VAD_Energy.ipynb +0 -0
  79. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/Docs/vad/VAD_Silero.ipynb +0 -0
  80. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/Docs/vad/VAD_funasr.ipynb +0 -0
  81. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/Docs/vad/VAD_rvADfast.ipynb +0 -0
  82. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/Docs/vad/VAD_statistics.ipynb +0 -0
  83. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/Docs/vad/VAD_tenVAD.ipynb +0 -0
  84. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/Docs/vad/VAD_vadlib.ipynb +0 -0
  85. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/QA/get_fun.py +0 -0
  86. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/QA/html2markdown.py +0 -0
  87. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/audio_aug/README.md +0 -0
  88. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/audio_aug/TFDrop.py +0 -0
  89. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/audio_aug/TFMask.py +0 -0
  90. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/audio_aug/clip_aug.py +0 -0
  91. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/data/000_short_enhance.wav +0 -0
  92. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/data/3956_speech.wav +0 -0
  93. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/data/3956_sweep.wav +0 -0
  94. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/data/vad_example.wav +0 -0
  95. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/data/white.wav +0 -0
  96. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/data/white_EQ.wav +0 -0
  97. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/data/white_matched.wav +0 -0
  98. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/data_analyze/rms_distrubution.py +0 -0
  99. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/data_analyze/spectral_analysis.py +0 -0
  100. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/data_analyze/temporal_features.py +0 -0
  101. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/filter/auto_eq/freq_eq.py +0 -0
  102. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/filter/common.py +0 -0
  103. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/filter/core.py +0 -0
  104. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/DNSMOS/bak_ovr.onnx +0 -0
  105. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/DNSMOS/model_v8.onnx +0 -0
  106. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/DNSMOS/sig.onnx +0 -0
  107. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/DNSMOS/sig_bak_ovr.onnx +0 -0
  108. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/README.md +0 -0
  109. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/pDNSMOS/sig_bak_ovr.onnx +0 -0
  110. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/pesq_c/PESQ +0 -0
  111. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/pesq_c/dsp.c +0 -0
  112. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/pesq_c/dsp.h +0 -0
  113. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/pesq_c/pesq.h +0 -0
  114. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/pesq_c/pesqdsp.c +0 -0
  115. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/pesq_c/pesqio.c +0 -0
  116. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/pesq_c/pesqmain.c +0 -0
  117. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/pesq_c/pesqmod.c +0 -0
  118. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/pesq_c/pesqpar.h +0 -0
  119. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/metrics/time.py +0 -0
  120. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/signal_gen/babble_noise_generate.py +0 -0
  121. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/tests/test_preprocess.py +0 -0
  122. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/tests/test_vad.py +0 -0
  123. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/utils/pcm.py +0 -0
  124. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/vad/PreProcess.py +0 -0
  125. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/vad/VAD_Energy.py +0 -0
  126. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/vad/VAD_Silero.py +0 -0
  127. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/vad/VAD_WebRTC.py +0 -0
  128. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/vad/VAD_funasr.py +0 -0
  129. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/vad/VAD_statistics.py +0 -0
  130. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/vad/VAD_vadlib.py +0 -0
  131. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/vad/VAD_whisper.py +0 -0
  132. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/vad/class_get_speech.py +0 -0
  133. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/vad/class_vad.py +0 -0
  134. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib/vad/img.png +0 -0
  135. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib.egg-info/dependency_links.txt +0 -0
  136. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib.egg-info/requires.txt +0 -0
  137. {neverlib-0.2.9 → neverlib-0.3.0}/neverlib.egg-info/top_level.txt +0 -0
  138. {neverlib-0.2.9 → neverlib-0.3.0}/setup.cfg +0 -0
@@ -15,4 +15,4 @@
15
15
 
16
16
  ## 个人备注
17
17
 
18
- - 如果遇到困难,请停下来寻求帮助。我的名字是 never
18
+ - 如果遇到困难, 请停下来寻求帮助. 我的名字是 never.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: neverlib
3
- Version: 0.2.9
3
+ Version: 0.3.0
4
4
  Summary: A successful sign for python setup
5
5
  Author-email: "Never.Ling" <1786088386@qq.com>
6
6
  License: MIT
@@ -57,7 +57,7 @@ Dynamic: license-file
57
57
  -->
58
58
  # NeverLib
59
59
 
60
- 一个用于音频处理和VAD(语音活动检测)的Python工具库。
60
+ 一个用于音频处理和VAD(语音活动检测)的Python工具库.
61
61
 
62
62
  ## 安装
63
63
 
@@ -129,7 +129,7 @@ from neverlib.message import seed_QQEmail
129
129
 
130
130
  ## 许可证
131
131
 
132
- 本项目采用MIT许可证。详情请参阅LICENSE文件。
132
+ 本项目采用MIT许可证. 详情请参阅LICENSE文件.
133
133
 
134
134
  ## 作者
135
135
 
@@ -8,7 +8,7 @@
8
8
  -->
9
9
  # NeverLib
10
10
 
11
- 一个用于音频处理和VAD(语音活动检测)的Python工具库。
11
+ 一个用于音频处理和VAD(语音活动检测)的Python工具库.
12
12
 
13
13
  ## 安装
14
14
 
@@ -80,7 +80,7 @@ from neverlib.message import seed_QQEmail
80
80
 
81
81
  ## 许可证
82
82
 
83
- 本项目采用MIT许可证。详情请参阅LICENSE文件。
83
+ 本项目采用MIT许可证. 详情请参阅LICENSE文件.
84
84
 
85
85
  ## 作者
86
86
 
@@ -350,16 +350,16 @@
350
350
  "print(\"\\n音量增强方法分析总结:\")\n",
351
351
  "print(\"=\" * 80)\n",
352
352
  "print(\"1. Linear增强 (volume_aug_linmax):\")\n",
353
- "print(\" - 基于峰值的线性增益,目标为最大峰值为指定的线性值\")\n",
354
- "print(\" - 特点:保持动态范围不变,整体增强或减弱\")\n",
353
+ "print(\" - 基于峰值的线性增益, 目标为最大峰值为指定的线性值\")\n",
354
+ "print(\" - 特点:保持动态范围不变, 整体增强或减弱\")\n",
355
355
  "print(\" - 适用场景:需要精确控制峰值而不改变音频动态特性的场合\")\n",
356
356
  "print(\"\\n2. dBrms增强 (volume_aug_dbrms):\")\n",
357
- "print(\" - 基于RMS电平的增益,目标为指定的dB电平\")\n",
358
- "print(\" - 特点:以能量均值为基准,更接近人耳感知\")\n",
357
+ "print(\" - 基于RMS电平的增益, 目标为指定的dB电平\")\n",
358
+ "print(\" - 特点:以能量均值为基准, 更接近人耳感知\")\n",
359
359
  "print(\" - 适用场景:需要统一音频能量电平的场合\")\n",
360
360
  "print(\"\\n3. LUFS增强 (volume_aug_lufs):\")\n",
361
- "print(\" - 基于国际响度标准的增益,符合广播标准\")\n",
362
- "print(\" - 特点:考虑人耳频率加权,最接近人耳响度感知\")\n",
361
+ "print(\" - 基于国际响度标准的增益, 符合广播标准\")\n",
362
+ "print(\" - 特点:考虑人耳频率加权, 最接近人耳响度感知\")\n",
363
363
  "print(\" - 适用场景:广播、流媒体、专业音频处理等需要符合响度标准的场合\")\n",
364
364
  "print(\"=\" * 80)"
365
365
  ]
@@ -386,9 +386,9 @@
386
386
  "3. **LUFS增强 (volume_aug_lufs)**\n",
387
387
  " - 基于感知响度单位(LUFS)的增益\n",
388
388
  " - 符合广播标准的响度归一化\n",
389
- " - 考虑人耳感知加权,最接近人耳响度感知\n",
389
+ " - 考虑人耳感知加权, 最接近人耳响度感知\n",
390
390
  "\n",
391
- "各方法适用于不同场景,可根据需求选择合适的音量增强方式。"
391
+ "各方法适用于不同场景, 可根据需求选择合适的音量增强方式. "
392
392
  ]
393
393
  }
394
394
  ],
@@ -39,7 +39,7 @@
39
39
  "source": [
40
40
  "# 设计高通滤波器系数\n",
41
41
  "fs = 16000 # 采样率\n",
42
- "fc = 70 # 截止频率(Hz)\n",
42
+ "fc = 70 # 截止频率(Hz)\n",
43
43
  "# 输入信号\n",
44
44
  "input_signal = [0.5, 0.8, 1.0, 0.7, -0.2, -0.6, -0.8, -0.3, -0.3, -0.3, -0.3]\n",
45
45
  "\n",
@@ -10,7 +10,7 @@
10
10
  "source": [
11
11
  "# 音频滤波器示例\n",
12
12
  "\n",
13
- "这个notebook展示了如何使用 neverlib.filter 中的各种滤波器。我们将展示:\n",
13
+ "这个notebook展示了如何使用 neverlib.filter 中的各种滤波器. 我们将展示:\n",
14
14
  "1. 各种滤波器的频率响应\n",
15
15
  "2. 实际音频处理示例\n",
16
16
  "3. 与scipy原生函数的对比\n",
@@ -80,7 +80,7 @@
80
80
  "source": [
81
81
  "# 滤波器示例\n",
82
82
  "\n",
83
- "下面我们将展示各种滤波器的频率响应。我们使用以下参数:\n",
83
+ "下面我们将展示各种滤波器的频率响应. 我们使用以下参数:\n",
84
84
  "- 采样率 fs = 16000 Hz\n",
85
85
  "- 截止频率 fc = 1000 Hz\n",
86
86
  "- 品质因数 Q = 1/√2 ≈ 0.707 (Butterworth响应)\n",
@@ -248,7 +248,7 @@
248
248
  "source": [
249
249
  "# 实际音频处理示例\n",
250
250
  "\n",
251
- "下面我们将展示如何使用这些滤波器处理实际的音频信号。我们将:\n",
251
+ "下面我们将展示如何使用这些滤波器处理实际的音频信号. 我们将:\n",
252
252
  "1. 加载一个音频文件\n",
253
253
  "2. 应用不同的滤波器\n",
254
254
  "3. 对比处理前后的频谱\n"
@@ -318,7 +318,7 @@
318
318
  "source": [
319
319
  "# EQ滤波\n",
320
320
  "\n",
321
- "通过多个Biquand滤波器, 组成一个EQ滤波器, 实现音频的均衡处理。"
321
+ "通过多个Biquand滤波器, 组成一个EQ滤波器, 实现音频的均衡处理. "
322
322
  ]
323
323
  },
324
324
  {
@@ -12,12 +12,12 @@
12
12
  "mode 0~3\n",
13
13
  "\n",
14
14
  "0: 最低的语音检测敏感度, \n",
15
- "- 认为背景噪声不是语音, 适合环境较安静, 背景噪声少的情况。\n",
16
- "- 适合环境较安静, 背景噪声少的情况。\n",
15
+ "- 认为背景噪声不是语音, 适合环境较安静, 背景噪声少的情况. \n",
16
+ "- 适合环境较安静, 背景噪声少的情况. \n",
17
17
  "\n",
18
18
  "3: 最高的语音检测敏感度, \n",
19
- "- VAD 会非常积极地尝试将任何噪声过滤掉, 只有明确的语音才会被认为是语音。\n",
20
- "- 适合环境较吵, 背景噪声多的情况。"
19
+ "- VAD 会非常积极地尝试将任何噪声过滤掉, 只有明确的语音才会被认为是语音. \n",
20
+ "- 适合环境较吵, 背景噪声多的情况. "
21
21
  ]
22
22
  },
23
23
  {
@@ -7,7 +7,7 @@
7
7
  "source": [
8
8
  "# whisper base模型\n",
9
9
  "\n",
10
- "whisper 检测的 词与词之间的VAD 都是连着的。但其实音频不是\n",
10
+ "whisper 检测的 词与词之间的VAD 都是连着的. 但其实音频不是\n",
11
11
  "\n",
12
12
  "而且Whisper的VAD并没有直接提供调参接口, 所以无法调整VAD的参数"
13
13
  ]
@@ -170,7 +170,7 @@
170
170
  "source": [
171
171
  "# whisper large-v3 模型\n",
172
172
  "\n",
173
- "词与词之间的VAD 都是连着的。但其实音频不是\n",
173
+ "词与词之间的VAD 都是连着的. 但其实音频不是\n",
174
174
  "```\n",
175
175
  "# Word: Sometimes, Start: 0.00s, End: 0.70s\n",
176
176
  "# Word: he, Start: 0.70s, End: 0.86s\n",
@@ -0,0 +1,37 @@
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 .bailian import AliyunSession, Aliyun_App
9
+ from .image import chat_with_ai_image, image_to_base64_uri
10
+ from .text import chat
11
+
12
+ # 运行时使用懒加载
13
+ from lazy_loader import attach
14
+
15
+ __getattr__, __dir__, __all__ = attach(
16
+ __name__,
17
+ submodules=[
18
+ "bailian",
19
+ "image",
20
+ "text",
21
+ ],
22
+ submod_attrs={
23
+ "bailian": ['AliyunSession', 'Aliyun_App'],
24
+ "image": ['chat_with_ai_image', 'image_to_base64_uri'],
25
+ "text": ['chat'],
26
+ }
27
+ )
28
+
29
+ # 显式声明 __all__ 以便 IDE 识别
30
+ if TYPE_CHECKING:
31
+ __all__ = [
32
+ 'AliyunSession',
33
+ 'Aliyun_App',
34
+ 'chat_with_ai_image',
35
+ 'image_to_base64_uri',
36
+ 'chat',
37
+ ]
@@ -0,0 +1,342 @@
1
+ '''
2
+ Author: 凌逆战 | Never
3
+ Date: 2026-01-07 00:47:30
4
+ Description: 阿里云百炼应用调用封装
5
+ '''
6
+ import os
7
+ from typing import Optional, Dict, Any, List
8
+
9
+
10
+ def Aliyun_App(inputs: str, prompt: Optional[str] = None,
11
+ api_key: Optional[str] = None,
12
+ app_id: Optional[str] = None,
13
+ stream: bool = False,
14
+ messages: Optional[List[Dict[str, str]]] = None,
15
+ workspace: Optional[str] = None,
16
+ temperature: Optional[float] = None,
17
+ top_p: Optional[float] = None,
18
+ top_k: Optional[int] = None,
19
+ return_full_response: bool = False,
20
+ **kwargs
21
+ ) -> str | Dict[str, Any]:
22
+ """
23
+ 调用阿里云百炼应用
24
+
25
+ Args:
26
+ inputs: 输入文本
27
+ prompt: 提示词(可选, 会与inputs拼接)
28
+ api_key: API密钥
29
+ app_id: 应用ID(必填)
30
+ stream: 是否启用流式输出
31
+ messages: 对话消息列表, 格式: [{'role': 'user', 'content': '问题'}, {'role': 'assistant', 'content': '回答'}]
32
+ workspace: 工作空间
33
+ temperature: 温度参数 (0-2), 控制随机性和多样性
34
+ - 值越高:输出越随机、越有创造性
35
+ - 值越低:输出越确定、越保守
36
+ - 建议: 财经分析用0.1-0.3, 创意内容用0.7-1.0
37
+ top_p: 核采样参数(Nucleus Sampling), 范围 (0-1)
38
+ - 作用: 从累积概率达到p的候选词中采样
39
+ - 0.1: 只考虑累积概率前10%的词(更确定)
40
+ - 0.9: 考虑累积概率前90%的词(更多样)
41
+ - 建议: 专业分析用0.1-0.3, 常规对话用0.7, 创意内容用0.9
42
+ top_k: Top-K采样候选集大小
43
+ - 作用: 每次生成只从概率最高的k个词中选择
44
+ - 值越小:确定性越高(如10-30)
45
+ - 值越大:随机性越高(如50-100)
46
+ - 默认0: 禁用top_k策略, 只使用top_p
47
+ return_full_response: 是否返回完整响应(包含thoughts、session_id等)
48
+ **kwargs: 其他API支持的参数
49
+ - enable_thinking: 启用深度思考模式
50
+ - has_thoughts: 包含思考内容
51
+ - seed: 随机种子(用于复现结果)
52
+
53
+ Returns:
54
+ str: 默认返回响应文本字符串
55
+ dict: 当 return_full_response=True 时返回完整响应字典:
56
+ {
57
+ "status": "success" | "error",
58
+ "text": "响应文本",
59
+ "request_id": "请求ID",
60
+ "session_id": "会话ID(可选)",
61
+ "finish_reason": "结束原因(可选)",
62
+ "thoughts": [...] # 思考过程(可选),
63
+ "doc_references": [...] # 文档引用(可选),
64
+ }
65
+
66
+ Raises:
67
+ ValueError: 参数验证失败
68
+
69
+ 来源: https://help.aliyun.com/zh/model-studio/call-single-agent-application/
70
+ """
71
+ try:
72
+ from http import HTTPStatus
73
+ from dashscope import Application
74
+ except ImportError as e:
75
+ if 'dashscope' in str(e):
76
+ raise ImportError("请安装dashscope库: pip install dashscope")
77
+ else:
78
+ raise ImportError(f"导入失败: {e}. 如果是因为HTTPStatus, 请确保使用Python 3.5或更高版本")
79
+
80
+ if not app_id:
81
+ raise ValueError("app_id参数不能为空")
82
+
83
+ if not inputs and not prompt:
84
+ raise ValueError("inputs和prompt至少需要提供一个")
85
+
86
+ # 构建输入
87
+ if prompt and inputs:
88
+ llm_input = f"{prompt}\n{inputs}"
89
+ elif prompt:
90
+ llm_input = prompt
91
+ else:
92
+ llm_input = inputs
93
+
94
+ # 构建API调用参数
95
+ call_params = {
96
+ 'app_id': app_id,
97
+ 'prompt': llm_input,
98
+ 'stream': stream
99
+ }
100
+
101
+ # 添加可选参数
102
+ if api_key:
103
+ call_params['api_key'] = api_key
104
+ if messages:
105
+ call_params['messages'] = messages
106
+ if workspace:
107
+ call_params['workspace'] = workspace
108
+ if temperature is not None:
109
+ call_params['temperature'] = temperature
110
+ if top_p is not None:
111
+ call_params['top_p'] = top_p
112
+ if top_k is not None:
113
+ call_params['top_k'] = top_k
114
+
115
+ # 添加额外参数
116
+ call_params.update(kwargs)
117
+
118
+ # 调用API
119
+ response = Application.call(**call_params)
120
+
121
+ # 检查响应状态
122
+ if response.status_code != HTTPStatus.OK:
123
+ if return_full_response:
124
+ return {
125
+ "status": "error",
126
+ "text": "",
127
+ "message": f"API调用失败: [{response.code}] {response.message}",
128
+ "code": response.code
129
+ }
130
+ return "API调用失败"
131
+
132
+ # 提取文本
133
+ output_text = response.output.text if hasattr(response.output, 'text') else str(response.output)
134
+
135
+ # 如果需要完整响应
136
+ if return_full_response:
137
+ result = {
138
+ "status": "success",
139
+ "text": output_text,
140
+ "request_id": response.request_id
141
+ }
142
+
143
+ # 添加 session_id
144
+ if hasattr(response.output, 'session_id') and response.output.session_id:
145
+ result['session_id'] = response.output.session_id
146
+
147
+ # 添加 finish_reason
148
+ if hasattr(response.output, 'finish_reason') and response.output.finish_reason:
149
+ result['finish_reason'] = response.output.finish_reason
150
+
151
+ # 添加思考过程(深度思考)
152
+ if hasattr(response.output, 'thoughts') and response.output.thoughts:
153
+ result['thoughts'] = [
154
+ {
155
+ 'thought': t.thought,
156
+ 'action_type': t.action_type,
157
+ 'action_name': t.action_name,
158
+ 'observation': t.observation
159
+ }
160
+ for t in response.output.thoughts
161
+ ]
162
+
163
+ # 添加文档引用(RAG场景)
164
+ if hasattr(response.output, 'doc_references') and response.output.doc_references:
165
+ result['doc_references'] = [
166
+ {
167
+ 'title': ref.title,
168
+ 'text': ref.text,
169
+ 'doc_name': ref.doc_name
170
+ }
171
+ for ref in response.output.doc_references
172
+ ]
173
+
174
+ return result
175
+
176
+ return output_text
177
+
178
+
179
+ class AliyunSession:
180
+ """
181
+ 阿里云百炼应用会话管理类
182
+ 自动维护对话历史, 支持多轮对话
183
+
184
+ 使用示例:
185
+ session = AliyunSession(app_id="xxx", api_key="xxx", temperature=0.3)
186
+
187
+ # 第一轮对话
188
+ result1 = session.chat("介绍一下股票市场")
189
+
190
+ # 第二轮对话(自动带上历史)
191
+ result2 = session.chat("那A股和港股有什么区别?")
192
+
193
+ # 查看历史
194
+ print(session.get_history_text())
195
+ """
196
+
197
+ def __init__(self, app_id: str, api_key: Optional[str] = None,
198
+ max_history: int = 10, **default_params):
199
+ """
200
+ 初始化会话
201
+
202
+ Args:
203
+ app_id: 应用ID
204
+ api_key: API密钥
205
+ max_history: 最多保留的历史轮数(默认10轮, 超过会自动删除最早的)
206
+ **default_params: 默认参数(如temperature, top_p等)
207
+ """
208
+ self.app_id = app_id
209
+ self.api_key = api_key
210
+ self.max_history = max_history
211
+ self.default_params = default_params
212
+ self.messages: List[Dict[str, str]] = []
213
+ self.session_id: Optional[str] = None
214
+
215
+ def chat(self, inputs: str, prompt: Optional[str] = None, **kwargs) -> str | Dict[str, Any]:
216
+ """
217
+ 发送消息并自动维护历史
218
+
219
+ Args:
220
+ inputs: 用户输入
221
+ prompt: 系统提示词(可选)
222
+ **kwargs: 覆盖默认参数(如 return_full_response=True)
223
+
224
+ Returns:
225
+ str: 默认返回响应文本
226
+ dict: 当 kwargs 中包含 return_full_response=True 时返回完整响应
227
+ """
228
+ # 合并默认参数和传入参数
229
+ call_params = {**self.default_params, **kwargs}
230
+
231
+ # 调用API
232
+ result = Aliyun_App(
233
+ inputs=inputs,
234
+ prompt=prompt,
235
+ app_id=self.app_id,
236
+ api_key=self.api_key,
237
+ messages=self.messages.copy() if self.messages else None,
238
+ **call_params
239
+ )
240
+
241
+ # 如果调用成功, 添加到历史
242
+ # 添加用户消息
243
+ user_content = f"{prompt}\n{inputs}" if prompt else inputs
244
+ self.messages.append({"role": "user", "content": user_content})
245
+
246
+ # 添加助手回复
247
+ self.messages.append({"role": "assistant", "content": result})
248
+
249
+ # 限制历史长度(保留最近的 max_history 轮对话)
250
+ if len(self.messages) > self.max_history * 2:
251
+ removed = len(self.messages) - self.max_history * 2
252
+ self.messages = self.messages[removed:]
253
+
254
+ return result
255
+
256
+ def clear_history(self):
257
+ """清空对话历史"""
258
+ self.messages.clear()
259
+ self.session_id = None
260
+
261
+ def get_history(self) -> List[Dict[str, str]]:
262
+ """获取当前对话历史"""
263
+ return self.messages.copy()
264
+
265
+ def get_history_text(self) -> str:
266
+ """获取格式化的对话历史文本"""
267
+ history_lines = []
268
+ for msg in self.messages:
269
+ role = "用户" if msg["role"] == "user" else "助手"
270
+ history_lines.append(f"{role}: {msg['content'][:100]}...")
271
+ return "\n\n".join(history_lines)
272
+
273
+ def set_history(self, messages: List[Dict[str, str]]):
274
+ """设置对话历史(用于恢复会话)"""
275
+ self.messages = messages.copy()
276
+
277
+ def __repr__(self):
278
+ return f"AliyunSession(app_id={self.app_id}, history={len(self.messages) // 2}轮)"
279
+
280
+
281
+ if __name__ == "__main__":
282
+ import dotenv
283
+ dotenv.load_dotenv()
284
+
285
+ # 使用示例1: 基本调用
286
+ print("=" * 50)
287
+ print("示例1: 基本调用")
288
+ print("=" * 50)
289
+ result = Aliyun_App(
290
+ inputs="你好, 请介绍一下最近的A股市场情况",
291
+ app_id=os.getenv("ALIYUN_APP_ID"),
292
+ api_key=os.getenv("DASHSCOPE_API_KEY")
293
+ )
294
+ print(f"响应: {result[:200]}...")
295
+
296
+ # 使用示例2: 使用会话管理类(自动维护历史)
297
+ print("\n" + "=" * 50)
298
+ print("示例2: 使用AliyunSession - 多轮对话")
299
+ print("=" * 50)
300
+
301
+ session = AliyunSession(
302
+ app_id=os.getenv("ALIYUN_APP_ID"),
303
+ api_key=os.getenv("DASHSCOPE_API_KEY"),
304
+ temperature=0.5,
305
+ max_history=5
306
+ )
307
+
308
+ # 第一轮
309
+ print("\n[第1轮]")
310
+ r1 = session.chat("介绍一下A股市场")
311
+ print(f"用户: 介绍一下A股市场")
312
+ print(f"助手: {r1[:150]}...")
313
+
314
+ # 第二轮(自动带上历史)
315
+ print("\n[第2轮]")
316
+ r2 = session.chat("那主要有哪些板块?")
317
+ print(f"用户: 那主要有哪些板块?")
318
+ print(f"助手: {r2[:150]}...")
319
+
320
+ # 查看会话信息
321
+ print(f"\n{session}")
322
+
323
+ # 使用示例3: 启用深度思考模式(返回完整响应)
324
+ print("\n" + "=" * 50)
325
+ print("示例3: 深度思考模式")
326
+ print("=" * 50)
327
+ result_thinking = Aliyun_App(
328
+ inputs="分析今日A股大盘走势",
329
+ app_id=os.getenv("ALIYUN_APP_ID"),
330
+ api_key=os.getenv("DASHSCOPE_API_KEY"),
331
+ return_full_response=True,
332
+ enable_thinking=True
333
+ )
334
+
335
+ if isinstance(result_thinking, dict):
336
+ print(f"状态: {result_thinking.get('status')}")
337
+ print(f"响应: {result_thinking.get('text', '')[:200]}...")
338
+
339
+ if result_thinking.get('thoughts'):
340
+ print(f"\n发现 {len(result_thinking['thoughts'])} 条思考过程")
341
+ if result_thinking.get('finish_reason'):
342
+ print(f"结束原因: {result_thinking['finish_reason']}")
@@ -0,0 +1,73 @@
1
+ '''
2
+ Author: 凌逆战 | Never
3
+ Date: 2026-01-07 00:44:24
4
+ Description:
5
+ '''
6
+ import os
7
+ import base64
8
+ import mimetypes
9
+ from openai import OpenAI
10
+
11
+
12
+ def image_to_base64_uri(file_path):
13
+ """
14
+ 将本地图片文件转换为Base64编码的Data URI.
15
+ """
16
+ # 自动猜测MIME类型
17
+ mime_type, _ = mimetypes.guess_type(file_path)
18
+ if mime_type is None:
19
+ # 如果无法猜测, 可以根据文件扩展名设置一个默认值
20
+ if file_path.lower().endswith(('.jpg', '.jpeg')):
21
+ mime_type = 'image/jpeg'
22
+ elif file_path.lower().endswith('.png'):
23
+ mime_type = 'image/png'
24
+ elif file_path.lower().endswith('.gif'):
25
+ mime_type = 'image/gif'
26
+ elif file_path.lower().endswith('.webp'):
27
+ mime_type = 'image/webp'
28
+ else:
29
+ print(
30
+ f"Warning: Could not determine MIME type for {file_path}. Skipping.")
31
+ return None # 或者抛出错误
32
+
33
+ with open(file_path, "rb") as image_file:
34
+ binary_data = image_file.read()
35
+ base64_encoded_data = base64.b64encode(binary_data)
36
+ base64_string = base64_encoded_data.decode('utf-8')
37
+ return f"data:{mime_type};base64,{base64_string}"
38
+
39
+
40
+ def chat_with_ai_image(inputs, image_path_list, prompt=None,
41
+ model="doubao-1-5-vision-pro-32k-250115"):
42
+ """
43
+ 使用豆包大模型分析图片和文本内容.
44
+ 支持多个图片, 图片可以是本地路径或网络URL.
45
+ """
46
+ image_contents, messages = [], []
47
+ for image_path in image_path_list:
48
+ if "http" in image_path: # 是网络图片
49
+ image_contents.append({
50
+ "type": "image_url",
51
+ "image_url": {"url": image_path}
52
+ })
53
+ else: # 是本地图片路径
54
+ base64_uri = image_to_base64_uri(image_path)
55
+ image_contents.append({
56
+ "type": "image_url",
57
+ "image_url": {"url": base64_uri}
58
+ })
59
+
60
+ image_contents.append({"type": "text", "text": inputs})
61
+ if prompt:
62
+ messages.append({"role": "system", "content": prompt})
63
+ messages.append({"role": "user", "content": image_contents})
64
+
65
+ client = OpenAI(
66
+ base_url="https://ark.cn-beijing.volces.com/api/v3",
67
+ api_key=os.environ.get("DOUBAO_API_KEY"),
68
+ )
69
+ response = client.chat.completions.create(
70
+ model=model,
71
+ messages=messages,
72
+ )
73
+ return response.choices[0].message.content
@@ -0,0 +1,32 @@
1
+ '''
2
+ Author: 凌逆战 | Never
3
+ Date: 2026-01-07 00:35:35
4
+ Description:
5
+ '''
6
+
7
+
8
+ def chat(inputs, prompt=None, model=None, timeout=180, base_url=None, api_key=None):
9
+ """
10
+ 使用OpenAI API进行对话(非流式)
11
+ """
12
+ try:
13
+ from openai import OpenAI
14
+ except ImportError:
15
+ raise ImportError("请安装openai库: pip install openai")
16
+ assert model, "model不能为空"
17
+ assert base_url and api_key, "base_url和api_key不能为空"
18
+ client = OpenAI(base_url=base_url, api_key=api_key, timeout=timeout)
19
+
20
+ messages = []
21
+ if prompt:
22
+ messages.append({"role": "system", "content": prompt})
23
+ messages.append({"role": "user", "content": inputs})
24
+
25
+ completion = client.chat.completions.create(
26
+ model=model, messages=messages, timeout=timeout)
27
+
28
+ output = completion.choices[0].message.content
29
+ # 如果有引用, 则添加到输出中
30
+ if hasattr(completion, "references"):
31
+ output += "\n" + str(completion.references)
32
+ return output