使用Cloud Function

时间:2018-06-24 11:41:01

标签: javascript node.js promise google-cloud-functions

这就是我要使用Cloud Function进行的操作。

将某些音频文件上传到FireStorage时,它将转换为mp3格式。之后,我想使用CLOUD SPEECH-TO-TEXT取得成绩单。

但我不断收到此错误消息:

Each then() should return a value or throw

我对javascript不熟悉。 这是我有关云功能的全部代码。

'use strict';

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const gcs = require('@google-cloud/storage')();
const speech = require('@google-cloud/speech');
const path = require('path');
const os = require('os');
const fs = require('fs');
const ffmpeg = require('fluent-ffmpeg');
const ffmpeg_static = require('ffmpeg-static');

admin.initializeApp(functions.config().firebase);
var db = admin.firestore();

function promisifyCommand(command) {
return new Promise((resolve, reject) => {
    command
        .on('end', () => {
        resolve();
        })
        .on('error', (error) => {
        reject(error);
        })
        .run();
});
}

/**
 * When an audio is uploaded in the Storage bucket We generate a mono channel audio automatically using
 * node-fluent-ffmpeg.
 */
exports.generateMonoAudio = functions.storage.object().onFinalize((object) => {
const fileBucket = object.bucket; // The Storage bucket that contains the file.
const filePath = object.name; // File path in the bucket.
const contentType = object.contentType; // File content type.
const metageneration = object.metageneration; // Number of times metadata has been generated. New objects have a value of 1.

// Exit if this is triggered on a file that is not an audio.
if (!contentType.startsWith('audio/')) {
    console.log('This is not an audio.');
    return null;
}

// Get the file name.
const fileName = path.basename(filePath);
// Exit if the audio is already converted.
if (fileName.endsWith('_output.mp3')) {
    console.log('Already a converted audio.');
    return null;
}

// Download file from bucket.
const bucket = gcs.bucket(fileBucket);
const tempFilePath = path.join(os.tmpdir(), fileName);
// We add a '_output.mp3' suffix to target audio file name. That's where we'll upload the converted audio.
const targetTempFileName = fileName.replace(/\.[^/.]+$/, '') + '_output.mp3';
const targetTempFilePath = path.join(os.tmpdir(), targetTempFileName);
const targetStorageFilePath = path.join(path.dirname(filePath), targetTempFileName);

return bucket.file(filePath).download({
    destination: tempFilePath,
}).then(() => {
    console.log('Audio downloaded locally to', tempFilePath);
    // Convert the audio to mono channel using FFMPEG.

    let command = ffmpeg(tempFilePath)
        .setFfmpegPath(ffmpeg_static.path)
        .audioChannels(2)
        .audioFrequency(32000)
        .format('mp3')
        .output(targetTempFilePath);

    command = promisifyCommand(command);

    return command;
}).then(() => {
    console.log('Output audio created at', targetTempFilePath);

    // Uploading the audio.
    return bucket.upload(targetTempFilePath, {destination: targetStorageFilePath});
}).then(() => {
    console.log('Output audio uploaded to', targetStorageFilePath);

    // Once the audio has been uploaded delete the local file to free up disk space.
    fs.unlinkSync(tempFilePath);
    fs.unlinkSync(targetTempFilePath);

    getTextFromAudio(targetStorageFilePath) //#### HERE! ERROR

    return console.log('Temporary files removed.', targetTempFilePath);
});
});

function getTextFromAudio(paramTargetStorageFilePath) {
    // Creates a client
    const client = new speech.SpeechClient();

    // Reads a local audio file and converts it to base64
    const file = fs.readFileSync(paramTargetStorageFilePath);
    const audioBytes = file.toString('base64');

    // The audio file's encoding, sample rate in hertz, and BCP-47 language code
    const audio = {
        content: audioBytes,
    };
    const config = {
        encoding: 'LINEAR16',
        sampleRateHertz: 16000,
        languageCode: 'en-US',
    };
    const request = {
        audio: audio,
        config: config,
    };

    // Detects speech in the audio file
    return client
        .recognize(request)
        .then(data => {
            const response = data[0];
            const transcription = response.results
                .map(result => result.alternatives[0].transcript)
                .join('\n');

            console.log(`Transcription: ${transcription}`);
        }).catch(err => {
            console.error('ERROR:', err);
        });
}

function postTranscript(transcriptText) {
    var docRef = db.collection('users').doc('alovelace');

    var setAda = docRef.set({
    first: transcriptText
    });
}

0 个答案:

没有答案