如何将音频Buffer转为可读流直接调用Whisper API(无需本地存文件)
直接用Buffer转可读流调用Whisper API的可行方案
完全可行,你不需要把Buffer存到本地再读取,直接将Buffer转为可读流就能成功调用Whisper API。你之前的代码无效,问题不在于Readable.from()生成的流类型,而是请求时没有正确配置表单数据的格式——Whisper API要求用multipart/form-data格式上传音频,必须指定文件名和对应的MIME类型。
正确实现代码示例
下面是用axios和原生Readable流的完整调用示例:
const { Readable } = require('stream'); const axios = require('axios'); const FormData = require('form-data'); // 假设你已经有了audioBuffer(webm格式) const audioStream = Readable.from(audioBuffer); // 构建multipart/form-data表单 const formData = new FormData(); // 关键:指定文件名和MIME类型,Whisper需要识别音频格式 formData.append('file', audioStream, { filename: 'audio.webm', contentType: 'audio/webm' }); formData.append('model', 'whisper-1'); // 必须指定模型 // 发送请求 axios.post('https://api.openai.com/v1/audio/transcriptions', formData, { headers: { ...formData.getHeaders(), 'Authorization': `Bearer ${process.env.OPENAI_API_KEY}` }, responseType: 'json' }) .then(response => { console.log('转录结果:', response.data.text); }) .catch(error => { console.error('请求失败:', error.response?.data || error.message); });
关键注意点
- 表单配置:必须用
formData.append时传入文件名和Content-Type,否则Whisper API无法识别音频格式。 - 流的兼容性:
Readable.from()生成的可读流和fs.createReadStream()本质上都是符合Node.js Stream规范的,API完全兼容,不存在“不是ReadStream就不能用”的问题。 - 音频格式:确保你的
audioBuffer是Whisper支持的格式(webm、mp3等),如果格式不对也会导致请求失败。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

