深入解析:音频降噪技术:从原理到工具的完整指南(scipy librosa noisereduce soundfile pedalboard)

news/2025/10/4 14:24:42/文章来源:https://www.cnblogs.com/wzzkaifa/p/19125569

写给想真正理解降噪的你

如果你录了一段采访,结果背景里全是空调嗡嗡声;或者做播客时电脑风扇声把你的声音都盖住了——这时候你需要的不是玄学调参,而是真正理解降噪在做什么。这篇文章会带你从零开始,用最直白的语言讲清楚音频降噪的底层逻辑,然后告诉你该用什么工具、怎么用、为什么这么用。


一、降噪的本质:你在跟什么作战?

1.1、声音的双重面孔

想象你在嘈杂的咖啡厅打电话。你的大脑能自动"过滤"掉背景的咖啡机声、谈话声,专注听电话那头的声音。这个能力太自然了,以至于我们从没意识到它有多复杂。

但计算机面对的是一串数字——在时域(Time Domain)里,它看到的是上下波动的波形图。这串数字里,你的声音和噪声完全混在一起,无法区分。这就像把盐溶进水里,你怎么把盐再分离出来?

时域:以时间为横轴,声音振幅为纵轴的表示方法。录音文件里存的就是每个时间点的振幅值。

这就是为什么我们需要傅里叶变换(Fourier Transform)——把声音从"时间维度"转换到"频率维度"。

1.2、频率的秘密:声音的指纹

傅里叶变换告诉我们一个惊人的事实:任何复杂的声音,都可以拆解成不同频率的正弦波叠加。

打个比方:一段录音就像一碗杂烩汤。时域看到的是混在一起的汤,但频谱(Spectrum)就像把这碗汤的配料分开摆在盘子里——土豆(低频)、胡萝卜(中频)、葱花(高频)。

频谱:横轴是频率(Hz),纵轴是该频率的能量强度。通过傅里叶变换得到。

STFT(短时傅里叶变换):把音频切成小段(比如每25毫秒),分别做傅里叶变换。这样能看到"频率随时间的变化",形成频谱图(Spectrogram)。

关键来了:大部分噪声都有特定的"指纹"。比如:

  • 电脑风扇:低频的嗡嗡声,频率恒定
  • 空调:50Hz或60Hz的交流电哼声
  • 白噪声:所有频率都均匀分布

而人声呢?主要集中在300Hz到3000Hz之间,而且会随着说话内容不断变化。

这就是降噪的核心思路:在频域里,找出那些"长期霸占某些频率、但不是你想要的声音"的成分,然后把它们压下去。

STFT
ISTFT
原始音频
时域信号
频谱图
时间-频率-能量
分析噪声特征
计算噪声阈值
每个频率单独设定
生成掩码Mask
决定保留还是削弱
应用掩码到频谱
降噪后音频
回到时域

二、降噪的"不可能三角":你必须做的取舍

现在我们知道了降噪的原理,但这里有个残酷的真相:你不可能同时做到完美降噪、音质不损失、计算速度快。

这就像经济学里的"不可能三角"——你只能选两个:

维度含义技术实现代价
降噪强度能压制多强的噪声提高阈值、增加平滑可能误伤有用信号
音质保留保持原声的清晰度和自然度降低阈值、精细化掩码残留更多噪声
计算效率实时处理的速度更大的FFT窗口、更多平滑音质下降或延迟增加

2.1、核心参数的真实影响

当你使用降噪工具时,本质上就是在这个三角形里找平衡点。我们来看几个关键参数:

n_fft(FFT窗口大小)

这决定了频率分辨率。

  • 大窗口(如4096):能精确区分相邻的频率,但时间分辨率差,快速变化的声音会被"模糊化"
  • 小窗口(如1024):能捕捉快速变化,但频率糊在一起,可能把低频噪声和人声混淆

