Open4
node-fetchを利用しないと安定しない場合
スタックチャンの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
}
}
まさかのエラーが発生
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でないと使えない)ので注意が必要
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()
を入れないとエラー
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
}
}