Почему библиотека SpeechRecognition не работает с временным аудиофайлом? - PullRequest
0 голосов
/ 07 октября 2019

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

Из документов CherryPy:

Когдаклиент загружает файл в приложение CherryPy, он немедленно помещается на диск. CherryPy передаст его вашему выставленному методу в качестве аргумента;этот аргумент будет иметь атрибут «file», который является дескриптором временно загруженного файла

Поскольку конструктор sr.AudioFile также принимает «файловый объект», я использую io.BytesIO чтобы передать содержимое временного файла конструктору.

Вот код моего сервера:

import io
import cherrypy
import speech_recognition as sr

class HttpServer(object):    
    @cherrypy.expose
    def index(self, ufile):
        ufile_content = ufile.file.read() # reading temp file
        buffer = io.BytesIO(ufile_content)
        buffer.seek(0)
        with sr.AudioFile(buffer) as source:
            audio = self.recognizer.record(source)
        result = self.recognizer.recognize_google(audio, language='ru-RU')

Я использую этот код для отправки запроса на сервер:

import requests
url = 'http://localhost:8080/'
files = {'ufile': ('audio.flac', open('audio.flac', 'rb'), 'audio/flac')}
r = requests.post(url, files=files)

Я получаю следующую ошибку:

  File "C:\Users\Артём\AppData\Local\Programs\Python\Python37\lib\site-packages\speech_recognition\__init__.py", line 203, in __enter__
    self.audio_reader = wave.open(self.filename_or_fileobject, "rb")
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python37\lib\wave.py", line 510, in open
    return Wave_read(f)
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python37\lib\wave.py", line 164, in __init__
    self.initfp(f)
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python37\lib\wave.py", line 131, in initfp
    raise Error('file does not start with RIFF id')
wave.Error: file does not start with RIFF id

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python37\lib\site-packages\speech_recognition\__init__.py", line 208, in __enter__
    self.audio_reader = aifc.open(self.filename_or_fileobject, "rb")
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python37\lib\aifc.py", line 917, in open
    return Aifc_read(f)
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python37\lib\aifc.py", line 358, in __init__
    self.initfp(f)
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python37\lib\aifc.py", line 316, in initfp
    raise Error('file does not start with FORM id')
aifc.Error: file does not start with FORM id

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python37\lib\site-packages\speech_recognition\__init__.py", line 234, in __enter__
    self.audio_reader = aifc.open(aiff_file, "rb")
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python37\lib\aifc.py", line 917, in open
    return Aifc_read(f)
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python37\lib\aifc.py", line 358, in __init__
    self.initfp(f)
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python37\lib\aifc.py", line 314, in initfp
    chunk = Chunk(file)
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python37\lib\chunk.py", line 63, in __init__
    raise EOFError
EOFError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python37\lib\site-packages\cherrypy\_cprequest.py", line 628, in respond
    self._do_respond(path_info)
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python37\lib\site-packages\cherrypy\_cprequest.py", line 687, in _do_respond
    response.body = self.handler()
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python37\lib\site-packages\cherrypy\lib\encoding.py", line 219, in __call__
    self.body = self.oldhandler(*args, **kwargs)
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python37\lib\site-packages\cherrypy\_cpdispatch.py", line 54, in __call__
    return self.callable(*self.args, **self.kwargs)
  File "new1.py", line 19, in index
    with audio_file as source:
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python37\lib\site-packages\speech_recognition\__init__.py", line 236, in __enter__
    raise ValueError("Audio file could not be read as PCM WAV, AIFF/AIFF-C, or Native FLAC; check if file is corrupted or in another format")
ValueError: Audio file could not be read as PCM WAV, AIFF/AIFF-C, or Native FLAC; check if file is corrupted or in another format

У кого-нибудь есть какие-либо решения проблемы?

...