Запуск речевой модели в модификации массива Tensorflow Python

#python #numpy #tensorflow #machine-learning #keras

#python #numpy #tensorflow #машинное обучение #keras

Вопрос:

Я пытаюсь запустить модель, которая была обучена с помощью MFCC и набора данных Google Speech. Модель была обучена здесь с использованием первых 2 ноутбуков jupyter.

Теперь я пытаюсь реализовать его на Raspberry Pi с помощью Tensorflow 1.15.2, обратите внимание, что он также был обучен в TF 1.15.2. Модель загружается, и я получаю правильную model.summary():

 Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 15, 15, 32)        160       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 7, 7, 32)          0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 6, 6, 32)          4128      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 3, 3, 32)          0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 2, 2, 64)          8256      
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 1, 1, 64)          0         
_________________________________________________________________
flatten (Flatten)            (None, 64)                0         
_________________________________________________________________
dense (Dense)                (None, 64)                4160      
_________________________________________________________________
dropout (Dropout)            (None, 64)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 65        
=================================================================
Total params: 16,769
Trainable params: 16,769
Non-trainable params: 0
 

Моя программа, которая принимает звуковые полосы за 1 секунду и выводит файл wav, который затем открывается (не уверен, как просто использовать данные) и преобразуется в тензорную строку, которая затем прогнозируется с помощью модели:

 import os

import wave #Audio
import pyaudio #Audio

import time
import matplotlib.pyplot as plt
from math import ceil
import tensorflow as tf
import numpy as np

tf.compat.v1.enable_eager_execution() #We call this to establish a tf session

# Load Frozen Model
path = '/home/pi/Desktop/tflite-speech-recognition-master/saved_model_stop'
#print(path)
model = tf.keras.models.load_model(path)
#print(model)
model.summary()


# Pi Hat Config 
RESPEAKER_RATE = 16000 #Hz
RESPEAKER_CHANNELS = 2 # Originally 2 channel audio, slimmed to 1 channel for a 1D array of audio 
RESPEAKER_WIDTH = 2
RESPEAKER_INDEX = 2  # refer to input device id
CHUNK = 1024
RECORD_SECONDS = 1   # Change according to how many seconds to record for
WAVE_OUTPUT_FILENAME = "output.wav" #Temporary file name
WAVFILE = WAVE_OUTPUT_FILENAME #Clean up name

# Pyaudio
p = pyaudio.PyAudio() #To use pyaudio

#words = ["no","off","on","stop","_silence_","_unknown_","yes"] #Words in our model 
word = ["stop","not stop"]

def WWpredict(input_file):
    decoded_audio = decode_audio(input_file)
    #tf.print(decoded_audio,summarize =-1) #print full array
    print(decoded_audio)
    print(decoded_audio.shape)
    prediction = model.predict(decoded_audio,steps =None)
    guess = words[np.argmax(prediction)]
    print(guess)

def decode_audio(input_file):
    if input_file in os.listdir():
        print("Audio file found:", input_file)
        
    input_data = tf.io.read_file(input_file)
    print(input_data)
    audio,_d = tf.audio.decode_wav(input_data,RESPEAKER_CHANNELS)
    print(audio)
    print(_d)
    return audio

def record(): #This function will record 1 second of your voice every 1 second and will output a wav file that it will overwrite every second
    
    stream = p.open(
            rate=RESPEAKER_RATE,
            format=p.get_format_from_width(RESPEAKER_WIDTH),
            channels=RESPEAKER_CHANNELS,
            input=True,
            input_device_index=RESPEAKER_INDEX,)
 
    print("* recording")
 
    frames = []
 
    for i in range(0, ceil(RESPEAKER_RATE / CHUNK * RECORD_SECONDS)):
        data = stream.read(CHUNK)
        frames.append(data)
 
    print("* done recording")
    
    #print(len(frames), "bit audio:")
    #print(frames)
    #print(int.from_bytes(frames[-1],byteorder="big",signed = True)) #Integer for the last frame
    
    stream.stop_stream()
    stream.close()
    
    wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
    wf.setnchannels(RESPEAKER_CHANNELS)
    wf.setsampwidth(p.get_sample_size(p.get_format_from_width(RESPEAKER_WIDTH)))
    wf.setframerate(RESPEAKER_RATE)
    wf.writeframes(b''.join(frames))
    wf.close()
    
while(True):
    record()
    WWpredict(WAVFILE)
    time.sleep(1)
 

Теперь, когда мы на самом деле запускаем это, я изначально получаю следующие результаты:

 tf.Tensor(
[[ 0.0000000e 00  0.0000000e 00]
 [ 0.0000000e 00  0.0000000e 00]
 [-3.0517578e-05 -3.0517578e-05]
 ...
 [ 2.2949219e-02  3.6926270e-03]
 [ 2.3315430e-02  3.3874512e-03]
 [ 2.2125244e-02  4.1198730e-03]], shape=(16384, 2), dtype=float32)
(16384, 2)
 

Однако ожидается, что мой прогноз не будет работать с этим, поскольку ему нужно, чтобы он имел размеры (Нет, 16,16,1). Я понятия не имею, как взять этот 2-мерный массив (16384,2) и сделать его (16,16) *, а затем просто добавить к нему None и 1 позже.
Если у кого-нибудь есть какие-либо идеи о том, как это сделать, пожалуйста, дайте мне знать. 16384 делится на 16, поскольку это 16-битный звук.
Спасибо

 ValueError: Error when checking input: expected conv2d_input to have 4 dimensions, but got array with shape (16384, 2)
 

Ответ №1:

Оказывается, нам нужно было создать MFCC с Python_Speech_features. Это дало нам 1,16,16, затем мы расширили размеры для 1,16,16,1.