真实场景:处理语音时用2048,处理音乐时用4096。原因是语音变化快,音乐需要精细的音色。

hop_length(跳跃长度)

相邻两次分析之间跳过多少样本。

  • 小hop_length(如512):时间分辨率高,但计算量大
  • 大hop_length(如2048):省计算,但可能漏掉细节

经验值:通常设为n_fft的1/4,保证重叠率75%。

n_std_thresh(阈值倍数)

决定"多大声才算信号"。如果噪声平均是-40dB,设置1.5倍标准差,就是说只有比-40dB + 1.5σ 更响的才保留。

  • 低阈值(1.0):保留更多声音,但噪声也留下了
  • 高阈值(3.0):噪声彻底消失,但你的声音可能也被"削"掉了

2.2、两种策略:稳定vs动态

Stationary(稳态降噪)

假设噪声是恒定的。你先录一段"纯噪声"(比如录音前的5秒空白),算法学习这段的频谱特征,然后在整个音频里都用这个标准去压制。

适用场景:风扇声、交流电哼声这种持续不变的噪声。

局限:如果中途噪声变了(比如突然有人开门),就失效了。

Non-stationary(非稳态降噪)

不依赖预先采样,而是实时计算一个"滑动窗口"内的噪声统计。算法假设"长时间持续的成分=噪声,短暂出现的成分=信号"。

适用场景:背景噪声不稳定,比如街道录音、会议室。

代价:计算量大,可能产生"呼吸音"(噪声忽强忽弱)。


三、从零到一:基础工具怎么用

# 一条命令全装
pip install scipy librosa numpy noisereduce soundfile pedalboard
# 或者分开装
pip install scipy          # 基础科学计算,读写wav
pip install librosa        # 音频分析,STFT/ISTFT
pip install numpy          # 数组运算
pip install noisereduce    # 频谱门控降噪
pip install soundfile      # 更强大的音频文件IO
pip install pedalboard     # Spotify的专业效果链

3.1、Scipy + Librosa:手工拆解降噪

这是最底层的方式——你需要理解每一步在做什么。

版本A:概念版(便于理解)

import scipy.io.wavfile as wavfile
import librosa
import numpy as np
# 1. 读取音频
sr, audio = wavfile.read('noisy.wav')
# sr: sample rate 采样率,通常是44100或48000
# audio: numpy数组,每个值是某一时刻的振幅
# 2. 转到频域
stft_result = librosa.stft(audio, n_fft=2048, hop_length=512)
# stft_result是复数矩阵,形状是(频率bins, 时间帧)
# 比如(1025, 500)表示1025个频率 × 500个时间帧
# 3. 获取幅度谱
magnitude = np.abs(stft_result)  # 提取幅度
phase = np.angle(stft_result)     # 提取相位(稍后恢复用)
# 4. 估计噪声(假设前1秒是纯噪声)
noise_frames = int(1.0 * sr / 512)  # 1秒对应多少帧
noise_profile = np.mean(magnitude[:, :noise_frames], axis=1)
# noise_profile的形状是(1025,),每个频率的平均噪声强度
# 5. 计算阈值
threshold = noise_profile * 1.5  # 1.5倍噪声才算信号
# 6. 生成掩码
mask = magnitude > threshold[:, np.newaxis]  # 广播比较
# mask是True/False矩阵,True表示保留,False表示压制
# 7. 应用掩码(软掩码)
magnitude_clean = magnitude * mask
# 8. 恢复相位并转回时域
stft_clean = magnitude_clean * np.exp(1j * phase)
audio_clean = librosa.istft(stft_clean, hop_length=512)
# 9. 保存
wavfile.write('cleaned.wav', sr, audio_clean.astype(np.int16))

这段代码的问题

  • 硬掩码(非0即1)会产生"音乐噪声"(musical noise),听起来像金属质感的杂音
  • 没有平滑处理,时频边界会很生硬
  • 阈值是拍脑袋定的,不同音频需要手动调

