语音深度鉴伪识别项目实战:基于深度学习的语音深度鉴伪识别算法模型(二)音频数据预处理及去噪算法+Python源码应用

前言

深度学习技术在当今技术市场上面尚有余力和开发空间的,主流落地领域主要有:视觉,听觉,AIGC这三大板块。

目前视觉板块的框架和主流技术在我上一篇基于Yolov7-LPRNet的动态车牌目标识别算法模型已有较为详细的解说。与AIGC相关联的,其实语音模块在近来市场上面活跃空间很大。

从智能手机的语音助手到智能家居中的语音控制系统,再到银行和电信行业的语音身份验证,语音技术的应用日益广泛。那么对应现在ACG技术是可以利用原音频去进行训练学习,从而得到相对应的声音特征,从而进行模仿,甚至可以利用人工智能生成的语音可以以假乱真,给社会带来了严重的安全隐患。

当前,语音深度鉴伪识别技术已经取得了一定的进展。研究人员利用机器学习和深度学习方法,通过分析语音信号的特征,开发出了一系列鉴伪算法。

然而,随着生成大模型和其他语音合成技术的不断进步,伪造语音的逼真度也在不断提高,使得语音鉴伪任务变得愈加复杂和具有挑战性。本项目系列文章将从最基础的语音数据存储和详细分析开始,由于本系列专栏是有详细解说过深度学习和机器学习内容的,音频数据处理和现主流技术语音分类模型和编码模型将会是本项目系列文章的主体内容,具体本项目系列要讲述的内容可参考下图:
在这里插入图片描述语音模型的内容不是那么好掌握的,包含大量的数学理论知识以及大量的计算公式原理需要推理。且如果不进行实际操作很难够理解我们写的代码究极在神经网络计算框架中代表什么作用。不过我会尽可能将知识简化,转换为我们比较熟悉的内容。

我将尽力让大家了解并熟悉神经网络框架,保证能够理解通畅以及推演顺利的条件之下,尽量不使用过多的数学公式和专业理论知识。以一篇文章快速了解并实现该算法,以效率最高的方式熟练这些知识。希望有需求的小伙伴不要错过笔者精心打造的专栏。

上篇文章详细解答了所有音频常见存储载体和其特征,以及音频的数据保存形态有哪些?具体数据可视化展示为何种形式?这类问题,对音频数据认知打下了坚实的基础。那么第二章我们就应该对音频数据预处理有大致的了解,从噪音的种类再到各个去噪算法依次了解,那么我们的语音深度鉴伪识别才算入门。

一、音频存储载体

由于音频存储是根据音频数据编码来的,上篇文章已经几乎把所有的音频编码算法都讲解了,固不再重复将每个音频存储载体具体信息详细,只作概览:
在这里插入图片描述

综合比较

格式压缩类型音质文件大小主要应用优点缺点
WAV无压缩音频编辑高质量文件大
FLAC无损压缩音频存储高质量,文件较小文件仍较大
ALAC无损压缩苹果设备高质量,兼容苹果跨平台支持少
MP3有损压缩音乐存储、传输文件小,支持广泛音质低
AAC有损压缩中高流媒体、移动设备高效压缩,音质好普及度略低
OGG Vorbis有损压缩中高游戏音频、流媒体高质量,开源支持较少
DSD无压缩极高极大高保真音频超高保真度文件极大,支持有限
AIFF无压缩苹果设备高质量文件大
Opus有损压缩流媒体、实时通信低延迟,高质量存储应用少

二、音频数据预处理

既然我们现在已经通过python去尝试了构建一个wav音频文件,自然我们也可以通过编码方式对原有音频进行数据处理,使其音频质量,如后续有建模的必要这会是关键步骤,一切模型都离不开数据质量。和图片去噪的方式也是大相径庭,那么现在我们来实践操作。首先,确保安装了pydub库和ffmpeg

pip install pydub
sudo apt-get install ffmpeg

如果需要更细粒度的控制,需要使用numpyscipy生成纯音乐。

pip install numpy scipy soundfile

生成音乐片段

import numpy as np
import soundfile as sf

def generate_sine_wave(frequency, duration, sample_rate=44100):
    """生成指定频率和持续时间的正弦波"""
    t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False)
    return 0.5 * np.sin(2 * np.pi * frequency * t)

# 定义音符(频率)和节拍(秒)
notes = {
    'C4': 261.63,
    'D4': 293.66,
    'E4': 329.63,
    'F4': 349.23,
    'G4': 392.00,
    'A4': 440.00,
    'B4': 493.88,
    'C5': 523.25
}

# 定义乐曲:每个音符和相应的持续时间(秒)
melody = [
    ('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('F4', 0.5),
    ('G4', 0.5), ('A4', 0.5), ('B4', 0.5), ('C5', 0.5)
]

# 生成乐曲
sample_rate = 44100
song = np.array([])

for note, duration in melody:
    tone = generate_sine_wave(notes[note], duration, sample_rate)
    song = np.concatenate([song, tone])

# 保存生成的纯音乐
sf.write('pure_music.wav', song, sample_rate)

print("纯音乐生成完毕并保存为pure_music.wav")

我们可以通过使用matplotliblibrosa.display库绘制音频波形图和梅尔频谱图,来帮助我们更好观测音频数据特征:

import matplotlib.pyplot as plt
import librosa.display

def plot_waveform_and_spectrogram(file_path):
    audio_data, sample_rate = librosa.load(file_path, sr=None)

    # 绘制波形图
    plt.figure(figsize=(10, 4))
    librosa.display.waveshow(audio_data, sr=sample_rate)
    plt.title('Waveform')
    plt.xlabel('Time (s)')
    plt.ylabel('Amplitude')
    plt.show()

    # 计算梅尔频谱图
    mel_spectrogram = librosa.feature.melspectrogram(y=audio_data, sr=sample_rate, n_mels=128)
    log_mel_spectrogram = librosa.power_to_db(mel_spectrogram, ref=np.max)

    # 绘制梅尔频谱图
    plt.figure(figsize=(10, 4))
    librosa.display.specshow(log_mel_spectrogram, sr=sample_rate, x_axis='time', y_axis='mel')
    plt.title('Mel-Spectrogram')
    plt.colorbar(format='%+2.0f dB')
    plt.show()

# 示例:绘制WAV文件的波形图和频谱图
file_path = 'pure_music.wav'
plot_waveform_and_spectrogram(file_path)

在这里插入图片描述

接下来我们通过引入不同的噪音种类,认识噪音种类并尝试辨别哪些噪音种类,最后进行音频去噪。

2.1噪音种类

每种噪音的特征和来源不同,可能会对音频信号的质量产生不同的影响。
在这里插入图片描述

2.1.1. 白噪音

我们来尝试制作白噪音,从制作过程中就能看到特征种类:

import numpy as np
import soundfile as sf

def generate_white_noise(duration, sample_rate):
    """生成指定持续时间的白噪音"""
    noise = np.random.normal(0, 1, int(sample_rate * duration))
    return noise

# 生成5秒白噪音
sample_rate = 44100
duration = 5.0
white_noise = generate_white_noise(duration, sample_rate)

# 保存白噪音
sf.write('white_noise.wav', white_noise, sample_rate)

该白噪音一听就能够辨别出来,十分明显。听起来像“嘶嘶”声,类似电视没有信号时的声音。

2.1.2.粉红噪音

听起来比白噪音柔和,常用于声音测试和治疗。类似自然环境中的各种声音,如风声、流水声等。

import numpy as np
import soundfile as sf

def generate_pink_noise(duration, sample_rate):
    """生成指定持续时间的粉红噪音"""
    white = np.random.randn(int(sample_rate * duration))
    fft = np.fft.rfft(white)
    fft = fft / np.sqrt(np.arange(1, len(fft) + 1))
    pink = np.fft.irfft(fft)
    return pink

# 生成5秒粉红噪音
sample_rate = 44100
duration = 5.0
pink_noise = generate_pink_noise(duration, sample_rate)

# 保存粉红噪音
sf.write('pink_noise.wav', pink_noise, sample_rate)

2.1.3.棕色噪音(Brown Noise)

听起来更低沉和柔和,比粉红噪音更温和。自然环境中的低频声音,如雷声、海浪声等。

import numpy as np
import soundfile as sf

def generate_brown_noise(duration, sample_rate):
    """生成指定持续时间的棕色噪音"""
    white = np.random.randn(int(sample_rate * duration))
    brown = np.cumsum(white) / np.sqrt(sample_rate)
    return brown

# 生成5秒棕色噪音
sample_rate = 44100
duration = 5.0
brown_noise = generate_brown_noise(duration, sample_rate)

# 保存棕色噪音
sf.write('brown_noise.wav', brown_noise, sample_rate)

还有更多噪音这里暂且不作更多生成展示,不同类型的噪音在日常生活和各种技术应用中都可能出现,后续处理这些噪声方面会介绍的更加详细。最主要的我们需要花更多的时间去学习如何运用去噪算法,如何选着合适的去噪算法,达到想要的去噪效果。

2.2去噪算法

不同类型的噪音需要采用不同的去噪算法才能达到效果,下面我们来看看都有哪些去噪算法,都可以适用哪些噪音:
在这里插入图片描述

2.2.1.频谱减法(Spectral Subtraction)

频谱减法(Spectral Subtraction)是一种经典的音频去噪技术,用于从噪声污染的信号中减去估计的噪声频谱,以恢复原始的干净信号。该算法最初由 S. Boll 于1979年提出,是一种简单且有效的去噪方法,广泛应用于语音处理、音频增强等领域。

频谱减法利用了噪声信号在频谱上的统计特性,假设噪声是平稳的或缓慢变化的,因此其频谱特性在时间上保持相对稳定。通过估计噪声的频谱并将其从受噪声污染的音频信号中减去,可以在一定程度上恢复原始信号。

用途

  • 语音增强:提高语音信号的可懂度和清晰度,常用于电话通信、语音识别和助听器等领域。
  • 音频修复:去除录音中的背景噪音,如风声、交通噪音等,改善音频质量。
  • 预处理步骤:在许多音频处理任务中,频谱减法可以作为预处理步骤,以提高后续处理的效果。

频谱减法的核心思想是估计噪声频谱并将其从受污染信号的频谱中减去:

  1. 预处理

    • 短时傅里叶变换(STFT):将时域信号转换为频域信号,分解为若干帧,每帧进行傅里叶变换,得到每帧的频谱。
  2. 估计噪声频谱

    • 静音段估计:在信号的静音段或环境噪声段提取噪声频谱的平均值。假设噪声在这些段中是平稳的。
    • 平滑估计:使用平滑方法估计噪声频谱,通常采用时间平均或指数加权平均。
  3. 频谱减法

    • 频谱减法计算:对每一帧信号,计算其幅值谱并减去估计的噪声幅值谱:
      ∣ S ( f ) ∣ = m a x ( ∣ Y ( f ) ∣ − ∣ N ( f ) ∣ , 0 ) |S(f)|=max(|Y(f)|-|N(f)|,0) S(f)=max(Y(f)N(f),0)
      其中,|Y(f)|是受噪声污染的信号的幅值谱,∣N(f)∣ 是估计的噪声幅值谱, ∣𝑆(𝑓)∣是去噪后的信号的幅值谱。
  4. 相位恢复:使用原始信号的相位谱 θ Y ( f ) θ_{Y}(f) θY(f)​和去噪后的幅值谱 ∣𝑆(𝑓)∣ 重构频域信号:

    • S ( f ) = ∣ S ( f ) ∣ e j θ Y ( f ) S(f)=|S(f)|e^{jθ_{Y}(f)} S(f)=S(f)ejθY(f)
  5. 逆变换

    • 逆短时傅里叶变换(ISTFT):将去噪后的频域信号通过逆短时傅里叶变换转换回时域信号,得到去噪后的时域信号。

那么首先我们对我们生成的纯音乐添加白噪音:

import soundfile as sf
import numpy as np

# 读取纯音乐文件
pure_music, sample_rate = sf.read('pure_music.wav')

def generate_white_noise(duration, sample_rate):
    """生成指定持续时间的白噪音"""
    noise = np.random.normal(0, 1, int(sample_rate * duration))
    return noise

# 获取纯音乐的持续时间
duration = len(pure_music) / sample_rate

# 生成与纯音乐长度相同的噪音
white_noise = generate_white_noise(duration, sample_rate)

# 将白噪音添加到纯音乐
white_noise_music = pure_music + 0.1 * white_noise  # 0.1表示噪音的强度,可以调整

# 保存合成后的音频
sf.write('pure_music_with_white_noise.wav', white_noise_music, sample_rate)

合成之后的音频听起来噪声是很明显的,此时我们可以通过特征可视化看到区别:

为加噪音之前:
在这里插入图片描述加入噪音之后:

在这里插入图片描述在这里插入图片描述

现在我们再用去噪算法进行去噪处理:

def spectral_subtraction(noisy_signal, noise_signal, sample_rate):
    # 计算短时傅里叶变换(STFT)
    noisy_stft = librosa.stft(noisy_signal)
    noise_stft = librosa.stft(noise_signal)

    # 计算噪声的平均频谱
    noise_spectrum = np.mean(np.abs(noise_stft), axis=1, keepdims=True)

    # 对每一帧信号进行频谱减法
    magnitude = np.abs(noisy_stft)
    phase = np.angle(noisy_stft)
    clean_spectrum = np.maximum(magnitude - noise_spectrum, 0)

    # 重构频域信号
    clean_stft = clean_spectrum * np.exp(1j * phase)

    # 逆STFT得到时域信号
    clean_signal = librosa.istft(clean_stft)
    return clean_signal

处理之后对比如下所示,大家可以听视频感觉,噪音还是有所降低的,但是不多:
在这里插入图片描述### 2.2.2自适应滤波(Adaptive Filtering)

自适应滤波是一种动态调整滤波器参数以最小化输出误差的信号处理技术。它广泛应用于各种需要实时调整和优化的系统中。自适应滤波器根据输入信号的统计特性不断更新其参数,因而能够在非平稳环境中有效工作。一般适用于背景噪声(Background Noise)、电磁干扰噪声(Electromagnetic Interference Noise)、语音噪声(Speech Noise)、回声(Echo)、噪声尖峰(Impulse Noise)这五种噪音。

具体算法逻辑

自适应滤波器通过最小均方(LMS)算法调整滤波器系数以最小化误差。常见的自适应滤波算法包括LMS和RLS(递归最小二乘)。

LMS算法

LMS算法是一种简单且有效的自适应滤波算法,其主要步骤如下:

  1. 初始化

    • 设定滤波器系数初始值为零或随机值。
    • 设定步长因子 μ 以控制更新速度。
  2. 迭代更新

    • 对于每一个输入信号样本:
      • 计算滤波器输出y(n): 𝑦(𝑛)=𝑤(𝑛)𝑇𝑥(𝑛),其中 w ( n ) w(n) w(n) 是滤波器系数向量,𝑥(𝑛)$ 是输入信号向量。
      • 计算误差e(n):e(n)=d(n)-y(n),其中𝑑(𝑛)​ 是期望信号。
      • 更新滤波器系数:w(n+1)=w(n)+2μe(n)x(n)$
  3. 停止条件

    • 通常设定迭代次数或达到误差最小值时停止。
def lms_filter(noisy_signal, reference_signal, mu, num_taps):
    n = len(noisy_signal)
    w = np.zeros(num_taps)
    y = np.zeros(n)
    e = np.zeros(n)
    
    for i in range(num_taps, n):
        x = noisy_signal[i-num_taps:i]
        y[i] = np.dot(w, x)
        e[i] = reference_signal[i] - y[i]
        w = w + 2 * mu * e[i] * x
    
    return e  # 返回误差信号作为去噪后的信号

在自适应滤波算法中去噪效果受到步长因子 (𝜇μ) 和滤波器长度 (num_taps)影响尤其重要,如果这些参数设置不当,可能会导致滤波效果不佳,甚至使噪声加重。可以通过:

  1. 调整步长因子:步长因子 (𝜇μ) 决定了滤波器系数的更新速度,过大或过小的步长因子都可能影响滤波效果。
  2. 增加滤波器长度:较长的滤波器可以捕捉更多的信号特征,但也增加了计算复杂度。
  3. 使用参考信号:在实际应用中,通常需要一个参考信号作为期望信号 (𝑑(𝑛)d(n))。如果没有理想信号,可以尝试使用噪声信号的估计值。
  4. 预处理和后处理:在滤波前后进行适当的预处理和后处理,例如平滑、归一化等。

这几种处理方法,我更推荐前面三种方法,简单高效。其中在自适应滤波应用中,参考信号的选择取决于具体的应用场景和目标。

# 读取音频文件
noisy_signal, sample_rate = librosa.load('pure_music_with_white_noise.wav', sr=None)
noise_signal, _ = librosa.load('pure_music_with_white_noise.wav', sr=None)
reference_signal, _ = librosa.load('pure_music.wav', sr=None)  # 使用参考信号
# 自适应滤波参数
mu = 0.00001   # 步长因子
num_taps = 512  # 滤波器长度

在这里插入图片描述

期望信号是仿真中不考虑噪声影响的系统输出,在实际中我们是无法获得的,只能在仿真中得到。期望信号与具体的应用场合有关。比如在胎儿的心音检测中。输入信号x(n)=sm(n)+sb(n),其中sm为孕妇的心音信号,sb为胎儿的心音信号。此时自适应滤波器要输出的是胎儿的心音信号sb(n)。因此此时可以将x(n)看做是期望输出信号,sm为输入信号,这样,通过自适应滤波器之后就得到实际需要的sb(n)了。x(n)可以通过放置在胎儿位置的传感器得到,sm可以通过放置在远离胎儿的位置的传感器得到。

实际上,基于维纳滤波的问题都涉及到期望信号的理解。很多人往往会问,要是知道了期望输出信号,还需要滤波做什么呢?实际上不完全是这么回事的。如果从去相关的角度,就非常好理解期望信号的问题了。

期望信号是仿真中不考虑噪声影响的系统输出,在实际中我们是无法获得的,只能在仿真中得到。期望信号与具体的应用场合有关。比如在胎儿的心音检测中。输入信号x(n)=sm(n)+sb(n),其中sm为孕妇的心音信号,sb为胎儿的心音信号。此时自适应滤波器要输出的是胎儿的心音信号sb(n)。因此此时可以将x(n)看做是期望输出信号,sm为输入信号,这样,通过自适应滤波器之后就得到实际需要的sb(n)了。x(n)可以通过放置在胎儿位置的传感器得到,sm可以通过放置在远离胎儿的位置的传感器得到。

实际上,基于维纳滤波的问题都涉及到期望信号的理解。很多人往往会问,要是知道了期望输出信号,还需要滤波做什么呢?实际上不完全是这么回事的。如果从去相关的角度,就非常好理解期望信号的问题了。

提取纯噪声

从录音中提取纯噪声部分通常涉及识别和分离音频中的噪声段有:

手动方法

  1. 试听音频:手动试听音频文件,找到没有目标信号的噪声段。
  2. 音频剪辑工具:使用音频剪辑工具(如Audacity),手动剪切和提取噪声段。

自动方法

  1. 静音检测:通过检测音频中的静音段或低能量段,自动识别可能的噪声段。
  2. 语音活动检测(VAD):使用语音活动检测算法,识别和提取无语音活动的段落作为噪声参考信号。

我们也可以通过计算音频信号的短时能量,设定能量阈值从而提取低能量段的音频信号,也就是大概率为噪音信号,再将所有噪声段合并成一个信号。

# 计算音频信号的短时能量和零交叉率
frame_length = 2048
hop_length = 512

# 短时能量
energy = np.array([
    np.sum(np.abs(noisy_signal[i:i+frame_length]**2))
    for i in range(0, len(noisy_signal), hop_length)
])

# 零交叉率
zcr = np.array([
    librosa.feature.zero_crossing_rate(noisy_signal[i:i+frame_length])[0, 0]
    for i in range(0, len(noisy_signal), hop_length)
])

# 标准化能量
energy = energy / np.max(energy)

# 设定能量阈值和ZCR阈值
energy_threshold = 0.02
zcr_threshold = 0.1

# 找到低能量段和高ZCR段的索引
low_energy_indices = np.where(energy < energy_threshold)[0]
high_zcr_indices = np.where(zcr > zcr_threshold)[0]

# 提取低能量段和高ZCR段的音频信号
noise_segments = []
for idx in np.intersect1d(low_energy_indices, high_zcr_indices):
    start = idx * hop_length
    end = start + frame_length
    noise_segments.append(noisy_signal[start:end])

# 检查是否找到任何低能量段和高ZCR段
if len(noise_segments) > 0:
    # 将所有噪声段合并成一个信号
    pure_noise = np.concatenate(noise_segments)
else:
    # 如果没有找到低能量段和高ZCR段,可以使用白噪声作为默认参考信号
    print("没有找到低能量段和高ZCR段,使用白噪声作为参考信号")
    duration = len(noisy_signal) / sample_rate
    pure_noise = np.random.normal(0, 1, int(sample_rate * duration))

# 保存提取的噪声段
sf.write('extracted_noise.wav', pure_noise, sample_rate)

然后再次去噪即可,不过自适应滤波并不适合去噪白噪音,固大家可以自行尝试其他噪音去噪效果。
本篇文章先写到此,内热太多也不好一下再继续写接下来三种算法。本系列将从最基础的音频数据认知开始一直讲解到最终完成整个语音深度鉴别模型的落地使用,对此项目感兴趣的,对此领域感兴趣的不要错过,多谢大家的支持!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java使用OpenCV计算两张图片相似度

业务&#xff1a;找出两个表的重复的图片。 图片在表里存的是二进制值&#xff0c;存在大量由于一些特殊情况例如扫描有差异&#xff0c;导致图片存的二进制值不同&#xff0c;但图片其实是一样来的。 所以找出两个表重复相同的图片&#xff0c;不可能只是单纯的比较二进制值…

java版B/S架构UWB人员定位系统源码spring boot+vue技术架构uwb定位装置-工业级UWB室内定位系统源码

java版B/S架构UWB人员定位系统源码spring bootvue技术架构uwb定位装置-工业级UWB室内定位系统源码 本套系统运用UWB定位技术&#xff0c;开发的高精度人员定位系统&#xff0c;通过独特的射频处理&#xff0c;配合先进的位置算法&#xff0c;可以有效计算复杂环境下的人员与物…

【MySQL】MySQL 图形化界面 - 使用说明(MySQL Workbench)

一、安装软件 Navicat&#xff0c;SQLyog 这些软件都不错&#xff0c;不过都需要收费&#xff0c;当然也有破解版。下面用 MySQL Workbench&#xff0c;它是官方提供的工具。 二、使用操作 这个软件本质是一个客户端&#xff0c;现在要让数据库能够远程登录。不过一般不会远程…

生活使用英语口语柯桥外语学校成人英语学习

● “自来水”英语怎么说&#xff1f; ● “自来水”的英语表达是&#xff1a;Running water或者Tap water. 例句&#xff1a; There are hot and cold running water in all the bedrooms. 所有的卧室里都有冷热自来水。 ● “热水”英文怎么水&#xff1f; ● 我们不管…

[经验] 羊肺怎么清洗才干净视频 #经验分享#学习方法#其他

羊肺怎么清洗才干净视频 1、羊肺怎么清洗才干净 羊肺是一种营养丰富的食材&#xff0c;含有丰富的蛋白质和维生素&#xff0c;是众多美食菜谱的重要原料之一。但是&#xff0c;由于羊肺的内部结构复杂&#xff0c;清洗起来比较麻烦。那么&#xff0c;如何清洗羊肺才能让它干净…

Excel 交叉表的格转成列,行转成格

Excel里交叉表的左表头是卡车号&#xff0c;上表头是工作&#xff0c;交叉格是工作编号。 ABCD1Truck NumberJob1Job2Job3271592859285928372395859282971473297159282971 要求&#xff1a;将交叉格转为列&#xff0c;左表头转为格。 ABC1297139585928272727137371473715726…

【Python】使用Gradio作为机器学习web服务器

在机器学习领域&#xff0c;模型的展示和验证是一个重要的环节。传统的模型展示方式往往需要复杂的Web开发知识&#xff0c;这对于许多机器学习研究者或数据科学家来说可能是一个挑战。然而&#xff0c;Gradio的出现为我们提供了一个简单而强大的解决方案&#xff0c;让我们能够…

麒麟v10系统arm64架构openssh9.7p1的rpm包

制作openssh 说明 理论上制作的多个rpm在arm64架构&#xff08;aarch64&#xff09;都适用 系统信息&#xff1a;4.19.90-17.ky10.aarch64 GNU/Linux 升级前备份好文件/etc/ssh、/etc/pam.d等以及开启telnet 升级后确认正常后关闭telnet 在之前制作过openssh-9.5p1基础上继续…

Python文本处理利器:jieba库全解析

文章目录 Python文本处理利器&#xff1a;jieba库全解析第一部分&#xff1a;背景和功能介绍第二部分&#xff1a;库的概述第三部分&#xff1a;安装方法第四部分&#xff1a;常用库函数介绍1. 精确模式分词2. 全模式分词3. 搜索引擎模式分词4. 添加自定义词典5. 关键词提取 第…

汽车尾气排放污染的解决方案

根据公安部截至2023年底的机动车市场保有量统计&#xff0c;燃油车市场仍有不少消费者拥趸&#xff1a;目前全国新能源汽车保有量仅占汽车总量的6.07%&#xff0c;而其中的纯电动汽车保有量占比仅为76.05%。 汽车尾气排放污染已成为城市主要污染源之一。据统计显示&#xff0c…

代码随想录算法训练营Day17|404.左叶子之和 110.平衡二叉树 222.完全二叉树的节点个数

404.左叶子之和 1、这道题需要统计出所有左叶子结点的值的和&#xff0c;首先要明确左叶子节点指的左右孩子节点均为null的左节点。如上图就是4和6. 2.但是光凭叶子结点本身是无法判定左叶子的&#xff0c;因为左右孩子都是null&#xff0c;所以要从上一层节点往下判定。所以判…

Python下载库

注&#xff1a;本文一律使用windows讲解。 一、使用cmd下载 先用快捷键win R打开"运行"窗口&#xff0c;如下图。 在输入框中输入cmd并按回车Enter或点确定键&#xff0c;随后会出现这个画面&#xff1a; 输入pip install 你想下载的库名&#xff0c;并按回车&…

玩转微服务-GateWay

目录 一. 背景二. API网关1. 概念2. API网关定义3. API网关的四大职能4. API网关分类5. 开源API网关介绍6. 开源网关的选择 三. Spring Cloud Gateway1. 文档地址2. 三个核心概念3. 工作流程4. 运行原理4.1 路由原理4.2 RouteLocator 5. Predicate 断言6. 过滤器 Filter6.1. 过…

基于拓扑漏洞分析的网络安全态势感知模型

漏洞态势分析是指通过获取网络系统中的漏洞信息、拓扑信息、攻击信息等&#xff0c;分析网络资产可能遭受的安全威胁以及预测攻击者利用漏洞可能发动的攻击&#xff0c;构建拓扑漏洞图&#xff0c;展示网络中可能存在的薄弱环节&#xff0c;以此来评估网络安全状态。 在网络安…

立创·天空星开发板-GD32F407VE-EXTI

本文以 立创天空星开发板-GD32F407VET6-青春版 作为学习的板子&#xff0c;记录学习笔记。 立创天空星开发板-GD32F407VE-EXTI 中断硬件触发中断示例软件触发中断示例 中断 中断分为内部中断和外部中断 外部中断是由外部设备&#xff08;如按键、传感器、通信接口等&#xff09…

ES启动失败原因记录

一、JDK不兼容&#xff1a; es和jdk是一个强依赖的关系&#xff0c;所以当我们在新版本的ElasticSearch压缩包中包含有自带的jdk&#xff0c;但是当我们的Linux中已经安装了jdk之后&#xff0c;就会发现启动es的时候优先去找的是Linux中已经装好的jdk&#xff0c;此时如果jdk的…

Faster R-CNN:端到端的目标检测网络

本文回顾了由微软研究人员开发的 Faster R-CNN 模型。Faster R-CNN 是一种用于物体检测的深度卷积网络&#xff0c;在用户看来&#xff0c;它是一个单一的、端到端的统一网络。该网络可以准确快速地预测不同物体的位置。为了真正理解 Faster R-CNN&#xff0c;我们还必须快速概…

继续引爆!5天连出2个里程碑成果,离子阱量子计算机嗨翻天!

5月30日&#xff0c;清华大学的一项成果被Nature审稿人称为“量子模拟领域的巨大进步”&#xff01;“值得关注的里程碑”&#xff01;该成果就是中国科学院院士、清华大学交叉信息研究院教授段路明带领研究组在量子模拟计算领域取得的重要突破。段路明研究组首次实现512离子二…

LeetCode62不同路径

题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。问总共有多少条不同的路径&#xff1f; …

Amesim示例篇-案例2:液体循环回路

前文已完成流体库常用的元件参数与使用方法简单的介绍。本文将对液体回路系统管路的压降标定仿真方法与注意事项进行讨论。首先&#xff0c;本案例应用到的元件有膨胀水壶、水泵、阻力管、常规管路等元件。将上述元件进行串联组成液冷循环回路。 图1 膨胀水壶 图2 水泵 1…