clean up error handling in say verb

This commit is contained in:
Dave Horton
2022-04-21 10:27:33 -04:00
parent 359cb82d80
commit 698d12a95f
2 changed files with 42 additions and 35 deletions

View File

@@ -331,7 +331,7 @@ class CallSession extends Emitter {
speech_credential_sid: credential.speech_credential_sid, speech_credential_sid: credential.speech_credential_sid,
accessKeyId: credential.access_key_id, accessKeyId: credential.access_key_id,
secretAccessKey: credential.secret_access_key, secretAccessKey: credential.secret_access_key,
region: process.env.AWS_REGION || credential.aws_region region: credential.aws_region || process.env.AWS_REGION
}; };
} }
else if ('microsoft' === vendor) { else if ('microsoft' === vendor) {

View File

@@ -56,17 +56,18 @@ class TaskSay extends Task {
// synthesize all of the text elements // synthesize all of the text elements
let lastUpdated = false; let lastUpdated = false;
/* produce an audio segment from the provided text */
const generateAudio = async(text) => {
if (this.killed) return;
if (text.startsWith('silence_stream://')) return text;
/* otel: trace time for tts */ /* otel: trace time for tts */
const {span} = this.startChildSpan('tts-generation', { const {span} = this.startChildSpan('tts-generation', {
'tts.vendor': vendor, 'tts.vendor': vendor,
'tts.language': language, 'tts.language': language,
'tts.voice': voice 'tts.voice': voice
}); });
this.ttsSpan = span; try {
const filepath = (await Promise.all(this.text.map(async(text) => {
if (this.killed) return;
if (text.startsWith('silence_stream://')) return text;
const {filePath, servedFromCache} = await synthAudio(stats, { const {filePath, servedFromCache} = await synthAudio(stats, {
text, text,
vendor, vendor,
@@ -75,15 +76,7 @@ class TaskSay extends Task {
engine, engine,
salt, salt,
credentials credentials
}).catch((err) => {
this.logger.info(err, 'Error synthesizing tts');
writeAlerts({
account_sid: cs.accountSid,
alert_type: AlertType.TTS_NOT_PROVISIONED,
vendor,
detail: err.message
}); });
}).catch((err) => this.logger.info({err}, 'Error generating alert for tts failure'));
this.logger.debug(`file ${filePath}, served from cache ${servedFromCache}`); this.logger.debug(`file ${filePath}, served from cache ${servedFromCache}`);
if (filePath) cs.trackTmpFile(filePath); if (filePath) cs.trackTmpFile(filePath);
if (!servedFromCache && !lastUpdated) { if (!servedFromCache && !lastUpdated) {
@@ -91,15 +84,29 @@ class TaskSay extends Task {
updateSpeechCredentialLastUsed(credentials.speech_credential_sid) updateSpeechCredentialLastUsed(credentials.speech_credential_sid)
.catch(() => {/*already logged error */}); .catch(() => {/*already logged error */});
} }
this.ttsSpan.setAttributes({'tts.cached': servedFromCache}); span.setAttributes({'tts.cached': servedFromCache});
span.end();
return filePath; return filePath;
}))).filter((fp) => fp && fp.length); } catch (err) {
this.ttsSpan?.end(); this.logger.info({err}, 'Error synthesizing tts');
span.end();
writeAlerts({
account_sid: cs.accountSid,
alert_type: AlertType.TTS_NOT_PROVISIONED,
vendor,
detail: err.message
}).catch((err) => this.logger.info({err}, 'Error generating alert for tts failure'));
return;
}
};
const arr = this.text.map((t) => generateAudio(t));
const filepath = (await Promise.all(arr)).filter((fp) => fp && fp.length);
this.logger.debug({filepath}, 'synthesized files for tts'); this.logger.debug({filepath}, 'synthesized files for tts');
while (!this.killed && (this.loop === 'forever' || this.loop--) && this.ep?.connected) { while (!this.killed && (this.loop === 'forever' || this.loop--) && this.ep?.connected) {
let segment = 0; let segment = 0;
do { while (!this.killed && segment < filepath.length) {
if (cs.isInConference) { if (cs.isInConference) {
const {memberId, confName, confUuid} = cs; const {memberId, confName, confUuid} = cs;
await this.playToConfMember(this.ep, memberId, confName, confUuid, filepath[segment]); await this.playToConfMember(this.ep, memberId, confName, confUuid, filepath[segment]);
@@ -109,10 +116,10 @@ class TaskSay extends Task {
await ep.play(filepath[segment]); await ep.play(filepath[segment]);
this.logger.debug(`Say:exec completed play file ${filepath[segment]}`); this.logger.debug(`Say:exec completed play file ${filepath[segment]}`);
} }
} while (!this.killed && ++segment < filepath.length); segment++;
}
} }
} catch (err) { } catch (err) {
this.ttsSpan?.end();
this.logger.info(err, 'TaskSay:exec error'); this.logger.info(err, 'TaskSay:exec error');
} }
this.emit('playDone'); this.emit('playDone');