В основном я обучил несколько моделей с использованием керас для распознавания отдельных слов. В настоящее время я могу записывать звук с помощью функции записи звукового устройства в течение заранее установленного периода времени и сохранять аудиофайл в виде файла WAV. Я реализовал обнаружение тишины, чтобы обрезать нежелательные образцы. Но это все работает после завершения всей записи. Я хотел бы получить обрезанные аудиосегменты сразу во время записи одновременно, чтобы я мог выполнять распознавание речи в режиме реального времени. Я использую python2 и тензор потока 1.14.0. Ниже приведен фрагмент того, что у меня сейчас есть,
import sounddevice as sd
import matplotlib.pyplot as plt
import time
#import tensorflow.keras.backend as K
import numpy as np
from scipy.io.wavfile import write
from scipy.io.wavfile import read
from scipy.io import wavfile
from pydub import AudioSegment
import cv2
import tensorflow as tf
tf.compat.v1.enable_eager_execution()
tf.compat.v1.enable_v2_behavior()
from contextlib import closing
import multiprocessing
models=['model1.h5','model2.h5','model3.h5','model4.h5','model5.h5']
loaded_models=[]
for model in models:
loaded_models.append(tf.keras.models.load_model(model))
def prediction(model_ip):
model,t=model_ip
ret_val=model.predict(t).tolist()[0]
return ret_val
print("recording in 5sec")
time.sleep(5)
fs = 44100 # Sample rate
seconds = 10 # Duration of recording
print('recording')
time.sleep(0.5)
myrecording = sd.rec(int(seconds * fs), samplerate=fs, channels=1)
sd.wait()
thresh=0.025
gaplimit=9000
wav_file='/home/nick/Desktop/Endpoint/aud.wav'
write(wav_file, fs, myrecording)
fs,myrecording = read(wav_file)[0], read(wav_file)[1]
#Now the silence removal function is called which trims and saves only the useful audio samples in the form of a wav file. This trimmed audio contains the full word which can be recognized.
end_points(wav_file,thresh,50)
#Below for loop combines the loaded models(I'm using multiple models) with the input in a tuple
for trimmed_aud in trimmed_audio:
...
... # The trimmed audio is processed further and the input which the model can predict
#is t
...
modelon=[]
for md in loaded_models:
modelon.append((md,t))
start_time=time.time()
with closing(multiprocessing.Pool()) as p:
predops=p.map(prediction,modelon)
print('Total time taken: {}'.format(time.time() - start_time))
actops=[]
for predop in predops:
actops.append(predop.index(max(predop)))
print(actops)
max_freqq = max(set(actops), key = actops.count)
final_ans+=str(max_freqq)
print("Output: {}".format(final_ans))
Обратите внимание, что приведенный выше код включает только то, что имеет отношение к вопросу и не будет выполняться. Я хотел бы дать обзор того, что у меня есть, и был бы очень признателен за ваш вклад в то, как я могу продолжить, чтобы иметь возможность записывать и обрезать звук на основе порогового значения одновременно, чтобы при произнесении нескольких слов в течение продолжительности записи 10 секунд (переменная секунд в коде), когда я говорю, когда энергия выборок для размера окна 50 мс становится ниже определенного порога, я обрезаю звук в этих двух точках, обрезаю и использую его для прогнозирования. Запись и прогнозирование обрезанных аудиосегментов должны происходить одновременно, чтобы каждое выходное слово могло отображаться сразу после его произнесения в течение 10 секунд записи. Буду очень признателен за любые предложения о том, как я могу go об этом.