From 698d12a95fc66813844b7ac70b08b5d92cbb5fd8 Mon Sep 17 00:00:00 2001 From: Dave Horton Date: Thu, 21 Apr 2022 10:27:33 -0400 Subject: [PATCH] clean up error handling in say verb --- lib/session/call-session.js | 2 +- lib/tasks/say.js | 75 ++++++++++++++++++++----------------- 2 files changed, 42 insertions(+), 35 deletions(-) diff --git a/lib/session/call-session.js b/lib/session/call-session.js index 7302a598..c3ec5b45 100644 --- a/lib/session/call-session.js +++ b/lib/session/call-session.js @@ -331,7 +331,7 @@ class CallSession extends Emitter { speech_credential_sid: credential.speech_credential_sid, accessKeyId: credential.access_key_id, 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) { diff --git a/lib/tasks/say.js b/lib/tasks/say.js index a6f09eb5..dc25245c 100644 --- a/lib/tasks/say.js +++ b/lib/tasks/say.js @@ -56,50 +56,57 @@ class TaskSay extends Task { // synthesize all of the text elements let lastUpdated = false; - /* otel: trace time for tts */ - const {span} = this.startChildSpan('tts-generation', { - 'tts.vendor': vendor, - 'tts.language': language, - 'tts.voice': voice - }); - this.ttsSpan = span; - - const filepath = (await Promise.all(this.text.map(async(text) => { + /* produce an audio segment from the provided text */ + const generateAudio = async(text) => { if (this.killed) return; if (text.startsWith('silence_stream://')) return text; - const {filePath, servedFromCache} = await synthAudio(stats, { - text, - vendor, - language, - voice, - engine, - salt, - credentials - }).catch((err) => { - this.logger.info(err, 'Error synthesizing tts'); + + /* otel: trace time for tts */ + const {span} = this.startChildSpan('tts-generation', { + 'tts.vendor': vendor, + 'tts.language': language, + 'tts.voice': voice + }); + try { + const {filePath, servedFromCache} = await synthAudio(stats, { + text, + vendor, + language, + voice, + engine, + salt, + credentials + }); + this.logger.debug(`file ${filePath}, served from cache ${servedFromCache}`); + if (filePath) cs.trackTmpFile(filePath); + if (!servedFromCache && !lastUpdated) { + lastUpdated = true; + updateSpeechCredentialLastUsed(credentials.speech_credential_sid) + .catch(() => {/*already logged error */}); + } + span.setAttributes({'tts.cached': servedFromCache}); + span.end(); + return filePath; + } catch (err) { + 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')); - this.logger.debug(`file ${filePath}, served from cache ${servedFromCache}`); - if (filePath) cs.trackTmpFile(filePath); - if (!servedFromCache && !lastUpdated) { - lastUpdated = true; - updateSpeechCredentialLastUsed(credentials.speech_credential_sid) - .catch(() => {/*already logged error */}); + }).catch((err) => this.logger.info({err}, 'Error generating alert for tts failure')); + return; } - this.ttsSpan.setAttributes({'tts.cached': servedFromCache}); - return filePath; - }))).filter((fp) => fp && fp.length); - this.ttsSpan?.end(); + }; + + 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'); while (!this.killed && (this.loop === 'forever' || this.loop--) && this.ep?.connected) { let segment = 0; - do { + while (!this.killed && segment < filepath.length) { if (cs.isInConference) { const {memberId, confName, confUuid} = cs; await this.playToConfMember(this.ep, memberId, confName, confUuid, filepath[segment]); @@ -109,10 +116,10 @@ class TaskSay extends Task { await ep.play(filepath[segment]); this.logger.debug(`Say:exec completed play file ${filepath[segment]}`); } - } while (!this.killed && ++segment < filepath.length); + segment++; + } } } catch (err) { - this.ttsSpan?.end(); this.logger.info(err, 'TaskSay:exec error'); } this.emit('playDone');