当前位置:   article > 正文

语音深度鉴伪识别项目实战:基于深度学习的语音深度鉴伪识别算法模型(二)音频数据预处理及去噪算法+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
  • 1
  • 2

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

pip install numpy scipy soundfile
  • 1

生成音乐片段

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")

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

我们可以通过使用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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

在这里插入图片描述

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

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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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

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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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

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)∣ 是估计的噪声幅值谱, ∣
      声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/733254
推荐阅读
相关标签