Open4

node-fetchを利用しないと安定しない場合

shuyin02shuyin02

スタックチャンのwhisper部分でこけているっぽいので、whisperとAPIキーが問題ないかを検証するためにJSでwhisperを叩いていた時に発生した事故

Fetchの場合

事前にnpm i form-dataでNode.jsでFormDataを利用できるようにする

const FormData = require('form-data');
const fs = require('fs');

const main = async () => {
  const form = new FormData();
  form.append("model", "whisper-1");
  form.append("file", fs.createReadStream("firstvoice.wav"));

  const res = await fetch('https://api.openai.com/v1/audio/transcriptions', {
    method: 'POST',
    headers: {
      "Authorization": `Bearer ${process.env.OPENAI_API_KEY}`,
    },
    body: form
  });

  const text = await res.json();
  console.log(text);
}

main();

結果

node --env-file=.env test2.js
{
  error: {
    message: 'you must provide a model parameter',
    type: 'invalid_request_error',
    param: null,
    code: null
  }
}

まさかのエラーが発生

shuyin02shuyin02

node-fetchの場合

const FormData = require('form-data');
const fs = require('fs');
const fetch = require('node-fetch'); //追加

const main = async () => {
  const form = new FormData();
  form.append("model", "whisper-1");
  form.append("file", fs.createReadStream("firstvoice.wav"));

  const res = await fetch('https://api.openai.com/v1/audio/transcriptions', {
    method: 'POST',
    headers: {
      "Authorization": `Bearer ${process.env.OPENAI_API_KEY}`,
    },
    body: form
  });

  const text = await res.json();
  console.log(text);
}

main();

結果

node --env-file=.env test2.js
{ text: 'こんにちは本日はどうされましたか' }

こんなこともあるんですね

node-fetchはcommonJSで利用する場合、

npm install node-fetch@2

でインストールする必要がある(最新版はimportでないと使えない)ので注意が必要

https://www.npmjs.com/package/node-fetch

shuyin02shuyin02

axiosの場合

結局インストールするんだったらaxiosでも変わらなくね?

const FormData = require('form-data');
const fs = require('fs');
const axios = require('axios'); // axiosをインポート

const main = async () => {
  const form = new FormData();
  form.append("model", "whisper-1");
  form.append("file", fs.createReadStream("firstvoice.wav"));

  try {
    const res = await axios.post('https://api.openai.com/v1/audio/transcriptions', form, {
      headers: {
        "Authorization": `Bearer ${process.env.OPENAI_API_KEY}`,
        ...form.getHeaders() // formDataのヘッダーを追加
      }
    });

    console.log(res.data);
  } catch (error) {
    console.error('Error:', error.response ? error.response.data : error.message);
  }
}

main();

axiosでもいける
けど、formDataのヘッダー...form.getHeaders()を入れないとエラー

shuyin02shuyin02

kyの場合

axios使うくらいならkyが良いのでは?ということで使ってみたがうまくいかない

const FormData = require('form-data');
const fs = require('fs');

const main = async () => {
  const { default: ky } = await import('ky'); // kyはrequireできないので動的にimport
  const form = new FormData();
  form.append("model", "whisper-1");
  form.append("file", fs.createReadStream("firstvoice.wav"));

  try {
    const res = await ky.post('https://api.openai.com/v1/audio/transcriptions', {
      headers: {
        "Authorization": `Bearer ${process.env.OPENAI_API_KEY}`,
        ...form.getHeaders() // Content-Typeのヘッダー有無に関わらずうまくいかない
      },
      body: form
    }).json();

    console.log(res);
  } catch (error) {
    if (error.response) {
      const errorMessage = await error.response.json();
      console.error('Error:', errorMessage);
    } else {
      console.error('Error:', error);
    }
  }
}

main();
node --env-file=.env test2.js
Error: {
  error: {
    message: 'Could not parse multipart form',
    type: 'invalid_request_error',
    param: null,
    code: null
  }
}