语音触发器

参考资料:
Coursera-Sequence Models 第三周作业2

  • 作业内容
    搭建一个语音触发器,听到特定的指令能够响应

  • 数据准备
    数据合成要比用人工去检测出词语在什么地方更加方便。
    输入都是10s的数据,我们将在背景噪声中插入”activate“这个词,注意虽然是10s,但是作业中可能有多个单位,但间隔都是均匀的。

441000  (raw audio)
5511=Tx  (spectrogram output, and dimension of input to the neural network).
10000  (used by the pydub module to synthesize audio)
1375=Ty  (the number of steps in the output of the GRU you'll build).

前面部分主要是让我们随机地选几段"activate"的语音和几段负的语音插入到10s的背景语音当中,其实这部分没有必要实作。

  • 模型


    语音触发器_第1张图片

第一层为一维卷积,10s的语音经过傅里叶变换后得到5511个输入,卷积后得到1375输出,输出的维度跟滤波器的个数一样,为196。
这里的GRU是单向的,双向需要等10s语音完才可以进行计算。

# GRADED FUNCTION: model

def model(input_shape):
    """
    Function creating the model's graph in Keras.
    
    Argument:
    input_shape -- shape of the model's input data (using Keras conventions)

    Returns:
    model -- Keras model instance
    """
    
    X_input = Input(shape = input_shape)
    
    ### START CODE HERE ###
    
    # Step 1: CONV layer (≈4 lines)
    X = Conv1D(filters=196,kernel_size=15,strides=4,padding="same")(X_input)                           # CONV1D
    X = BatchNormalization()(X)                                                                        # Batch normalization
    X = Activation("relu")(X)                                                                          # ReLu activation
    X = Dropout(0.8)(X)                                                                                # dropout (use 0.8)

    # Step 2: First GRU Layer (≈4 lines)
    X = GRU(units = 128, return_sequences = True)(X)                                 # GRU (use 128 units and return the sequences)
    X = Dropout(0.8)(X)                                                              # dropout (use 0.8)
    X = BatchNormalization()(X)                                                      # Batch normalization
    
    # Step 3: Second GRU Layer (≈4 lines)
    X = GRU(units = 128, return_sequences = True)(X)                                 # GRU (use 128 units and return the sequences)
    X = Dropout(0.8)(X)                                                              # dropout (use 0.8)
    X = BatchNormalization()(X)                                                      # Batch normalization
    X = Dropout(0.8)(X)                                                              # dropout (use 0.8)
    
    # Step 4: Time-distributed dense layer (≈1 line)
    X = TimeDistributed(Dense(1, activation = "sigmoid"))(X) # time distributed  (sigmoid)

    ### END CODE HERE ###

    model = Model(inputs = X_input, outputs = X)
    
    return model  
  • 结果
    两个正确的activate语音都被检测出来了,为了防止多次检测,程序采用了跟非最大抑制差不多的方法,两次检测完成之间至少要有一定的时间间隔。


    语音触发器_第2张图片

你可能感兴趣的:(语音触发器)