语音深度鉴伪识别项目实战:基于深度学习的语音深度鉴伪识别算法模型(三)音频去噪算法大全+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))) / n
        risks[i] = risk
    best_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_signal


def calculate_universal_threshold(coeffs):
    # 使用高频细节系数估计噪声标准差
    sigma = np.median(np.abs(coeffs[-1])) / 0.6745
    # 计算通用阈值
    threshold = sigma * np.sqrt(2 * np.log(len(coeffs[-1])))
    return threshold

def calculate_sure_threshold(coeff):
    n = len(coeff)
    if n == 0:
        return 0
    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))) / n
        risks[i] = risk
    best_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).real
    
    return 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数据。

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

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

相关文章

C# Web控件与数据感应之 填充 HtmlTable

目录 关于 HtmlTable HtmlTable与BaseDataList的区别 准备数据源 ​范例运行环境 FillTable 方法 设计与实现 模板样例输出 Automatic 模式填充 ​ DynamicRows 模式填充 StaticRows 模式填充 ​ 小结 关于 HtmlTable 数据感应也即数据捆绑,是…

前端canvas绘图,利用canvas在图片上面绘制标记以及给canvas添加点击事件。

前端canvas绘图&#xff0c;利用canvas在图片上面绘制标记以及给canvas添加点击事件。 需要实现的效果如下图: 首先需要一个承载的核心画布 <canvas id"canvas" width"800" height"600"></canvas>全部代码&#xff1a; <!DOCT…

Web3的应用场景分析

Web3&#xff0c;即基于区块链技术的去中心化互联网&#xff0c;正逐渐改变我们与数字世界的互动方式。以下是Web3的一些主要应用场景。Web3技术正在各个领域推动创新&#xff0c;创造更多透明、开放和去中心化的解决方案&#xff0c;为用户带来更高的自主权和安全性。北京木奇…

Python语法详解module3(组合数据类型列表、元组、字典、集合详细用法)

目录 一、列表列表的创建多维列表列表的访问和修改列表的添加和删除列表的遍历使用 for 循环遍历使用 while 循环遍历同时遍历索引和元素列表推导式 常用的列表函数len()sort()reverse()index()count()extend()clear() 二、元组创建元组访问元组元素元组的不可变性元组的优点元…

【Linux】(三)—— 文件管理和软件安装

文件管理 Linux的文件管理是系统管理中的核心部分&#xff0c;它涉及到如何组织、访问、修改和保护文件及目录结构。 目录 文件管理基本概念常用命令查看和切换目录创建文件和目录删除文件和目录文件拷贝移动和重命名文件文件查看cat文件查看more查找文件查找文本 数据流和管道…

软件测试报告实际案例模板(项目测试文档doc原件)

软件测试报告在软件开发过程中起着至关重要的作用&#xff0c;主要有以下几个主要原因&#xff1a; 1、确保软件质量 2、提供决策支持 3、记录测试过程和结果 4、促进沟通和协作 5、符合标准和法规要求 6、改进测试流程和策略 7、降低风险 软件开发全套资料获取进主页或者本文末…

SEACells:元细胞分析

元细胞是从单细胞测序数据中衍生的细胞分组&#xff0c;代表高度精细的不同细胞状态。在这里&#xff0c;作者介绍了单细胞细胞状态聚集 (SEACells)&#xff0c;这是一种用于识别元细胞的算法&#xff0c;它克服了单细胞数据的稀疏性&#xff0c;同时保留了传统细胞聚类所掩盖的…

LW-DETR:实时目标检测的Transformer, Apache-2.0 开源可商用,实验超 YOLOv8

LW-DETR&#xff1a;实时目标检测的Transformer&#xff0c; Apache-2.0 开源可商用&#xff0c;实验超 YOLOv8 LW-DETR 架构实例化高效训练高效推理 目的与解法拆解ViT编码器和DETR解码器多级特征图聚合变形交叉注意力窗口注意力和全局注意力 论文&#xff1a;https://arxiv.o…

QT系列教程(9) 主窗口学习

简介 任何界面应用都有一个主窗口&#xff0c;今天我们谈谈主窗口相关知识。一个主窗口包括菜单栏&#xff0c;工具栏&#xff0c;状态栏&#xff0c;以及中心区域等部分。我们先从菜单栏说起 菜单栏 我们创建一个主窗口应用程序, 在ui文件里的菜单栏里有“在这里输入”的一个…

AI大底座核心平台:百度百舸AI异构计算平台(AI IaaS)与AI中台(AI PaaS)

AI大底座正是整合了以上端到端全要素技术能力&#xff0c;将基础架构IaaS与应用平台PaaS能力深度融合&#xff0c;面向企业和产业AI生 产与应用的全生命周期提供完整解决方案。 百舸AI异构计算平台是AI IaaS层的核心平台&#xff0c;包括AI计算、AI存储、AI加速、AI容器四层套件…

算法人生(19): 从“LangChain的六大组件”看“个人职业规划”

我们今天要说说和大模型有着密切关系的Langchain &#xff0c;它提供了一个平台&#xff0c;让开发者可以更加轻松地训练、部署和管理这些大模型。具体来说&#xff0c;Langchain 可以通过提供高性能的计算资源、灵活的模型管理和部署选项、以及丰富的监控和调试功能&#xff0…

「动态规划」如何求下降路径最小和?

931. 下降路径最小和https://leetcode.cn/problems/minimum-falling-path-sum/description/ 给你一个n x n的方形整数数组matrix&#xff0c;请你找出并返回通过matrix的下降路径的最小和。下降路径可以从第一行中的任何元素开始&#xff0c;并从每一行中选择一个元素。在下一…

CentOS 环境下 PostgreSQL 在线安装和源码安装详解

1、内容概述 昨天给大家简单的介绍了一下 PostgreSQL,并且在Windows系统上通过图形化界面的方式搭建好了环境&#xff0c;今天我们就来学习一下如何在Linux 系统上搭建 PostgreSQL环境&#xff0c;我会给大家介绍在线安装、离线源码安装以及Docker 安装三种方式。 2、在线安装…

umijs 服务端渲染(SSR) 指南

umijs 服务端渲染&#xff08;SSR&#xff09; 指南 Umi 是什么&#xff1f; Umi&#xff0c;中文可发音为乌米&#xff0c;是可扩展的企业级前端应用框架。Umi 以路由为基础的&#xff0c;同时支持配置式路由和约定式路由&#xff0c;保证路由的功能完备&#xff0c;并以此进…

枚举(enum)+联合体(union)

枚举联合 一.枚举类型1.枚举类型的声明2.枚举类型的优点3.枚举类型的使用 二.联合体1.联合体类型的声明2.联合体的特点3.相同成员的结构体和联合体对比4.联合体大小的计算5.联合体的练习&#xff08;判断大小端&#xff09;6.联合体节省空间例题 一.枚举类型 1.枚举类型的声明…

安全U盘和普通U盘有什么区别?

安全U盘&#xff08;也称为加密U盘或安全闪存驱动器&#xff09;与普通U盘肯定是有一些区别的&#xff0c;从字面意思上来看&#xff0c;就能看出&#xff0c;安全U盘是能够保护文件数据安全性的&#xff0c;普通U盘没这一些功能的&#xff0c;可随意拷贝文件&#xff0c;不防盗…

Hadoop3:MapReduce源码解读之Mapper阶段的TextInputFormat切片机制(3)

Job那块的断点代码截图省略&#xff0c;直接进入切片逻辑 参考&#xff1a;Hadoop3&#xff1a;MapReduce源码解读之Mapper阶段的Job任务提交流程&#xff08;1&#xff09; 5、TextInputFormat源码解析 类的继承关系 它的内容比较少 重写了两个父类的方法 这里关心一下泛型…

《开源模型食用指南》基于Linux环境快速部署开源模型,更适合中国宝宝的部署教程

今天给大家推荐一个非常适合中国宝宝学习的专属大模型教程&#xff0c;也就是它《开源模型食用指南》&#xff01; 当前百模大战正值火热&#xff0c;开源LLM层出不穷。 如今国内外已经涌现了众多优秀开源LLM&#xff0c;国外如LLaMA、Alpaca&#xff0c;国内如ChatGLM、BaiCh…

【Unity Shader入门精要 第13章】使用深度和法线纹理(一)

1. 原理 深度纹理的本质是一张RenderTexture&#xff0c;只不过其中记录的不是颜色值&#xff0c;而是一个深度值 这些深度值来自于顶点在空间变换后得到的归一化设备坐标&#xff08;NDC&#xff09;的Z值 由于NDC坐标的分量取值范围在[-1, 1]之间&#xff0c;要使颜色值能…

欧盟EDPS发布首份生成式人工智能与数据安全指南解读

6月3日&#xff0c;欧洲数据保护监督机构&#xff08;EDPS&#xff09;在其官网上发布了题为《生成式人工智能与EUDPR》的指南&#xff08;注&#xff1a;EUDPR指的是《欧盟2018/1725号条例》&#xff09;&#xff0c;这是首份适用于欧盟机构的人工智能与数据安全指南。 01 指南…