pyAudioKits
pyAudioKits是基于librosa和其他库的强大Python音频工作流支持。
通过pip安装:
pip install pyAudioKits
本项目的GitHub地址,如果这个项目帮助到了你,请为它点上一颗star,谢谢你的支持!如果你在使用过程中有任何问题,请在评论区留言或在GitHub上提issue,我将持续对该项目进行维护。
基本用法
import pyAudioKits.audio as ak
创建或加载音频
来自NumPy数组
audio = ak.Audio(samples, sr)
使用NumPy数组和特定采样率初始化Audio对象。
-
samples:音频样本。NumPy数组对象。
-
sr:采样率。整数。
返回:一个 Audio对象.
来自文件
audio = ak.read_Audio(direction = "audio.wav")
(audio1,audio2) = ak.read_Audio(direction = "audio_dualchannel.wav")
从指定路径获取音频文件。双通道音频返回一个元组。
- direction:路径。
返回:
- 读取单通道音频时为Audio对象。
- 读取双通道音频时为包含两个Audio对象的元组。
录音
pyAudioKits的录音功能需要用到PyAudio库,该库目前无法正常通过pip在线安装。
为了安装PyAudio,请按照以下流程操作:
-
查看自己的Python版本
-
在该链接下载对应的.whl文件
-
将下载好的.whl文件放到python安装路径下的Scripts文件夹中(若直接使用Python)或Anaconda安装路径下的Scripts文件夹中(若使用Anaconda)
-
打开命令行,输入命令
pip install .whl文件的路径+.whl文件名 #如pip install D:\anacondaLocation\Scripts\PyAudio-0.2.11-cp37-cp37m-win_amd64.whl
-
继续输入命令
pip install pyaudio
import pyAudioKits.record
audio = pyAudioKits.record.record(sr,recordSeconds)
(audio1, audio2) = pyAudioKits.record.record(sr,recordSeconds,channels=2)
以sr的采样率从麦克风录制持续时间为recordSeconds的音频。
- sr:采样率。整数。
- recordSeconds:录制持续时间(秒)。整数。
- channels: 用于录制的通道数。
返回:
- 录制单通道音频时为Audio对象。
- 录制双通道音频时为包含两个Audio对象的元组。
pyAudioKits.record.audio.start_record(sr)
audio = pyAudioKits.record.audio.end_record(sr)
开始和结束录制线程。可用于需要随时打开或关闭录制的交互式软件设计中。
- sr:采样率。整数。
返回:一个Audio对象。
模拟
audio = ak.create_Single_Freq_Audio(amp,freq,sr,time,phase)
生成正弦波信号。
- amp:用于振幅的浮点数。
- freq:用于频率(Hz)的浮点数。
- sr:用于采样率的整数。
- time:用于持续时间(秒)的整数。
- phase: 正弦波的相位。指定None将在每个时刻[-π,π]之间生成独立且均匀分布的随机相位。
返回:一个Audio对象。
Audio对象
播放
audio.sound()
播放音频。它显示音频的功率,并在可能损害人耳听力时自动限制振幅。
绘制
audio.plot(start=0, end=None, ylim=None, ax=None, imgPath=None, xlabel="t/s")
在子图上绘制音频波形。
如果没有传递任何子图,它将直接显示。
如果传入imgpath,则将保存图形。
-
start:
- 如果xlabel是“t/s”或“t/ms”,则它将是开始时间戳。默认值为0。
- 如果xlabel为“n”,则它将是开始样本计数。默认值为0。
-
end:
- 如果xlabel是“t/s”或“t/ms”,则它将是结束时间戳。默认值=音频的最后一个时间戳。
- 如果xlabel为“n”,则它将是结束样本计数。默认值=样本总数。
-
ylim:y轴上显示范围的元组(y_start,y_end)。默认值(None)是自适应的。
-
ax:matplotlib.pyplot子图.
-
imgPath:保存图形的路径。
-
xlabel: “t/s”,“t/ms"或"n”.
转为NumPy数组
array = audio.samples
获取音频中的所有样本。
返回:NumPy数组。
获取属性
duration = audio.getDuration()
获取音频的持续时间(秒)。
返回:浮点数。
samples_count = len(audio)
获取音频的样本数。
返回:整数。
sr = audio.sr
获取音频的采样率。
返回:整数。
保存
audio.save(direction = "audio.wav")
将音频保存到指定路径。
- direction:保存路径。
ak.save_Audio_DoubleTracks(audio1 = track1, audio1 = track2, direction = "audio.wav")
将两个长度和采样率相同的音频组合成双通道音频,并将其保存到指定路径。
- audio1:第一个通道的Audio对象。
- audio2:第二个通道的Audio对象。
- direction:保存路径。
索引和切片
Audio对象支持一维索引和切片。索引中使用的任何值表示样本数(如果是整数),或者表示时间(以秒为单位)(如果是浮点数)。
返回:
-
如果执行索引,则返回样本值。
-
如果执行切片,则返回由切片样本组成的Audio对象,但采样率不变。
由于一维索引被重载,因此也可以使用一维索引修改音频的特定部分。可以使用NumPy数组作为源来修改,也可以使用另一个Audio对象作为源。但是,源音频和目标音频的采样率必须相同。
audio_slice = audio.timeSelect(start = 0, end = None, step = None, index_type = "t/s")
选择部分音频。
-
start:
- 如果index_type为“t/s”或“t/ms”,则它将是切片的开始时间戳。
- 如果index_type为“n”,则它将是切片的开始样本计数。
- 默认值为0。
-
end:
- 如果index_type为“t/s”或“t/ms”,则它将是切片的结束时间戳。默认值=音频的最后一个时间戳。
- 如果index_type为“n”,则它将是切片的结束样本计数。默认值=样本总数。
-
step:
- 如果index_type为“t/s”或“t/ms”,则它将是切片的时间步长。
- 如果index_type为“n”,则它将是切片的样本数步长。
- 默认值为1个样本。
-
index_type: “t/s”、“t/ms"或"n”。
返回:部分音频的Audio对象。
连接
audio = ak.concatenate(lis = [audio1,audio2,...])
将元组或列表中的Audio对象串联。
- lis:一个Audio对象的元组或列表。
返回:一个Audio对象。
合成
audio = ak.synthesis(lis = [audio1,audio2,...])
将元组或列表中的Audio对象合成。
- lis:用于Audio对象的元组或列表。
返回:一个Audio对象。
audio = ak.mixWithSNR(signal, noise, snr, maintain= "signal")
以特定信噪比(dB)混合信号和噪声。信号和噪声应具有相同的采样率。
-
signal:一个Audio对象。无噪声的信号。
-
noise:一个Audio对象。噪声与信号混合。
-
snr:一个浮点数。信号和噪声之间的信噪比(dB)。
-
maintain:maintain="signal"以保持信号强度,maintain="noise"以保持噪声强度。
返回:一个Audio对象。
四则运算
Auido对象重载了四则运算。
audio1=audio1+audio2 #音频叠加。两个音频应具有相同的长度和采样率
audio1=audio1+arr #Audio对象还可以叠加NumPy数组,其形状应与audio1.samples.shape相同
audio1=audio1-audio2 #音频减法。两个音频应具有相同的长度和采样率
audio1=audio1-arr #Audio对象还可以减去NumPy数组,其形状与audio1.samples.shape相同
audio1=audio1*audio2 #音频调制。两个音频应具有相同的长度和采样率
audio1=audio1*arr #Audio对象也可以通过NumPy数组进行调制,其形状与audio1.samples.shape相同
audio1=audio1/audio2 #音频解调。两个音频应具有相同的长度和采样率
audio1=audio1/arr #Audio对象也可以通过NumPy数组进行解调,其形状与audio1.samples.shape相同
audio1=audio1*value #使用乘法放大音频,value为浮点数
audio1=audio1/value #使用除法衰减音频,value为浮点数
增幅
audio = audio.amplify(dB)
以dB的增益放大音频。
- dB: 增益的浮点对象(dB)。
返回:一个Audio对象。
变调
audio = audio.pitch_shift(halfSteps)
改变音频的音调。正的的halfStep值会增加音频的频率。
- halfSteps: 一个整数,表示要增加多少个半音。
返回:一个Audio对象。
重采样
audio = audio.resample(newRate)
使用新的采样率对音频重新采样。
- newRate: 新采样率的整数。
返回:一个Audio对象。
添加高斯白噪声
audio = audio.addWgn(dB)
添加特定强度的高斯白噪声。
- snr:决定白噪声强度的浮点数。信号和白噪声将具有以snr(dB)测量的信噪比
返回:一个Audio对象。
填充
audio_padded = audio.padding(audioDuration, start = 0)
将音频零填充到给定的长度。
-
audioDuration:如果是浮点数,表示填充后音频的持续时间(秒);如果是整数,表示填充后音频的样本数。
-
start:原始音频在填充后音频中的起始位置。如果是浮点数,它是开始时间(秒);如果是整数,它是开始样本数。
返回:一个Audio对象。
分帧加窗
audioFrames=audio.framing(frameDuration=0.03,overlapRate=0.5,window=None)
为音频分帧加窗。
-
frameDuration:一个浮点数用于指定每个帧的持续时间(秒),或一个整数用于指定每个帧的长度(样本点数)。
-
overlapRate:一个[0,1)的浮点数,表示帧的重叠率。
-
window:
- 如果是字符串,它是窗口函数的名称(例如,“hann”)。
- 如果是元组,它是窗口函数的名称和任何参数(例如,(“kaiser”,4.0))。
- 如果是数字,它将被视为kaiser窗的β参数。
- 如果是一个函数,它是一个接受整型参数(窗口长度)的函数。
- 如果是列表式的,它是一个预先计算好的长度为Nx的窗口。
返回:一个AudioFrames对象。
AudioFrames对象
转为NumPy数组
array = audioFrames.samples
获取音频中的所有样本。其形状为 ( K × N ) (K\times N) (K×N),其中 M M M为帧数, N N N为以样本点数计算的帧长。
返回:NumPy数组。
获取属性
duration = audioFrames.getDuration()
获取原始音频的持续时间(秒)。
返回:一个浮点数。
samples_count = len(audioFrames)
获取原始音频的样本数。
返回:一个整数。
sr = audioFrames.sr
获取原始音频的采样率。
返回:一个整数。
frame_count = audioFrames.getFrameCount()
获取帧的数量。
返回:一个整数。
frame_length = audioFrames.getFrameLength()
获取每一帧中的样本数。
返回:一个整数。
frame_count, frame_length = audioFrames.shape
同时获得帧的数量和每一帧的样本数量。
返回:两个整数的一个元组。
frame_duration = audioFrames.getFrameDuration()
获取每一帧的持续时间,以秒为单位。
返回:一个浮点数。
step_length = audioFrames.getStepLength()
获取以样本数为单位的帧间步长。
返回:一个整数。
step_duration = audioFrames.getStepDuration()
获取以秒为单位的帧间步长。
返回:一个浮点数。
索引和切片
AudioFrames对象支持一维或二维的索引和切片。
第一个维度是帧维度。任何整数数值都代表原始Audio对象中的样本数,任何浮点数值都表示原始Audio对象中以秒为单位的时间。
第二个索引是时间维度。任何整数数值都代表每一帧的样本数,任何浮点数值都表示每一帧以秒为单位的时间。
返回:
- 如果在时间维度上做了任何索引或切片,将返回一个二维的NumPy数组。
- 如果在帧维度上进行切片,步长大于帧间步长,将返回一个二维NumPy数组。
- 否则,将返回一个AudioFrames对象;特别地,如果AudioFrames对象的帧维度长度为1,它将被降级为一个Audio对象。
复原
audio = audioframes.retrieve(method = "first_half")
还原AudioFrames对象回Audio对象。
- method:
- “last_half”:重叠时,保留每一帧的最后一半。
- “first_half”:重叠时,保留每一帧的前半部分。
返回:一个Audio对象。
时域分析
关于此部分的细节请参考【基于pyAudioKits的Python音频信号处理(三)】乐音和噪音和【基于pyAudioKits的Python音频信号处理(五)】音频信号的短时分析方法
import pyAudioKits.analyse as aly
方法
功率和能量
power = aly.power(input, dB = False)
计算音频的功率。
-
input:一个Audio对象或一个AudioFrames对象。
-
dB:是否以增益(dB)的形式表达结果。
返回:
-
如果输入是一个Audio对象:整个音频的功率。
-
如果输入是一个AudioFrames对象:一个frame_axis_ds对象,包含每一帧的功率。
energy = aly.energy(input, dB = False)
计算音频的能量。
- input:一个Audio对象或一个AudioFrames对象。
- dB:是否以增益(dB)的形式表达结果。
返回:
- 如果输入是一个Audio对象:整个音频的能量。
- 如果输入是一个AudioFrames对象:一个frame_axis_ds对象,包含每一帧的能量。
snr = aly.snr(signal, signalAndNoise)
计算信噪比(dB)。
- signal:一个Audio对象。不含噪声的信号。
- signalAndNoise:一个Audio对象。含噪声的信号。
返回:信噪比(dB)。浮点数。
过零率
overzerorate = aly.overzero(input)
计算音频的短时过零率。
- input:一个AudioFrames对象。
返回:一个frame_axis_ds对象,包含每个帧的短时过零率。
自相关
autocorrelation = aly.autocorr(input)
计算音频的自相关函数。
- input:一个Audio对象或一个AudioFrames对象。
返回:
-
如果输入是Audio对象:包含自相关函数的time_delta_axis_ds对象。
-
如果输入是AudioFrames对象:一个time_delta_frame_axis_ds对象,包含每个帧的短时自相关结果。
统计结果数据结构
frame_axis_ds对象
result = frame_axis_ds.samples
获取统计结果
返回:一个一维NumPy数组,其长度等于要统计的AudioFrames对象的帧数。
frame_axis_ds对象支持一维索引和切片。索引中使用的任何值表示样本数(如果是整数),或者表示时间(如果是浮点数)。
返回:部分结果的一维NumPy数组。
result = frame_axis_ds.frameSelect(start = 0, end = None, step = None, index_type = "t/s")
选择部分结果。
-
start:
- 如果index_type为“t/s”或“t/ms”,则它将是切片的开始时间戳。默认值为0。
- 如果index_type为“n”,则它将是切片的开始样本计数。默认值为0。
- 如果index_type为“frame”,则它将是开始帧计数。默认值为0。
-
end:
- 如果index_type为“t/s”或“t/ms”,则它将是切片的结束时间戳。默认值=音频的最后一个时间戳。
- 如果index_type为“n”,则它将是切片的结束样本计数。默认值=样本总数。
- 如果index_type为“frame”,则它将是切片的结束帧计数。默认值=总帧数。
-
step:
- 如果index_type为“t/s”或“t/ms”,则它将是切片的时间步长。
- 如果index_type为“n”,则它将是切片的样本数步长。
- 如果index_type为“frame”,则它将是切片的帧计数步长。
- 默认值为1帧。
-
index_type: “t/s”、“t/ms”、“n"或"frame”。
返回:部分结果的一维NumPy数组。
frame_axis_ds.plot(start=0, end=None, ylim=None, ax=None, imgPath=None, xlabel="t/s")
在子图上绘制每帧统计结果。
如果没有传递任何子图,它将直接显示。
如果传入imgpath,则将保存图形。
-
start:
- 如果xlabel是“t/s”或“t/ms”,则它将是开始时间戳。默认值为0。
- 如果xlabel为“n”,则它将是开始样本计数。默认值为0。
- 如果xlabel是“frame”,则它将是开始帧计数。默认值为0。
-
end:
- 如果xlabel是“t/s”或“t/ms”,则它将是结束时间戳。默认值=音频的最后一个时间戳。
- 如果xlabel为“n”,则它将是结束样本计数。默认值=样本总数。
- 如果xlabel是“frame”,则它将是结束帧计数。默认值=总帧数。
-
ylim:y轴上显示范围的元组(y_start,y_end)。默认值(None)是自适应的。
-
ax:matplotlib.pyplot子图。
-
imgPath:保存图形的路径。
-
xlabel:“t/s”、“t/ms”、“n”或“frame”。
time_delta_axis_ds对象
result = time_delta_axis_ds.samples
获取统计结果。
返回:一个一维NumPy数组,其长度等于 2 × L − 1 2\times L-1 2×L−1,其中 L L L是要统计的Audio对象的样本数。
time_delta_axis_ds对象支持一维索引和切片。索引中使用的任何值如果是整数,则表示样本偏移;如果是浮点数,则表示以秒为单位的时间偏移。
返回:部分结果的一维NumPy数组。
result = time_delta_axis_ds.timeSelect(start = 0, end = None, step = None, index_type = "t/s")
选择部分结果。
- start:
- 如果index_type为“t/s”或“t/ms”,则它将是切片的开始时间偏移。默认值为0。
- 如果index_type为“k”,则它将是切片的起始样本偏移。默认值为0。
- end:
- 如果index_type为“t/s”或“t/ms”,则它将是切片的结束时间偏移。默认值=音频的持续时间。
- 如果index_type为“k”,则它将是切片的结束样本偏移。默认值=音频的最大样本数。
- step:
- 如果index_type为“t/s”或“t/ms”,则它将是切片的时间偏移步长。
- 如果index_type为“k”,则它将是切片的样本偏移步长。
- 默认值为1个样本偏移。
- index_type:“t/s”、“t/ms”或“k”。
返回:部分结果的一维NumPy数组。
result = time_delta_axis_ds.plot(start=0, end=None, ylim=None, ax=None, imgPath=None, xlabel="t/s")
在子图上绘制结果。
如果没有传递任何子图,它将直接显示。
如果传入imgpath,则将保存图形。
-
start:
- 如果xlabel是“t/s”或“t/ms”,则它将是开始时间偏移。默认值为0。
- 如果xlabel为“k”,则它将是起始样本偏移。默认值为0。
-
end:
- 如果xlabel是“t/s”或“t/ms”,则它将是结束时间偏移。默认值=音频的持续时间。
- 如果xlabel为“k”,则它将是结束样本偏移。默认值=音频的最大采样数。
-
ylim:y轴上显示范围的元组(y_start, y_end)。默认值(None)是自适应的。
-
ax:matplotlib.pyplot子图。
-
imgPath:保存图形的路径。
-
xlabel:“t/s”、“t/ms”或“k”。
time_delta_frame_axis_ds对象
result = time_delta_frame_axis_ds.samples
获取统计结果。
返回:一个形状为 ( K , 2 × L − 1 ) (K,2\times L-1) (K,2×L−1)的二维NumPy数组,其中 L L L是每帧中的样本数, K K K是要统计的AudioFrames对象的帧数。
time_delta_frame_axis_ds对象支持一维或二维索引和切片。
第一个维度是帧维度。任何整数值表示原始Audio对象中的采样数,任何浮点值表示原始Audio对象中的时间(以秒为单位)。
第二个维度是时间偏移维度。如果是整数,则任何值表示每帧中的样本偏移;如果是浮点数,则表示每帧中的时间偏移(以秒为单位)。
返回:部分结果的二维NumPy数组。
result = time_delta_frame_axis_ds.frameSelect(start = 0, end = None, step = None, index_type = "t/s")
在帧维度上选择部分结果。
-
start:
- 如果index_type为“t/s”或“t/ms”,则它将是切片的开始时间戳。默认值为0。
- 如果index_type为“n”,则它将是切片的开始样本计数。默认值为0。
- 如果index_type为“frame”,则它将是开始帧计数。默认值为0。
-
end:
- 如果index_type为“t/s”或“t/ms”,则它将是切片的结束时间戳。默认值=音频的最后一个时间戳。
- 如果index_type为“n”,则它将是切片的结束样本计数。默认值=音频的样本总数。
- 如果index_type为“frame”,则它将是切片的结束帧计数。默认值=总帧数。
-
step:
- 如果index_type为“t/s”或“t/ms”,则它将是切片的时间步长。
- 如果index_type为“n”,则它将是切片的样本计数步长。
- 如果index_type为“frame”,则它将是切片的帧计数步长。
- 默认值为1帧。
-
index_type: “t/s”、“t/ms”、“n”或“frame”。
返回:部分结果的二维NumPy数组。
result = time_delta_frame_axis_ds.timeSelect(start = 0, end = None, step = None, index_type = "t/s")
在时间偏移维度上选择部分结果。
-
start:
- 如果index_type为“t/s”或“t/ms”,则它将是切片的开始时间偏移。默认值为0。
- 如果index_type为“k”,则它将是切片的起始样本偏移。默认值为0。
-
end:
- 如果index_type为“t/s”或“t/ms”,则它将是切片的结束时间偏移。默认值=每帧的持续时间。
- 如果index_type为“k”,则它将是切片的结束样本偏移。默认值=每帧的最大样本数。
-
step:
- 如果index_type为“t/s”或“t/ms”,则它将是切片的时间偏移步长。
- 如果index_type为“k”,则它将是切片的样本偏移步长。
- 默认值为1个样本偏移。
-
index_type: “t/s”、“t/ms”或“k”。
返回:部分结果的二维NumPy数组。
time_delta_frame_axis_ds.plot(xstart=0, xend=None, ystart=0, yend=None, ax=None, imgPath=None, xlabel="t/s", ylabel="t/s", cbar=True)
在子图上画出每一帧的统计结果。
如果没有传入子图,将直接显示。
如果传入了imgpath,图表将被保存。
-
xstart:
- 如果xlabel是 "t/s "或 “t/ms”,那么它将是起始时间戳。默认=0。
- 如果xlabel为“n”,则它将是开始样本计数。默认值为0。
- 如果xlabel是“frame”,则它将是开始帧计数。默认值为0。
-
xend:
-
如果xlabel是“t/s”或“t/ms”,则它将是结束时间戳。默认值=音频的最后一个时间戳。
-
如果xlabel为“n”,则它将是结束样本计数。默认值=样本总数。
-
如果xlabel是“frame”,则它将是结束帧计数。默认值=总帧数。
-
-
ystart:
-
如果ylabel是“t/s”或“t/ms”,则它将是开始时间偏移。默认值为0。
-
如果ylabel为“k”,则它将是起始样本偏移。默认值为0。
-
-
yend:
-
如果ylabel是“t/s”或“t/ms”,则它将是结束时间偏移。默认值=每帧的持续时间。
-
如果ylabel为“k”,则它将是结束样本差。默认值=每帧的最大样本数。
-
-
ax:matplotlib.pyplot子图。
-
imgPath:保存图形的路径。
-
xlabel:“t/s”、“t/ms”、“n”或“frame”。
-
ylabel:“t/s”、“t/ms”或“k”。
-
cbar:True以显示色条。
频域分析
关于此部分细节请参考【基于pyAudioKits的Python音频信号处理(四)】傅里叶变换:从时域到频域和【基于pyAudioKits的Python音频信号处理(五)】音频信号的短时分析方法
import pyAudioKits.analyse as aly
方法
快速傅里叶变换
spec = aly.FFT(input, N=None)
计算音频的FFT。
- input:一个Audio对象或一个AudioFrames对象。
- N:傅立叶变换点的数量。如果使用所有样本,则为None。
返回:
-
如果输入是一个Audio对象:一个包含频谱的freq_axis_ds对象。
-
如果输入是一个AudioFrames对象:一个freq_frame_axis_ds对象,包含短时频谱。
功率谱密度
psd = aly.PSD(input, N=None, dB=False)
计算音频的功率谱密度。
- input:一个Audio对象或一个AudioFrames对象。
- N:傅立叶变换点的数量。如果使用所有样本,则为None。
- dB:是否用增益(dB)来表示输出。
返回:
-
如果输入是一个Audio对象:一个包含整个音频的功率谱密度的freq_axis_ds_real对象。
-
如果输入是一个AudioFrames对象:一个包含每一帧的功率谱密度的freq_frame_axis_ds_real对象。
谱熵
specEnt = aly.specEntropy(input, N=None)
计算音频的谱熵。
-
input:一个Audio对象或一个AudioFrames对象。
-
N:傅里叶变换点的数量。如果使用所有样本,则为None。
返回:
-
如果输入是一个Audio对象:一个浮点数,表示整个音频的谱熵。
-
如果输入是一个AudioFrames对象:一个frame_axis_ds对象,包含每一帧的谱熵。
频谱峰值
specPeak, peakAmp = aly.getMaxFrequency(input,N=None,dB=False)
获取频谱峰值的频率和振幅。
- input:一个Audio对象或一个AudioFrames对象。
- N:傅里叶变换点的数量。如果使用所有样本,则为None。
- dB:是否用增益(dB)表示输出振幅。
返回:
-
如果输入是一个Audio对象:整个音频的频谱峰值及其振幅。
-
如果输入是一个AudioFrames对象:一个包含频谱峰值的频率的frame_axis_ds对象和一个包含频谱峰值的振幅的frame_axis_ds对象。
统计结果数据结构
freq_axis_ds对象
result = freq_axis_ds.samples
result = freq_axis_ds_real.samples
获取统计频谱。
返回:长度等于 N / 2 N/2 N/2的一维NumPy数组,其中 N N N是FFT中的点数。
freq_axis_ds对象支持一维索引和切片。索引中使用的任何值表示频点(如果是整数),或者表示频率(单位为Hz)(如果是浮点数)。
返回:部分统计结果频谱的一维NumPy数组。
result = freq_axis_ds.freqSelect(start = 0, end = None, step = None, index_type = "frequency/Hz")
result = freq_axis_ds_real.freqSelect(start = 0, end = None, step = None, index_type = "frequency/Hz")
选择频谱的一部分。
-
start:切片频率的开始。含义取决于index_type。默认值为0。
-
end:切片频率的结束。含义取决于index_type。默认值=采样率的一半。
-
step:切片步长。含义取决于index_type。默认值=1个频点。
-
index_type:“frequency/Hz”、“frequency/(rad/s)”、 “normalized frequency/Hz”、“normalized frequency/(rad/s)” 或"freq point"。
返回:部分频谱的一维NumPy数组。
freq_axis_ds.plot(start=0, end=None, ylim=None, ax=None, imgPath=None, xlabel="frequency/Hz", plot_type="amplitude",freq_scale="linear")
freq_axis_ds_real.plot(start=0, end=None, ylim=None, ax=None, imgPath=None, xlabel="frequency/Hz",freq_scale="linear")
在子图上绘制统计结果频谱图。
如果没有传递任何子图,它将直接显示。
如果传入imgpath,则将保存图形。
-
start:起始频率。意义取决于xlabel。默认值为0。
-
end:结束频率。意义取决于xlabel。默认值=采样率的一半。
-
ylim:y轴上显示范围的元组(y_start,y_end)。默认值(None)是自适应的。
-
ax:matplotlib.pyplot子图。
-
imgPath:保存图形的路径。
-
xlabel:“frequency/Hz”、“frequency/(rad/s)”、“normalized frequency/Hz”、"normalized frequency/(rad/s)“或"freq point”。
-
plot_type:“amplitude”、“dB” 或"phase"。 (freq_axis_ds_real对象的绘图函数没有此参数)
-
freq_scale:“linear”、“log"或"mel”。
freq_frame_axis_ds对象
result = freq_frame_axis_ds.samples
result = freq_frame_axis_ds_real.samples
获取统计短时谱。
返回:形状为 ( K , N / 2 ) (K,N/2) (K,N/2)的二维NumPy数组,其中 N N N是FFT中的点数, K K K是要统计的AudioFrames对象的帧数。
freq_frame_axis_ds对象支持一维或二维索引和切片。
第一个维度是帧维度。任何整数值表示原始Audio对象中的样本计数;任何浮点数表示原始Audio对象中的时间(以秒为单位)。
第二个索引是频率维度。如果是整数,则任何值表示每帧中的频点;如果是浮点数,则表示每帧中的频率(Hz)。
返回:部分短时频谱的二维NumPy数组。
result = freq_frame_axis_ds.freqSelect(start = 0, end = None, step = None, index_type = "frequency/Hz")
result = freq_frame_axis_ds_real.freqSelect(start = 0, end = None, step = None, index_type = "frequency/Hz")
在频率维度上选择部分短时频谱。
-
start:切片频率的开始。含义取决于index_type。默认值为0。
-
end:切片频率的结束。含义取决于index_type。默认值=采样率的一半。
-
step:结束频率。含义取决于index_type。默认值=1个频点。
-
index_type:“frequency/Hz”、“frequency/(rad/s)”、“normalized frequency/Hz”、"normalized frequency/(rad/s)“或"freq point”。
返回:部分短时频谱的二维NumPy数组。
result = freq_frame_axis_ds.frameSelect(start = 0, end = None, step = None, index_type = "frequency/Hz")
result = freq_frame_axis_ds_real.frameSelect(start = 0, end = None, step = None, index_type = "frequency/Hz")
在帧维度上选择部分短时频谱。
-
start:
- 如果index_type为“t/s”或“t/ms”,则它将是切片的开始时间戳。默认值为0。
- 如果index_type为“n”,则它将是切片的开始样本计数。默认值为0。
- 如果index_type为“frame”,则它将是开始帧计数。默认值为0。
-
end:
- 如果index_type为“t/s”或“t/ms”,则它将是切片的结束时间戳。默认值=音频最后一个时间戳。
- 如果index_type为“n”,则它将是切片的结束样本计数。默认值=音频的样本总数。
- 如果index_type为“frame”,则它将是切片的结束帧计数。默认值=总帧数。
-
step:
- 如果index_type为“t/s”或“t/ms”,则它将是切片的时间步长。
- 如果index_type为“n”,则它将是切片的样本计数步长。
- 如果index_type为“frame”,则它将是切片的帧计数步长。
- 默认值为1帧。
-
index_type: “t/s”、“t/ms”、“n”或“frame”。
返回:部分短时频谱的二维NumPy数组。
freq_frame_axis_ds.plot(xstart=0, xend=None, ystart=0, yend=None, ax=None, imgPath=None, xlabel="t/s", ylabel="frequency/Hz", plot_type="amplitude", cbar=True, freq_scale="linear")
freq_frame_axis_ds_real.plot(xstart=0, xend=None, ystart=0, yend=None, ax=None, imgPath=None, xlabel="t/s", ylabel="frequency/Hz", cbar=True, freq_scale="linear")
在子图上绘制短时谱图。
如果没有传递任何子图,它将直接显示。
如果传入imgpath,则将保存图形。
-
xstart:
- 如果xlabel是“t/s”或“t/ms”,则它将是开始时间戳。默认值为0。
- 如果xlabel为“n”,则它将是开始样本计数。默认值为0。
- 如果xlabel是“frame”,则它将是开始帧计数。默认值为0。
-
xend:
- 如果xlabel是“t/s”或“t/ms”,则它将是结束时间戳。默认值=每个帧中的最后一个时间戳。
- 如果xlabel为“n”,则它将是结束样本计数。默认值=每个帧中的样本总数。
- 如果xlabel是“frame”,则它将是结束帧计数。默认值=每个帧中的总帧数。
-
ystart:开始频率。意义取决于ylabel。默认值为0。
-
yend:结束频率。意义取决于ylabel。默认值=采样率的一半。
-
ax:matplotlib.pyplot子图。
-
imgPath:保存图形的路径。
-
xlabel:“t/s”、“t/ms”、“n”或“frame”。
-
ylabel:“frequency/Hz”、“frequency/(rad/s)”、“normalized frequency/Hz”、"normalized frequency/(rad/s)“或"freq point”
-
plot_type:“amplitude”、“dB"或"phase”。(freq_frame_axis_ds_real的绘图函数没有此参数)
-
cbar:True以显示色条。
-
freq_scale:“linear”、“log"或"mel”。
基于模型的分析
关于此部分的细节请参考【基于pyAudioKits的Python音频信号处理(七)】端点检测和语音识别
import pyAudioKits.analyse as aly
MFCC
mfcc_feats = aly.MFCC(input,p=13,diff1=True,diff2=True,energy=True,frameDuration = 0.03, overlapRate = 0.5)
计算音频的MFCC特征。
- input:一个Audio对象。
- p:MFCC阶数。
- frameDuration:一个浮点数用于指定每个帧的持续时间(秒),或一个整数用于指定每个帧的长度(样本点数)。
- overlapRate:一个[0,1)的浮点数,表示帧的重叠率。
- diff1:使用一阶差分特征。
- diff2:使用二阶差分特征。
- energy:使用能量特征。
返回:MFCC特征的二维NumPy数组。每行将是一帧的MFCC特征。
FBank
fbank_feats = aly.fBank(input, filters = 26, frameDuration = 0.03, overlapRate = 0.5)
计算音频的Fbank特征。
- input:一个Audio对象。
- filters:应用的梅尔滤波器数量。
- frameDuration:一个浮点数用于指定每个帧的持续时间(秒),或一个整数用于指定每个帧的长度(样本点数)。
- overlapRate:一个[0,1)的浮点数,表示帧的重叠率。
返回:FBank特征的二维NumPy数组。每行将是一帧的FBank特征。
Mel Spectrogram
melspec_feats = aly.melSpec(input, spec_h=128, spec_w=128)
计算音频的梅尔频谱特征。
- input:一个Audio对象.
- spec_h:梅尔频谱特征的高度,决定了频率分辨率。
- spec_w:梅尔频谱特征的宽度,决定了时间分辨率。
返回:梅尔频谱特征的二维NumPy数组。
LPC
es, ws = LPC(input, p=10)
每个帧的Matlab风格线性预测编码。
- input:一个AudioFrames对象。
- p:LPC阶数。
返回:每帧的LPC误差列表对象和每帧的LPC系数列表对象。
滤波器
关于此部分的细节请参考基于pyAudioKits的Python音频信号处理(六)】LTI滤波器
import pyAudioKits.filters as flt
通用设计
output = flt.ltiFilter(input,numerators,denominators,zero_phase=False)
通过指定系统函数的分母和分子系数进行LTI滤波器设计。
- input:一个Audio对象或一个AudioFrames对象。
- numerators:系统函数分子系数的NumPy数组。
- denominators:系统函数分母系数的NumPy数组。
- zero_phase:使用双向滤波以保持0的相位响应。
返回:
- 如果输入是Audio对象,则为Audio对象。
- 如果输入为AudioFrames对象,则为AudioFrames对象。
巴特沃斯滤波器设计
output=flt.lowPassFilterN(input,n,f,freq_type = "frequency/Hz", zero_phase = True) #N阶低通巴特沃斯滤波器。
output=flt.highPassFilterN(input,n,f,freq_type = "frequency/Hz", zero_phase = True) #N阶高通巴特沃斯滤波器。
output=flt.bandPassFilterN(input,n,fLow,fHigh,freq_type = "frequency/Hz", zero_phase = True) #N阶带通巴特沃斯滤波器。
output=flt.bandStopFilterN(input,n,fLow,fHigh,freq_type = "frequency/Hz", zero_phase = True) #N阶带阻巴特沃斯滤波器。
output=flt.lowPassFilter(input,fPass,fStop,ripplePass,rippleStop,freq_type = "frequency/Hz", zero_phase = True) #具有指定纹波的低通巴特沃斯滤波器。
output=flt.highPassFilter(input,fPass,fStop,ripplePass,rippleStop,freq_type = "frequency/Hz", zero_phase = True) #具有指定纹波的高通巴特沃斯滤波器。
output=flt.bandPassFilter(input,fLowPass,fLowStop,fHighPass,fHighStop,ripplePass,rippleStop,freq_type = "frequency/Hz", zero_phase = True) #具有指定纹波的带通巴特沃斯滤波器。
output=flt.bandStopFilter(input,fLowPass,fLowStop,fHighPass,fHighStop,ripplePass,rippleStop,freq_type = "frequency/Hz", zero_phase = True) #具有指定纹波的带阻巴特沃斯滤波器。
- input:一个Audio对象或一个AudioFrames对象。
- n:阶数。
- f、fLow、fHigh:截止频率。
- fPass:通带频率。
- fStop:阻带频率。
- ripplePass:通带波纹。信号在通带中的损耗不超过ripplePass dB。
- rippleStop:阻带波纹。信号在阻带中至少具有rippleStop dB衰减。
- freq_type:“frequency/Hz”[0,sr/2)、“frequency/(rad/s)”[0,sr * π)、“normalized frequency/Hz”[0,1) 或 “normalized frequency/(rad/s)”[0,π)
- zero_phase:使用双向滤波以保持0的相位响应。
返回:
- 如果输入是Audio对象,则为Audio对象。
- 如果输入为AudioFrames对象,则为AudioFrames对象。
算法
import pyAudioKits.algorithm as alg
语音端点检测
关于此部分的细节请参考【基于pyAudioKits的Python音频信号处理(七)】端点检测和语音识别
vad_result = alg.VAD(input,energyThresLow,energyThresHigh,overzeroThres,frameDuration = 0.03,overlapRate=0.5)
基于双门限方法的语音端点检测。
-
input:一个Audio对象。
-
energyThresLow:用于区分沉默和语音的较低能量阈值。
-
energyThresHigh:区分清音和浊音的较高能量阈值。
-
overzeroThres:过零率阈值。
-
frameDuration:一个浮点数用于指定每个帧的持续时间(秒),或一个整数用于指定每个帧的长度(样本点数)。
-
overlapRate:一个[0,1)的浮点数,表示帧的重叠率。
返回:VAD对象。
vad_result.plot(imgPath=None)
可视化VAD的结果。如果给定imgPath,则保存该图形,否则直接显示。蓝色部分是沉默,洋红色部分是清音,橙色部分是浊音。
- imgPath:保存图形的路径。
vad_result.slices()
返回音频中的语音片段。
返回:Audio对象列表。
语音增强
关于此部分的细节请参考【基于pyAudioKits的Python音频信号处理(八)】语音增强:谱减法、维纳滤波和卡尔曼滤波
谱减法
output = alg.specSubstract(input, noise, beta=0.002, frameDuration = 0.03, overlapRate = 0.5, window = None)
使用谱减法降噪。
-
input:信号+噪声的Audio对象。
-
noise:噪声估计的Audio对象。
-
beta:β参数。
-
frameDuration:一个浮点数用于指定每个帧的持续时间(秒),或一个整数用于指定每个帧的长度(样本点数)。
-
overlapRate:一个[0,1)的浮点数,表示帧的重叠率。
-
window:
- 如果是字符串,它是窗口函数的名称(例如,“hann”)。
- 如果是元组,它是窗口函数的名称和任何参数(例如,(“kaiser”,4.0))。
- 如果是数字,它将被视为kaiser窗的β参数。
- 如果是一个函数,它是一个接受整型参数(窗口长度)的函数。
- 如果是列表式的,它是一个预先计算好的长度为Nx的窗口。
返回:过滤后信号的Audio对象。
维纳滤波
output = alg.wienerFilter(observed_signal,desired_signal,h_length=200, frameDuration = 0.03, overlapRate = 0.5, window = None)
使用维纳滤波降噪。
-
observed_signal:信号+噪声的Audio对象。
-
desired_signal:真实信号估计的Audio对象。
-
h_length:阶数。
-
frameDuration:一个浮点数用于指定每个帧的持续时间(秒),或一个整数用于指定每个帧的长度(样本点数)。
-
overlapRate:一个[0,1)的浮点数,表示帧的重叠率。
-
window:
- 如果是字符串,它是窗口函数的名称(例如,“hann”)。
- 如果是元组,它是窗口函数的名称和任何参数(例如,(“kaiser”,4.0))。
- 如果是数字,它将被视为kaiser窗的β参数。
- 如果是一个函数,它是一个接受整型参数(窗口长度)的函数。
- 如果是列表式的,它是一个预先计算好的长度为Nx的窗口。
返回:过滤后信号的Audio对象。
卡尔曼滤波
output = alg.kalmanFilter(input,noise,numIter=7,p=20, frameDuration = 0.05)
使用卡尔曼滤波来降噪。
- input:信号+噪声的Audio对象。
- noise:噪声估计的Audio对象。
- numIter:迭代次数。
- p:阶数。
- frameDuration:一个浮点数用于指定每个帧的持续时间(秒),或一个整数用于指定每个帧的长度(样本点数)。
返回:过滤后信号的Audio对象。
语音识别
关于此部分的细节请参考【基于pyAudioKits的Python音频信号处理(七)】端点检测和语音识别
DTW
distance = alg.dtw(M1, M2)
使用DTW计算两个MFCC特征之间的相似距离。
-
M1:第一个MFCC特征。
-
M2:第二个MFCC特征。
返回:两个MFCC特征之间相似距离。浮点数。
GMM+HMM
gmmhmm_model = alg.GMMHMM(features, labels, n_iter = 10)
构建并训练GMM+HMM模型。
- features:由MFCC特征组成的列表。
- labels:与特征列表中每个MFCC特征对应的标签。
- n_iter:迭代次数。
返回:一个GMMHMM对象。
predicted_labels = gmmhmm_model.predict(features)
使用经过训练的GMM+HMM模型预测测试集上的标签。
- features:由MFCC特征组成的列表。
返回:预测标签的列表。