0

У меня часто возникает проблема при работе с библиотеками Python, у которых есть методы, требующие пути к файлам в качестве параметров. Это проблема, когда у меня есть некоторые данные в памяти, которые я хочу использовать с библиотечной функцией. В этих случаях я делаю следующее:Python избежать файла IO с помощью речевого распознавания или библиотек PocketSphinx

  1. напишите временный файл, содержащий данные.
  2. передать временный путь к библиотечной функции.
  3. удалите файл после возвращения функции.

Это работает достаточно хорошо, однако для приложений, чувствительных к времени, файл IO, связанный с записью и чтением из временного файла, является прерыватель транзакции.

У кого-нибудь есть решения проблемы? Я бы подумал, что здесь нет ни одного размера, но я не хочу делать никаких предположений. Однако позвольте мне описать мой текущий вариант использования и, надеюсь, кто-то сможет мне помочь в этом.

Я использую библиотеку speech_recognition для преобразования большого количества аудиофайлов в текст. У меня есть данные для аудиофайлов в двоичной форме. Вот мой код:

from os import path, remove 

from scipy.io.wavfile import write 

import speech_recognition as sr 

audio_list = ... # get the audio 

text_list = [] 

for item in audio_list: 

     temp_name = 'temp.wav' 
     # create temporary file, writing it as a wave for speech_recognition to read 
     write(temp_name, rate, item) 

     audio_file = path.join(path.dirname(path.realpath('__file__')), temp_name) 

     recognizer = sr.Recognizer() 

     # this is where I need to have the path to the file 
     with sr.AudioFile(audio_file) as source: 
      audio = recognizer.record(source) 

     text = recognizer.recognize_sphinx(audio) 
     text_list.append(text) 

     remove(temp_name) 

speech_recognition библиотека использует PocketSphinx в качестве движка. PocketSphinx имеет свой собственный API Python, но мне тоже не удавалось.

Может ли кто-нибудь помочь мне уменьшить этот файл IO?

ответ

2

Конструктор sr.AudioFile также принимает «файл-подобный объект», и SciPy должен иметь возможность записать его. В вашем случае это звучит, как io.BytesIO было бы хорошо. Это файл-подобный объект, построенный вокруг буфера в памяти.

сделать один, а затем использовать его, как и любой другой файл-подобный объект:

import io 

... 

buffer = io.BytesIO() 

... 

write(buffer, rate, item) 

... 

with sr.AudioFile(buffer) as source: 
    audio = recognizer.record(source) 
+0

Awesome, что работал. Огромное спасибо. Интересно, что это не сильно ускорило мой код - я собираюсь сделать некоторые профилирования, чтобы увидеть, где узкое место. Но спасибо независимо. –

+0

Добро пожаловать! Возможно, вашей программе не пришлось ждать физического диска вообще, из-за кэширования диска и т. Д., Но немного чище, чтобы в любом случае не посыпать временные файлы. –

+1

Да, я не думал об этом. Но да, я использую ваш код именно по этой причине. Это также делает код намного проще для многопоточных, поскольку io.BytesIO является потокобезопасным. Больше не беспокоиться о блокировках файлов. –