【基于pyAudioKits的Python音频信号处理(一)】pyAudioKits安装与API速查手册

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,请按照以下流程操作:

  1. 查看自己的Python版本

  2. 该链接下载对应的.whl文件

  3. 将下载好的.whl文件放到python安装路径下的Scripts文件夹中(若直接使用Python)或Anaconda安装路径下的Scripts文件夹中(若使用Anaconda)

  4. 打开命令行,输入命令

    pip install .whl文件的路径+.whl文件名
    #如pip install D:\anacondaLocation\Scripts\PyAudio-0.2.11-cp37-cp37m-win_amd64.whl
    
  5. 继续输入命令

    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×L1,其中 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×L1)的二维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特征组成的列表。

返回:预测标签的列表。

猜你喜欢

转载自blog.csdn.net/weixin_43441742/article/details/126093437