⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我
语音识别--使用YAMNet识别环境音
- 使用YAMNet识别环境音
- 一、任务需求
- 二、任务目标
- 1、学习TF Hub使用
- 2、学习YAMNet网络
- 3、学习tf模型推理
- 三、任务环境
- 1、jupyter开发环境
- 2、python3.6
- 3、tensorflow2.4
- 四、任务实施过程
- 1、导入 TensorFlow 和其他库
- 2、从 TensorFlow Hub 加载 YAMNet
- 3、加载类映射
- 4、运行推理
- 五、任务小结
- 说明
使用YAMNet识别环境音
一、任务需求
YAMNet是一个预训练的深度神经网络,可以从521 个类别中预测音频事件,例如笑声、吠叫或警报声。
YAMNet采用MobileNetV1深度可分离卷积架构。它可以使用音频波形作为输入,并对来自AudioSet语料库的 521 个音频事件中的每一个进行独立预测。
在内部,该模型从音频信号中提取“帧”并批量处理这些帧。此版本的模型使用 0.96 秒长的帧,每 0.48 秒提取一帧。
该模型接受包含任意长度波形的一维 float32 张量或 NumPy 数组,表示为范围内的单通道(单声道)16 kHz 样本[-1.0, +1.0]。本教程包含帮助我们将 WAV 文件转换为支持格式的代码。
该模型返回 3 个输出,包括类分数、嵌入(我们将用于迁移学习)和对数梅尔谱图。
YAMNet 的一个特定用途是作为高级特征提取器 - 1,024 维嵌入输出。我们将使用基础 (YAMNet) 模型的输入特征,并将它们输入由一个隐藏tf.keras.layers.Dense层组成的较浅层模型。然后,我们将使用少量数据训练网络以进行音频分类,而无需大量标记数据和端到端训练。
首先,我们将测试模型并查看对音频进行分类的结果。然后,我们将构建数据预处理管道。
要求:加载并使用 YAMNet 模型进行推理。 使用 YAMNet 嵌入构建一个新模型来对环境音进行分类。 评估并导出您的模型。
二、任务目标
1、学习TF Hub使用
2、学习YAMNet网络
3、学习tf模型推理
三、任务环境
1、jupyter开发环境
2、python3.6
3、tensorflow2.4
四、任务实施过程
1、导入 TensorFlow 和其他库
这里我们要载入tensorflow_io,帮助我们轻松地从磁盘加载音频文件。
import os
from IPython import display
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import tensorflow as tf
import tensorflow_hub as hub
import tensorflow_io as tfio
2、从 TensorFlow Hub 加载 YAMNet
使用来自Tensorflow Hub的预训练 YAMNet 从声音文件中提取嵌入。
从 TensorFlow Hub 加载模型很简单:选择模型,复制其 URL,然后使用load函数。
yamnet_model_handle = 'https://tfhub.dev/google/yamnet/1'
yamnet_model = hub.load(yamnet_model_handle)
当然,这会涉及到网络下载,需要联网,并能顺利访问对应网址。为了避免不稳定的情况发生,我们下载好了模型,存放在/home/jovyan/datas/yamnet
中,然后使用离线方式加载模型,这与上述在线方式并没有什么不同。
yamnet_model_handle = '/home/jovyan/datas/yamnet'
yamnet_model = hub.load(yamnet_model_handle)
加载示例文件
testing_wav_file_name = '/home/jovyan/datas/miaow_16k.wav'
现在我们还需要一个函数来加载音频文件,稍后在处理训练数据时也会用到它。
# 定义函数,加载音频文件,并确保采样率是正确的
@tf.function
def load_wav_16k_mono(filename):
""" 加载一个WAV文件,将其转换为浮点tensor,重新采样到16khz单通道音频 """
file_contents = tf.io.read_file(filename)
wav, sample_rate = tf.audio.decode_wav(
file_contents,
desired_channels=1)
wav = tf.squeeze(wav, axis=-1)
sample_rate = tf.cast(sample_rate, dtype=tf.int64)
wav = tfio.audio.resample(wav, rate_in=sample_rate, rate_out=16000)
return wav
testing_wav_data = load_wav_16k_mono(testing_wav_file_name)
_ = plt.plot(testing_wav_data)
display.Audio(testing_wav_data,rate=16000)
这是我们读取的样本之一,以上展示了声音内容及对应的波形图。
3、加载类映射
加载 YAMNet 能够识别的类名很重要。映射文件yamnet_model.class_map_path()以 CSV 格式存在。
class_map_path = yamnet_model.class_map_path().numpy().decode('utf-8')
class_names =list(pd.read_csv(class_map_path)['display_name'])
for name in class_names[:20]:
print(name)
print('...')
Speech
Child speech, kid speaking
Conversation
Narration, monologue
Babbling
Speech synthesizer
Shout
Bellow
Whoop
Yell
Children shouting
Screaming
Whispering
Laughter
Baby laughter
Giggle
Snicker
Belly laugh
Chuckle, chortle
Crying, sobbing
...
4、运行推理
YAMNet 提供帧级别的类分数(即每帧 521 分)。为了确定剪辑级别的预测,可以跨帧按类别聚合分数(例如,使用平均值或最大聚合)。这是由下面完成的scores_np.mean(axis=0)。最后,要在剪辑级别找到得分最高的类,我们需要取 521 个汇总分数中的最大值。
scores, embeddings, spectrogram = yamnet_model(testing_wav_data)
class_scores = tf.reduce_mean(scores, axis=0)
top_class = tf.argmax(class_scores)
inferred_class = class_names[top_class]
print(f'The main sound is: {inferred_class}')
print(f'The embeddings shape: {embeddings.shape}')
The main sound is: Animal
The embeddings shape: (13, 1024)
五、任务小结
本实验完成学习使用TF Hub预训练模型相关内容,通过本实验我们学习到了加载并使用 YAMNet 模型进行推理相关知识,需要掌握以下知识点:
- tfhub的使用方法
- YAMNet网络的调用方法
- 模型的加载和使用方法
- 模型评估方法
–end–
说明
本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我