关键词识别神经网络

    具体的软硬件实现点击 MCU-AI技术网页_MCU-AI人工智能

关键词识别 (KWS) 是人机界面的主要组成部分。 KWS 的目标是在低误报 (FA) 率下最大化检测精 度,同时最小化占用空间大小、延迟和复杂性。为 了实现这些目标,我们研究了卷积循环神经网络 (CRNN)。受到大规模最先进语音识别系统的启发, 我们结合了卷积层和循环层的优势来利用局部结构 和远程上下文。我们分析了架构参数的影响,并提 出了提高性能的训练策略。我们的 CRNN 模型仅使 用约 230k 参数,即可产生可接受的低延迟,并在 0.5 FA/小时、5 dB 信噪比下实现 97.71% 的准确 度。

受人类彼此交互最常见方式的推动,对话式人 机界面在众多应用中变得越来越流行。高性能 语音到文本转换和文本到语音转换构成了此类 接口的两个重要方面,因为大多数计算算法都 是针对文本输入和输出而开发的。会话界面的 另一个重要方面是关键字识别(KWS)M也 称为唤醒词检测,以根据用户提供的语音输入 实现不同计算状态之间的转换。 KWS 系统旨在 从连续的音频流中检测特定的关键字。由于它 们的输出决定了设备的不同状态,因此极高的 检测精度和极低的误报 (FA) 率对于实现令人满 意的用户体验至关重要。典型应用存在于受到 背景音频、混响失真以及嵌入 KWS 的设备的扬 声器产生的声音干扰的环境中。 KWS 系统应该 在这种广泛的情况下表现出强大的性能。此 外,计算复杂性和模型大小是 KWS 系统的重要 关注点,因为它们通常嵌入内存和计算资源有 限的消费设备中,例如智能手机或智能家居传 感器。

已经有数百万台设备配备了嵌入式 KWS 系统。 KWS 的传统方法基于带有序列搜索算法的隐马尔 可夫模型 。随着深度学习的进步和可用数据量 的增加,最先进的 KWS 已被深度学习所取代基于学习的方法由于其卓越的性能。基于深度 学习的 KWS 系统通常使用深度神经网络 (DNN) 与压缩技术 或多风格训练方法相结 合。 DNN 的潜在缺点是它们忽略输入的结构和上 下文,并且音频输入在时域或频域中可能具有很强 的依赖性。为了通过共享权重利用此类局部连接模 式,人们对 KWS 探索了卷积神经网络 (CNN) 。 CNN 的一个潜在缺点是,如果没有宽过滤 器或大深度,它们无法对整个帧的上下文进行建 模。与前面提到的具有交叉熵 (CE) 损失的 DNN 和 CNN 模型 不同,循环神经网络 (RNN) 还 研究了具有联结时间分类 (CTC) 损失的 KWS 。然而,考虑到此类系统的应用目标雄心勃 勃,无法在低 FA 率下获得高精度。与 DNN 类 似,RNN 的潜在局限性是建模是根据输入特征完 成的,而不需要学习连续时间和频率步骤之间的结 构。最近,提出了一种具有 CTC 损失的卷积 循环神经网络(CRNN)架构。然而,尽管模型尺 寸很大,与 RNN 类似,但无法在低 FA 率下获得 高精度。在本文中,我们专注于开发一个生产质量的 KWS 系 统,使用带有 CE 损失的 CRNN,用于小足迹模型, 应用于单个关键字。我们的目标是结合 CNN 和 RNN 的优势,并在训练过程中应用额外的策略来提高整体 性能,同时保持较小的占用空间。

受到成功的大规模语音识别系统 [12-14] 的启发,我 们专注于规范的 CRNN 架构。为了使这些架构适应 小规模 KWS,模型大小需要缩小两到三个数量级。 我们将分析缩小模型尺寸时不同参数对性能的影响。图 1 显示了带有相应参数的 CRNN 架构。原始时域输入被转 换为每通道能量归一化 (PCEN) 梅尔谱图 [8],以实现简洁的 表示和高效的训练。 (我们尝试过的其他输入表示结果更糟大小相当的模型架构的性能。)二维 PCEN 特征作 为卷积层的输入,卷积层在时间和频率维度上采用 二维滤波。卷积层的输出被馈送到双向循环层,其 中可能包括门循环单元(GRU)[15]或长短期记忆 (LSTM)单元[16]并处理整个帧。循环层的输出被 赋予全连接(FC)层。最后,对两个神经元应用 softmax解码,以获得相应的标量分数。我们在所 有层中使用修正线性单元作为激活函数。

image.png

在语音识别中,具有循环层的大规模架构通常使用 CTC 损失的变体来解码最可能的输出标签。除了由 于目标的条件独立性假设导致的建模限制之外, CTC 损失具有很高的计算复杂性,并且通常只有当 模型容量足够大以有效地从大型数据集中学习时才 能产生良好的性能。由于我们专注于小足迹架构, 因此选择在训练期间优化的损失函数作为估计和目 标二进制标签的 CE 损失,指示帧是否对应于关键 字。 我们使用算法 1 中所示的启发式算法获得关键字的 开始和结束时间。在切割关键字以覆盖边缘情况时 添加额外的短填充。获得的比对精度明显超出了人 类感知的时间尺度。

