Как записать файл в Firebase Storage из Google Text-to-Speech API (fs.writeFile vs createWriteStream)? - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь записать аудиофайл API Google Cloud Text-to-Speech в Firebase Storage.Документация Node.js показывает, как записать в локальный файл, используя fs.writeFile, но я думаю, что мне нужно использовать что-то еще, возможно, file.writefile или fs.createWriteStream.

Я изменил пример документации как запись функции облака Firebase в хранилище Firebase:

exports.Google_T2S = functions.firestore.document('Users/{userID}/Spanish/T2S_Request').onUpdate((change, context) => {
  if (change.after.data().word != undefined) {
    const word = change.after.data().word;
    const longLanguage = 'Spanish';
    const audioFormat = '.mp3';

    const fs = require('fs');
    const util = require('util');
    const textToSpeech = require('@google-cloud/text-to-speech'); // Imports the Google Cloud client library
    const client = new textToSpeech.TextToSpeechClient(); // Creates a client
    const text = word; // The text to synthesize

    let myWordFile = word.replace(/ /g,"_"); // replace spaces with underscores in the file name
    myWordFile = myWordFile.toLowerCase(); // convert the file name to lower case
    myWordFile = myWordFile + audioFormat; // append .mp3 to the file name;

    // boilerplate copied from https://cloud.google.com/blog/products/gcp/use-google-cloud-client-libraries-to-store-files-save-entities-and-log-data
    const {Storage} = require('@google-cloud/storage');
    const storage = new Storage();
    const bucket = storage.bucket('myApp.appspot.com');
    const file = bucket.file('Audio/' + longLanguage + '/' + myWordFile);

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

    async function test() {
      try {
        // Performs the Text-to-Speech request
        const [response] = await client.synthesizeSpeech(request);

        // Write the binary audio content to a local file
        const writeFile = util.promisify(fs.writeFile);

        await writeFile(file, response.audioContent, 'binary');
        console.log('Audio content written to file: output.mp3');
      } catch (error) {
        console.error(error);
      }
    }
    test();

  }
});

Сообщение об ошибке:

TypeError: path must be a string or Buffer
    at fs.writeFile (fs.js:1277:6)

Это говорит о том, что проблема заключается в параметре file в строке

await writeFile(file, response.audioContent, 'binary');

Согласно документации , этот параметр должен быть строкой, буфером, URL или целым числом.Я дал ему функцию.Я предполагаю, что мне нужно использовать что-то другое, чем fs.writeFile.Возможно fs.createWriteStream?Или я должен изменить fs.writeFile на file.writeFile?

Кроме того, почему в Google Cloud Text-to-Speech API документация использует await без async?

...