我想在文字转语音的IBM API之后立即调用语音转文字的IBM API。但是由于文本到语音转换必须下载音频文件,因此在文件存在之前调用第二个API,因此会引发错误。
我不太擅长异步或同步任务,而且我不知道如何在正确的时间调用第二个API。
我试图在第二次调用之前设置超时,或者只是等待一段时间以确保文件已创建,甚至进行for循环,直到文件出现在我的PC上,但无济于事。
我的函数可以调用第一个API,然后调用第二个API:
router.get('/', async function(req, res, next) {
//Read get parameters and store them
let turns = req.query.turns;
let name = req.query.name;
let base = req.query.base;
let lang = req.query.lang;
//Declare some temporary arrays to keep track of intermediate results
let interLang = [];
let interSent = [];
let interAudio = [];
let actSent = '';
//Store given sentence or word
interSent.push(base);
//Start game loop
for (let i = 0; i < turns; i++) {
//Select another language of the one given in parameter
let actLang = t2s.langArray[randomIntInc(0, t2s.langArray.length - 1)];
while (lang.search(actLang.substring(0, 4)) !== -1) {
actLang = t2s.langArray[randomIntInc(0, t2s.langArray.length - 1)];
}
//Setup the parameters for voice synthesizing
const synthesizeParams = {
text: interSent[interSent.length - 1],
accept: 'audio/wav',
voice: actLang,
};
//Store the result in an unique file
let name = uuidv4() + '.wav';
t2s.textToSpeech.synthesize(synthesizeParams)
.then(audio => {
audio.pipe(fs.createWriteStream(name));
})
.catch(err => {
console.log('error:', err);
});
try {
await fs.promises.access(name);
const recognizeParams = {
audio: fs.createReadStream(name),
content_type: 'audio/wav',
word_alternatives_threshold: 0.9,
keywords: [base],
keywords_threshold: 0.5,
};
s2t.speechToText.recognize(recognizeParams, null)
.then(speechRecognitionResults => {
actSent = JSON.stringify(speechRecognitionResults, null, 2);
})
.catch(err => {
console.log('error:', err);
});
break;
} catch (error) {
console.log('No files\n'+error);
}
//Store intermediates results
interLang.push(actLang);
interSent.push(actSent);
interAudio.push(name);
//Remove 1st sentence that will be useless here
interSent.shift();
}
let final = (turns !== 1 ? base : interSent[interSent - 1]);
interSent.pop();
let results = {
turns: turns,
player: name,
baseSentence: base,
finalSentence: final,
baseLanguage: lang,
intermediateLanguages: interLang,
intermediateSentences: interSent,
intermediateAudioFile: interAudio,
note: turns
};
let test = new game(results);
let saved = test.save(function (err) {
if (err) return console.log('Error while processing the save');
console.log('New game saved !')
});
res.json(results);
});
每次我得到:
Error: ENOENT: no such file or directory,
有人知道如何调用语音转文字吗?