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