I am currently using amazon polly to generate sound files from data however when I run my script I keep getting the error message:
ThrottlingException: Rate exceeded.
What I have currently
Here is the function that I use
function createAudioFiles(data, outputDir) {
console.log('in createAudioFiles with data: ' , data);
return new Promise((resolve, reject) => {
let successessfullyCompletedAmount = 0;
for ({ audioText, filename } of data) {
createAudio(audioText, filename, outputDir)
.then(({ status, message }) => {
if (status == "success") {
successessfullyCompletedAmount++;
console.log(message);
}
// if all audio files have been created
if (successessfullyCompletedAmount == data.length) {
resolve({
status: 'success',
message: "successfully created audioFiles"
})
}
})
}
});
}
The createAudio function in that function is:
function createAudio(text, filename, outputDir) {
let params = {
'Text': text,
'OutputFormat': 'mp3',
'VoiceId': 'Amy'
};
return new Promise((resolve, reject) => {
Polly.synthesizeSpeech(params, (err, data) => {
if (err) {
console.log("errors found");
console.log(err);
} else if (data) {
if (data.AudioStream instanceof Buffer) {
fs.writeFile(`${outputDir}/${filename}`, data.AudioStream, function (err) {
if (err) {
return reject({
status: "error",
message: err
})
}
resolve({
status: "success",
message: filename + " saved"
});
})
}
}
});
})
}.
What I tried.
I tried adding a setTimeout()
wrapper on the for
loop like so:
setTimeout(function() {
for ({ audioText, filename } of data) {
createAudio(audioText, filename, outputDir)
.then(({ status, message }) => {
if (status == "success") {
successessfullyCompletedAmount++;
console.log(message);
}
// if all audio files have been created
if (successessfullyCompletedAmount == data.length) {
resolve({
status: 'success',
message: "successfully created audioFiles"
})
}
})
}
}, 2000);
but that does not seem to change anything. What I think is happening is all the data seems to be gathered and sent at once.
What I want to happen.
I would like to add a small delay between each 'get' from amazon to slow down the rate.