openWakeWord
是一个开源的音频唤醒词检测框架,专注于性能和简便性。它包括预训练模型,用于常见的词汇和短语,适用于实际环境中。框架支持 ONNX 和 TFLite 推理,能够在 Linux 和 Windows 系统上运行,提供 Speex 噪声抑制以提高在嘈杂环境中的性能。安装简单,使用 Python 接口进行本地或在线测试。项目目标是提供快速、准确且易于扩展的解决方案,同时支持通过 Google Colab 进行快速定制模型训练。
项目链接:openWakeWord
search("openWakeWord deep learning algorithm site:github.com")mclick(["0", "13", "10"])
The openWakeWord
project implements its wake word detection using a combination of convolutional neural networks (CNNs) and recurrent neural networks (RNNs). The general architecture consists of three main components:
Pre-processing: The audio data is converted into mel-spectrograms, which are a type of time-frequency representation.
Feature Extraction Backbone: This part of the model extracts relevant features from the mel-spectrograms using a shared feature extraction model. This backbone is based on a series of convolutional blocks that have been pre-trained on a large amount of data to create general-purpose speech audio embeddings.
Classification Model: Following the feature extraction, a classification model (either a fully connected network or a 2-layer RNN) is used to predict the presence of the wake word.
This approach allows the openWakeWord
models to effectively detect wake words even in noisy environments and maintain a balance between accuracy and computational efficiencyundefinedundefined.
openWakeWord
项目使用的深度学习算法主要是卷积神经网络(CNN)和循环神经网络(RNN)的结合。项目的主要架构包含以下三个部分:
预处理:将音频数据转换为梅尔频谱图(mel-spectrogram),这是一种时间-频率表示方法。
特征提取骨干网络:使用共享特征提取模型从梅尔频谱图中提取相关特征。该骨干网络基于一系列卷积块,这些卷积块在大量数据上进行了预训练,以创建通用的语音音频嵌入。
分类模型:在特征提取之后,使用分类模型(可以是全连接网络或两层RNN)来预测唤醒词的存在。
这种方法使得 openWakeWord
模型能够在嘈杂环境中有效地检测唤醒词,同时在准确性和计算效率之间取得平衡。
openWakeWord
项目中,预处理步骤将音频数据转换为梅尔频谱图,这是唤醒词检测的基础。让我们来详细看看代码中是如何实现预处理的以及设计了哪些参数。
在 preprocess.py
或相关文件中,我们通常可以找到预处理音频数据的实现。以下是一个假设的实现示例:
import numpy as np
import librosa
class AudioPreprocessor:
def __init__(self, sample_rate=16000, n_mels=40, frame_length=0.025, frame_stride=0.01):
self.sample_rate = sample_rate
self.n_mels = n_mels
self.frame_length = frame_length
self.frame_stride = frame_stride
def preprocess(self, audio):
# 将音频信号转换为梅尔频谱图
# 1. 提取短时傅里叶变换(STFT)
stft = librosa.stft(audio, n_fft=int(self.sample_rate * self.frame_length),
hop_length=int(self.sample_rate * self.frame_stride),
win_length=int(self.sample_rate * self.frame_length))
# 2. 计算梅尔频谱
mel_spectrogram = librosa.feature.melspectrogram(S=np.abs(stft)**2, sr=self.sample_rate, n_mels=self.n_mels)
# 3. 对数变换
log_mel_spectrogram = librosa.power_to_db(mel_spectrogram, ref=np.max)
return log_mel_spectrogram
# 示例使用
if __name__ == "__main__":
audio_path = "path/to/audio.wav"
audio, sr = librosa.load(audio_path, sr=16000)
preprocessor = AudioPreprocessor()
features = preprocessor.preprocess(audio)
print(features.shape)
sample_rate (采样率): 将音频数据加载到内存时的采样率,默认设置为 16000 Hz。采样率决定了每秒钟音频样本的数量。
n_mels (梅尔频谱图的梅尔频带数量): 梅尔频谱图中的梅尔频带数量,默认设置为 40。这个参数决定了频谱的分辨率。
frame_length (帧长度): 计算短时傅里叶变换(STFT)时每一帧的长度,默认设置为 0.025 秒(25 毫秒)。
frame_stride (帧移步长): 相邻帧之间的时间步长,默认设置为 0.01 秒(10 毫秒)。
短时傅里叶变换(STFT): 对音频信号进行短时傅里叶变换,将时域信号转换为频域表示。
梅尔频谱图: 计算音频信号的梅尔频谱图,利用梅尔尺度将频域表示转换为更符合人类听觉感知的尺度。
对数变换: 将梅尔频谱图转换为对数梅尔频谱图,增强人类听觉感知中的非线性特性。
通过这些步骤,原始音频信号被转换为适合于卷积神经网络输入的特征表示。这些特征可以有效地用于后续的唤醒词检测模型中。