Why does a EOFError occur while running an application with FastAPI server?

619 Views Asked by At

I got an EOFError while running this code, I have a Python file to declare a Preprocessing class which first method read an .wav audio file and returns a PCM data, etc. and the second method which generates audio frames from PCM audio data. I used this class in a POST request with FastAPI, in this I get .wav audios from the uploading, but I got the EOFError while generating the frames.

class Frame:
    def __init__(self, bytes: bytes, timestamp: float, duration: float) -> None:
        self.bytes = bytes
        self.timestamp = timestamp
        self.duration = duration

class Preprocessing:

    def __init__(self, path: str) -> None:
        self.path = path
        # self.pcm_data = self.read_wave(path)["pcm_data"]

        #self.sample_rate = self.read_wave(path)["sample_rate"]
        # self.duration = self.read_wave(path)["duration"]

    def read_wave(self, path: str) -> Dict:
        """
        Reads a .wav file
        Input: audio path.
        Returns: PCM audio data, sample rate, duration
        """
        with contextlib.closing(wave.open(path, "rb")) as wf:

            num_channels: int = wf.getnchannels()
            assert num_channels == 1
            sample_width: int = wf.getsampwidth()
            assert sample_width == 2
            sample_rate: int = wf.getframerate()
            assert sample_rate in (8000, 16000, 32000)
            frames: int = wf.getnframes()
            pcm_data: bytes = wf.readframes(frames)
            duration: float = frames / sample_rate

            return {
                "pcm_data": pcm_data,
                "sample_rate": sample_rate,
                "duration": duration,
            }

    def frame_generator(
        self, frame_duration_ms: int, pcm_data: bytes, sample_rate: int
    ) -> Generator:
        """
        Generates audio frames from PCM audio data Inputs: desire frame duration in ms, the PCM data, the sample rate.
        Yields frames of the requested duration.
        """
        n = int(sample_rate * (frame_duration_ms / 1000.0) * 2)
        offset: int = 0
        timestamp: float = 0.0
        duration: float = (float(n) / sample_rate) / 2.0
        while offset + n < len(pcm_data):
            yield Frame(pcm_data[offset : offset + n], timestamp, duration)
            timestamp += duration
            offset += n
app = FastAPI()

@app.post(
    path="/upload-audios/",
    status_code=status.HTTP_200_OK
)
async def upload_audios(audios: list[UploadFile] = File(...)):
    for i in range(len(audios)):
        audio_data = audios[i].file
        wave_file = audio_data
        wave_instance = pr(wave_file)
        read_instance = wave_instance.read_wave(wave_file)
        pcm_data = read_instance["pcm_data"]
        sample_rate = read_instance["sample_rate"]
        print(read_instance["sample_rate"])
        frame_instance = wave_instance.frame_generator(30, pcm_data, sample_rate)
        frame_instance = list(frame_instance)
        print(frame_instance)

    return "ok"

I discovered that If I delete the commented lines for self.pcm_data, self.sample_rate and self.duration, it works well but I don't understand why, so I wonder if someone can tell me why this happens.

This is error traceback.

INFO:     127.0.0.1:44268 - "POST /upload-audios/ HTTP/1.1" 500 Internal Server Error
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "/home/user/.cache/pypoetry/virtualenvs/fastapi-server-BFZN8ms--py3.9/lib/python3.9/site-packages/uvicorn/protocols/http/h11_impl.py", line 366, in run_asgi
    result = await app(self.scope, self.receive, self.send)
  File "/home/user/.cache/pypoetry/virtualenvs/fastapi-server-BFZN8ms--py3.9/lib/python3.9/site-packages/uvicorn/middleware/proxy_headers.py", line 75, in __call__
    return await self.app(scope, receive, send)
  File "/home/user/.cache/pypoetry/virtualenvs/fastapi-server-BFZN8ms--py3.9/lib/python3.9/site-packages/fastapi/applications.py", line 259, in __call__
    await super().__call__(scope, receive, send)
  File "/home/user/.cache/pypoetry/virtualenvs/fastapi-server-BFZN8ms--py3.9/lib/python3.9/site-packages/starlette/applications.py", line 112, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/home/user/.cache/pypoetry/virtualenvs/fastapi-server-BFZN8ms--py3.9/lib/python3.9/site-packages/starlette/middleware/errors.py", line 181, in __call__
    raise exc
  File "/home/user/.cache/pypoetry/virtualenvs/fastapi-server-BFZN8ms--py3.9/lib/python3.9/site-packages/starlette/middleware/errors.py", line 159, in __call__
    await self.app(scope, receive, _send)
  File "/home/user/.cache/pypoetry/virtualenvs/fastapi-server-BFZN8ms--py3.9/lib/python3.9/site-packages/starlette/exceptions.py", line 82, in __call__
    raise exc
  File "/home/user/.cache/pypoetry/virtualenvs/fastapi-server-BFZN8ms--py3.9/lib/python3.9/site-packages/starlette/exceptions.py", line 71, in __call__
    await self.app(scope, receive, sender)
  File "/home/user/.cache/pypoetry/virtualenvs/fastapi-server-BFZN8ms--py3.9/lib/python3.9/site-packages/fastapi/middleware/asyncexitstack.py", line 21, in __call__
    raise e
  File "/home/user/.cache/pypoetry/virtualenvs/fastapi-server-BFZN8ms--py3.9/lib/python3.9/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
    await self.app(scope, receive, send)
  File "/home/user/.cache/pypoetry/virtualenvs/fastapi-server-BFZN8ms--py3.9/lib/python3.9/site-packages/starlette/routing.py", line 656, in __call__
    await route.handle(scope, receive, send)
  File "/home/user/.cache/pypoetry/virtualenvs/fastapi-server-BFZN8ms--py3.9/lib/python3.9/site-packages/starlette/routing.py", line 259, in handle
    await self.app(scope, receive, send)
  File "/home/user/.cache/pypoetry/virtualenvs/fastapi-server-BFZN8ms--py3.9/lib/python3.9/site-packages/starlette/routing.py", line 61, in app
    response = await func(request)
  File "/home/user/.cache/pypoetry/virtualenvs/fastapi-server-BFZN8ms--py3.9/lib/python3.9/site-packages/fastapi/routing.py", line 227, in app
    raw_response = await run_endpoint_function(
  File "/home/user/.cache/pypoetry/virtualenvs/fastapi-server-BFZN8ms--py3.9/lib/python3.9/site-packages/fastapi/routing.py", line 160, in run_endpoint_function
    return await dependant.call(**values)
  File "./routerpoo.py", line 80, in upload_audios
    read_instance = wave_instance.read_wave(wave_file)
  File "/home/user/audio_transcript_fastapi_server/fastapi_server/fastapi_server/preprocessing_poo.py", line 43, in read_wave
    with contextlib.closing(wave.open(path, "rb")) as wf:
  File "/home/user/.pyenv/versions/3.9.2/lib/python3.9/wave.py", line 509, in open
    return Wave_read(f)
  File "/home/user/.pyenv/versions/3.9.2/lib/python3.9/wave.py", line 163, in __init__
    self.initfp(f)
  File "/home/user/.pyenv/versions/3.9.2/lib/python3.9/wave.py", line 128, in initfp
    self._file = Chunk(file, bigendian = 0)
  File "/home/user/.pyenv/versions/3.9.2/lib/python3.9/chunk.py", line 63, in __init__
    raise EOFError
EOFError
0

There are 0 best solutions below