const BaseEngine = require('../BaseEngine') const sdk = require('@google-cloud/text-to-speech'); const fs = require('fs'); const util = require('util'); module.exports = class GoogleCloudTTS extends BaseEngine { constructor() { super('google', 'Google Cloud TTS', 'wav'); this.client = new sdk.TextToSpeechClient(); this.client.initialize(); this.voices = {}; this.populateVoiceList(); } async populateVoiceList() { const [result] = await this.client.listVoices({}); const voiceList = result.voices; voiceList.forEach((voice) => { this.voices[voice.name.toLowerCase()] = { name: voice.name, lang: voice.languageCodes[0] }; }); } getDefaultVoice() { return 'en-US-Wavenet-A'; } async getSpeechFile(text, filepath, voice = this.getDefaultVoice(), params = {}) { const request = { input: { text: text }, voice: { name: this.voices[voice].name, languageCode: this.voices[voice].lang }, audioConfig: { audioEncoding: 'LINEAR16' }, }; let [response] = await this.client.synthesizeSpeech(request); const writeFile = util.promisify(fs.writeFile); await writeFile(filepath, response.audioContent, 'binary'); return filepath; } }