Path: blob/master/site/zh-cn/tutorials/audio/simple_audio.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
简单的音频识别:识别关键词
本教程演示了如何预处理 WAV 格式的音频文件,并构建和训练一个基本的自动语音识别 (ASR) 模型来识别十个不同的单词。您将使用 Speech Commands 数据集(Warden,2018 年)的一部分,其中包含命令的短(一秒或更短)音频片段,例如“down”、“go”、“left”、“no”、“right”、“stop”、“up”和“yes”。
现实世界的语音和音频识别系统很复杂。但是,就像使用 MNIST 数据集进行图像分类一样,本教程应该能够使您对所涉及的技术有一个基本的了解。
设置
导入必要的模块和依赖项。您将使用 tf.keras.utils.audio_dataset_from_directory
(在 TensorFlow 2.10 中引入),它有助于从 .wav
文件的目录生成音频分类数据集。在本教程中,您还需要 seaborn 进行呈现。
导入迷你 Speech Commands 数据集
为了节省数据加载时间,您将使用较小版本的 Speech Commands 数据集。原始数据集包含超过 105,000 个音频文件,采用 WAV(波形)音频文件格式,内容是不同的人们说出 35 个不同的单词。此数据由 Google 收集并根据 CC BY 许可发布。
使用 tf.keras.utils.get_file
下载并提取包含较 Speech Commands 数据集的 mini_speech_commands.zip
:
数据集的音频片段存储在与每个语音命令对应的八个文件夹中:no
、yes
、down
、go
、left
、up
、right
和 stop
:
以这种方式划分目录,您可以使用 keras.utils.audio_dataset_from_directory
轻松加载数据。
音频剪辑在 16kHz 时为 1 秒或更短。output_sequence_length=16000
会将短音频剪辑填充到恰好 1 秒(并且会修剪较长的音频剪辑),以便可以轻松地对它们进行批处理。
数据集现在包含批量的音频剪辑和整数标签。音频剪辑的形状为 (batch, samples, channels)
。
此数据集仅包含单声道音频,因此使用 tf.squeeze
函数删除额外的轴:
utils.audio_dataset_from_directory
函数最多只返回两个拆分。将测试集与验证集分开是一个好主意。理想情况下,您会将其保存在单独的目录中,但在这种情况下,您可以使用 Dataset.shard
将验证集拆分成两半。请注意,遍历任何分片将加载所有数据,并且只保留它的片段。
我们来绘制一些音频波形:
将波形转换为频谱图
数据集中的波形在时域中表示。接下来,您将通过计算短时傅里叶变换 (STFT) 将波形从时域信号转换为时频域信号,以将波形转换为频谱图,显示频率随时间的变化,并且可以表示为二维图像。您将把频谱图图像输入您的神经网络以训练模型。
傅里叶变换 (tf.signal.fft
) 会将信号转换为其分量频率,但会丢失所有时间信息。相比之下,STFT (tf.signal.stft
) 会将信号拆分为时间窗口,并在每个窗口上运行傅里叶变换,保留一些时间信息,并返回可以运行标准卷积的二维张量。
创建用于将波形转换为频谱图的效用函数:
这些波形需要具有相同的长度,以便将它们转换为频谱图时,结果具有相似的维度。这可以通过简单地对短于一秒的音频片段进行零填充(使用
tf.zeros
)来完成。调用
tf.signal.stft
时,请选择frame_length
和frame_step
参数,使生成的频谱图“图像”几乎为方形。有关 STFT 参数选择的更多信息,请参阅有关音频信号处理和 STFT 的 Coursera 视频。STFT 会产生表示幅度和相位的复数数组。但是,在本教程中,您将只使用幅度,您可以通过在 tf.signal.stft 的输出上应用
tf.abs
来获得该tf.signal.stft
。
接下来,开始探索数据。打印一个样本的张量波形形状和相应的频谱图,并播放原始音频:
现在,定义一个显示频谱图的函数:
绘制样本随时间变化的波形和相应的频谱图(随时间变化的频率):
接下来,从音频数据集创建频谱图数据集:
检查数据集不同样本的频谱图:
构建并训练模型
添加 Dataset.cache
和 Dataset.prefetch
运算以减少训练模型时的读取延迟:
对于模型,您将使用简单的卷积神经网络 (CNN),因为您已将音频文件转换为频谱图图像。
您的 tf.keras.Sequential
模型将使用以下 Keras 预处理层:
tf.keras.layers.Resizing
:对输入进行下采样以使模型训练得更快。tf.keras.layers.Normalization
:根据图像的均值和标准差对图像中的每个像素进行归一化。
对于 Normalization
层,首先需要在训练数据上调用其 adapt
方法,以计算聚合统计数据(即均值和标准差)。
使用 Adam 优化器和交叉熵损失配置 Keras 模型:
出于演示目的,将模型训练超过 10 个周期:
我们来绘制训练和验证损失曲线,以检查您的模型在训练期间的改进情况:
评估模型性能
在测试集上运行模型并检查模型的性能:
显示混淆矩阵
使用混淆矩阵检查模型对测试集中每个命令的分类效果:
对音频文件运行推断
最后,使用某人说“no”的输入音频文件验证模型的预测输出。您的模型表现如何?
如输出所示,您的模型应该已将音频命令识别为“no”。
通过预处理导出模型
如果您必须在将数据传递给模型进行推断之前应用这些预处理步骤,该模型不是很易于使用。因此,构建一个端到端的版本:
测试运行“导出”模型:
保存并重新加载模型,重新加载的模型给出了相同的输出:
后续步骤
本教程演示了如何使用带有 TensorFlow 和 Python 的卷积神经网络执行简单的音频分类/自动语音识别。要了解更多信息,请考虑以下资源:
使用 YAMNet 进行声音分类教程展示了如何使用迁移学习进行音频分类。
来自 Kaggle 的 TensorFlow 语音识别挑战的笔记本。
TensorFlow.js - 使用迁移学习的音频识别代码实验室教授如何构建您自己的交互式 Web 应用以进行音频分类。
arXiv 上的音乐信息检索深度学习教程(Choi 等人,2017 年)。
TensorFlow 还为音频数据准备和增强提供额外支持,以帮助您完成基于音频的项目。
考虑使用 librosa 库进行音乐和音频分析。