Загрузка файла API в облачное хранилище Firebase? - PullRequest
0 голосов
/ 08 ноября 2018

Как сохранить аудиофайл (размером около 10 КБ) из текста в речь IBM Watson в Firebase Cloud Storage? Вот мой код, скопированный из документации IBM Watson :

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

var TextToSpeechV1 = require('watson-developer-cloud/text-to-speech/v1');
var fs = require('fs');    

exports.TextToSpeech = functions.firestore.document('Test_Value').onUpdate((change, context) => {

  var textToSpeech = new TextToSpeechV1({
    username: 'groucho',
    password: 'swordfish',
    url: 'https://stream.watsonplatform.net/text-to-speech/api'
  });

  var synthesizeParams = {
    text: 'Hello world',
    accept: 'audio/wav',
    voice: 'en-US_AllisonVoice'
  };

  textToSpeech.synthesize(synthesizeParams).on('error', function(error) {
    console.log(error);
  }).pipe(fs.createWriteStream('hello_world.wav')); // what goes here?

  const file = ?????
  file.download()
  .then(function(data) {
    console.log("File downloaded."
  })
  .catch(error => {
    console.error(error);
  });
});

Отсутствует код между

}).pipe(fs.createWriteStream('hello_world.wav'));

и

file.download()

Каким-то образом мне нужно преобразовать файл, предоставленный IBM Watson, в файл, который распознает Firebase Cloud Storage. fs не разрешено в облачных функциях Google?

Кроме того, строка 6 не должна быть

var fs = require('fs-js');

не

var fs = require('fs'); 

Согласно NPM пакет fs устарел.

Разрешено ли pipe в облачных функциях Google? Если так, то к чему я передаю файл? Мне нужно что-то похожее на это:

}).pipe(file);
file.download()

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Спасибо dpopp07, я понял!

exports.TextToSpeech = functions.firestore.document('Test_Word').onUpdate((change, context) => {

if (change.after.data().word != undefined) {
    myWord = change.after.data().word;
    myWordFileType = myWord + '.ogg';

  var synthesizeParams = {
        text: myWord,
        accept: 'audio/ogg',
        voice: 'en-US_AllisonVoice'
      };

      const {Storage} = require('@google-cloud/storage');
      const storage = new Storage();
      const bucket = storage.bucket('myapp.appspot.com');
      const file = bucket.file('Test_Folder' + myWordFileType);

      var TextToSpeechV1 = require('watson-developer-cloud/text-to-speech/v1');

      var textToSpeech = new TextToSpeechV1({
        username: 'groucho',
        password: 'swordfish',
        url: 'https://stream.watsonplatform.net/text-to-speech/api'
      });

      textToSpeech.synthesize(synthesizeParams).on('error', function(error) {
        console.log(error);
      }).pipe(file.createWriteStream({contentType: 'auto'}))
      .on('error', function(err) {})
      .on('finish', function() {
        console.log("Complete.");
      });
      }
      return 0;
    });

Функция срабатывает, когда новое слово записывается в папку Firestore, затем извлекает слово и вызывает его myWord. Добавление .ogg составляет myWordFileType. Функции отправляют HTTP-запрос в IBM Watson Text-to-speech, который возвращает обратный вызов, а не обещание, поэтому код немного уродливый. Суть в том, что HTTP-ответ проходит через команду Node pipe для отправки файла в команду Google Cloud Storage file.createWriteStream . contentType должен быть установлен для получения читаемого файла, но auto делает это легко. Затем файл записывается в корзину, которая установлена ​​в моей папке Firebase Cloud Storage Test_Folder, а имя файла - myWordFileType.

0 голосов
/ 09 ноября 2018

Хорошо, просматривая документацию для file.download(), я думаю, что вы можете сделать это с небольшими изменениями в своем коде. file должен быть типа File из библиотеки Google Storage (вам нужно установить эту библиотеку ). Этот тип имеет метод с именем createWriteStream, в который вы можете передавать результаты synthesize. Я не проверял это, но считаю, что это должно быть правильно или, по крайней мере, должно указывать вам правильное направление:

// looks like you'll need to require this package also
const { Storage } = require('@google-cloud/storage');

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

var TextToSpeechV1 = require('watson-developer-cloud/text-to-speech/v1');
var fs = require('fs');    

const storage = new Storage();
const myBucket = storage.bucket('my-bucket');

exports.TextToSpeech = functions.firestore.document('Test_Value').onUpdate((change, context) => {

  var textToSpeech = new TextToSpeechV1({
    username: 'groucho',
    password: 'swordfish',
    url: 'https://stream.watsonplatform.net/text-to-speech/api'
  });

  var synthesizeParams = {
    text: 'Hello world',
    accept: 'audio/wav',
    voice: 'en-US_AllisonVoice'
  };

  const file = myBucket.file('my-file'); // name your file something here

  textToSpeech
    .synthesize(synthesizeParams)
    .on('error', function(error) {
      console.log(error);
    })
    .pipe(file.createWriteStream()) // the File object has a `createWriteStream` method for writing streams to it
    .on('error', function(err) {
      console.log(err);
    })
    .on('finish', function() {
      // The file upload is complete.
      file.download()
        .then(function(data) {
          console.log("File downloaded.");
        })
        .catch(error => {
          console.error(error);
        });
    });
});

Для записи:

  • pipe() должно быть разрешено в облачных функциях Google, и является асинхронным. Вот почему вам нужно прослушать событие finish перед загрузкой файла
  • fs не рекомендуется использовать только в общедоступном NPM, но это не тот пакет, который вы импортировали, модуль fs (файловая система) является одним из встроенных пакетов ядра Node . Тем не менее, похоже, вам вообще не нужно это в своем коде
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...