librosa.load
函数返回的时间序列是一个一维数组,表示音频信号在时间轴上的采样值。在 librosa
中,时间轴的方向是沿着数组的第一个轴,即 axis=0
。librosa.load
函数返回的时间序列就是一个长度为 T × s r T \times sr T×sr 的一维数组,其中 s r sr sr 是采样率。SoundFile — PySoundFile documentation
with sf.SoundFile(file_title) as audio_recording:
是使用 soundfile
库读取音频文件时的常用语法。
soundfile
是一个 Python 库,用于读取和写入各种音频文件格式,包括 WAV、FLAC、OGG 等。
在使用 soundfile
读取音频文件时,我们通常使用 with
语句来自动管理文件的打开和关闭,避免出现资源泄漏等问题。
具体来说,with
语句中的 sf.SoundFile(file_title)
表示打开一个音频文件,并将其转换为 SoundFile
对象。file_title
是要读取的音频文件的路径和文件名。
as audio_recording
表示将打开的音频文件对象赋值给 audio_recording
变量,以便后续对音频文件进行操作。
例如,以下代码使用 with
语句打开一个 WAV 格式的音频文件,并打印音频的采样率和通道数:
pythonCopy codeimport soundfile as sf
file_title = 'audio_file.wav'
with sf.SoundFile(file_title) as audio_recording:
print('Sample rate:', audio_recording.samplerate)
print('Channels:', audio_recording.channels)
需要注意的是,with
语句中的代码块结束后,soundfile
库会自动关闭音频文件对象,无需手动调用 close()
方法。
soundfile
和 librosa
都是用于读取和处理音频文件的 Python 库,但它们之间有一些不同。 soundfile
主要用于读取和写入各种音频文件格式,包括 WAV、FLAC、OGG 等。soundfile
相对于 librosa
更加通用,可以处理多种音频格式,并且在读取音频时速度较快,但是在音频分析和处理方面功能相对较弱。librosa
则更加专注于音频信号处理和分析。它提供了一系列用于特征提取、音频可视化、音频处理等方面的函数,例如计算短时傅里叶变换、梅尔频率倒谱系数等音频特征。
librosa
也支持多种音频格式,但其主要功能是对音频信号进行分析和处理,因此在读取音频时可能相对较慢。soundfile
库。librosa
库。音频中的通道和声道都是描述声音的参数,但是它们的含义略有不同。
声道(channel)是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号,所以声道数也就是声音录制时的音源数量或回放时相应的扬声器数量。
通道(track)是指音频信号在传输或处理过程中的路径,每个通道可以有不同的属性,如音量、音色、输入/输出端口等。
英文中,声道一般用channel表示,通道一般用track表示。
例子,
通道指的是音频信号传输和处理的路径,通常是指声道的数量。
声道指的是声音在空间中的位置和方向,是指人耳接收声音的方向。例如,左声道是指声音来自左侧,右声道是指声音来自右侧。
音源和声道是音频处理中两个不同的概念,它们之间有一定的联系。
为什么加载同一份音频,librosa.load()返回是一维数组,而sf.read()返回二维数组
这是因为 librosa.load()
和 sf.read()
在处理多声道音频文件时的默认行为不同。
librosa.load()
默认将多声道音频文件转换为单声道,并返回一维数组。如果你需要处理多声道音频文件,可以使用 mono=False
参数来保留所有声道,并返回二维数组。
而 sf.read()
默认会将多声道音频文件的每个声道分别存储在二维数组的不同列中,因此返回的是一个二维数组。
soundfile.read()
函数不支持修改已经存在的文件的采样率、通道数、格式、子类型或字节序。
否则遇到如下错误
TypeError: Not allowed for existing files (except 'RAW'): samplerate, channels, format, subtype, endian
这是一个与python-soundfile库相关的问题。python-soundfile是一个用于读写音频文件的python包,它支持多种音频格式
当你使用soundfile.read函数来读取一个已存在的音频文件时,你不能指定samplerate(采样率)、channels(声道数)、format(格式)、subtype(子类型)和endian(字节序)这些参数,因为这些参数是从文件本身获取的,除非你读取的是RAW文件。
RAW文件是一种没有头部信息的音频文件,所以你需要手动指定这些参数才能正确地读取它。
如果你想要改变已存在文件的这些参数,你可以使用soundfile.write函数来写入一个新的音频文件,并指定你想要的参数。
总的来讲,可以用librosa.load
的情况下,有先用librosa.load
librosa.load
内部也用到soundFile
的接口librosa.stft — librosa 0.10.0 documentation
librosa.stft()是一个用于计算短时傅里叶变换(STFT)的函数,它将一个时间序列分解成一系列频率域表示。STFT是一种将一个信号分解成一系列时域段的方法,每个时域段被转换成频域表示。
Short-time Fourier transform (STFT).
The STFT represents a signal in the time-frequency domain by computing discrete Fourier transforms (DFT) over short overlapping windows.
This function returns a complex-valued matrix D such that
np.abs(D[..., f, t])
is the magnitude of frequency bin f
at frame t
, and
np.angle(D[..., f, t])
is the phase of frequency bin f
at frame t
.
The integers t
and f
can be converted to physical units by means of the utility functions frames_to_samples
and fft_frequencies
.
Short-time Fourier transform (STFT)是一种信号处理技术,它通过在短时间窗口上进行离散傅里叶变换(DFT)来将信号表示为时频域。
在STFT中,将信号分成多个时域段,并对每个时域段进行DFT变换,得到它们在频域的表示。这样可以更好地分析信号的频域特性,因为信号的频域特性在时间上是不稳定的,而在短时间内则相对稳定。
STFT函数返回一个复数矩阵D,其中:
通过使用frames_to_samples和fft_frequencies这两个实用程序函数,可以将整数t和f转换为物理单位,以便更好地理解它们的意义。其中frames_to_samples函数将帧数转换为样本数,而fft_frequencies函数将频率索引转换为频率值。这些函数可以帮助我们更好地理解STFT的输出结果。
在短时傅里叶变换(STFT)中,信号被分成了许多个窗口,每个窗口内的信号长度相同,通常是几毫秒。
在每个窗口内,进行离散傅里叶变换(DFT),将信号在频域上表示为一系列频率成分。这些频率成分被称为频率“bin”,在数学上可以看作是DFT输出中的离散频率点。
在STFT中,我们用帧来描述每个窗口,并用时间轴和频率轴来表示这些帧内的信号。这里的“bin f at frame t”指的是在时刻t和频率bin f处的幅度和相位。因此,通过计算STFT,我们可以得到一系列在时频域内描述信号特征的“幅度-相位矩阵”,可以用于分析和处理信号。
y, sr = librosa.load(librosa.ex('trumpet'))
S = np.abs(librosa.stft(y))
S
array([[5.395e-03, 3.332e-03, ..., 9.862e-07, 1.201e-05],
[3.244e-03, 2.690e-03, ..., 9.536e-07, 1.201e-05],
...,
[7.523e-05, 3.722e-05, ..., 1.188e-04, 1.031e-03],
[7.640e-05, 3.944e-05, ..., 5.180e-04, 1.346e-03]],
dtype=float32)
这段代码使用了Librosa库来加载一个小号音频文件,并对其进行短时傅里叶变换(STFT)得到了一个复数型的STFT谱S。
具体的解释如下:
librosa.load()
函数用于加载音频文件,并返回两个值:音频信号y
和采样率sr
。
np.abs()
函数用于计算复数STFT谱的模值,也就是将复数谱的实部和虚部分别平方相加后再取平方根。
librosa.stft()
函数用于计算音频信号的短时傅里叶变换(STFT),它可以将时域信号转换成频域信号,并将信号分成多个窗口进行变换。STFT的输出结果是一个复数型矩阵,包含了信号在不同时间和频率上的能量分布。
因此,S
是一个形状为(n_fft/2+1, t)
的实数型矩阵,其中n_fft
是STFT中的FFT窗口大小,t
是STFT中窗口的数量。
S
的每一列代表一个时间窗口内的频率能量分布,它的每一行代表一个频率的能量。np.angle()
函数计算S
的相角部分,得到一个复数型的STFT谱。包络区域(envelope)是指一个信号或波动在时间或空间上的变化趋势,即它的最大振幅随时间或空间变化的曲线。在信号处理和通信中,包络区域通常用于分析和描述信号的动态特性,例如信号的幅度调制或解调、信号的频谱分析等。
包络区域的构成通常需要对信号进行调制或滤波处理。
在调幅(AM:amplitude modulation)信号中,包络区域是调制信号的幅度变化;
在调频(FM:frequency modulation)信号中,包络区域是调制信号的频率变化。
包络区域可以用图像或数学函数的形式表示,例如通过绘制信号波形的最大值或平均值曲线,或使用包络检测算法提取信号的包络函数。
在实际应用中,包络区域广泛应用于无线通信、音频信号处理、地震波分析等领域。
librosa.feature.mfcc — librosa 0.10.0 documentation
librosa.feature.mfcc函数是一个用于提取音频信号的Mel频率倒谱系数(MFCC)特征的函数。
MFCC是目前用于音频信号处理和语音识别的最常用特征之一,它可以有效地表示音频信号的语音特征。
该函数的输入参数包括音频信号y和采样率sr,以及一些可选参数,如窗口大小、帧移等。
它的输出是一个矩阵,其中每行是一个时间段的MFCC特征向量。
MFCC特征的计算过程包括以下几个步骤:
MFCC特征具有以下几个优点:
因此,MFCC特征在语音识别、声纹识别、音乐信息检索等领域得到了广泛的应用。
librosa.power_to_db()
是 Librosa 库中的一个工具函数,用于将功率谱转换为分贝(dB)刻度。
librosa.power_to_db()
函数将功率谱作为输入,并返回分贝比例尺的谱图。power_to_db
函数将输入频谱图转换为 dB 刻度,计算公式为: