语音深度鉴伪识别项目实战:基于深度学习的语音深度鉴伪识别算法模型(三)音频去噪算法大全+Python源码应用

本文主要是介绍语音深度鉴伪识别项目实战:基于深度学习的语音深度鉴伪识别算法模型(三)音频去噪算法大全+Python源码应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

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

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

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

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

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

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

上篇文章详细解答了部份音频噪音种类和效果,以及频谱减法(Spectral Subtraction)和自适应滤波(Adaptive Filtering),接下来我们需要继续了解小波变换去噪(Wavelet Transform Denoising)和维纳滤波(Wiener Filter)进行去噪算法结尾。

小波变换去噪(Wavelet Transform Denoising)

小波变换是一种能够同时在时域和频域中对信号进行分析的技术。它利用小波函数对信号进行多尺度分解,能够有效地捕捉信号的局部特征和突变点。在去噪应用中,小波变换被广泛应用于处理各种类型的信号,如语音信号、图像、医学信号等。

详细步骤

1. 小波分解

对信号进行小波分解,可以得到不同尺度上的逼近系数和细节系数。公式如下:

在这里插入图片描述

其中, ϕ j 0 k ϕ_{j_{0}k} ϕj0k是尺度函数, ψ j , k \psi_{j,k} ψj,k 是小波函数, c j v , k c_{j_v,k} cjv,k d j , k d_{j,k} dj,k​ 分别是尺度系数和细节系数。

2. 阈值处理

对细节系数进行阈值处理,去除噪声。常见的阈值处理方法有:

  • 硬阈值(Hard Thresholding):将小于阈值的系数置为零。

在这里插入图片描述

  • 软阈值(Soft Thresholding):将小于阈值的系数置为零,大于阈值的系数按一定规则缩小。

在这里插入图片描述

硬阈值是一种简单的置零的方法,而软阈值对于大于阈值的小波系数作了"收缩",即都减去阈值,从而使输入-输出曲线变成连续的。在阈值选选取上,人们普遍使用软阈值。改进的阈值是硬阈值和软阈值之间的一个折中,即当小波系数小于阈值时,不是简单地置为零,而是平滑地减小为零,当大于阈值时,小波系数幅度都减去阈值。这样,既保证了大的小波系数,又保证了加阈值后系数的平滑过渡。

阈值的选取

在小波变换去噪过程中,阈值选择至关重要,直接影响去噪效果。常用的阈值选择方法包括通用阈值(Universal Threshold)和自适应阈值。下面详细介绍这两种方法的计算逻辑。

1. 通用阈值(Universal Threshold)

通用阈值是由Donoho和Johnstone提出的一种简单有效的阈值选择方法。通用阈值的计算公式如下:
λ = σ 2 l o g ( n ) λ=σ\sqrt {2log(n)} λ=σ2log(n)
其中:

  • σ \sigma σ​ 是噪声标准差。

    • 估计噪声标准差:通常使用高频细节系数(如小波分解后的最后一级细节系数)的中值绝对偏差(MAD)来估计噪声标准差。

    • σ = m e d i a n ( ∣ d ∣ ) 0.6745 σ= \frac{median(∣d∣)}{0.6745} σ=0.6745median(d)

      sigma = np.median(np.abs(coeffs[-level])) / 0.6745
      
  • n n n​ 是信号的长度。

2.自适应阈值(SURE Thresholding)

自适应阈值(SURE,Stein’s Unbiased Risk Estimate)方法通过最小化估计风险(误差)来选择阈值。SURE方法可以针对不同尺度的系数单独选择阈值,更加灵活。

计算每个尺度的阈值:对于每个尺度的系数,计算一个最佳阈值。

计算SURE值:计算不同阈值下的SURE值,选择使SURE值最小的阈值。

def calculate_sure_threshold(coeff):n = len(coeff)sorted_coeff = np.sort(np.abs(coeff))risks = np.zeros(n)for i in range(n):t = sorted_coeff[i]risk = (n - 2 * (i + 1) + np.sum(np.minimum(coeff**2, t**2))) / nrisks[i] = riskbest_threshold = sorted_coeff[np.argmin(risks)]return best_threshold
3. 小波重构

对处理后的系数进行逆小波变换,重构信号。逆变换公式与分解公式相反,利用处理后的系数进行信号重建。

# 小波重构
denoised_signal = pywt.waverec(coeffs_thresh, wavelet)

整体去噪代码:

def wavelet_denoising(signal, wavelet='db1', level=1, thresholding='soft'):# 小波分解coeffs = pywt.wavedec(signal, wavelet, level=level)# 计算阈值universal_threshold = calculate_universal_threshold(coeffs)# 阈值处理coeffs_thresh = []for i, c in enumerate(coeffs):if i == 0:  # 保留逼近系数coeffs_thresh.append(c)else:# 使用SURE阈值处理细节系数sure_threshold = calculate_sure_threshold(c)if thresholding == 'hard':coeffs_thresh.append(pywt.threshold(c, sure_threshold, mode='hard'))elif thresholding == 'soft':coeffs_thresh.append(pywt.threshold(c, sure_threshold, mode='soft'))# 小波重构denoised_signal = pywt.waverec(coeffs_thresh, wavelet)return denoised_signaldef calculate_universal_threshold(coeffs):# 使用高频细节系数估计噪声标准差sigma = np.median(np.abs(coeffs[-1])) / 0.6745# 计算通用阈值threshold = sigma * np.sqrt(2 * np.log(len(coeffs[-1])))return thresholddef calculate_sure_threshold(coeff):n = len(coeff)if n == 0:return 0sorted_coeff = np.sort(np.abs(coeff))risks = np.zeros(n)for i in range(n):t = sorted_coeff[i]risk = (n - 2 * (i + 1) + np.sum(np.minimum(coeff**2, t**2))) / nrisks[i] = riskbest_threshold = sorted_coeff[np.argmin(risks)]return best_threshold

