NodeJS中如何将Buffer转换为可读流适配OpenAI Whisper
问题:如何直接将Buffer转为可读流传入OpenAI Whisper转录?
我通过输入获取了一个Buffer:
const fileData = Buffer.concat(chunks);
随后将其传入OpenAI的Whisper进行转录,但直接传入Buffer无法运行:
const resp = await openai.createTranscription( //@ts-ignore fileData, "whisper-1", );
目前我只能先将Buffer写入磁盘:
fs.writeFileSync("input.wav", fileData);
再通过可读流读取后传入:
const resp = await openai.createTranscription( //@ts-ignore createReadStream("input.wav"), "whisper-1", );
这种方式可行,但我不想每次都写入磁盘,请问能否直接将Buffer转换为NodeJS可读流或实现同等效果?
解决方案:直接将Buffer转为可读流
可以通过Node.js内置的stream.Readable模块,在内存中将Buffer转换为可读流,无需写入磁盘,具体有两种实现方式:
方法一:使用Readable.from()(推荐,Node.js v12.3.0+支持)
这是最简洁的实现方式,直接从Buffer生成可读流:
const { Readable } = require('stream'); // ES模块环境:import { Readable } from 'stream'; // 将Buffer转换为可读流 const fileStream = Readable.from(fileData); // 直接传入Whisper转录接口 const resp = await openai.createTranscription( //@ts-ignore fileStream, "whisper-1", );
方法二:手动实例化Readable(兼容低版本Node.js)
如果需要兼容v12.3.0以下的Node.js版本,可以手动构建可读流:
const { Readable } = require('stream'); const fileStream = new Readable(); // 推送Buffer数据到流中 fileStream.push(fileData); // 推送null标记流结束 fileStream.push(null); // 调用Whisper转录接口 const resp = await openai.createTranscription( //@ts-ignore fileStream, "whisper-1", );
注意事项
- 两种方法都完全在内存中处理,避免了磁盘IO的开销
- OpenAI的
createTranscription接口完全支持标准Node.js可读流作为输入 - TypeScript环境下,若遇到类型不匹配的报错,可保留
//@ts-ignore注释,或给流添加类型断言:fileStream as unknown as File
内容的提问来源于stack exchange,提问作者vsr
相关产品推荐
相关产品推荐

