You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:02:46