音频处理1_基本概念

AI变声和音乐创作的基础

声音本质上是人类可察觉范围内的气压周期性波动, 即声波

声波是一种连续信号,在任意时间内的声音信号有无数个取值。对于只能读取有限长数组计算机来说,我们需要将连续的声音信号转换为一个离散的序列,即数字化表示。

1.音频采样 (sampling)

采样是在固定时间间隔上测量连续信号,并将这些间隔信号转换为离散数值的过程。

采样率(sampling rate,也叫采样频率,sampling frequency)指的是每秒测量信号数值的次数,其单位为赫兹(Hz)。

  • CD音质的音频一般采用44100Hz的采样率,即每秒钟测量了44100次信号的数值。

  • 高清(High-resolution)音频的采样率一般为192000赫兹,即192千赫兹。

  • 语音模型常用的采样率为16,000赫兹,即16千赫兹。

1.1 采样幅值

幅值是描述声音在任意瞬间的气压大小,使用分贝(dB)作为单位

人类感知到的幅值强度称为响度

正常的说话声音响度在60分贝以下;一场摇滚演出的响度大概在125分贝,几乎是人耳的极限。

  • 在数字音频中,每个采样点记录某个时间点上的声波幅值

1.2 位深度

  • 采样点的位深度决定了采样点的数值可以有多少种变化,即采样的精度

  • 位深度越大,数字化表示就可以越准确地记录下原始的连续声波

在这一量化过程中,原始的连续幅值被约减到最近的离散值上,因此量化过程会引入噪声。位深度越大,量化噪声则越小。

最常见的音频位深度为16比特或24比特。比特是一个二进制单位,

表示了声波的连续幅值被数字化后可以取值的范围:16比特有65,536种可能的取值,而24比特有16,777,216种可能的取值。

在实际应用中,16比特音频的量化噪声已达到了几乎不可辨别的程度。

1.3 重采样

改变音频采样频率,频率变高(大)为上采样,频率变低(小)为下采样

信号的原始采样率为8千赫兹时,即信号每秒钟会包含8000个采样点,根据奈奎斯特采样定理,我们知道该信号不会包含高于4千赫兹的频率成分。

假设两个采样点中间的原始连续信号呈一条平滑的曲线:

  • 上采样是对曲线的估计计算得到两个采样点中间的额外数值。

  • 下采样首先要通过低通滤波器过滤高于 奈奎斯特极限频率 的成分,之后重新按低频率采样。

能通过简单的每隔一个采样点丢弃一个采样点来进行2倍的下采样, 会造成信号的失真,即混叠失真。

2.音频的时域-频域

音频信号的频域(谱)和其时域(波形)所包含的信息完全相同,他们只是相同数据的不同视角。

  • 时域波形表示的是幅值随时间的变化

  • 频谱表示的是各个频率成分在该时间段内的强度

2.1 音频的时域

采样点随着时间变化的数值被标记在直角坐标系中

这种可视化表示方法可以很好地帮助我们辨别声音信号中的某些特征,

用librosa来绘制音频信号的波形图:

import librosa
import librosa.display
import matplotlib.pyplot as pltarray, sampling_rate = librosa.load(librosa.ex("trumpet"))
plt.figure().set_figwidth(12)
librosa.display.waveshow(array, sr=sampling_rate)
# y轴表示的是信号的幅值,x轴则表示时间

在这里插入图片描述

2.2 音频的频域

即音频的 频谱(spectrum) or 频域(frequency domain)

频谱通过离散傅里叶变换(Discrete Fourier Transform, DFT)求得,描述音频信号中每个频率成分的强度

使用numpy的rfft()函数来绘制小号声音的频谱图,使用整段音频的前4096个采样点计算DFT,这差不多是第一个音符的长度:

