如何同步ibm-watson的API调用文本到语音->语音到文本node.js

时间:2019-08-16 07:35:07

标签: node.js asynchronous text-to-speech ibm-watson speech-to-text

我想在文字转语音的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,

有人知道如何调用语音转文字吗?

0 个答案:

没有答案