但这段代码的价值:你完全理解了降噪的每个步骤。这是基础。

版本B:完整可运行版

librosa依赖链复杂(需要numba、audioread等),在某些环境安装困难或运行异常慢scipy是Python标准科学计算库,更稳定轻量。

对于STFT/ISTFT这种基础操作,scipy.signal完全够用且性能更好。librosa的优势在音乐信息检索(音高检测、节拍分析),但简单降噪用不到这些功能。

原则:能用底层库解决的,不引入高层依赖——减少出错可能,提高运行效率。scipy是必装的,librosa是可选的。

# ============ 3.1 Scipy:手工拆解降噪 ============
# 最底层的方式,完全用scipy,不依赖librosa
import scipy.io.wavfile as wavfile
import scipy.signal as signal
import numpy as np
# 1. 读取音频
sr, audio = wavfile.read('noisy.wav')
# 预处理
if audio.ndim == 2:
audio = audio.mean(axis=1)
audio = audio.astype(np.float32) / 32768.0
# 2. 转到频域(STFT)
f, t, stft_result = signal.stft(
audio,
fs=sr,
nperseg=2048,      # FFT窗口大小
noverlap=1536      # 重叠75%(2048-512)
)
# stft_result形状:(频率bins, 时间帧)
# 3. 获取幅度和相位
magnitude = np.abs(stft_result)
phase = np.angle(stft_result)
# 4. 估计噪声(前1秒作为噪声样本)
noise_frames = min(int(1.0 * sr / 512), magnitude.shape[1] // 2)
noise_profile = np.mean(magnitude[:, :noise_frames], axis=1)
# 5. 计算阈值
threshold = noise_profile * 1.5  # 超过1.5倍噪声才算信号
# 6. 生成掩码
mask = magnitude > threshold[:, np.newaxis]
# 7. 应用掩码
magnitude_clean = magnitude * mask
# 8. 恢复相位,转回时域(ISTFT)
stft_clean = magnitude_clean * np.exp(1j * phase)
_, audio_clean = signal.istft(
stft_clean,
fs=sr,
nperseg=2048,
noverlap=1536
)
# 9. 截取到原长度并保存
audio_clean = audio_clean[:len(audio)]
audio_clean = np.clip(audio_clean, -1.0, 1.0)
wavfile.write('cleaned.wav', sr, (audio_clean * 32767).astype(np.int16))

3.2、Noisereduce:封装好的Spectral Gating

noisereduce把上面的流程封装成了一个函数,并且加入了关键优化:

import noisereduce as nr
import soundfile as sf
# 读取音频
audio, sr = sf.read('noisy.wav')
# 方式1:稳态降噪(提供噪声样本)
noise_sample = audio[0:int(sr*1.0)]  # 前1秒作为噪声
reduced = nr.reduce_noise(
y=audio,
sr=sr,
y_noise=noise_sample,
stationary=True,
n_std_thresh_stationary=1.5,     # 阈值倍数
prop_decrease=1.0,                # 降噪强度,0-1
freq_mask_smooth_hz=500,          # 频率平滑,Hz
time_mask_smooth_ms=50            # 时间平滑,毫秒
)
# 方式2:非稳态降噪(自动估计)
reduced = nr.reduce_noise(
y=audio,
sr=sr,
stationary=False,
time_constant_s=2.0,              # 时间常数,2秒内的被视为噪声
thresh_n_mult_nonstationary=2,    # 非稳态阈值倍数
)
sf.write('output.wav', reduced, sr)

关键改进

  1. 频率和时间平滑:用高斯卷积平滑掩码边界,避免生硬的开关
  2. Sigmoid函数:替代硬掩码,渐进式衰减
  3. 多线程支持:用n_jobs=-1利用所有CPU核心

参数调优指南

场景n_fftfreq_smoothtime_smooththresh
播客/人声2048500 Hz50 ms1.5
音乐40961000 Hz100 ms1.2
现场录音2048300 Hz30 ms2.0

3.3、Pedalboard:录音棚级别的效果链

Spotify开发的Pedalboard不仅能降噪,还能串联多个音频效果,就像实体的吉他效果器链。

from pedalboard import Pedalboard, NoiseGate, Compressor, Gain, LowShelfFilter
from pedalboard.io import AudioFile
import noisereduce as nr
sr = 44100
# 1. 先用noisereduce做主力降噪
with AudioFile('input.wav').resampled_to(sr) as f:
audio = f.read(f.frames)
audio_nr = nr.reduce_noise(y=audio, sr=sr, stationary=True, prop_decrease=0.75)
# 2. 用Pedalboard做后处理
board = Pedalboard([
NoiseGate(
threshold_db=-30,       # 低于-30dB的全部静音
ratio=1.5,              # 衰减比例
release_ms=250          # 释放时间
),
Compressor(
threshold_db=-16,       # 压缩阈值
ratio=4                 # 4:1压缩比
),
LowShelfFilter(
cutoff_frequency_hz=400,  # 提升低频的饱满度
gain_db=10,
q=1
),
Gain(gain_db=2)            # 整体提升2dB
])
audio_final = board(audio_nr, sr)
# 3. 保存
with AudioFile('output.wav', 'w', sr, audio_final.shape[0]) as f:
f.write(audio_final)

为什么要组合使用?

  • noisereduce:擅长压制持续性噪声(spectral gating)
  • NoiseGate:砍掉低电平的尾音(threshold gating)
  • Compressor:平衡动态范围,让小声更清晰、大声不炸裂
  • EQ:修正降噪后的音色失真

这就像摄影后期:先用AI去噪(noisereduce),再调色(Compressor),最后锐化(EQ)。

原始音频
noisereduce
频谱门控
NoiseGate
阈值门控
Compressor
动态压缩
EQ均衡
音色修正
Gain
音量归一化
最终输出

四、参数背后的数学:你需要知道的概念

4.1、为什么FFT不是越大越好?

时频不确定性原理(类似量子力学的测不准):你无法同时精确知道"某个频率"和"某个时刻"。

实战意义:语音的辅音(t、k、s)只持续几毫秒,用大窗口会糊成一团;但音乐的和弦需要分清每个音,必须用大窗口。

4.2、掩码的软硬之分

硬掩码mask = (magnitude > threshold),非黑即白。

  • 优点:计算简单
  • 缺点:会产生"音乐噪声",听起来像金属颗粒感

软掩码:用Sigmoid函数,渐进式衰减。

def soft_mask(magnitude, threshold, slope=10):
ratio = magnitude / threshold
return 1 / (1 + np.exp(-slope * (ratio - 1)))
  • 优点:过渡平滑,不会有突兀的咔嚓声
  • 缺点:计算稍慢

noisereduce默认用软掩码,并且slope可以调(sigmoid_slope_nonstationary)。

4.3、为什么需要重叠?

如果STFT的窗口是方形(rectangular window),窗口边界会引入频谱泄漏。所以要用汉明窗(Hamming Window)或汉宁窗(Hann Window)——中间高、两边低的曲线。

但这样会导致窗口边界的信号被衰减。解决方法:重叠分析(Overlap)。

  • hop_length = n_fft / 4 → 75%重叠
  • hop_length = n_fft / 2 → 50%重叠

重叠率越高,边界伪影越少,但计算量越大。


五、进阶:深度学习时代的降噪

基于传统信号处理的方法(spectral gating)有个根本限制:它不"理解"声音。它只能基于统计特征(这个频率长期很强=噪声)来工作。

但如果噪声和信号频率重叠怎么办?比如背景音乐和人声都在300-3000Hz,传统方法无解。

这时候就需要深度学习了。典型的有:

它们的核心思路:训练模型"听懂"什么是人声、什么是噪声,而不是靠统计阈值。

代价

  1. 需要大量训练数据
  2. 模型可能过拟合(对训练集外的噪声效果差)
  3. 计算量大,不适合老旧设备

什么时候用深度学习?

什么时候用传统方法?


六、实战建议:不同场景的最佳实践

场景推荐工具参数建议理由
播客录制noisereduce (stationary)n_fft=2048, thresh=1.5, smooth_hz=500噪声稳定,人声为主
现场采访noisereduce (non-stationary)time_constant=2.0, thresh=2.0背景噪声变化大
音乐混音Pedalboard全链路先nr + 后NoiseGate + EQ需要保留音色细节
视频会议实时RNNoise (深度学习)默认参数低延迟,效果好
学习原理Scipy + Librosa手写自定义理解每个步骤

通用流程

  1. 评估噪声类型:录一段10秒的测试音频,看波形和频谱
  2. 选择策略:稳定噪声→stationary,变化噪声→non-stationary
  3. 从保守开始:先用小的prop_decrease (0.5),逐步提高
  4. 听residue:降噪后导出"被删除的声音",确保没误伤
  5. 后处理:用NoiseGate清理尾音,用Compressor平衡动态

七、常见问题:为什么效果不好?

7.1、降噪后声音变"闷"了

原因:阈值太高,把高频的辅音(s、sh、f)也压掉了。

解决

  • 降低n_std_thresh从2.0到1.5
  • 减少freq_mask_smooth_hz从1000到500
  • prop_decrease=0.7而不是1.0(只降70%的噪声)

7.2、出现"水下感"或"呼吸音"

原因:非稳态降噪的时间常数太短,掩码频繁开关。

解决

7.3、噪声还在,但音质已经劣化

原因:噪声和信号频率重叠严重(比如背景有音乐)。

解决

  • 换策略:传统方法无能为力,考虑用深度学习(RNNoise、Demucs)
  • 源头控制:重新录制,改善录音环境
  • 接受现实:降噪不是万能的,严重混叠只能取舍

八、写在最后:工具只是手段

降噪本质上是一个不完美的艺术。你在压制噪声的同时,必然会损失一些信息。关键是找到那个平衡点——既能让内容清晰可听,又不至于变成机器人声音。

三个层次的理解

  1. 新手:会用工具,调参数,出结果
  2. 进阶:理解原理,知道每个参数影响什么,能根据音频特点选择策略
  3. 专家:知道工具的边界,清楚什么能做、什么不能做,必要时自己写算法

这篇文章希望帮你从第1层跨越到第2层。记住:

最后,永远记住:最好的降噪是不需要降噪。一个好的麦克风、一个安静的环境、正确的录音技巧,胜过任何后期处理。

技术是解决问题的,不是制造问题的。当你真正理解了降噪的原理和局限,你会知道什么时候该用它,什么时候该放弃它。


附录:专业术语表

STFT(Short-Time Fourier Transform,短时傅里叶变换):把音频切成小段,分别做傅里叶变换,得到时频谱。是频域分析的基础。

Spectrogram(频谱图):横轴时间,纵轴频率,颜色表示能量强度。是音频的"视觉指纹"。

Spectral Gating(频谱门控):基于频率的噪声门,每个频率单独设阈值。低于阈值的被压制,高于阈值的被保留。

FFT(Fast Fourier Transform,快速傅里叶变换):傅里叶变换的高效算法,计算复杂度从O(n²)降到O(n log n)。

Hop Length(跳跃长度):相邻两次STFT分析之间跳过的样本数。决定时间分辨率。

Window Function(窗函数):用于STFT的加权函数,常见的有Hann窗、Hamming窗。避免频谱泄漏。

Mask(掩码):一个矩阵,与频谱图同样大小,每个元素表示"该时频点保留多少"。0表示完全压制,1表示完全保留。

Noise Floor(噪声底):频谱中的最低能量水平,通常代表背景噪声的平均强度。

Musical Noise(音乐噪声):硬掩码降噪产生的伪影,听起来像金属颗粒感或水泡声。源于频谱的不连续性。

Stationary Noise(稳态噪声):统计特性不随时间变化的噪声,如风扇声、交流电哼声。

Non-stationary Noise(非稳态噪声):统计特性随时间变化的噪声,如街道声、会议室的杂音。

Compressor(压缩器):动态范围压缩工具。把大声压小、小声提升,让整体音量更均衡。

NoiseGate(噪声门):基于幅度的阈值工具。低于阈值的信号直接静音,高于阈值的完全保留。

EQ(Equalizer,均衡器):调整不同频率的增益。High-pass滤掉低频,Low-pass滤掉高频,Shelf提升或衰减某个频段。

Sample Rate(采样率):每秒采集多少个样本点,单位Hz。常见44100(CD质量)、48000(专业录音)。

Bit Depth(位深度):每个样本用多少bit表示,决定动态范围。16bit=96dB,24bit=144dB。

dB(Decibel,分贝):对数尺度的响度单位。0dB是参考电平,负数表示更小,正数表示更大。每增加6dB,幅度翻倍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/927222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完整教程:如何将文件从电脑传输到安卓设备

完整教程:如何将文件从电脑传输到安卓设备pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

[vmware+openeuler22.03]创建软RAID

1.添加虚拟硬盘 如下图所示添加4块成员硬盘(RAID6的最小成员硬盘数量为4)2.安装mdadm sudo yum install mdadm3.创建RAID 查看mdadm的使用方法 Joe@openeuler ~]$ sudo mdadm --create --help Usage: mdadm --creat…

