UNPKG

infobot-sber-tts

Version:

Node.JS library for Sber SmartSpeech Text-To-Speech

90 lines (82 loc) 3.32 kB
const {v4: uuidv4} = require('uuid'); const axios = require("axios"); const qs = require('querystring'); const https = require('https'); const fs = require('fs'); class InfobotSberTTS { constructor(clientId, clientSecret) { this.clientId = clientId; this.clientSecret = clientSecret; this.token = null; this.httpsAgent = new https.Agent({ ca: [ fs.readFileSync(`${__dirname}/certs/russian_trusted_root_ca.cer`), fs.readFileSync(`${__dirname}/certs/russian_trusted_sub_ca.cer`) ], keepAlive: false }); if (!this.clientId) throw new Error('No Service Client ID provided'); if (!this.clientSecret) throw new Error('No Service Client Secret provided'); } generateToken() { const self = this; return new Promise(function (resolve, reject) { if (!(self.token && self.tokenExpire && self.tokenExpire < (new Date().getTime() - 10 * 1000))) { const payload = { 'scope': 'SBER_SPEECH' }; const code = Buffer.from(`${self.clientId}:${self.clientSecret}`).toString('base64'); axios({ method: 'post', url: 'https://ngw.devices.sberbank.ru:9443/api/v2/oauth', headers: { 'RqUID': uuidv4(), 'Authorization': `Basic ${code}`, }, data: qs.encode(payload), httpsAgent: self.httpsAgent }).then(result => { self.token = result.data.access_token; self.tokenExpire = result.data.expires_at; resolve(self.token); }).catch(e => { reject(e); }) } else { resolve(self.token); } }); } generateAudio(text, params) { const self = this; return new Promise(function (resolve, reject) { if (!text) reject('No text specified'); self.generateToken().then(function () { params.format = params.format || 'opus'; params.voice = params.voice || 'Nec_24000'; const data = { voice: params.voice, format: params.format, }; axios({ method: 'post', url: 'https://smartspeech.sber.ru/rest/v1/text:synthesize', headers: { 'Authorization': 'Bearer ' + self.token, 'Content-Type': params.ssml ? 'application/ssml' : 'application/text' }, params: data, data: text, responseType: 'arraybuffer', httpsAgent: self.httpsAgent }).then(result => { resolve(result.data); }).catch(e => { reject(e); }) }).catch(function (err) { reject(err); }); }); } } module.exports = InfobotSberTTS;