Как написать и получить временный двоичный файл с узлом Js? - PullRequest
0 голосов
/ 06 декабря 2018

Issue

Я работаю с Google Text To Speech ( TTS ) , чтобы сохранить сгенерированный двоичный аудиофайл в Google Cloud Storage ( ГСК ) .

Сохранение локального двоичного файла не кажется хорошей идеей в среде облачных функций Firebase.Поэтому я смотрю как записать и получить временный двоичный файл? Когда я пытаюсь получить созданный в данный момент временный файл, я получаю сообщение об ошибке.

В попытке найти решение ниже временного файлаотображается как сохраненный в журнале, затем я пытаюсь получить временный файл в успешной части обратного вызова создания файла.

Ошибка

Error: Cannot parse JSON response  
at ApiError (/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/build/src/util.js:43:9)
  at Util.parseHttpRespBody (/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/build/src/util.js:167:42)
  at Util.handleResp (/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/build/src/util.js:116:117)
  at retryRequest (/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/build/src/util.js:403:22)
  at onResponse (/user_code/node_modules/@google-cloud/storage/node_modules/retry-request/index.js:200:7)
  at /user_code/node_modules/@google-cloud/storage/node_modules/teeny-request/build/src/index.js:158:17
  at process._tickDomainCallback (internal/process/next_tick.js:135:7)

Попытка решения

const admin = require('firebase-admin');
const functions = require('firebase-functions');
const path = require('path');
const os = require('os');
const {Storage} = require('@google-cloud/storage');
const projectId = 'coinverse-media-staging';
const storage = new Storage({
  projectId: projectId,
});

const fs = require('fs');
const textToSpeech = require('@google-cloud/text-to-speech');

const client = new textToSpeech.TextToSpeechClient();

admin.initializeApp();

const text = 'Hello, world!';

const request = {
   input: {text: text},
   // Select the language and SSML Voice Gender (optional)
   voice: {languageCode: 'en-US', ssmlGender: 'NEUTRAL'},
   // Select the type of audio encoding
   audioConfig: {audioEncoding: 'MP3'},
}; 

exports.getAudiocast = functions.https.onCall((data, context) => {

var bucket = storage.bucket('gs://[project-name].appspot.com/content/feeds/en-audio/');

client.synthesizeSpeech(request, (err, response) => {
    if (err) {
      console.error('ERROR:', err);
      return;
    }

    const tempFile = path.join(os.tmpdir(), (data.id + '.mp3'));

    fs.writeFile(tempFile, response.audioContent, 'binary', err => {
      if (err) {
        console.error('ERROR:', err);
        return;
      }

      console.log('Audio content written to file: ' + tempFile);

      bucket.upload(tempFile), function(err, file) {
        if (!err) {
          console.log('Audiocast uploaded!');
        } else {
          console.error('Audiocast upload error: ' + err.message);
        }
      };
    });  
});

return {
    filePath: "cloudStorage/someFilePath",
};
});

Следующий шаг

Я попытаюсь загрузить обычный текстовый файл вместо двоичного файла, чтобы проверить, является ли временный формат файла проблемой.

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Тот же ответ, мой код:

    const http = require('http');
    const fs = require('fs');
    const path = require('path');
    const os = require('os');

    var options = {
        destination: ('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.mp3'),
        contentType: 'audio/' + audioType
    };

    function oedPromise() {
        return new Promise(function(resolve, reject) {
          const tempFile = path.join(os.tmpdir(), (word + '.mp3'));
          const file = fs.createWriteStream(tempFile)
          http.get(apiURL, function(response) {
            response.pipe(file)
            .on('error', function(error) {
              console.error(error);
              reject(error);
            })
            .on('finish', function() {
              myBucket.upload(tempFile, options)
              .then(function(data) {
                return;
              })
              .catch(error => console.error(error));
            });
          });
        });
    }
0 голосов
/ 07 декабря 2018

Спасибо @Doug_Stevenson и @AndersonMendes за руководство!

Решение

Я включил оба идентификатора bucket в мой Google Cloud Storage и путь к файлу в той же строке, которая была источником ошибки.

Bucket String

var bucket = storage.bucket('gs://[projectName].appspot.com');

Метод загрузки GCS

bucket.upload(tempFile, { destination: ("directory/someFolderName/" + fileName) }, (err, file) => {
        if (!err) {
          console.log('Audiocast uploaded!');
        } else {
          console.error('Audiocast upload error: ' + err.message);
        }
      });
...