哪个网站做恒生指数最安全如何将网站提交给百度

目录 一、实时数仓的需求与挑战 二、构建极速易用的实时数仓架构 三、解决方案 3.1 如何实现数据的增量与全量同步 3.1.1 增量及全量数据同步 3.1.2 数据一致性保证 3.1.3 DDL 和 DML 同步 Light Schema Change Flink CDC DML 和DDL同步 3.2 如何基于Flink实现多种数…

002

002$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");002.C语言进制、ASCII码和基础数据类型 数字进制表示法 在日常生活中,我们计数往往使用十进制。然而在计…

网站超市源码哪个好找人做彩票网站有哪些

一、子查询&#xff1a; 1.语法&#xff1a; select 列名 from 表名 where 列名 比较运算符(>、<、) (子查询) 2.将子查询和比较运算符联合使用&#xff0c;必须保证子查询的返回结果不大于1条 3.子查询是一个嵌套在select,insert,update和delete语句或者其他子查询中的查…

网站登录页面怎么做的软件开发者英文

立方体纹理就是包含6个2D纹理的纹理.6个纹理有序排列在立方体的6个面.其可以通过方向向量采样立方体纹理上的纹素.创建立方体贴图跟创建2D贴图一样,但是绑定到GL_TEXTURE_CUBE_MAP上.glGenTextures(1, &CubeMapID); glBindTexture(GL_TEXTURE_CUBE_MAP, CubeMapID);立方体纹…

