操作步骤整理
- pip install audiomentations
- 官方文档 audiomentations documentation (iver56.github.io)
官网:Core IO and DSP — librosa 0.10.2 documentation
语音信号处理:librosa-CSDN博客
-
-
安装依赖
-
pip install librosa
-
-
加载音频文件
-
ibrosa.load 函数返回的时间序列是一个一维数组,表示音频信号在时间轴上的采样值。在 librosa中,时间轴的方向是沿着数组的第一个轴,即 axis=0。
因此,数组的每个元素代表了时间轴上的一个采样点。 例如,如果采样率为22050Hz,那么每秒会有 22050 个采样点,我们可以将其理解为在时间轴上每隔1/22050秒就采集一次音频信号的值。
因此,如果音频的长度为T秒,那么librosa.load函数返回的时间序列就是一个长度为T×sr的一维数组,其中sr是采样率
读取mp3文件报错“raise NoBackendError()”原因:没有安装ffmpeg包。不能简单使用pip install ffmpeg,因为在anaconda的下的tensorflow环境根本就没用FFmpeg,这样导致无法找到ffdec.py下的指令来调出指令。
解决办法:只需cmd输入一行指令:conda install ffmpeg -c conda-forge
Windows环境需要手工下载ffmpeg 然后设置环境变量
y, sr = librosa.load(librosa.util.example_audio_file())
y.shape
#如果y.shape样式为(2,n)则是立体声,如果是(n,)则是单声道
#如果y.shape样式为(2,n)则是立体声,如果是(n,)则是单声道
-
-
重采样
-
经过测试发现,采样率(target_sr)越高,时间越短,也就是常见的音频快放,音频播放的速度会变快,反之亦然
librosa.resample(y, orig_sr, target_sr, fix=True, scale=False)
orig_sr :y的原始采样率
target_sr :目标采样率
fix:bool,调整重采样信号的长度,使其大小恰好为len(y)/orig_sr*target_sr=t∗target_sr
scale:bool,缩放重新采样的信号,以使y和y_hat具有大约相等的总能量。
代码:
audio_data = '../data/ringing.wav'
data, sr = librosa.load(audio_data)
#慢放
target_sr=16000
y_hat = librosa.resample(data, orig_sr=22050,target_sr=target_sr)
print('原始数据长度:', data.shape)
print('重采样后数据长度:', y_hat.shape)
#保存下来
sf.write('../data/ringing慢放.wav', data,target_sr)
-
-
读取时长
-
就是音频播放的时间长度
librosa.get_duration(y=None, sr=22050, S=None, n_fft=2048, hop_length=512, center=True, filename=None)
例如:duration1 = librosa.get_duration(y=data)
duration2 = librosa.get_duration(y=y_hat, sr=44100);如果采样率不是默认值,则需要填采样率
返回单位s
-
-
读取采样率
-
采样率就是一秒采样多少个数据,一般默认是22050
librosa.get_samplerate(path)
例如:
audio_data = '../data/ringing.wav'
sr = librosa.get_samplerate(audio_data)
print(f'采样率{sr}')
-
-
写文件
-
就是把重新采样或者处理的音频保存为新文件,好像只能保存为wav格式
经过测试 保存的时候,sr必须与实际的sr一致,否则数据失真,比如默认采样率22050,你保存的时候用16000 就会失真
import soundfile as sf
sf.write('../data/output2.wav', data, sr)
- file:保存输出wav文件的路径
- data:音频数据
- samplerate:采样率
代码:
audio_data = '../data/ringing.wav'
data, sr = librosa.load(audio_data)
#慢放
target_sr=16000
y_hat = librosa.resample(data, orig_sr=22050,target_sr=target_sr)
sf.write('../data/ringing慢放.wav', data,target_sr)
-
-
音频图
-
- 音频波形可视化:显示音频信号的时间-振幅图形,帮助理解音频信号的时域特性。
- 数据检查:在分析音频数据时,通过可视化可以直观地检查音频的质量和特征。
- 前处理分析:在应用音频特征提取或其他处理之前,可以查看原始音频信号的波形以便进行预处理。
librosa.display.waveshow(y,*,sr=22050,max_points=11025,x_axis="time",offset=0.0,marker="",where="post",label=None,ax=None,**kwargs,)
y :音频时间序列
sr :y的采样率
x_axis :str {‘time’,‘off’,‘none’}或None,如果为“时间”,则在x轴上给定时间刻度线。
offset:水平偏移(以秒为单位)开始波形图
例如:
import librosa
import librosa.display
import matplotlib.pyplot as plt
audio, sr = librosa.load('../data/ringing.wav', duration=20)
# # 绘制音频波形图
plt.figure(figsize=(10, 6))
librosa.display.waveshow(audio, sr=sr)
plt.title('Waveform')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.show()
plt.savefig('波形图.png')
-
-
过零率
-
描述声音的明亮程度,声音越明亮,过零率越高。因为声音信号是波形,所以过零率越高,表示频率越高。
音频过零率(Zero-Crossing Rate, ZCR)是音频信号处理中一个重要的特征,用于表示信号的频率内容和瞬时变化。它计算了音频信号在给定时间段内穿过零点的次数。具体来说,过零率的作用包括:
1. 语音与非语音区分
- 语音信号通常有较低的过零率,因为语音信号通常是周期性的和连续的。
- 非语音信号(如音乐或噪声)可能有更高的过零率,特别是在信号包含高频成分时。
2. 噪声检测
- 过零率可以用来检测噪声或背景噪声的存在。噪声通常会导致信号在短时间内频繁穿越零点,因此具有较高的过零率。
3. 音频特征提取
- 在音频特征提取中,过零率是一个简单但有用的特征,尤其是在需要捕捉信号的短期变化和粗略频率信息的应用中(如音频分类和音频识别)。
4. 音频分割
- 在音频处理和编辑中,过零率可以帮助分割音频信号,例如在语音活动检测(VAD)中,用于区分静音和语音部分。
5. 音频分析
- 过零率也可以用于音频信号的统计特征分析,例如分析音频信号的频率特性和动态范围。
librosa.zero_crossings(y)
-
-
音频截取
-
就是裁剪音频,指定开始时间和结束时间
import librosa
import numpy as np
import soundfile as sf
query_audio, query_sr = librosa.load('../data/叶丽仪 - 仙鹤情缘.mp3')
##截取音频 截取0-5s
start = 0
duration = 5 #音频时长为5s
stop = start +duration
audio_dst = query_audio[start*query_sr:stop*query_sr]
sf.write('../data/截取.wav', audio_dst, query_sr)
-
-
去除噪音
-
# # # 去除噪音
audio_denoised = librosa.effects.preemphasis(query_audio)
sf.write('../data/audio_denoised.wav', audio_denoised, query_sr)
-
-
改变音调
-
pitch_shifted = librosa.effects.pitch_shift(query_audio, sr=query_sr, n_steps=4)
sf.write('../data/pitch_shifted.wav', pitch_shifted, query_sr)
-
- 声谱图
- 显示频谱图:帮助你看到音频信号在不同频率上的强度分布。
- 分析频谱特征:通过查看频谱图,你可以分析音频信号的频率特征,比如音高、谐波和噪声。
- 时频分析:可用于展示时域和频域的信息,便于分析音频的变化趋势和模式。
# 绘制音频频谱图
plt.figure(figsize=(10, 6))
librosa.display.specshow(librosa.amplitude_to_db(librosa.stft(audio), ref=np.max), y_axis='log', x_axis='time')
plt.colorbar(format='%+2.0f dB')
plt.title('Spectrogram')
# plt.show()
plt.savefig('频谱图.png')
-
-
可视化MFCC特征
-
MFCC(Mel频率倒谱系数)是音频信号处理中的一种常用特征提取方法,主要用于将音频信号转换为可以用于分析和建模的特征。其作用包括:
- 语音识别:MFCC广泛应用于语音识别系统中,通过捕捉音频信号的声音特征来识别语音内容。
- 说话人识别:它用于区分不同的说话人,因为每个人的声音特征都具有独特的MFCC表示。
- 音频分类:在音乐、噪音检测等任务中,MFCC帮助分类和识别不同类型的音频。
- 特征降维:它通过对音频信号进行变换和压缩,减少了数据的维度,同时保留了关键的声音特征。
# 提取MFCC特征
mfccs = librosa.feature.mfcc(y=audio, sr=sr)
# 可视化MFCC特征
plt.figure(figsize=(10, 6))
librosa.display.specshow(mfccs, x_axis='time')
plt.colorbar()
plt.title('MFCC')
plt.xlabel('Time (s)')
plt.ylabel('MFCC Coefficients')
plt.savefig('mfccs.png')
音频相似度
场景描述: 正在构建一个音乐信息检索系统,用户可以通过输入歌曲的音频文件或音频特征来搜索相似的音乐。Librosa可用于提取音频特征并计算相似度。
import librosa import numpy as np # 加载查询音频和数据库中的音频 query_audio, query_sr = librosa.load('../data/ringing.wav') database_audio, database_sr = librosa.load('../data/output1.wav') # 提取MFCC特征 query_mfcc = librosa.feature.mfcc(y=query_audio, sr=query_sr) database_mfcc = librosa.feature.mfcc(y=database_audio, sr=database_sr) mfccs1=np.mean(query_mfcc, axis=1) mfccs2=np.mean(database_mfcc, axis=1) from scipy.spatial.distance import euclidean distance = euclidean(mfccs1, mfccs2) print(f'Euclidean Distance between audio files: {distance}') # 计算余弦相似度 from scipy.spatial.distance import cosine similarity = 1 - cosine(mfccs1, mfccs2) print(f'Cosine Similarity between audio files: {similarity}') |