import numpy as npdft_input = array[:4096]# 计算 DFT
window = np.hanning(len(dft_input))
windowed_input = dft_input * window
dft = np.fft.rfft(windowed_input)# 计算频谱的幅值,转换为分贝标度
amplitude = np.abs(dft)
amplitude_db = librosa.amplitude_to_db(amplitude, ref=np.max)# 计算每个DFT分量对应的频率值
frequency = librosa.fft_frequencies(sr=sampling_rate, n_fft=len(dft_input))plt.figure().set_figwidth(12)
plt.plot(frequency, amplitude_db)
plt.xlabel("Frequency (Hz)")
plt.ylabel("Amplitude (dB)")
plt.xscale("log")

在这里插入图片描述

这张图向我们展示了截取的音频片段中各个频率成分的强度。图中的x轴是频率的值,一般采用对数表示;y轴则对于频率的幅值。

可以看到这张频谱图中有几个峰值。这些峰值对应着当前音符的泛音频率,且更高的泛音声音更小。可以看到首个峰对应的频率在620赫兹左右,这说明当前演奏的音符的音高是E♭。

计算DFT所得到的频谱是由复数组成的序列,每个复数都包含了实部和虚部。我们可以使用np.abs(dft)来计算频谱的绝对值(又称模、幅值)。实部和虚部的夹角组成的序列也成为相位谱,但在机器学习应用中我们通常不关注这一部分。

我们使用了librosa.amplitude_to_db()函数将幅值转换为了分贝标度,方便我们观察频谱的细节。有时人们也使用测量能量而非幅值的能量谱(power spectrogram),其值为幅值的平方。

2.3 时频谱

描绘频率成分随着时间的变化

在一段乐器演奏中,演奏者实际上吹奏了几个不同频率的音符。 频谱只能表示一个短暂时间段内各个频率成分的总体幅值

时频谱表示了音频信号中各个频率成分随时间变化的过程。它可以在一张图中看到时间、频率和幅值的所有信息。

时频谱是信息量最大的音频工具之一:

  • 在分析音乐文件时,时频谱可以清晰地展示各个乐器和人声在音乐整体中所占的部分

  • 在语音文件中,可以在时频谱里看到每个元音音节以及它们频率成分的差异。

这里的解决方法是我们可以进行多次的DFT,每次DFT都覆盖一小段不同的时间段,然后再把所有的频谱堆叠起来,这样就构成了时频谱(spectrogram)

import numpy as npD = librosa.stft(array) # Short Time Fourier Transform, STFT
S_db = librosa.amplitude_to_db(np.abs(D), ref=np.max)plt.figure().set_figwidth(12)
librosa.display.specshow(S_db, x_axis="time", y_axis="hz")
plt.colorbar()

在这里插入图片描述

图解:

- x轴表示的是和波形图中相同的时间- y轴现在表示着不同的频率,以赫兹(Hz)为单位- 颜色的强度表示着当前时间点和频率的幅值强度,使用分贝(dB)标度

时频谱计算步骤:

1. 首先截取很短的音频片段(通常只有几毫秒),然后对每个片段计算其离散傅里叶变换(DFT);2. 获得所有片段的频谱之后,我们再将频谱延时间轴堆叠起来,这样就得到了我们的时频谱

时频谱图像的每个垂直切片都是一个单独的频谱图

3.梅尔时频谱

一种时频谱变体,与标准时频谱相比,梅尔谱可以捕捉更多人类可感知的音频特征,在语音识别、、音乐等任务中更常用。

标准时频谱的频率(y轴)是赫兹的线性变化。 由于人类听觉系统对于低频率声音的变化更敏感,对于高频率声音的变化则较不敏感。这一敏感度的变化是随频率的上升呈对数关系下降的。

S = librosa.feature.melspectrogram(y=array, sr=sampling_rate, n_mels=128, fmax=8000)
S_dB = librosa.power_to_db(S, ref=np.max)plt.figure().set_figwidth(12)
librosa.display.specshow(S_dB, x_axis="time", y_axis="mel", sr=sampling_rate, fmax=8000)
plt.colorbar()

在这里插入图片描述

  • 梅尔滤波器组:

梅尔标度作为一种感知标度,通过梅尔滤波器组,模拟人耳对于频率的非线性感知。

n_mels代表梅尔滤波器组中的滤波器个数梅尔滤波器组会计算一组频率范围,这些频率范围会将整个频谱分割成许多部分每个频率范围都对应滤波器组中的一个滤波器滤波器的形状和间隔是模拟人耳对不同频率的感知差异而计算得出常用的n_mels取值为4080fmax则代表我们想选取的最大频率(以赫兹为单位)
  • 梅尔谱的计算过程中需要对信号进行滤波,因此梅尔谱的特征有损过程。

将梅尔谱转化回波形比标准时频谱更加困难,我们需要估计在滤波过程中丢失的频率成分。

  • HiFiGAN声码器可以将梅尔谱转化回波形。

4.其他

  • 反向短时傅里叶变换(inverse STFT)可将时频谱转换回原始的波形 这需要时频谱的强度谱之外,也需要时频谱的相位谱,目前的机器学习模型大多只能生成强度谱

  • 相位重建(phase reconstruction)方法,包括传统的Griffin-Lim算法,或者使用一种被称为声码器(vocoder)的神经网络来从时频谱还原其波形

  • 时频谱的作用不仅在于音频的可视化,许多机器学习模型也会使用时频谱作为模型的输入和输出而不直接使用音频的波形

Reference

  • 本文内容借鉴: https://huggingface.co/learn/audio-course/zh-CN/chapter1/introduction

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

法考报名必看,99%高过审率证件照片电子版制作技巧

在2024年,法考备战已经如火如荼进行中,作为进入法律行业的第一步,参加法考的重要性不言而喻。而作为报名过程中必不可少的一环,报名照片要求以及证件照制作技巧更是需要我们特别重视的部分。想要在这个过程中顺利通过审核&#xf…

【全开源】图书借阅管理系统源码(ThinkPHP+FastAdmin)

📚图书借阅管理系统:打造你的私人图书馆 一款基于ThinkPHPFastAdmin开发的简易图书借阅管理系统,一款轻量级的图书借阅管理系统,具有会员管理,图书管理,借阅及归还管理,会员充值等基本功能&…

使用 PNPM 从 0 搭建 monorepo,测试并发布

1 目标 通过 PNPM 创建一个 monorepo(多个项目在一个代码仓库)项目,形成一个通用的仓库模板。 这个仓库既可以用于公司存放和管理所有的项目,也可以用于将个人班余的所有积累整合其中。 这里以在 monorepo 项目中搭建 web compon…

x64-linux下在vscode使用vcpkg

1.使用vscode远程连接上对应的linux ,或者直接在图形化界面上使用。 2.安装vcpkg 插件,然后打开插件设置。 注意:defalut和host的主机一定和你自己的主机一致,且必须符合vcpkg三元组格式,其中你可以选择工作台的设置&a…

揭秘!5大策略让广告变现长久有效

在数字化时代的浪潮下,广告变现作为自媒体和APP开发者重要的收入来源,越来越受到重视。 但如何让这种变现方式长久持续,成为许多内容创作者与平台运营者思考的问题。 本文旨在探讨广告变现的持久之道,通过分析前端展示、合规性、…

OpenCV特征匹配

1、OpenCV Brute-Force匹配器 Brute-Force匹配器的匹配方法非常简单,输入两张图像所分别对应的特征(特征点坐标与特征点域对应的描述子),循环遍历两幅图像中的特征,计算第一幅图像与第二幅图像之间每个特征点之间的距…

【日记】第一次养植物,没什么经验……(781 字)

正文 前两天梦见灵送的几盆植物全都死掉了。梦里好伤心。醒来与她说这件事,她宽慰我说,梦都是反着的,肯定能活得很好的。于是忽然记起昨天给植物换水时,文竹的根居然从花盆底部伸吊了出来,以前都没有这种情况来着&…

ArcGIS Pro 3.0加载在线高德地图