image.png

我们为关键字"TalkType"(可以发音为单个单词 或两个单词)开发 KWS 系统。我们选择 T = 1.5 秒 的帧长度,该长度足以捕获"TalkType"的合理发 音。使用 16 kHz 的采样率,每帧包含 24k 个原始 时域样本。获得了 10 ms 步幅和 40 个通道的相应 PCEN mel 频谱图,产生 40 × 151 的输入维度。整 个数据集由从 5k 多个说话者收集的约 16k 个不同样 本组成。数据集按照 6-1-1 的比例分为训练集、开发 集和测试集。通过应用加性噪声来增强训练样本, 其功率由从 [-5,15] dB 间隔采样的信噪比 (SNR) 确 定。加性噪声是从具有代表性的背景噪声和语音的 数据集中采样的,总长度超过300小时。为了提供针 对对准误差的鲁棒性,还通过引入随机定时抖动来 增强训练样本。我们使用ADAMoptimization算法 进行训练[17],批量大小为64。学习率最初选择为 0.001,后来降至0.0003。我们的评估考虑了一个流场景,这样对持续时间为 T 的重叠帧执行推理。帧之间的偏移选择为 100 ms(理想情况下应比频谱图步幅长得多,并且比推 理延迟短得多 - 有关更多详细信息,请参阅第 3.2 节) )。我们关注的指标是每小时的错误拒绝率 (FRR) 和错误警报 (FA),通常将后者固定在所需 值,例如 1 FA/小时 [7]。噪声被添加到开发和测试 集中,其大小取决于 SNR 值。我们注意到,收集的 样本已经有噪声,因此如果精确定义为承载信息的 信号与噪声的功率比,则实际 SNR 会较低。与我们 对训练集的增强类似,负样本和噪声数据集是从代 表性背景噪声中采样的,并且演讲。

实验结果如下

image.png

  • 11
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个简单的神经网络关键词语音识别代码,使用Python和TensorFlow实现。 首先,我们需要导入必要的库: ```python import tensorflow as tf from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense ``` 接下来,我们需要定义一些超参数: ```python # 超参数 batch_size = 32 num_epochs = 10 learning_rate = 0.001 input_shape = (20, 80, 1) # 输入的声谱图大小 num_classes = 3 # 关键词数量 ``` 我们使用20毫秒的窗口大小和80个频带来生成声谱图,并将其作为神经网络的输入。我们将训练模型以识别3个关键词。 接下来,我们需要准备数据。 ```python # 准备数据 train_data = tf.keras.preprocessing.image_dataset_from_directory( "train/", batch_size=batch_size, image_size=(20, 80), color_mode="grayscale" ) test_data = tf.keras.preprocessing.image_dataset_from_directory( "test/", batch_size=batch_size, image_size=(20, 80), color_mode="grayscale" ) # 数据预处理 train_data = train_data.map(lambda x, y: (tf.expand_dims(x, -1), y)) test_data = test_data.map(lambda x, y: (tf.expand_dims(x, -1), y)) # 自动调整数据以提高性能 train_data = train_data.prefetch(tf.data.experimental.AUTOTUNE) test_data = test_data.prefetch(tf.data.experimental.AUTOTUNE) ``` 我们将声谱图数据集读入train和test文件夹中,并使用image_dataset_from_directory函数来加载数据。然后,我们将数据预处理为灰度图像,并将其扩展一个维度以适应模型的输入。最后,我们使用prefetch函数来自动调整数据以提高性能。 接下来,我们定义一个简单的神经网络模型: ```python # 定义模型 model = tf.keras.Sequential([ Conv2D(32, (3, 3), activation="relu", input_shape=input_shape), MaxPooling2D((2, 2)), Conv2D(64, (3, 3), activation="relu"), MaxPooling2D((2, 2)), Conv2D(128, (3, 3), activation="relu"), MaxPooling2D((2, 2)), Flatten(), Dense(128, activation="relu"), Dense(num_classes, activation="softmax") ]) ``` 我们使用三个卷积层和一个全连接层来定义模型。我们使用softmax函数作为输出层的激活函数,以获得每个类别的概率分布。 最后,我们编译模型并开始训练: ```python # 编译模型 model.compile( optimizer=tf.keras.optimizers.Adam(learning_rate=learning_rate), loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=["accuracy"] ) # 训练模型 history = model.fit(train_data, epochs=num_epochs, validation_data=test_data) ``` 我们使用Adam优化器和交叉熵损失函数来编译模型,并使用accuracy度量来评估模型的性能。最后,我们使用fit函数来训练模型,并使用validation_data参数来进行验证集的评估。 完成训练后,我们可以使用模型进行预测: ```python # 使用模型进行预测 predictions = model.predict(test_data) ``` 这是一个简单的神经网络关键词语音识别代码,你可以根据自己的需求修改超参数和模型结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值