国际购物网站平台有哪些wordpress付费播放

前提要求 ubuntu下安装lxd 参考Rockylinux下安装lxd 参考LXC 源替换参考LXC 容器端口发布参考LXC webui 管理<

地方美食网站开发意义优秀网站配色

作者&#xff1a;轩辕之风O来源&#xff1a;编程技术宇宙-前言-程序员经常要面临的一个问题就是&#xff1a;如何提高程序性能&#xff1f;这篇文章&#xff0c;我们循序渐进&#xff0c;从内存、磁盘I/O、网络I/O、CPU、缓存、架构、算法等多层次递进&#xff0c;串联起高性能…

GenColoring - AI 免费涂色页生成器

GenColoring - AI 涂色页生成器上个月发现Nano Banana模型的图片编辑和生成能力都很不错,于是找了找是否有涂色页生成相关的应用,试用了几款后发现GenColoring的效果很满意,比其他的AI涂色页效果要好很多,而且每天…

zkSync Era在ETHDenver的技术盛宴:zkEVM与Layer2创新实践

本文详细介绍了zkSync作为ETHDenver 2023官方Layer2赞助商的技术活动安排,包括zkEVM开发工作坊、账户抽象黑客松、安全研讨会等核心技术内容,以及基于zkSync Era的食品代币实践案例。在ETHDenver与zkSync Era连接 zk…

