机器学习如何用于音频分析?

机器学习如何用于音频分析?

一、说明

近十年来,机器学习越来越受欢迎。事实上,它被用于医疗保健、农业和制造业等众多行业。随着技术和计算能力的进步,机器学习有很多潜在的应用正在被创造出来。由于数据以多种格式大量可用,因此现在是使用机器学习和数据科学从数据中提取各种见解并使用它们进行预测的合适时机。

机器学习最有趣的应用之一是音频分析和分别了解不同音频格式的质量。因此,使用各种机器学习和深度学习算法可确保使用音频数据创建和理解预测。
在这里插入图片描述
照片由 Med Badr Chemmaoui on Unsplash

二、机器学习处理音频

在进行音频分析之前,必须单独采集和分析信号样本。我们取样的速率也称为采样率或奈奎斯特率。将时域信号转换为频域信号,以便对信号有很好的逻辑理解,同时计算有用的分量,如功率和能量,这将非常方便。所有这些都可以作为我们的机器学习模型的特征,这些模型将使用它们进行预测。

音频信号通常可以转换为频谱图(图像),以便将其提供给卷积神经网络 (CNN) 进行预测。频谱图可以捕获音频信号的重要特征并给出 2D 表示,因此可以与基于图像的网络一起使用。

如果给它们一个图像,有很多 ML 模型可以很好地预测输出标签。因此,由振幅和不同频率单位组成的音频信号也可以转换为图像并用于稳健的 ML 预测。

在本文中,我们将通过考虑一个随机示例并绘制它来理解其图形表示,从而介绍如何读取音频文件。稍后,我们将使用图像数据执行特征工程,并在音频转换为图像时执行卷积运算。最后,我们将获得未见过数据的样本预测。请注意,此代码用于演示,不考虑特定的数据集。

读取数据

import matplotlib.pyplot as plt
import numpy as np
from scipy.io.wavefile import read# Read in the audio file
sample_rate, audio_data = read('audio_file.wav')# Convert the audio data to a numpy array
audio_data = np.array(audio_data)# Get the length of the audio data
length = audio_data.shape[0] / sample_rate# Create a time axis
time = np.linspace(0., length, audio_data.shape[0])# Plot the audio data
plt.plot(time, audio_data)
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.show()

我们将导入必要的库,这些库用于以主要以 ‘.wav’ 格式的形式读取音频文件。读取文件后,我们将得到一个数组表示形式,如上面的代码单元所示。最后,我们将绘制输出,只是为了看看它在 matplotlib 中的外观。

特征工程

import librosa# Calculate the short-term Fourier transform (STFT) of the audio data
stft = librosa.stft(audio_data)# Extract the magnitude and phase of the STFT
magnitude, phase = librosa.magphase(stft)# Calculate the mel-scaled spectrogram of the audio data
mel_spec = librosa.feature.melspectrogram(audio_data, sr=sample_rate)# Extract the Mel-frequency cepstral coefficients (MFCCs) from the mel-scaled spectrogram
mfccs = librosa.feature.mfcc(S=librosa.power_to_db(mel_spec), n_mfcc=20)# Transpose the MFCCs so that each row represents a time frame and each column represents a coefficient
mfccs = mfccs.T

现在,数据已经绘制和可视化以查看 ‘.wav’ 文件中的异常情况,我们现在将使用一个名为 ‘librosa’ 的流行库,该库可用于计算音频数据的短期傅里叶变换。这是为了确保信号被分解成其组成频率,是一种在大量行业中广泛使用的技术。

训练模型

# Convert the audio data to a spectrogram
X = compute_spectrogram(X)# Split data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)# Build machine learning model
# In this case, let's use a random forest classifier with 100 trees
model = RandomForestClassifier(n_estimators = 100)# Train model on training data
model.fit(X_train, y_train)# Evaluate model on test data
accuracy = model.score(X_test, y_test)
print("Test accuracy:", accuracy)

现在我们已经使用 ‘librosa’ 来获取频率分量,我们将使用机器学习模型进行预测。需要注意的是,这是一个分类问题,因此,我们继续使用随机森林分类器。但是,请随意使用适合您的需求和业务的任何其他机器学习模型。

我们现在将使用相同的代码,但用于输出是连续而不是离散的回归任务。下面是有关如何在随机森林回归器的帮助下进行训练和监控性能的编码单元。

# Convert the audio data to a spectrogram
X = compute_spectrogram(X)# Split data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)# Build machine learning model
# In this case, let's use a random forest regressor with 100 trees
model = RandomForestRegressor(n_estimators = 100)# Train model on training data
model.fit(X_train, y_train)# Evaluate model on test data
accuracy = model.score(X_test, y_test)
print("Test accuracy:", accuracy)

