95 lines
2 KiB
JavaScript
95 lines
2 KiB
JavaScript
const https = require('https');
|
|
const querystring = require('querystring');
|
|
const aws4 = require('aws4');
|
|
|
|
class PollyTTS {
|
|
constructor(credentials) {
|
|
this.credentials = credentials;
|
|
}
|
|
|
|
textToSpeech(options, callback) {
|
|
if (!options) {
|
|
return callback(new Error('Options are missing'));
|
|
}
|
|
const qs = {
|
|
Text: options.text,
|
|
TextType: options.textType || 'text',
|
|
VoiceId: options.voiceId || 'Vicki',
|
|
SampleRate: options.sampleRate || 22050,
|
|
OutputFormat: options.outputFormat || 'mp3',
|
|
};
|
|
const opts = {
|
|
service: 'polly',
|
|
region: options.region || 'eu-west-1',
|
|
path: `/v1/speech?${querystring.stringify(qs)}`,
|
|
signQuery: true,
|
|
};
|
|
|
|
// you can also pass AWS credentials in explicitly (otherwise taken from process.env)
|
|
aws4.sign(opts, this.credentials);
|
|
https
|
|
.get(opts, (res) => {
|
|
if (res.statusCode !== 200) {
|
|
return callback(
|
|
new Error(`Request Failed. Status Code: ${res.statusCode}`),
|
|
);
|
|
}
|
|
callback(null, res);
|
|
return true;
|
|
})
|
|
.on('error', (e) => {
|
|
callback(e);
|
|
});
|
|
|
|
return null;
|
|
}
|
|
|
|
describeVoices(options, callback) {
|
|
if (!options) {
|
|
return callback(new Error('Options are missing'));
|
|
}
|
|
const qs = {};
|
|
|
|
if (options.languageCode) {
|
|
qs.LanguageCode = options.languageCode;
|
|
}
|
|
|
|
if (options.nextToken) {
|
|
qs.NextToken = options.nextToken;
|
|
}
|
|
|
|
const opts = {
|
|
service: 'polly',
|
|
region: options.region || 'eu-west-1',
|
|
path: `/v1/voices?${querystring.stringify(qs)}`,
|
|
signQuery: true,
|
|
};
|
|
|
|
// you can also pass AWS credentials in explicitly (otherwise taken from process.env)
|
|
aws4.sign(opts, this.credentials);
|
|
https
|
|
.get(opts, (res) => {
|
|
if (res.statusCode !== 200) {
|
|
return callback(
|
|
new Error(`Request Failed. Status Code: ${res.statusCode}`),
|
|
);
|
|
}
|
|
let body = '';
|
|
res.on('readable', () => {
|
|
body += res.read();
|
|
});
|
|
res.on('end', () => {
|
|
callback(null, body);
|
|
});
|
|
|
|
return undefined;
|
|
})
|
|
.on('error', (e) => {
|
|
callback(e);
|
|
});
|
|
|
|
return null;
|
|
}
|
|
}
|
|
|
|
module.exports = PollyTTS;
|