FastAPI接收音频直接调用Whisper API报错的解决方案咨询
解决FastAPI上传音频直接调用Whisper API格式无效的问题
问题原因
直接使用file.file调用Whisper API失败,核心原因有两点:
- FastAPI的
UploadFile对应的file属性是SpooledTemporaryFile对象,文件指针默认停留在文件末尾,导致Whisper读取不到有效音频内容 - Whisper API依赖文件对象的
name属性推断音频格式,而SpooledTemporaryFile默认未设置正确文件名,无法识别音频类型
解决方案
方案1:重置文件指针位置
将文件指针移到开头,确保Whisper能读取完整的音频数据:
from fastapi import FastAPI, UploadFile, File import openai app = FastAPI() @app.post("/transcribe") async def transcribe_audio(file: UploadFile = File(...)): # 将文件指针重置到文件开头 file.file.seek(0) # 直接传入file.file调用Whisper API transcript = openai.Audio.transcribe("whisper-1", file.file) return {"transcript": transcript["text"]}
方案2:转换为BytesIO并设置文件名
将上传的音频内容读取到BytesIO对象中,手动设置文件名让Whisper识别格式:
import io from fastapi import FastAPI, UploadFile, File import openai app = FastAPI() @app.post("/transcribe") async def transcribe_audio(file: UploadFile = File(...)): # 读取上传的音频内容 audio_content = await file.read() # 转换为BytesIO对象 audio_file = io.BytesIO(audio_content) # 设置文件名,用于Whisper识别音频格式 audio_file.name = file.filename # 调用Whisper API transcript = openai.Audio.transcribe("whisper-1", audio_file) return {"transcript": transcript["text"]}
方案3:显式指定音频格式
如果前两种方法无效,可在调用时直接指定音频格式,无需依赖文件名推断:
from fastapi import FastAPI, UploadFile, File import openai app = FastAPI() @app.post("/transcribe") async def transcribe_audio(file: UploadFile = File(...)): file.file.seek(0) # 从文件名提取格式,显式传给Whisper API audio_format = file.filename.split(".")[-1] transcript = openai.Audio.transcribe( model="whisper-1", file=file.file, file_format=audio_format ) return {"transcript": transcript["text"]}
总结
并非FastAPI接收的文件格式有问题,而是传递给Whisper API的文件对象缺少必要的格式标识或指针位置错误。通过重置指针、设置文件名或显式指定格式,即可实现直接调用,无需先写入磁盘再读取。
内容的提问来源于stack exchange,提问作者mightyandweakcoder
相关产品推荐
相关产品推荐

