iPhone浏览器调用OpenAI Whisper API无法完整转录音频
解决iPhone浏览器中Whisper API仅转录音频开头内容的问题
可能的原因及解决方案
1. 音频编码格式兼容性问题
iPhone浏览器录制的Blob可能并非标准MP3编码,即便你指定了type: "audio/mp3",实际编码参数(如比特率、采样率)可能不符合Whisper API的要求,导致转录截断。
解决方法:
- 改用WAV格式发送音频(无压缩格式,兼容性更强):
修改文件创建代码:
同时确保录制时使用WAV格式初始化MediaRecorder:const audioFile = new File([recordedBlob], "audio.wav", { type: "audio/wav", });const mediaRecorder = new MediaRecorder(stream, { mimeType: 'audio/wav' });
2. Blob转File时的数据截断
iPhone浏览器在处理Blob转File的过程中可能出现数据丢失,虽然本地播放正常,但实际发送给API的文件不完整。
解决方法:
- 先将Blob转为ArrayBuffer再创建File,确保数据完整性:
const getTranscript = async (recordedBlob) => { try { const arrayBuffer = await recordedBlob.arrayBuffer(); const audioFile = new File([arrayBuffer], "audio.wav", { type: "audio/wav" }); const transcript = await openai.audio.transcriptions.create({ model: "whisper-1", file: audioFile, response_format: "text", }); return transcript; } catch (err) { return Promise.reject(err); } };
3. OpenAI JS库的兼容性问题
在iPhone浏览器中,openai-js库对File对象的自动处理可能存在兼容性bug,导致发送的文件不完整。
解决方法:
- 手动构建FormData直接调用API,绕过库的自动处理:
const getTranscript = async (recordedBlob) => { try { const arrayBuffer = await recordedBlob.arrayBuffer(); const audioFile = new File([arrayBuffer], "audio.wav", { type: "audio/wav" }); const formData = new FormData(); formData.append("file", audioFile); formData.append("model", "whisper-1"); formData.append("response_format", "text"); const response = await fetch("https://api.openai.com/v1/audio/transcriptions", { method: "POST", headers: { Authorization: `Bearer ${YOUR_OPENAI_API_KEY}`, }, body: formData, }); if (!response.ok) { throw new Error(`请求失败:${response.status} ${response.statusText}`); } return await response.text(); } catch (err) { return Promise.reject(err); } };
内容的提问来源于stack exchange,提问作者Abdullah Saleem
相关产品推荐
相关产品推荐

