读取和绘制音频数据
实际的音频信号是复杂的连续波形,为了将其保存成数字化形式,需要对音频信号进行采样并将其转换成数字,例如:语音通常以44100Hz的频率进行采样,这就意味着每秒钟信号被分解成44100份,然后这些抽样被保存。换句话说,每隔$\frac{1}{44100}Hz$就会存储一次,如果采样率高,那么媒体播放音频时会感觉信号是连续的。
import numpy as np import matplotlib.pyplot as plt from scipy.io import wavfile # 读取音频文件 sampling_freq, audio = wavfile.read('input_read.wav') # 打印参数 print('Shape:', audio.shape) # Shape: (132300,) 说明有132300个值 print('数据类型:', audio.dtype) # 数据类型: int16 print('持续时间:', round(audio.shape[0] / float(sampling_freq), 3), 'seconds') # 持续时间: 3.0 seconds audio = audio / np.max(audio) # 归一化 audio = audio[:30] # 提取音频的前30个值 # 建立时间轴 x_values = np.arange(0, len(audio), 1) / float(sampling_freq) x_values *= 1000 # 将单位转化为秒 # 画出声音信号图形 plt.plot(x_values, audio, color='blue') plt.xlabel('Time (ms)') plt.ylabel('Amplitude') plt.title('Audio signal') plt.show()
将音频信号转换为频域
音频信号是不同频率、增幅和相位的正弦波的复杂混合。一个音频信号的本质由其频率内容决定,
import numpy as np from scipy.io import wavfile import matplotlib.pyplot as plt sampling_freq, audio = wavfile.read('input_freq.wav') # 读取文件 audio = audio / np.max(audio) # 归一化,标准化 len_audio = len(audio) # 3251 # 应用傅里叶变换 transformed_signal = np.fft.fft(audio) print(transformed_signal) # [-0.04022912+0.j -0.04068997-0.00052721j -0.03933007-0.00448355j # ... -0.03947908+0.00298096j -0.03933007+0.00448355j -0.04068997+0.00052721j] half_length = int(np.ceil((len_audio + 1) / 2.0)) # np.ceil向上取整(向大的方向取整) transformed_signal = abs(transformed_signal[0:half_length]) print(transformed_signal) # [0.04022912 0.04069339 0.0395848 ... 0.08001755 0.09203427 0.12889393] transformed_signal /= float(len_audio) transformed_signal **= 2 # 提取转换信号的长度 len_ts = len(transformed_signal) # 1626 # 将部分信号乘以2 if len_audio % 2: # 奇数 transformed_signal[1:len_ts] *= 2 else: # 偶数 transformed_signal[1:len_ts-1] *= 2 # 获取功率信号 power = 10 * np.log10(transformed_signal) # 建立时间轴 x_values = np.arange(0, half_length, 1) * (sampling_freq / len_audio) / 1000.0 # 绘制语音信号的 plt.figure() plt.plot(x_values, power, color='blue') plt.xlabel('Freq (in kHz)') plt.ylabel('Power (in dB)') plt.show()
自定义参数生成音频信号
合成音乐
提取频域特征
将信号转换为频域之后,还需要将其转换为有用的形式,梅尔频率倒谱系数(MFCC),MFCC首先计算信号的功率谱,然后用滤波器组和离散余弦变换的组合来提取特征。
参考文献:
《python机器学习经典案例》美Prateek Joshi著
傅里叶变换的介绍:http://www.thefouriertransform.com/
各种音阶及其对应的频率 http://pages.mtu.edu/~suits/notefreqs.html