linux网站开发电子商务网站数据库建设

这里我们使用Java的线程与锁来解析共享内存模型&#xff1b;做过java开发并且了解线程安全问题的知道&#xff0c;要使某段代码是线程安全的那必须要满足两个条件&#xff1a;内存可见性、原子性&#xff1b; 内存可见性 在JVM规定多个线程进行通讯是通过共享变量进行的&a…

农业科技工作服务站建站模板购物网站设计

http://www.jqdemo.com/525.html转载于:https://www.cnblogs.com/iqiao/p/4255515.html

Squarepoint Challenge (Codeforces Round 1055, Div. 1 + Div. 2)

A. Increase or Smash 题意:你有一个全\(0\)数组,每次可以使得数组全部加上一个数或者使得某些位置变为\(0\)。求变成\(a\)的最小操作数。 最少的操作方案是,先把\(a\)去重后排序,然后从大到小每次加\(a_i - a_{i-…

有做数学题的网站吗网站专题二级页怎么做

第 1 章&#xff1a;Yarn资源调度器 思考&#xff1a; 1、如何管理集群资源&#xff1f; 2、如何给任务合理分配资源&#xff1f; Yarn是一个资源调度平台&#xff0c;负责为运算程序提供服务器运算资源&#xff0c;相当于一个分布式的操作系统平台&#xff0c;而MapReduce等运…

软件工程第一次作业--关于未来规划和自我发展

这个作业属于哪个课程 202501 软件工程这个作业要求在哪里 <软件工程第一次团队作业>这个作业的目标 熟悉git协作和markdown语法,深入了解自己的能力并寻找发展方向学号 102301537一、团队网页 https://github.…

2025太阳能厂家推荐天津龙腾,太阳能热水系统,发电系统,光伏热系统,热水工程系统,预加热系统,中央热水系统,彩图发电系统,分户储水系统,分户计量系统推荐

2025 年国内新能源行业迎来高质量发展新阶段,光热与光伏技术协同应用成为主流趋势,政策持续推动可再生能源在建筑、工业等领域的深度渗透。随着 “双碳” 目标推进,市场对新能源综合解决方案的需求显著提升,不仅要…

集训模拟赛日志

因为要补题,所以开了这个,题目和代码什么存了看文件。 2025.10.1 T1 怎么这么难,好像比 T3,4 做的都久。 T3 是注意到合法区间左右端点递增,然后随便维护一下就行了,甚至可以多测询问子区间然后历史和。 T4 场上…

详细介绍:Nature Electronics:卡内基梅隆大学开放用于多模态皮肤反馈的皮肤贴附式触觉接口

详细介绍:Nature Electronics:卡内基梅隆大学开放用于多模态皮肤反馈的皮肤贴附式触觉接口pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !impor…

网站设计 知识产权wordpress page id

3月29日 qt打包APP操作 1 先在windows shell 中下载打包软件Pylnstaller pip install pyinstaller2 先进入py项目所在的位置&#xff0c;再执行以下代码(我用的qt版本是PySide6可以根据自己的情况修改) pyinstaller s02.py --noconsole --hidden-import PySide6.QtXml3 因为…

1688 商品采集 API 调用全流程分享:从准备到实操 - 实践

1688 商品采集 API 调用全流程分享:从准备到实操 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…