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

使用Expo-AV录制的iOS MP4调用OpenAI语音转写接口报错格式无效

问题:Expo-AV录制的MP4音频上传OpenAI Whisper接口提示格式无效

我用Expo的Expo-AV在iPhone上录制音频,保存为MP4格式,转成Base64后已验证是有效MP4文件,但上传到OpenAI whisper-1语音转写接口时,始终返回格式无效错误。

录制配置代码

const recordingOptions = {
  android: {
    extension: ".mp4",
    outputFormat: Audio.AndroidOutputFormat.MPEG_4,
    audioEncoder: Audio.AndroidAudioEncoder.AAC,
    sampleRate: 44100,
    numberOfChannels: 2,
    bitRate: 128000,
  },
  ios: {
    extension: ".mp4",
    // outputFormat: Audio.IOSOutputFormat.MPEG4AAC,
    audioQuality: Audio.IOSAudioQuality.HIGH,
    sampleRate: 44100,
    numberOfChannels: 2,
    bitRate: 128000,
  },
  web: {
    mimeType: "audio/mp4",
    bitsPerSecond: 128000 * 8,
  },
};

上传实现代码

const recordingUri = recording.getURI();
const recordingBase64 = await ExpoFileSystem.readAsStringAsync(
  recordingUri,
  {
    encoding: ExpoFileSystem.EncodingType.Base64,
  }
);
const languageCode = "en"; // English
console.log(languageCode);
console.log(recordingBase64)

const buffer = Buffer.from(recordingBase64, "base64")
const blob= new Blob([buffer], { type:'audio/mp4' })
const file = new File([blob],'test.mp4', {type:'audio/mp4'})

const formData = new FormData();
formData.append('file',file);
formData.append("model", "whisper-1");

const apiUrl = "https://api.openai.com/v1/audio/transcriptions";

const requestOptions = {
  method: "POST",
  headers: {
    Authorization: `Bearer ${OPENAI_API_KEY}`,
  },
  body: formData,
};

fetch(apiUrl, requestOptions)
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.log(error));

错误响应

{"error": {"code": null, "message": "Invalid file format. Supported formats: ['m4a', 'mp3', 'webm', 'mp4', 'mpga', 'wav', 'mpeg']", "param": null, "type": "invalid_request_error"}}

解决方法

  1. 直接使用文件URI构建FormData,跳过Base64转码
    React Native中手动转Buffer、Blob、File的过程容易引入格式损坏,直接用录制生成的URI上传更可靠:
const formData = new FormData();
// 直接用recordingUri创建FormData项
formData.append('file', {
  uri: recordingUri,
  name: 'test.mp4',
  type: 'audio/mp4'
});
formData.append("model", "whisper-1");
  1. 启用iOS的标准MPEG4输出格式
    取消iOS配置中outputFormat的注释,确保输出标准的MPEG4容器:
ios: {
  extension: ".mp4",
  outputFormat: Audio.IOSOutputFormat.MPEG4AAC,
  audioQuality: Audio.IOSAudioQuality.HIGH,
  sampleRate: 44100,
  numberOfChannels: 2,
  bitRate: 128000,
},
  1. 不要手动设置Content-Type请求头
    使用FormData时,React Native会自动生成带正确boundary的multipart/form-data头,手动设置会导致格式解析错误,确保请求头只保留Authorization即可。

内容的提问来源于stack exchange,提问作者jawn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 08:12:30