Как одновременно читать аудиосэмплы при записи в python для преобразования речи в текст в реальном времени? - PullRequest
0 голосов
/ 31 марта 2020

В основном я обучил несколько моделей с использованием керас для распознавания отдельных слов. В настоящее время я могу записывать звук с помощью функции записи звукового устройства в течение заранее установленного периода времени и сохранять аудиофайл в виде файла 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 об этом.

1 Ответ

0 голосов
/ 31 марта 2020

Трудно сказать, какова ваша модель архитектуры, но есть модели, специально предназначенные для потокового распознавания. Как потоковые конвееты Facebook . Вы не сможете легко реализовать их в Keras.

...