如何获取用于读取 .wav 音频但使用从 fastAPI post 请求获得的临时文件 tempfile.SpooledTemporaryFile 的 wave 模块方法?
How to get wave module methods for reading a .wav audio but with a temporary file tempfile.SpooledTemporaryFile obtained from fastAPI post request?
我有一个函数接收 .wav 音频路径目录和 return 它的 pcm_data 以字节为单位,sample_rate 作为 int 和持续时间作为 float。
def read_wave(self, path: str) -> Dict:
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,
}
现在我希望音频文件来自使用 FastAPI 的 POST 请求上传的音频,因此如果我使用来自 fastapi 的 UploadFile class 上传 .wav 音频,我会得到一个 tempfile.SpooledTemporaryFile,我如何为这种情况调整第一个函数。
@app.post(path="/upload-audios/")
async def upload_audios(audios: list[UploadFile] = File(...)):
pass
wave.open
函数支持类文件对象,所以可以直接使用UploadFile
的.file
属性(代表SpooledTemporaryFile实例)
我有一个函数接收 .wav 音频路径目录和 return 它的 pcm_data 以字节为单位,sample_rate 作为 int 和持续时间作为 float。
def read_wave(self, path: str) -> Dict:
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,
}
现在我希望音频文件来自使用 FastAPI 的 POST 请求上传的音频,因此如果我使用来自 fastapi 的 UploadFile class 上传 .wav 音频,我会得到一个 tempfile.SpooledTemporaryFile,我如何为这种情况调整第一个函数。
@app.post(path="/upload-audios/")
async def upload_audios(audios: list[UploadFile] = File(...)):
pass
wave.open
函数支持类文件对象,所以可以直接使用UploadFile
的.file
属性(代表SpooledTemporaryFile实例)