You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:57:31