updates for lex v2

This commit is contained in:
Dave Horton
2020-10-26 09:59:10 -04:00
parent 6b63009707
commit b47e490424
4 changed files with 112 additions and 93 deletions

View File

@@ -7,10 +7,16 @@ class Lex extends Task {
super(logger, opts); super(logger, opts);
this.preconditions = TaskPreconditions.Endpoint; this.preconditions = TaskPreconditions.Endpoint;
this.credentials = this.data.credentials; if (this.data.credentials) {
this.bot = this.data.bot; this.awsAccessKeyId = this.data.credentials.accessKey;
this.alias = this.data.alias; this.awsSecretAccessKey = this.data.credentials.secretAccessKey;
}
this.bot = this.data.botId;
this.alias = this.data.botAlias;
this.region = this.data.region; this.region = this.data.region;
this.locale = this.data.locale || 'en_US';
this.intent = this.data.intent;
this.welcomeMessage = this.data.welcomeMessage;
this.bargein = this.data.bargein || false; this.bargein = this.data.bargein || false;
this.passDtmf = this.data.passDtmf || false; this.passDtmf = this.data.passDtmf || false;
if (this.data.noInputTimeout) this.noInputTimeout = this.data.noInputTimeout * 1000; if (this.data.noInputTimeout) this.noInputTimeout = this.data.noInputTimeout * 1000;
@@ -22,12 +28,8 @@ class Lex extends Task {
this.botName = `${this.bot}:${this.alias}:${this.region}`; this.botName = `${this.bot}:${this.alias}:${this.region}`;
if (this.data.eventHook) this.eventHook = this.data.eventHook; if (this.data.eventHook) this.eventHook = this.data.eventHook;
if (this.eventHook && Array.isArray(this.data.events)) { this.events = this.eventHook ?
this.events = this.data.events; [
}
else if (this.eventHook) {
// send all events by default - except interim transcripts
this.events = [
'intent', 'intent',
'transcription', 'transcription',
'dtmf', 'dtmf',
@@ -35,11 +37,7 @@ class Lex extends Task {
'stop-play', 'stop-play',
'play-interrupted', 'play-interrupted',
'response-text' 'response-text'
]; ] : [];
}
else {
this.events = [];
}
if (this.data.actionHook) this.actionHook = this.data.actionHook; if (this.data.actionHook) this.actionHook = this.data.actionHook;
} }
@@ -51,10 +49,10 @@ class Lex extends Task {
try { try {
await this.init(cs, ep); await this.init(cs, ep);
this.logger.debug(`starting lex bot ${this.botName}`); this.logger.debug(`starting lex bot ${this.botName} with locale ${this.locale}`);
// kick it off // kick it off
this.ep.api('aws_lex_start', `${this.ep.uuid} ${this.bot} ${this.alias} ${this.region}`) this.ep.api('aws_lex_start', `${this.ep.uuid} ${this.bot} ${this.alias} ${this.region} ${this.locale}`)
.catch((err) => { .catch((err) => {
this.logger.error({err}, `Error starting lex bot ${this.botName}`); this.logger.error({err}, `Error starting lex bot ${this.botName}`);
this.notifyTaskDone(); this.notifyTaskDone();
@@ -102,12 +100,25 @@ class Lex extends Task {
this.ep.addCustomEventListener('lex::error', this._onError.bind(this, ep, cs)); this.ep.addCustomEventListener('lex::error', this._onError.bind(this, ep, cs));
this.ep.on('dtmf', this._onDtmf.bind(this, ep, cs)); this.ep.on('dtmf', this._onDtmf.bind(this, ep, cs));
const channelVars = {};
if (this.bargein) { if (this.bargein) {
await this.ep.set('x-amz-lex:barge-in-enabled', 1); Object.assign(channelVars, {'x-amz-lex:barge-in-enabled': 1});
} }
if (this.noInputTimeout) { if (this.noInputTimeout) {
await this.ep.set('x-amz-lex:start-silence-threshold-ms', this.noInputTimeout); Object.assign(channelVars, {'x-amz-lex:audio:start-timeout-ms': this.noInputTimeout});
} }
if (this.awsAccessKeyId && this.awsSecretAccessKey) {
Object.assign(channelVars, {
AWS_ACCESS_KEY_ID: this.awsAccessKeyId,
AWS_SECRET_ACCESS_KEY: this.awsSecretAccessKey
});
}
if (this.vendor) Object.assign(channelVars, {LEX_USE_TTS: 1});
if (this.intent && this.intent.length) Object.assign(channelVars, {LEX_WELCOME_INTENT: this.intent});
if (this.welcomeMessage && this.welcomeMessage.length) {
Object.assign(channelVars, {LEX_WELCOME_MESSAGE: this.welcomeMessage});
}
if (Object.keys(channelVars).length) await this.ep.set(channelVars);
} catch (err) { } catch (err) {
this.logger.error({err}, 'Error setting listeners'); this.logger.error({err}, 'Error setting listeners');
@@ -149,37 +160,42 @@ class Lex extends Task {
*/ */
async _onTextResponse(ep, cs, evt) { async _onTextResponse(ep, cs, evt) {
this.logger.debug({evt}, `got text response for ${this.botName}`); this.logger.debug({evt}, `got text response for ${this.botName}`);
const messages = evt.messages;
if (this.events.includes('response-text')) { if (this.events.includes('response-text')) {
this._performHook(cs, this.eventHook, {event: 'response-text', data: evt}); this._performHook(cs, this.eventHook, {event: 'response-text', data: evt});
} }
if (this.vendor && ['PlainText', 'SSML'].includes(evt.type) && evt.msg) { if (this.vendor && Array.isArray(messages) && messages.length) {
const {srf} = cs; const msg = messages[0].msg;
const {synthAudio} = srf.locals.dbHelpers; const type = messages[0].type;
if (['PlainText', 'SSML'].includes(type) && msg) {
const {srf} = cs;
const {synthAudio} = srf.locals.dbHelpers;
try { try {
this.logger.debug(`tts with ${this.vendor} ${this.voice}`); this.logger.debug(`tts with ${this.vendor} ${this.voice}`);
const fp = await synthAudio({ const fp = await synthAudio({
text: evt.msg, text: msg,
vendor: this.vendor, vendor: this.vendor,
language: this.language, language: this.language,
voice: this.voice, voice: this.voice,
salt: cs.callSid salt: cs.callSid
});
if (fp) cs.trackTmpFile(fp);
if (this.events.includes('start-play')) {
this._performHook(cs, this.eventHook, {event: 'start-play', data: {path: fp}});
}
await ep.play(fp);
if (this.events.includes('stop-play')) {
this._performHook(cs, this.eventHook, {event: 'stop-play', data: {path: fp}});
}
this.logger.debug(`finished tts, sending play_done ${this.vendor} ${this.voice}`);
this.ep.api('aws_lex_play_done', this.ep.uuid)
.catch((err) => {
this.logger.error({err}, `Error sending play_done ${this.botName}`);
}); });
} catch (err) { if (fp) cs.trackTmpFile(fp);
this.logger.error({err}, 'Lex:_onTextResponse - error playing tts'); if (this.events.includes('start-play')) {
this._performHook(cs, this.eventHook, {event: 'start-play', data: {path: fp}});
}
await ep.play(fp);
if (this.events.includes('stop-play')) {
this._performHook(cs, this.eventHook, {event: 'stop-play', data: {path: fp}});
}
this.logger.debug(`finished tts, sending play_done ${this.vendor} ${this.voice}`);
this.ep.api('aws_lex_play_done', this.ep.uuid)
.catch((err) => {
this.logger.error({err}, `Error sending play_done ${this.botName}`);
});
} catch (err) {
this.logger.error({err}, 'Lex:_onTextResponse - error playing tts');
}
} }
} }
} }

View File

@@ -152,14 +152,17 @@
}, },
"lex": { "lex": {
"properties": { "properties": {
"bot": "string", "botId": "string",
"alias": "string", "botAlias": "string",
"credentials": "object",
"region": "string", "region": "string",
"locale": "string",
"intent": "string",
"welcomeMessage": "string",
"bargein": "boolean", "bargein": "boolean",
"passDtmf": "boolean", "passDtmf": "boolean",
"actionHook": "object|string", "actionHook": "object|string",
"eventHook": "object|string", "eventHook": "object|string",
"events": "[string]",
"prompt": { "prompt": {
"type": "string", "type": "string",
"enum": ["lex", "tts"] "enum": ["lex", "tts"]
@@ -168,8 +171,8 @@
"tts": "#synthesizer" "tts": "#synthesizer"
}, },
"required": [ "required": [
"bot", "botId",
"alias", "botAlias",
"region", "region",
"prompt" "prompt"
] ]

84
package-lock.json generated
View File

@@ -376,12 +376,12 @@
} }
}, },
"@jambonz/realtimedb-helpers": { "@jambonz/realtimedb-helpers": {
"version": "0.2.17", "version": "0.2.18",
"resolved": "https://registry.npmjs.org/@jambonz/realtimedb-helpers/-/realtimedb-helpers-0.2.17.tgz", "resolved": "https://registry.npmjs.org/@jambonz/realtimedb-helpers/-/realtimedb-helpers-0.2.18.tgz",
"integrity": "sha512-ferdg3ze4juzHKB8ZkR5s9c31V6YDZPwFQIoHWne2DG2ZhKL9dNwWyHBBjT0jdUjzWCGDM8Ly9o9VPbQC+fbOA==", "integrity": "sha512-OihQ6/mx8yXv8D8pVOnGWAe4VNiS7Iu7UGmFA6X/iVefs4DZAnlGsGcNpY6lxTqrPgirPF3tFQWY+4gQmhzKqg==",
"requires": { "requires": {
"@google-cloud/text-to-speech": "^3.1.1", "@google-cloud/text-to-speech": "^3.1.1",
"@jambonz/stats-collector": "0.0.4", "@jambonz/stats-collector": "0.1.0",
"aws-sdk": "^2.631.0", "aws-sdk": "^2.631.0",
"bluebird": "^3.7.2", "bluebird": "^3.7.2",
"debug": "^4.1.1", "debug": "^4.1.1",
@@ -390,12 +390,12 @@
} }
}, },
"@jambonz/stats-collector": { "@jambonz/stats-collector": {
"version": "0.0.4", "version": "0.1.0",
"resolved": "https://registry.npmjs.org/@jambonz/stats-collector/-/stats-collector-0.0.4.tgz", "resolved": "https://registry.npmjs.org/@jambonz/stats-collector/-/stats-collector-0.1.0.tgz",
"integrity": "sha512-HgkdJmxNk0LcQ/eB6CTh9C+mxMnFhoR8ykY2CHnEa8IC8wymv2WqeIi9IZ/lKfzUVVzH+EpYqw7GBVghHjdYxQ==", "integrity": "sha512-5ChS8x4ACAxXv0dNphV27bR3LKJk5wrkljpNW7xUWPmY4UpdGC5GhTlqlxumMYwBOy1N1nw3P50unQNTppm5Vw==",
"requires": { "requires": {
"debug": "^4.1.1", "debug": "^4.2.0",
"hot-shots": "^6.8.7" "hot-shots": "^8.2.0"
} }
}, },
"@protobufjs/aspromise": { "@protobufjs/aspromise": {
@@ -463,9 +463,9 @@
"integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w=="
}, },
"@types/node": { "@types/node": {
"version": "12.12.62", "version": "12.19.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.62.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.1.tgz",
"integrity": "sha512-qAfo81CsD7yQIM9mVyh6B/U47li5g7cfpVQEDMfQeF8pSZVwzbhwU3crc0qG4DmpsebpJPR49AKOExQyJ05Cpg==" "integrity": "sha512-/xaVmBBjOGh55WCqumLAHXU9VhjGtmyTGqJzFBXRWZzByOXI5JAJNx9xPVGEsNizrNwcec92fQMj458MWfjN1A=="
}, },
"abort-controller": { "abort-controller": {
"version": "3.0.0", "version": "3.0.0",
@@ -497,9 +497,9 @@
"dev": true "dev": true
}, },
"agent-base": { "agent-base": {
"version": "6.0.1", "version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
"integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"requires": { "requires": {
"debug": "4" "debug": "4"
} }
@@ -602,9 +602,9 @@
"integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="
}, },
"aws-sdk": { "aws-sdk": {
"version": "2.765.0", "version": "2.778.0",
"resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.765.0.tgz", "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.778.0.tgz",
"integrity": "sha512-FQdPKJ5LAhNxkpqwrjQ+hiEqEOezV/PfZBn5RcBG6vu8K3VuT4dE12mGTY3qkdHy7lhymeRS5rWcagTmabKFtA==", "integrity": "sha512-sIJRO7tMaztLs+gvHF/Wo+iek/rhH99+2OzharQJMS0HATPl5/EdhKgWGv1n/bNpVH+kD3n0QMQgdFu0FNUt0Q==",
"requires": { "requires": {
"buffer": "4.9.2", "buffer": "4.9.2",
"events": "1.1.1", "events": "1.1.1",
@@ -1855,25 +1855,25 @@
} }
}, },
"google-auth-library": { "google-auth-library": {
"version": "6.1.0", "version": "6.1.2",
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.0.tgz", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.2.tgz",
"integrity": "sha512-GbalszIADE1YPWhUyfFMrkLhFHnlAgoRcqGVW+MsLDPsuaOB5MRPk7NNafPDv9SherNE4EKzcYuxMJjaxzXMOw==", "integrity": "sha512-X9EUX8R+kIpsf55KdSPhFWF0RNyBGuBc1zeYc/5Sjuk65eIYqq91rINJVBD22pp+w/PuM2fasHiA6H2xYjxTIQ==",
"requires": { "requires": {
"arrify": "^2.0.0", "arrify": "^2.0.0",
"base64-js": "^1.3.0", "base64-js": "^1.3.0",
"ecdsa-sig-formatter": "^1.0.11", "ecdsa-sig-formatter": "^1.0.11",
"fast-text-encoding": "^1.0.0", "fast-text-encoding": "^1.0.0",
"gaxios": "^3.0.0", "gaxios": "^3.0.0",
"gcp-metadata": "^4.1.0", "gcp-metadata": "^4.2.0",
"gtoken": "^5.0.0", "gtoken": "^5.0.4",
"jws": "^4.0.0", "jws": "^4.0.0",
"lru-cache": "^6.0.0" "lru-cache": "^6.0.0"
} }
}, },
"google-gax": { "google-gax": {
"version": "2.9.0", "version": "2.9.1",
"resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.9.0.tgz", "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.9.1.tgz",
"integrity": "sha512-MFMwA7Fb8PEwjnYwfGXjZMidCNyMl3gSnvS/+kS8TQioJZQDpzK+W3dmwyNyig/U13+kbABqDnbkkAXJ5NiUkw==", "integrity": "sha512-KQ7HiMTB/PAzKv3OU00x6tC1H7MHvSxQfon5BSyW5o+lkMgRA8xoqvlxZCBC1dlW1azOPGF8vScy8QgFmhaQ9Q==",
"requires": { "requires": {
"@grpc/grpc-js": "~1.1.1", "@grpc/grpc-js": "~1.1.1",
"@grpc/proto-loader": "^0.5.1", "@grpc/proto-loader": "^0.5.1",
@@ -1901,12 +1901,12 @@
"integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
}, },
"gtoken": { "gtoken": {
"version": "5.0.3", "version": "5.0.4",
"resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.0.3.tgz", "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.0.4.tgz",
"integrity": "sha512-Nyd1wZCMRc2dj/mAD0LlfQLcAO06uKdpKJXvK85SGrF5+5+Bpfil9u/2aw35ltvEHjvl0h5FMKN5knEU+9JrOg==", "integrity": "sha512-U9wnSp4GZ7ov6zRdPuRHG4TuqEWqRRgT1gfXGNArhzBUn9byrPeH8uTmBWU/ZiWJJvTEmkjhDIC3mqHWdVi3xQ==",
"requires": { "requires": {
"gaxios": "^3.0.0", "gaxios": "^3.0.0",
"google-p12-pem": "^3.0.0", "google-p12-pem": "^3.0.3",
"jws": "^4.0.0", "jws": "^4.0.0",
"mime": "^2.2.0" "mime": "^2.2.0"
}, },
@@ -1967,9 +1967,9 @@
} }
}, },
"hot-shots": { "hot-shots": {
"version": "6.8.7", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/hot-shots/-/hot-shots-6.8.7.tgz", "resolved": "https://registry.npmjs.org/hot-shots/-/hot-shots-8.2.0.tgz",
"integrity": "sha512-XH8iezBSZgVw2jegu96pUfF1Zv0VZ/iXjb7L5yE3F7mn7/bdhf4qeniXjO0wQWeefe433rhOsazNKLxM+XMI9w==", "integrity": "sha512-k0J7QAMGWAawZr8b+Bgornns9IlBaV1p0X6Ju/OTye2QLf+u1KuD9NEbSU4IShviyr1tSOUBUxrEm2QSlx2Nfw==",
"requires": { "requires": {
"unix-dgram": "2.0.x" "unix-dgram": "2.0.x"
} }
@@ -2604,9 +2604,9 @@
} }
}, },
"nan": { "nan": {
"version": "2.14.0", "version": "2.14.2",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
"integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==",
"optional": true "optional": true
}, },
"natural-compare": { "natural-compare": {
@@ -2968,9 +2968,9 @@
}, },
"dependencies": { "dependencies": {
"@types/node": { "@types/node": {
"version": "13.13.21", "version": "13.13.28",
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.21.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.28.tgz",
"integrity": "sha512-tlFWakSzBITITJSxHV4hg4KvrhR/7h3xbJdSFbYJBVzKubrASbnnIFuSgolUh7qKGo/ZeJPKUfbZ0WS6Jp14DQ==" "integrity": "sha512-EM/qFeRH8ZCD+TlsaIPULyyFm9vOhFIvgskY2JmHbEsWsOPgN+rtjSXrcHGgJpob4Nu17VfO95FKewr0XY7iOQ=="
} }
} }
}, },
@@ -3858,9 +3858,9 @@
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
}, },
"unix-dgram": { "unix-dgram": {
"version": "2.0.3", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/unix-dgram/-/unix-dgram-2.0.3.tgz", "resolved": "https://registry.npmjs.org/unix-dgram/-/unix-dgram-2.0.4.tgz",
"integrity": "sha512-Bay5CkSLcdypcBCsxvHEvaG3mftzT5FlUnRToPWEAVxwYI8NI/8zSJ/Gknlp86MPhV6hBA8I8TBsETj2tssoHQ==", "integrity": "sha512-7tpK6x7ls7J7pDrrAU63h93R0dVhRbPwiRRCawR10cl+2e1VOvF3bHlVJc6WI1dl/8qk5He673QU+Ogv7bPNaw==",
"optional": true, "optional": true,
"requires": { "requires": {
"bindings": "^1.3.0", "bindings": "^1.3.0",

View File

@@ -27,8 +27,8 @@
}, },
"dependencies": { "dependencies": {
"@jambonz/db-helpers": "^0.5.1", "@jambonz/db-helpers": "^0.5.1",
"@jambonz/realtimedb-helpers": "^0.2.17", "@jambonz/realtimedb-helpers": "^0.2.18",
"@jambonz/stats-collector": "^0.0.4", "@jambonz/stats-collector": "^0.1.0",
"bent": "^7.3.12", "bent": "^7.3.12",
"cidr-matcher": "^2.1.1", "cidr-matcher": "^2.1.1",
"debug": "^4.2.0", "debug": "^4.2.0",