как вернуть результат из longrunningRecognize, используя шаблон генератора событий? - PullRequest
0 голосов
/ 06 марта 2019

Поэтому я последовал примеру Google с шаблоном отправителя событий, но немного изменил его, чтобы удовлетворить мои потребности. Однако что-то потеряно, и моя функция transcribe возвращает undefined.

Пожалуйста, помогите мне, как мне вернуть результат из operation.on ('complete' ...)?

вот как функция транскрибирования вызова:

const { transcribe } = require('./helpers/')
const tr = await transcribe(gcsuri) 

и это реализация транскрибирования:

exports.transcribe = async (gcsuri) => {

    const reducerforSingleAlternative = (obj, item, index, array) => {
        item.alternatives[0].words.map(word => obj.words.push(word))
        obj.confidence += item.alternatives[0].confidence
        obj.transcript += item.alternatives[0].transcript
        if (index === (array.length - 1)) {
            obj.confidence = obj.confidence / array.length
        }
        return obj
    }

    process.env.GOOGLE_APPLICATION_CREDENTIALS = process.env.SPEECH_KEY
    const speech = require('@google-cloud/speech').v1p1beta1
    const client = new speech.SpeechClient()
    const audio = {
        uri: gcsuri
    }
    const request = {
        audio: audio,
        config: { encoding: 'OGG_OPUS',
                  sampleRateHertz: 24000,
                  languageCode: 'ru',
                  enableSpeakerDiarization: true,
                  enableWordConfidence: true,
                  maxAlternatives: 1,
                  enableAutomaticPunctuation: true, 
                  enableWordTimeOffsets: true, 
                }
    }

const [operation, initialApiResponse] = await client.longRunningRecognize(request)


        operation.on('progress', (metadata, apiResponse) => {
            console.log('metadata', metadata, apiResponse)
        })

        operation.on('complete', (result, metadata, finalApiResponse) => {
            console.log("complete!")
            const res = result.results.reduce(reducerforSingleAlternative, {words:[], confidence:0, transcript:""})
            return res
        })

        operation.on('error', err => {
            throw(err)
        })
}

Я пытался также

return await new Promise((resolve, reject) => {

    operation.on...
    ...
}

Но, как ни странно, этот код порождал две идентичные операции по одному запросу, поэтому я догадался, что я что-то делал не так

...