使用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"}}
解决方法
- 直接使用文件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");
- 启用iOS的标准MPEG4输出格式
取消iOS配置中outputFormat的注释,确保输出标准的MPEG4容器:
ios: { extension: ".mp4", outputFormat: Audio.IOSOutputFormat.MPEG4AAC, audioQuality: Audio.IOSAudioQuality.HIGH, sampleRate: 44100, numberOfChannels: 2, bitRate: 128000, },
- 不要手动设置Content-Type请求头
使用FormData时,React Native会自动生成带正确boundary的multipart/form-data头,手动设置会导致格式解析错误,确保请求头只保留Authorization即可。
内容的提问来源于stack exchange,提问作者jawn
相关产品推荐
相关产品推荐

