在物联网平台上使用这个解决方案可以让你在很多领域中开发出智能解决方案
简介有很多不同的项目和服务能够识别人类的语音,例如 Pocketsphinx,Google』s Speech API,还有很多其他的。这些应用和服务能够以相当好的性能将人类的语音识别成文本,但是它们中间却没有一个能够分得清麦克风捕捉到的是哪一种声音:人声,动物声音或者音乐演奏声?
大家面临这个任务的时候,就决定去调研一下,并开发一个能够使用机器学习算法来区分声音的示例项目。这篇文章具体描述了大家选择哪款工具、大家面临的挑战是什么、大家如何为 TensorFlow 训练模型,以及如何运行大家的开源项目。为了把它们用在给第三方应用提供的云服务上,大家还在 DeviceHive 和 IoT 平台上提供了识别结果。
选择工具和分类模型首先大家需要选择一些能够运行神经网络的软件。大家发现的第一个合适的解决方案是 Python Audio Analysis。
机器学习中的主要问题是要有一个好的训练数据集。对于音乐分类和语音识别而言,有很多数据集,但是并没有多少数据集是用来做随机声音分类的。经过研究之,大家发现了 urban sound dataset(https://serv.cusp.nyu.edu/projects/urbansounddataset/)这个数据集。
经过一些测试之后,大家面临着以下问题:
pyAudioAnalysis 不够灵活。它不能得到多种参数,并且一些参数的计算是不受控制的,例如,训练实验的数量是基于样本数量的,你不能通过 pyAudioAnalysis 改变它。
这个数据集只有 10 个种类,而且它们都是「urban」种类。
大家发现的另一个解决方案是 Google AudioSet(https://research.google.com/audioset/index.html)。它是基于有标签的 YouTube 视频片段,可以以两种格式下载:
每一个视频片段都有 CSV 文件描述,包括 YouTube 视频 ID,起始时间和结束时间,以及一个或多个标签。
提取出的音频特征以 TF Record 文件的形式被存储。
这些特征和 YouTube-8M 模型是兼容的。这个解决方案也提供了 TensorFlow VGGish 模型作为特征提取器。它满足了大家的额大部分需求,因此也就成为了大家的最佳选择。
训练模型下一个任务就是了解 YouTube-8M 接口是如何运行的。它是被设计来处理视频的,但是幸运的是它也能够处理音频。这个库是相当方便的,但是它有固定的样本类别数。所以大家对它进行了小小的修改,便于将类别数作为参数传入。
YouTube-8M 能够处理两种类型的数据:总体特征和帧特征。Google AudioSet 能够将大家之前提到的数据作为特征。通过研究自后大家发现那些特征是以帧的格式给出的。接下来,大家需要选择要被训练的模型。
资源、时间和精度GPU 比 CPU 更适合做机器学习。你可以在这里看到更多的相关信息(https://docs.devicehive.com/blog/using-gpus-for-training-tensorflow-models)。所以大家跳过这个过程直接开始实验设置。大家在实验中使用的是一台装有 4GB 显存的 NVIDIA GTX 970。
在大家的这种情形下,训练时间并不十分重要。应该提一下,用 1 到 2 小时足以做出关于所选模型和精度的判断。
当然,大家想尽可能得到较好的精度。但是,为了训练出一个更复杂的模型(有潜力得到更好的准确率),你需要更大的 RAM(当然对于 GPU 而言就是显存了)。
选择模型这里是具有细节描述的可以使用的 YouTube-8M 模型完全列表(https://github.com/google/youtube-8m#overview-of-models)。因为大家的训练数据是以帧为格式的,所以必须使用帧级别的模型。Google AudioSet 数据集为大家提供的数据被分成了三部分:均衡的训练集,不均衡的训练集以及评估集。你可以在这里获得更多信息(https://research.google.com/audioset/download.html)。
还有一个修正版的用于训练和评估的 YouTube-8M 模型。在这里可以获得:(https://github.com/igor-panteleev/youtube-8m)
均衡的训练集
训练命令如下:
python train.py –train_data_pattern=/path_to_data/audioset_v1_embeddings/bal_train/*.tfrecord –num_epochs=100 –learning_rate_decay_examples=400000 –feature_names=audio_embedding –feature_sizes=128 –frame_features –batch_size=512 –num_classes=527 –train_dir=/path_to_logs –model=ModelName*
按照文档的建议,大家将 LSTM 模型的基础学习率改为 0.001. 此外,大家还将 LSTM 单元的大小改为 256,因为大家没有足够大的 RAM。
现在大家看一下训练结果:
模型名 训练时间 最后一次迭代的准确率 平均准确率
Logistic 14m 3s 0.58590 0.5560
Dbof 31m46s 1.000 0.5220
LSTM 45m53s 0.9883 0.4581
如上所示,大家在训练的时候得到了较好的结果–但是这并不意味着大家会在测试的时候也得到同样好的结果。
不均衡训练
让大家来试一下一个不均衡的数据集吧。它有更多的样本,所以大家将 epochs 的数目改为 10(最小应该改成 5,因为训练起来会耗费很多的时间)。
模型名 训练时间 最后一次迭代的准确率 平均准确率
Logistic 2h4m14s 0.875500.5560 0.5125
Dbof 4h39m29s 0.8848 0.5605
LSTM 9h42m52s 0.8691 0.5396
训练日志如果你想核查大家的训练日志,你可以在这里下载到 (https://s3.amazonaws.com/audioanalysis/train_logs.tar.gz)。然后运行
tensorboard *–logdir /path_to_train_logs/
然后在浏览器中打开主机 6006 端口就可以看到了。
关于训练的更多内容YouTube-8M 采用了很多参数,大部分都会影响训练过程。
例如:你可以调节学习率或者 epochs 的数量,这两个参数能够很明显的改变训练过程。也有 3 个用来计算损失的函数,以及很多其他有用的变量,你可以改变它们来提升结果。
在音频采集设备上使用训练好的模型现在大家已经有了一些训练好的模型了,是时候添加一些代码与它们交互了。
采集音频的麦克风大家需要从麦克风采集音频。这里大家使用 PyAudio。它提供了可以在很多平台上都能很好运行的简单接口。
声音准备正如大家之前所提及的,大家要使用 TensorFlow 的 VGGish 模型作为特征提取器。这里是转换过程的一个简短解释:
用 UrbanSound 数据集中「犬吠」样例来作为可视化的例子。
使用 25ms 的帧长,10ms 的帧移,以及周期为 25ms 的汉明窗对语音进行分帧,对每一帧做短时傅里叶变换,然后利用信号幅值计算省谱图。
映射到 64 阶 mel 滤波器组中计算 mel 声谱。
计算 log(mel-spectrum + 0.01),得到稳定的 mel 声谱,所加的 0.01 的偏置是为了避免对 0 取对数。
这些 然后被以 0.96s(这段「犬吠」声的总时长)的时长被组帧,并且没有帧的重叠,每一帧都包含 64 个 mel 频带,96 帧都是每帧时长 10ms。
这些样本然后就被输入到 VGGish 模型中去提取特征向量。
分类最后大家需要一个能够把数据输入到神经网络的接口,以得到分类结果。
大家会使用 YouTube-8M 作为一个例子,但是会做一些修改,去掉 serialization/deserialization 步骤。
在这里你可以看到大家的结果(https://github.com/devicehive/devicehive-audio-analysis),大家仔细看看吧。
安装PyAudio 使用 libportaudio2 和 portaudio19-dev,所以在安装 PyAudio 之前需要先安装这两个工具。
还需要一些 python 库,你可以使用 pip 来安装它们。
pip install -r requirements.txt
你还需要下载并提取具有保存好的模型的项目主目录。你可以在这里找到(https://s3.amazonaws.com/audioanalysis/models.tar.gz)。
运行
大家的项目提供了 3 个可供使用的接口。
1. 处理录制好的音频文件
仅仅需要运行下面的命令就好
python parse_file.py path_to_your_file.wav
然后你就会在终端中看到以下信息:语音:0.75;音乐:0.12;在大厅里面:0.03
这个结果由输入的文件决定。这些值是神经网络做出的预测。数值越大,则说明输入文件中的音频属于该类别的概率比较大。
2. 从麦克风中捕捉并处理数据
运行python capture.py开始从麦克风中无限地采集数据。默认配置下,它会没 5-7s 将数据输入到神经网络。你可以在之前的例子中看到结果。
在这个情况下,你可以使用参数–save_path=/path_to_samples_dir/运行上面的命令,然后所有采集到的数据都会以 wav 文件的格式存储在你提供的路径中。你想用同样的样本尝试不同的模型时,这个函数是很有用的。你可以使用-help 来获取更多的信息。
3.web 接口
python daemon.py实现了一个简单的 web 接口,默认配置下在本地的 8000 端口(http://127.0.0.1:8000/)。然后大家使用之前例子中提到的同样的代码。你可以看到对声音时间的最 10 次预测(http://127.0.0.1:8000/events):
IOT 服务集成最后一个,但是也是比较重要的一个:集成在 IOT 设施中。如果你运行了大家前面提到的 web 接口,你可以在页面上看到 DeviceHive 客户状态和配置。只要客户端已经连接成功了,预测结果会以通知的形式发送到特定的设备上。
结论正如你所看到的,tensorflow 是一款非常灵活的工具,在很多机器学习应用中都很有用,例如图像处理和语音识别。将这个方法个物联网平台结合起来可以让你在很多领域去建立智能解决方案。
智慧城市可以将这个解决方案用于安全目的,可以持续地监听玻璃破碎声、枪声以及其他与犯罪相关的声音。甚至在雨林中,可以用这个方法通过分析它们的声音来跟踪动物和鸟类。
物联网设备可以收到所有的这种通知。这个解决方案可以暗转在本地设备上以最小化通信和云成本(尽管也可以部署在云端作为一种云服务),并且可被定制成只接收除包含原始音频之外的信息。别忘了,这是一个开源的项目,随意使用吧。
css3 放大缩小动画,css valign top,css中laber标签,css中的黑色代码,css入门到精通 pdf,css正方形怎么实现,css3画3d六面33d开关