语音信号处理

python语音信号处理库

import librosa //音频处理

import librosa.display //信号画图

import soundfile //读取和写入音频文件

语音信号处理会用到的相关函数

eg:  data,fs = librosa.load(file_wav,sr=None,mono=False)

sr用于指定数据的音频采样率,mono=false表示单声道,=true表示为双声道。输出结果data为包含音频数据的numpy数组,fs为音频采样率(sr)

eg:

librosa.display.waveshow(data3, sr=fs3, ax=ax2, offset=2):

这一行代码使用Librosa库中的waveshow函数来显示音频波形。data3是音频数据,fs3是采样率,ax=ax2表示将图形显示在之前创建的子图ax2中,offset=2表示在x轴上偏移2秒的位置开始显示波形。

eg:yt, index = librosa.effects.trim(y,top_db=30)

  • y是输入的音频信号。
  • top_db=30指定了一个阈值,表示在裁剪时保留的最小分贝数。在这种情况下,只有高于-30分贝的部分会被保留,低于-30分贝的部分会被裁剪掉。
  • yt是裁剪后的音频信号。
  • index是一个包含裁剪后音频信号的起始和结束索引的元组。

eg:axs[0].vlines(index[0]/fs,-0.5,0.5,colors='r')

  • axs[0]表示要在第一个子图中进行绘制。
  • vlines函数用于在指定的x坐标位置绘制垂直线。
  • index[0]/fs表示要绘制的垂直线的x坐标位置,其中index[0]是裁剪后音频信号的起始索引,fs是采样率。
  • -0.50.5表示垂直线的y坐标范围。
  • colors='r'表示线的颜色为红色。

eg:y_remix = librosa.effects.remix(y,intervals)

  • y是输入的音频信号。
  • intervals是一个包含了要重新排列的音频片段的时间间隔的列表或数组。

effects.remix函数的作用是按照提供的时间间隔列表,重新排列输入的音频信号中的片段,生成一个重新排列后的音频信号y_remix

eg:fig,axs = plt.subplots(nrows=2,ncols=1,sharex=True, sharey=True)

  • nrows=2表示要创建2行的子图网格。
  • ncols=1表示要创建1列的子图网格。
  • sharex=True表示子图应该共享相同的x轴刻度。
  • sharey=True表示子图应该共享相同的y轴刻度。

eg:

n_fft = int(2**np.ceil(np.log2(win_length)))  

  • win_length是窗口的长度。
  • np.log2(win_length)计算窗口长度的以2为底的对数。
  • np.ceil()函数将对数结果向上取整,确保得到的是一个整数。
  • 2**表示对结果进行2的幂运算,即将对数结果转换为2的幂次方。

这行代码的作用是计算一个用于傅立叶变换的最接近且大于等于窗口长度的2的幂次方值,并将其存储在n_fft变量中。这个值通常用于傅立叶变换相关的操作,例如短时傅立叶变换(STFT)。

eg:

S = librosa.amplitude_to_db(S,ref=np.max) 

这行代码使用了Librosa库中的amplitude_to_db函数,将幅度谱(S)转换为分贝表示,并以最大幅度为参考。

  • S是输入的幅度谱数据。
  • ref=np.max表示将幅度谱的参考值设定为幅度谱中的最大值。

因此,这行代码的作用是将输入的幅度谱数据转换为以分贝(dB)为单位的表示,并以幅度谱中的最大值作为参考值。这种转换通常用于音频信号处理中,以便更直观地表示信号的幅度变化。

s=librosa.amplitude_to_db(s,ref=np.max)
d,n=s.shape
range_d=np.arange(0,d,20)
range_n=np.arange(0,n,20)
range_t=range_n*(hop_length/fs)
range_f=range_d*(fs/n_fft/1000)  

  • s=librosa.amplitude_to_db(s,ref=np.max):这行代码将幅度谱数据S转换为以分贝为单位的表示,并以幅度谱中的最大值作为参考值,结果存储在s中。

  • d, n = s.shape:这行代码获取了转换后的幅度谱s的形状,其中d表示频率的维度,n表示时间的维度。

  • range_d = np.arange(0, d, 20):这行代码创建了一个频率轴的取样范围,从0开始,每隔20个频率点取样,用于后续分析。

  • range_n = np.arange(0, n, 20):这行代码创建了一个时间轴的取样范围,从0开始,每隔20个时间点取样,用于后续分析。

  • range_t = range_n * (hop_length / fs):这行代码计算了时间轴上每个取样点对应的时间值,其中hop_length表示帧移,fs表示采样率。

  • range_f = range_d * (fs / n_fft / 1000):这行代码计算了频率轴上每个取样点对应的频率值,其中fs表示采样率,n_fft表示FFT窗口的大小。这里将结果除以1000是为了将频率转换为kHz。

eg:

  • plt.xticks(range_N, range_t)

  • 这行代码将时间轴上的刻度设置为range_t中的值。range_t是之前计算得到的时间轴取样范围,range_N应该是时间轴上对应的刻度位置。这样做可以确保时间轴上的刻度对应正确的时间值。

  • plt.yticks(range_D, range_f):这行代码将频率轴上的刻度设置为range_f中的值。range_f是之前计算得到的频率轴取样范围,range_D应该是频率轴上对应的刻度位置。这样做可以确保频率轴上的刻度对应正确的频率值。

eg:plt.imshow(s,origin='lower',cmap='hot') 

  • s是要显示的二维数组,通常是表示音频信号的幅度谱或者频谱图。

  • origin='lower'指定了图像的原点位置在左下角,这通常是频谱图的常见表示方式。

  • cmap='hot'指定了使用热图(hot colormap)来表示数据的数值大小,热图在低值处呈现蓝色,高值处呈现红色,用于显示数据的变化和强度。

eg:

librosa.effects.preemphasis(y) 

函数用于对音频信号进行预加重处理。预加重是一种信号处理技术,旨在提高语音信号的信噪比,使得语音在传输和处理过程中更容易被识别和理解。

在预加重过程中,高频部分的幅度会被增强,而低频部分的幅度会被减弱。这有助于减少语音信号在传输过程中受到的干扰,并且有助于提高语音信号的清晰度。

在这里,y是输入的音频信号。y_filt是经过预加重处理后的音频信号。通过应用预加重,可以改善音频信号的质量,使得后续的音频处理和分析更加准确和有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值