1、打开ArcGIS Online官网,登录自己的账号,登录后效果如下图所示 官网地址:https://www.arcgis.com/home/webmap/viewer.html 2、点击Add,选择Add Layer from Web,如下图所示 3、在显示的Add Layer from Web页面内&am…

RabbitMQ-Stream(高级详解)

文章目录 什么是流何时使用 RabbitMQ Stream?在 RabbitMQ 中使用流的其他方式基本使用Offset参数chunk Stream 插件服务端消息偏移量追踪示例 示例应用程序RabbitMQ 流 Java API概述环境创建具有所有默认值的环境使用 URI 创建环境创建具有多个 URI 的环境 启用 TLS…

c#调用c++dll方法

添加dll文件到debug目录,c#生成的exe的相同目录 就可以直接使用了,放在构造函数里面测试

手机流畅运行470亿参数大模型,上交大发布PowerInfer-2推理框架,性能提升29倍

苹果一出手,在手机等移动设备上部署大模型迅速成为行业焦点。 目前,移动设备上运行的模型相对较小(苹果的是3B,谷歌的是2B),并且消耗大量内存,这在很大程度上限制了其应用场景。 即使是苹果&…

linux中: IDEA 由于JVM 设置内存过小,导致打开项目闪退问题

1. 找到idea安装目录 由于无法打开idea,只能找到idea安装目录 在linux(debian/ubuntu)中idea的插件默认安装位置和配置文件在哪里? 默认路径: /home/当前用户名/.config/JetBrains/IntelliJIdea2020.具体版本号/options2. 找到jvm配置文件 IDEA安装…

MNIST手写字符分类-卷积

MNIST手写字符分类-卷积 文章目录 MNIST手写字符分类-卷积1 模型构造2 训练3 推理4 导出5 onnx测试6 opencv部署7 总结 在上一篇中,我们介绍了如何在pytorch中使用线性层ReLU非线性层堆叠的网络进行手写字符识别的网络构建、训练、模型保存、导出和推理测试。本篇文…

Redis高性能原理:Redis为什么这么快?

目录 前言: 一、Redis知识系统观 二、Redis为什么这么快? 三、Redis 唯快不破的原理总结 四、Redis6.x的多线程 前言: Redis 为了高性能,从各方各面都进行了优化。学习一门技术,通常只接触了零散的技术点&#xff…

解决linux jenkins要求JDK版本与项目版本JDK不一致问题

背景–问题描述: 新入职公司,交接人说jenkins运行有问题,现在都是手动发布,具体原因让我自己看(笑哭)。我人都蒙了,测试环境都手动发布,那不是麻烦的要死! 接手后&am…

推荐几款短链接工具系统软件

1、C1N短网址(c1n.cn) 为了提升你的品牌并吸引新的受众,C1N短网址可以帮助你以最简单的方式进行科学分析、决策和促进变革。帮助您真正了解客户并促进转型,C1N短网址,它不仅是一种工具,也是一种专业服务。该品牌成立于2018年&…

引入tinyMCE富文本框在vue3中的使用

实现效果: 官网地址:TinyMCE 7 Documentation | TinyMCE Documentation 1.下载依赖(我使用的版本是5.0 目前最新版本到7了) pnpm/npm install tinymce5.0.0 -S pnpm/npm install tinymce/tinymce-vue -S 2.在public文件夹下…

数字化制造案例分享以及数字化制造能力评估(34页PPT)

资料介绍: 通过全面的数字化企业平台和智能制造技术的应用,制造型企业不仅提升了自身的竞争力,也为整个制造业的数字化转型提供了借鉴。同时,数字化制造能力的评估是企业实现数字化转型的关键环节,需要从技术变革、组…

Javaweb05-会话技术(cookie,session)

会话及会话技术 **概念:**在web开发中,服务器跟踪用户的技术为会话技术 Cookie对象 1.Cookie的工作流程 cookie可以将会话中的数据保存在浏览器中,通过在响应中添加Set-Cookie头字段将数据保存在自身的缓存中去cookie由浏览器创建cookie在…