音频数据的建模全流程代码示例:通过讲话人的声音进行年龄预测

从EDA、音频预处理到特征工程和数据建模的完整源代码演示
大多数人都熟悉如何在图像、文本或表格数据上运行数据科学项目 。 但处理音频数据的样例非常的少见 。 在本文中 , 将介绍如何在机器学习的帮助下准备、探索和分析音频数据 。 简而言之:与其他的形式(例如文本或图像)类似我们需要将音频数据转换为机器可识别的格式 。
音频数据的有趣之处在于您可以将其视为多种不同的模式:
可以提取高级特征并分析表格数据等数据 。 可以计算频率图并分析图像数据等数据 。 可以使用时间敏感模型并分析时间序列数据等数据 。 可以使用语音到文本模型并像文本数据一样分析数据 。 【音频数据的建模全流程代码示例:通过讲话人的声音进行年龄预测】在本文中 , 我们将介绍前三种方法 。 首先看看音频数据的实际样子 。
虽然有多个python库可以处理音频数据 , 但我们推荐使用librosa 。 让我们加载一个MP3文件并绘制它的内容 。
#Importlibrosaimportlibrosa#Loadsmp3filewithaspecificsamplingrate,here16kHzy,sr=librosa.load("c4_sample-1.mp3",sr=16_000)#Plotthesignalstoredin'y'frommatplotlibimportpyplotaspltimportlibrosa.displayplt.figure(figsize=(12,3))plt.title("Audiosignalaswaveform")librosa.display.waveplot(y,sr=sr);音频数据的建模全流程代码示例:通过讲话人的声音进行年龄预测
文章图片
这里看到的是句子的波形表示 。
之前称它为时间序列数据 , 但现在我们称它为波形?当只看这个音频文件的一小部分时 , 这一点变得更加清晰 。 下图显示了与上面相同的内容 , 但这次只有62.5毫秒 。
音频数据的建模全流程代码示例:通过讲话人的声音进行年龄预测
文章图片
我们看到的是一个时间信号 , 它以不同的频率和幅度在值0附近振荡 。 该信号表示气压随时间的变化 , 或扬声器膜(或耳膜)的物理位移.这就是为什么这种对音频数据的描述也称为波形的原因 。
频率是该信号振荡的速度 。 低频例如60Hz可能是低音吉他的声音 , 而鸟儿的歌声可能是8000Hz的更高频率 。 我们人类语言通常介于两者之间 。
要知道这个信号在单位时间内从连续信号中提取并组成离散信号的采样个数 , 我们使用赫兹(Hz)来表示每秒的采样个数 。 16'000或16kHz表示美标采集了16000次 。 我们在上图中可以看到的1'000个时间点代表了62.5毫秒(1000/16000=0.0625)的音频信号 。
虽然之前的可视化可以告诉我们什么时候发生了(即2秒左右似乎有很多波形信号) , 但它不能真正告诉我们它发生的频率 。 因为波形向我们显示了有关时间的信息 , 所以该信号也被称为信号的时域表示 。
可以使用快速傅立叶变换 , 反转这个问题并获得关于存在哪些频率的信息 , 同时丢弃掉关于时间的信息 。 在这种情况下 , 信号表示被称为信号的频域表示 。
让我们看看之前的句子在频域中的表现 。
importscipyimportnumpyasnp#Appliesfastfouriertransformationtothesignalandtakesabsolutevaluesy_freq=np.abs(scipy.FFTpack.fft(y))#Establishesallpossiblefrequency#(dependentonthesamplingrateandthelengthofthesignal)f=np.linspace(0,sr,len(y_freq))#Plotaudiosignalasfrequencyinformation.plt.figure(figsize=(12,3))plt.semilogx(f[:len(f)//2],y_freq[:len(f)//2])plt.xlabel("Frequency(Hz)")plt.show();音频数据的建模全流程代码示例:通过讲话人的声音进行年龄预测
文章图片
可以在此处看到大部分信号在~100到~1000Hz之间(即102到103之间) 。 另外 , 似乎还有一些从1'000到10'000Hz的内容 。
我们并不总是需要决定时域或频域 。 使用频谱图同时表示这两个领域中的信息 , 同时将它们的大部差别保持在最低限度 。 有多种方法可以创建频谱图 , 但在本文中将介绍常见的三种 。