在这里插入图片描述

听音频效果去噪能力还是一般,比原音频要更加清晰一点。

维纳滤波(Wiener Filter)

维纳滤波(Wiener Filter)是由诺伯特·维纳提出的一种线性滤波方法,旨在通过最小化输出信号与期望信号之间的均方误差(MSE)来实现信号的去噪和估计。维纳滤波在时域和频域中都可以应用,是信号处理、图像处理等领域中的一种经典方法。

维纳滤波的核心思想是利用信号和噪声的统计特性,设计一个滤波器,使得滤波后的输出信号与期望信号之间的均方误差最小。算法逻辑可以分为四个步骤:

1.建模
  • 假设观测信号 x ( t ) x(t) x(t) 是真实信号 s ( t ) s(t) s(t)与噪声 n ( t ) n(t) n(t) 的叠加,即$ x(t)=s(t)+n(t)$。

  • 假设噪声 n ( t ) n(t) n(t)​是一个零均值的白噪声,且与信号 s ( t ) s(t) s(t) 互不相关。

2.频域表达
  • 将信号转换到频域,利用傅里叶变换,将维纳滤波器设计为频域滤波器。
3.维纳滤波器设计
  • 维纳滤波器的频域表达式为:
    H ( f ) = S s ( f ) S s ( f ) + S n ( f ) H(f)=\frac{S_{s}(f)}{S_{s}(f)+S_{n}(f)} H(f)=Ss(f)+Sn(f)Ss(f)
    其中, S s ( f ) S_{s}(f) Ss(f) S n ( f ) S_{n}(f) Sn(f)分别是信号和噪声的功率谱密度。
4.应用滤波器
  • 对观测信号应用维纳滤波器,得到估计的真实信号。
频域维纳滤波

在这里插入图片描述

计算信号和噪声的功率谱密度

  • 使用傅里叶变换计算观测信号的功率谱密度。
  • 使用估计方法或先验知识获取噪声的功率谱密度。

计算维纳滤波器的频域表达式

  • 根据信号和噪声的功率谱密度,计算维纳滤波器的频域表达式。

滤波和逆变换

  • 对观测信号进行傅里叶变换。
  • 应用维纳滤波器进行频域滤波。
  • 对滤波后的信号进行逆傅里叶变换,得到时域中的去噪信号。
def wiener_filter(noisy_signal, sample_rate, noise_power_spectrum):# 计算观测信号的功率谱密度f, Pxx = scipy.signal.welch(noisy_signal, sample_rate, nperseg=1024)# 估计信号的功率谱密度(假设信号与噪声独立,且噪声功率谱密度已知)signal_power_spectrum = np.maximum(Pxx - noise_power_spectrum, 1e-8)# 计算维纳滤波器的频域表达式H_wiener = signal_power_spectrum / (signal_power_spectrum + noise_power_spectrum)# 对观测信号进行傅里叶变换noisy_signal_fft = np.fft.fft(noisy_signal)# 对维纳滤波器进行频域插值H_wiener_interp = np.interp(np.fft.fftfreq(len(noisy_signal)), f, H_wiener)# 应用维纳滤波器进行频域滤波filtered_signal_fft = noisy_signal_fft * H_wiener_interp# 对滤波后的信号进行逆傅里叶变换filtered_signal = np.fft.ifft(filtered_signal_fft).realreturn filtered_signal

其中使用该算法前提条件需要计算出噪音的功率谱密度。噪声功率谱密度(Power Spectral Density, PSD)是描述噪声信号在频域中的能量分布的重要工具。在实际应用中,噪声功率谱密度通常需要根据观测到的噪声信号进行估计。我们可以通过自适应方法,通过统计分析或基于模型的方法估计噪声功率谱密度,适用于信号和噪声混合较复杂的情况。

def adaPtive_noisy(file,noise_estimation_duration=1.0):# 读取含噪信号音频文件noisy_signal, sample_rate = sf.read(file)# 使用Welch方法计算含噪信号的功率谱密度frequencies, Pxx  = scipy.signal.welch(noisy_signal, sample_rate, nperseg=10000)# 估计噪声功率谱密度noise_frames = int(noise_estimation_duration * sample_rate / 512)noise_power_spectrum = np.mean(Pxx[:noise_frames])# 可视化噪声功率谱密度plt.figure()plt.semilogy(frequencies, noise_power_spectrum)plt.title('Estimated Noise Power Spectral Density')plt.xlabel('Frequency [Hz]')plt.ylabel('Power Spectral Density [V^2/Hz]')plt.show()return noise_power_spectrum

那么音频各类去噪算法就先编码实现到此,后续我们可以根据不同的业务场景和需求来开展不同去噪效果的小型应用,而且也可以作为音视频直播或实现语音实时去噪效果。那么下一章节我们开始研究音频最为主要的特征以及对应含义,我们应该如何运用这些特征,如何通过特征来看透wav数据。

这篇关于语音深度鉴伪识别项目实战:基于深度学习的语音深度鉴伪识别算法模型(三)音频去噪算法大全+Python源码应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1036165

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06