超参数优化
在实时部署模型 (Random Forest) 之前,确定模型 (Random Forest) 的正确超参数非常重要。当涉及到深度神经网络时,有很多超参数需要搜索。由于我们使用随机森林作为基准模型,因此我们应该能够在最小的搜索空间中获得正确的超参数。让我们看看如何在常规数据集上执行超参数优化。

# Define hyperparameters to tune
param_grid = {'max_depth': [2, 4, 6, 8], 'min_samples_split': [2, 4, 6, 8]}# Create a grid search object with 5-fold cross-validation
grid_search = GridSearchCV(model, param_grid, cv=5)# Fit the grid search object to the training data
grid_search.fit(X_train, y_train)# Print the best hyperparameters and score
print("Best hyperparameters:", grid_search.best_params_)
print("Best cross-validation score:", grid_search.best_score_)# Evaluate the model on the test data
best_model = grid_search.best_estimator_
accuracy = best_model.score(X_test, y_test)
print("Test accuracy:", accuracy)

在代码单元中,我们指定估计器的数量和我们搜索的树的最大深度,以便在测试集上获得最佳结果。最后,我们监控分数,看看超参数的变化如何使模型获得更好的性能。

模型部署

import pickle# Save the model to a file
with open('model.pkl', 'wb') as f:pickle.dump(model, f)# Load the model from a file
with open('model.pkl', 'rb') as f:model = pickle.load(f)# Use the model to make predictions on new data
predictions = model.predict(new_data)

现在,我们已经执行了超参数优化以给出最准确的预测,是时候保存提供最佳结果的机器学习模型了。因此,我们将在 python 中使用 pickle 库,这样我们就可以自由地保存机器学习模型,以便以后用于服务。

保存模型后,我们将在构建生产就绪代码时再次加载它,并使用它来预测传入的批次或数据流。需要注意的是,在训练数据期间用于执行特征化的步骤集也必须在测试集上执行,以便数据中没有偏斜。

三、持续监控

我们知道,该模型在接收来自用户的传入数据的地方提供数据方面表现良好,这也是一个重要但被忽视的步骤,即监控模型的预测质量。通常,模型可能无法像训练期间那样执行。这可能是因为训练数据和服务数据之间存在差异。例如,可能存在概念漂移或数据漂移等情况,这些情况可能会对投入生产的推理模型的性能产生重大影响。

持续监控可确保采取措施检查预测模型并了解它们在变化数据中的行为。如果预测最不准确,并且导致企业收入损失,则应采取措施再次使用这些偏差数据训练模型,以便模型的行为不会发生意外变化。

四、结论

阅读本文后,您可能已经对如何对音频数据执行机器学习并了解整个工作流程有了很好的了解。我们已经看到了读取数据、特征工程、训练模型、超参数调整、模型部署以及持续监控等步骤。应用这些步骤中的每一个并确保在开发管道时没有错误,这将导致一个强大的机器学习生产系统。

以下是您可以联系我或查看我的作品的方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/418136.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM系列(十) -垃圾收集器介绍

一、摘要 在之前的几篇文章中,我们介绍了 JVM 内部布局、对象的创建过程、运行期的相关优化手段以及垃圾对象的回收算法等相关知识。 今天通过这篇文章,结合之前的知识,我们一起来了解一下 JVM 中的垃圾收集器。 二、垃圾收集器 如果说收集算法是内存回收的方法论,那么…

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 - 通过aclnn调用的方式调用AddCustom算子

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 通过aclnn调用的方式调用 - AddCustom算子 - 单算子API执行(aclnn) 多种算子调用方式 *开发时间使用场景调用方式运行硬件基于Kernel直调工程(快速)少单算子调用,快速验证算法逻辑IC…

Kafka【十二】消费者拉取主题分区的分配策略

【1】消费者组、leader和follower 消费者想要拉取主题分区的数据,首先必须要加入到一个组中。 但是一个组中有多个消费者的话,那么每一个消费者该如何消费呢,是不是像图中一样的消费策略呢?如果是的话,那假设消费者组…

C语言-程序环境 #预处理 #编译 #汇编 #链接 #执行环境

文章目录 前言 一、程序的环境翻译和执行环境 二、翻译环境 (一)、整体把握 (一)、编译 1、预处理(预编译) 2、编译 a、词法分析 b、语法分析 c、语义分析 d、符号汇总 3、汇编 (二)、链接 三、运行环境 总结​​​​​​​ 前言 路漫漫其修远兮,吾将…

9月7日微语报,星期六,农历八月初五

9月7日微语报,星期六,农历八月初五,周末愉快! 一份微语报,众览天下事! 1、21个部门:符合条件的流动儿童家庭或可配公租房。 2、多所高校2025年招生简章显示&#xff0…

API安全 | 发现API的5个小tips

在安全测试目标时,最有趣的测试部分是它的 API。API 是动态的,它们比应用程序的其他部分更新得更频繁,并且负责许多后端繁重的工作。在现代应用程序中,我们通常会看到 REST API,但也会看到其他形式,例如 Gr…

