Nest.js调用OpenAI Whisper API遇类型错误:ReadStream无法赋值给File
问题原因及解决办法
错误原因
这个TypeScript报错的核心是类型不匹配:
你调用openai.createTranscription时传入的fs.createReadStream(filePath)返回的是Node.js环境下的ReadStream类型,但当前OpenAI SDK的类型定义默认期望的是浏览器端的File对象(该对象包含lastModified、name等专属属性),两者的类型结构完全不兼容,因此触发TS类型检查错误。
另外你当前的代码存在冗余操作:已经拿到了音频的Buffer,却还要写入本地文件再通过读流传递,既浪费IO资源,又引入了类型问题。
解决办法
推荐直接使用已有的Buffer作为参数传递给createTranscription,这是最简洁高效的方式,同时也能完美解决类型问题:
修改speech-to-text.service.ts的代码:
async transcribeAudio(fileBuffer: Buffer): Promise<string> { try { const resp = await this.openai.createTranscription( fileBuffer, 'whisper-1', undefined, // 可选:指定音频语言,比如'zh' 'json', // 可选:响应格式 1, // 可选:温度参数,控制输出随机性 'mp3' // 必填:指定音频格式,需和上传文件格式一致 ); return resp.data.text; } catch (error) { console.error('Transcription error:', error); throw new Error('Failed to transcribe the audio file.'); } }
如果坚持要使用本地文件读流的方式,可通过类型断言绕过TS的类型检查:
const resp = await this.openai.createTranscription( fs.createReadStream(filePath) as unknown as File, 'whisper-1' );
但这种方式不推荐,因为类型断言本质是绕过类型检查,可能隐藏潜在问题,且不如直接用Buffer高效。
内容的提问来源于stack exchange,提问作者Zeenath
相关产品推荐
相关产品推荐

