From 6346954e7ad612800e766821db0c6cecc2f64b82 Mon Sep 17 00:00:00 2001 From: Dave Horton Date: Thu, 18 Aug 2022 23:18:24 +0200 Subject: [PATCH] session-level speech hints, strip trailing punctuation on continuous asr (#151) --- lib/session/call-session.js | 13 +++++++++++++ lib/tasks/config.js | 7 +++++++ lib/tasks/gather.js | 20 ++++++++++++++++++-- lib/tasks/transcribe.js | 12 ++++++++++-- 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/lib/session/call-session.js b/lib/session/call-session.js index d2880fe8..12341972 100644 --- a/lib/session/call-session.js +++ b/lib/session/call-session.js @@ -261,6 +261,19 @@ class CallSession extends Emitter { get recordState() { return this._recordState; } + set globalSttHints({hints, hintsBoost}) { + this._globalSttHints = {hints, hintsBoost}; + } + + get hasGlobalSttHints() { + const {hints = []} = this._globalSttHints || {}; + return hints.length > 0; + } + + get globalSttHints() { + return this._globalSttHints; + } + async notifyRecordOptions(opts) { const {action} = opts; this.logger.debug({opts}, 'CallSession:notifyRecordOptions'); diff --git a/lib/tasks/config.js b/lib/tasks/config.js index ea4964dc..230db0d3 100644 --- a/lib/tasks/config.js +++ b/lib/tasks/config.js @@ -87,6 +87,13 @@ class TaskConfig extends Task { cs.asrTimeout = this.recognizer.asrTimeout; cs.asrDtmfTerminationDigit = this.recognizer.asrDtmfTerminationDigit; } + if (Array.isArray(this.recognizer.hints)) { + const obj = {hints: this.recognizer.hints}; + if (typeof this.recognizer.hintsBoost === 'number') { + obj.hintsBoost = this.recognizer.hintsBoost; + } + cs.globalSttHints = obj; + } this.logger.info({ recognizer: this.recognizer, isContinuousAsr: cs.isContinuousAsr diff --git a/lib/tasks/gather.js b/lib/tasks/gather.js index 95ccca13..60783972 100644 --- a/lib/tasks/gather.js +++ b/lib/tasks/gather.js @@ -121,6 +121,13 @@ class TaskGather extends Task { await super.exec(cs); const {updateSpeechCredentialLastUsed} = require('../utils/db-utils')(this.logger, cs.srf); + if (cs.hasGlobalSttHints) { + const {hints, hintsBoost} = cs.globalSttHints; + this.hints = this.hints.concat(hints); + if (!this.hintsBoost && hintsBoost) this.hintsBoost = hintsBoost; + this.logger.debug({hints: this.hints, hintsBoost: this.hintsBoost}, + 'Gather:exec - applying global sttHints'); + } if (!this.isContinuousAsr && cs.isContinuousAsr) { this.isContinuousAsr = true; this.asrTimeout = cs.asrTimeout * 1000; @@ -286,7 +293,7 @@ class TaskGather extends Task { ].forEach((arr) => { if (this[arr[0]]) opts[arr[1]] = true; }); - if (this.hints.length > 1) { + if (this.hints.length > 0) { opts.GOOGLE_SPEECH_HINTS = this.hints.join(','); if (typeof this.hintsBoost === 'number') { opts.GOOGLE_SPEECH_HINTS_BOOST = this.hintsBoost; @@ -333,7 +340,7 @@ class TaskGather extends Task { 'AZURE_REGION': this.sttCredentials.region }); } - if (this.hints && this.hints.length > 1) { + if (this.hints && this.hints.length > 0) { opts.AZURE_SPEECH_HINTS = this.hints.map((h) => h.trim()).join(','); } if (this.altLanguages && this.altLanguages.length > 0) { @@ -487,6 +494,15 @@ class TaskGather extends Task { } if (this.isContinuousAsr) { /* append the transcript and start listening again for asrTimeout */ + const t = evt.alternatives[0].transcript; + if (t) { + /* remove trailing punctuation */ + if (/[,;:\.!\?]$/.test(t)) { + this.logger.debug('TaskGather:_onTranscription - removing trailing punctuation'); + evt.alternatives[0].transcript = t.slice(0, -1); + } + else this.logger.debug({t}, 'TaskGather:_onTranscription - no trailing punctuation'); + } this.logger.info({evt}, 'TaskGather:_onTranscription - got transcript during continous asr'); this._bufferedTranscripts.push(evt); this._clearTimer(); diff --git a/lib/tasks/transcribe.js b/lib/tasks/transcribe.js index c47c02fc..c06e209b 100644 --- a/lib/tasks/transcribe.js +++ b/lib/tasks/transcribe.js @@ -62,6 +62,14 @@ class TaskTranscribe extends Task { super.exec(cs); const {updateSpeechCredentialLastUsed} = require('../utils/db-utils')(this.logger, cs.srf); + if (cs.hasGlobalSttHints) { + const {hints, hintsBoost} = cs.globalSttHints; + this.hints = this.hints.concat(hints); + if (!this.hintsBoost && hintsBoost) this.hintsBoost = hintsBoost; + this.logger.debug({hints: this.hints, hintsBoost: this.hintsBoost}, + 'Transcribe:exec - applying global `sttHints'); + } + this.ep = ep; this.ep2 = ep2; if ('default' === this.vendor || !this.vendor) this.vendor = cs.speechRecognizerVendor; @@ -158,7 +166,7 @@ class TaskTranscribe extends Task { ].forEach((arr) => { if (this[arr[0]]) opts[arr[1]] = true; }); - if (this.hints.length > 1) { + if (this.hints.length > 0) { opts.GOOGLE_SPEECH_HINTS = this.hints.join(','); if (typeof this.hintsBoost === 'number') { opts.GOOGLE_SPEECH_HINTS_BOOST = this.hintsBoost; @@ -218,7 +226,7 @@ class TaskTranscribe extends Task { 'AZURE_SUBSCRIPTION_KEY': this.sttCredentials.api_key, 'AZURE_REGION': this.sttCredentials.region }); - if (this.hints && this.hints.length > 1) { + if (this.hints && this.hints.length > 0) { opts.AZURE_SPEECH_HINTS = this.hints.map((h) => h.trim()).join(','); } if (this.altLanguages.length > 1) opts.AZURE_SPEECH_ALTERNATIVE_LANGUAGE_CODES = this.altLanguages.join(',');