Jenkins构建CI/CD

CI/CD 软件开发的连续方法基于自动执行脚本,以最大限度地减少在开发应用程序时引入错误的可能性。从新代码的开发到部署,它们需要较少的人为干预甚至根本不需要干预。 它涉及在每次小迭代中不断构建,测试和部署代码更改,从而减少…

对极约束及其性质 —— 公式详细推导

Title: 对极约束及其性质 —— 公式详细推导 文章目录 前言1. 对极约束 (Epipolar Constraint)2. 坐标转换 (Coordinate Transformations)3. 像素坐标 (Pixel Coordinates)4. 像素坐标转换 (Transformations of Pixel Coordinates)5. 本质矩阵 (Essential Matrix)6. 线坐标 (Co…

单调栈的实现

这是C算法基础-数据结构专栏的第二十四篇文章,专栏详情请见此处。 引入 单调栈就是满足单调性的栈结构,它最经典的应用就是给定一个序列,找出每个数左边离它最近的比它大/小的数。 下面我们就来讲单调栈的实现。 定义 单调栈就是满足单调性…

pycharm破解教程

下载pycharm https://www.jetbrains.com/pycharm/download/other.html 破解网站 https://hardbin.com/ipfs/bafybeih65no5dklpqfe346wyeiak6wzemv5d7z2ya7nssdgwdz4xrmdu6i/ 点击下载破解程序 安装pycharm 自己选择安装路径 安装完成后运行破解程序 等到Done图标出现 选择Ac…

精准设计与高效开发:用六西格玛设计DFSS实现新能源汽车开发突破

快速变化的市场需求和激烈的竞争迫使制造企业不得不持续创新和优化产品开发流程。如何在保证产品质量的前提下,加快产品开发周期,成为许多企业亟待解决的问题。六西格玛中的DFSS(Design for Six Sigma)模型提供了一种系统的方法&a…

【银河麒麟高级服务器操作系统实例】虚拟化平台系统服务中断现象分析及处理建议

服务器环境以及配置 【机型】虚机 处理器: Kunpeng-920 内存: 40G 【内核版本】 4.19.90-23.8.v2101.ky10.aarch64 【OS镜像版本】 银河麒麟操作系统 Kylin-Server-10-SP1-Release-Build20-20210518-arm64 【第三方软件】 智能运维系统、mysq…

5G移动网络运维实验(训)室解决方案

随着第五代移动通信技术(5G)的快速普及和工业互联网的迅猛发展,全球制造业正面临着前所未有的深刻变革。5G技术凭借其超高的传输速率、极低的延迟以及大规模的连接能力,为工业自动化、智能制造等领域带来了革命性的技术支持。为了…

Vatee万腾平台:赋能企业,共筑智慧经济新高地

在智慧经济时代的大潮中,企业如何把握机遇,实现转型升级,成为行业内的佼佼者?Vatee万腾平台以其卓越的技术实力、前瞻性的战略眼光和全方位的服务体系,正逐步成为企业数字化转型的坚实后盾,赋能企业&#x…

软考真题之软件设计师的程序语言设计题型(上午题)

目录 编程程序和解释程序 相关习题 函数 编译,解释和翻译阶段 符号表 ​编辑 相关习题 ​编辑 词法分析 语法分析 语义分析 目标代码生成 相关习题 中间代码生成 正规式 相关习题 有限自动机 相关习题 上下文无关文法 相关习题 比较偏的真题 编程程序和解…

Python OpenCV 影像处理:傅立叶转换

►前言 上篇介绍基于计算影像的梯度,通过在影像中找到梯度值的变化来识别边缘。 本篇将介绍傅立叶变换的基本原理,了解傅立叶变换是如何将影像从空间域转换到频率域的,以及为什么这种转换在影像处理过程中是有用的。以及傅立叶变换的实际应…

微服务日常总结

1.当我们在开发中,需要连接多个库时,可以在yml中进行配置。 当在查询的时候,跨库时,需要通过DS 注解来指定,需要yml配置需要保持一致。 2. 当我们想把数据存入到clob类型中,需要再字段 的占位符后面加上j…

微服务--Nacos

一、Nacos简介 Nacos(Naming and Configuration Service)是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它致力于帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos支持几乎所有主流类型的服…

AFSim 仿真系统----性能工具

什么是 WPR/WPA? Windows 性能记录器 (WPR) 和 Windows 性能分析器 (WPA) 是 Windows 性能工具包中提供的性能监控工具。它们是免费的工具,可以通过下载和安装 Windows 评估和部署工具包 (ADK) 来获得。 WPR 是一个工具,允许用户动态部署事…

【LeetCode】09.回文数

题目要求 解题思路 主要是提防越界问题 代码实现 class Solution { public:bool isPalindrome(int x) {//处理边界if(x<0) return false;long tempx,ret0;while(temp){retret*10temp%10;temp/10;}return xret;} };