#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.