Next.js调用Whisper API遇多部分表单解析错误求助
解决Next.js调用Whisper API时"Could not parse multipart form"错误的方案
核心问题定位
相同API密钥能正常调用Chat接口,但Whisper接口返回400错误,说明问题出在多部分表单(multipart/form-data)的构造或传输环节,而非权限或网络问题。
具体修复步骤
1. 替换文件流为Buffer传递
避免使用createReadStream传递文件,改为读取文件为Buffer后再加入FormData,解决流传输可能的截断或格式不兼容问题:
import fs from 'fs'; // 替换原流读取逻辑 const fileBuffer = fs.readFileSync(file.filepath); formData.append('file', fileBuffer, { filename: 'audio.wav', contentType: 'audio/wav' });
2. 移除手动设置的FormData头
当请求body为FormData时,fetch会自动生成包含boundary的正确Content-Type头,手动添加...formData.getHeaders()会导致头信息冲突或格式错误,直接删除该部分:
// 修改后的请求头配置 headers: { Authorization: `Bearer ${process.env.OPENAI_API_KEY}`, // 无需额外设置Content-Type,fetch自动处理 }
3. 验证文件格式有效性
Whisper对音频文件有严格要求,确保上传的WAV文件符合:
- 采样率16kHz
- 单声道
- PCM编码
可使用ffmpeg转换测试:
ffmpeg -i 你的音频文件.wav -ar 16000 -ac 1 -c:a pcm_s16le 转换后的音频.wav
4. 检查文件上传中间件配置
确认withFileUpload中间件未限制过小的文件大小(Whisper支持最大25MB文件),若中间件有fileSizeLimit配置,需调整至25MB以上。
修复后的完整代码示例
import { withFileUpload } from '你的文件上传中间件'; import fs from 'fs'; export default withFileUpload(async (req, res) => { const file = req.file; if (!file) { res.status(400).send('No file uploaded'); return; } const fileBuffer = fs.readFileSync(file.filepath); const formData = new FormData(); formData.append('file', fileBuffer, { filename: 'audio.wav', contentType: 'audio/wav' }); formData.append('model', 'whisper-1'); try { const response = await fetch( 'https://api.openai.com/v1/audio/transcriptions', { method: 'POST', headers: { Authorization: `Bearer ${process.env.OPENAI_API_KEY}`, }, body: formData, } ); const data = await response.json(); if (response.ok) { res.status(200).json({ text: data.text }); } else { console.error('OpenAI Error:', data.error); res.status(response.status).json({ error: data.error.message }); } } catch (err) { console.error('Request Error:', err); res.status(500).send('Internal Server Error'); } });
内容的提问来源于stack exchange,提问作者user633597
相关产品推荐
相关产品推荐

