赞
踩
深度学习技术在当今技术市场上面尚有余力和开发空间的,主流落地领域主要有:视觉,听觉,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
如果需要更细粒度的控制,需要使用numpy
和scipy
生成纯音乐。
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")
我们可以通过使用matplotlib
和librosa.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)
接下来我们通过引入不同的噪音种类,认识噪音种类并尝试辨别哪些噪音种类,最后进行音频去噪。
每种噪音的特征和来源不同,可能会对音频信号的质量产生不同的影响。
我们来尝试制作白噪音,从制作过程中就能看到特征种类:
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)
该白噪音一听就能够辨别出来,十分明显。听起来像“嘶嘶”声,类似电视没有信号时的声音。
听起来比白噪音柔和,常用于声音测试和治疗。类似自然环境中的各种声音,如风声、流水声等。
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)
听起来更低沉和柔和,比粉红噪音更温和。自然环境中的低频声音,如雷声、海浪声等。
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)
还有更多噪音这里暂且不作更多生成展示,不同类型的噪音在日常生活和各种技术应用中都可能出现,后续处理这些噪声方面会介绍的更加详细。最主要的我们需要花更多的时间去学习如何运用去噪算法,如何选着合适的去噪算法,达到想要的去噪效果。
不同类型的噪音需要采用不同的去噪算法才能达到效果,下面我们来看看都有哪些去噪算法,都可以适用哪些噪音:
频谱减法(Spectral Subtraction)是一种经典的音频去噪技术,用于从噪声污染的信号中减去估计的噪声频谱,以恢复原始的干净信号。该算法最初由 S. Boll 于1979年提出,是一种简单且有效的去噪方法,广泛应用于语音处理、音频增强等领域。
频谱减法利用了噪声信号在频谱上的统计特性,假设噪声是平稳的或缓慢变化的,因此其频谱特性在时间上保持相对稳定。通过估计噪声的频谱并将其从受噪声污染的音频信号中减去,可以在一定程度上恢复原始信号。
用途:
频谱减法的核心思想是估计噪声频谱并将其从受污染信号的频谱中减去:
预处理:
估计噪声频谱:
频谱减法:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。