@euirim/microsoft-cognitiveservices-speech-sdk
Version:
Microsoft Cognitive Services Speech SDK for JavaScript
400 lines (398 loc) • 17.4 kB
JavaScript
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Exports_1 = require("../common.speech/Exports");
var Contracts_1 = require("./Contracts");
var Exports_2 = require("./Exports");
/**
* Intent recognizer.
* @class
*/
var IntentRecognizer = /** @class */ (function (_super) {
__extends(IntentRecognizer, _super);
/**
* Initializes an instance of the IntentRecognizer.
* @constructor
* @param {SpeechConfig} speechConfig - The set of configuration properties.
* @param {AudioConfig} audioConfig - An optional audio input config associated with the recognizer
*/
function IntentRecognizer(speechConfig, audioConfig) {
var _this = this;
Contracts_1.Contracts.throwIfNullOrUndefined(speechConfig, "speechConfig");
var configImpl = speechConfig;
Contracts_1.Contracts.throwIfNullOrUndefined(configImpl, "speechConfig");
_this = _super.call(this, audioConfig, configImpl.properties, new Exports_1.IntentConnectionFactory()) || this;
_this.privAddedIntents = [];
_this.privAddedLmIntents = {};
_this.privDisposedIntentRecognizer = false;
_this.privProperties = configImpl.properties;
Contracts_1.Contracts.throwIfNullOrWhitespace(_this.properties.getProperty(Exports_2.PropertyId.SpeechServiceConnection_RecoLanguage), Exports_2.PropertyId[Exports_2.PropertyId.SpeechServiceConnection_RecoLanguage]);
return _this;
}
Object.defineProperty(IntentRecognizer.prototype, "speechRecognitionLanguage", {
/**
* Gets the spoken language of recognition.
* @member IntentRecognizer.prototype.speechRecognitionLanguage
* @function
* @public
* @returns {string} the spoken language of recognition.
*/
get: function () {
Contracts_1.Contracts.throwIfDisposed(this.privDisposedIntentRecognizer);
return this.properties.getProperty(Exports_2.PropertyId.SpeechServiceConnection_RecoLanguage);
},
enumerable: true,
configurable: true
});
Object.defineProperty(IntentRecognizer.prototype, "authorizationToken", {
/**
* Gets the authorization token used to communicate with the service.
* @member IntentRecognizer.prototype.authorizationToken
* @function
* @public
* @returns {string} Authorization token.
*/
get: function () {
return this.properties.getProperty(Exports_2.PropertyId.SpeechServiceAuthorization_Token);
},
/**
* Gets/Sets the authorization token used to communicate with the service.
* Note: Please use a token derived from your LanguageUnderstanding subscription key for the Intent recognizer.
* @member IntentRecognizer.prototype.authorizationToken
* @function
* @public
* @param {string} value - Authorization token.
*/
set: function (value) {
this.properties.setProperty(Exports_2.PropertyId.SpeechServiceAuthorization_Token, value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(IntentRecognizer.prototype, "properties", {
/**
* The collection of properties and their values defined for this IntentRecognizer.
* @member IntentRecognizer.prototype.properties
* @function
* @public
* @returns {PropertyCollection} The collection of properties and their
* values defined for this IntentRecognizer.
*/
get: function () {
return this.privProperties;
},
enumerable: true,
configurable: true
});
/**
* Starts intent recognition, and stops after the first utterance is recognized.
* The task returns the recognition text and intent as result.
* Note: RecognizeOnceAsync() returns when the first utterance has been recognized,
* so it is suitable only for single shot recognition like command or query.
* For long-running recognition, use StartContinuousRecognitionAsync() instead.
* @member IntentRecognizer.prototype.recognizeOnceAsync
* @function
* @public
* @param cb - Callback that received the recognition has finished with an IntentRecognitionResult.
* @param err - Callback invoked in case of an error.
*/
IntentRecognizer.prototype.recognizeOnceAsync = function (cb, err) {
var _this = this;
try {
Contracts_1.Contracts.throwIfDisposed(this.privDisposedIntentRecognizer);
this.implRecognizerStop();
if (Object.keys(this.privAddedLmIntents).length !== 0 || undefined !== this.privUmbrellaIntent) {
var context = this.buildSpeechContext();
this.privReco.speechContext.setSection("intent", context.Intent);
this.privReco.dynamicGrammar.addReferenceGrammar(context.ReferenceGrammars);
var intentReco = this.privReco;
intentReco.setIntents(this.privAddedLmIntents, this.privUmbrellaIntent);
}
this.implRecognizerStart(Exports_1.RecognitionMode.Interactive, function (e) {
_this.implRecognizerStop();
if (!!cb) {
cb(e);
}
}, function (e) {
_this.implRecognizerStop();
if (!!err) {
err(e);
}
});
}
catch (error) {
if (!!err) {
if (error instanceof Error) {
var typedError = error;
err(typedError.name + ": " + typedError.message);
}
else {
err(error);
}
}
// Destroy the recognizer.
this.dispose(true);
}
};
/**
* Starts speech recognition, until stopContinuousRecognitionAsync() is called.
* User must subscribe to events to receive recognition results.
* @member IntentRecognizer.prototype.startContinuousRecognitionAsync
* @function
* @public
* @param cb - Callback invoked once the recognition has started.
* @param err - Callback invoked in case of an error.
*/
IntentRecognizer.prototype.startContinuousRecognitionAsync = function (cb, err) {
try {
Contracts_1.Contracts.throwIfDisposed(this.privDisposedIntentRecognizer);
this.implRecognizerStop();
if (Object.keys(this.privAddedLmIntents).length !== 0) {
var context = this.buildSpeechContext();
this.privReco.speechContext.setSection("intent", context.Intent);
this.privReco.dynamicGrammar.addReferenceGrammar(context.ReferenceGrammars);
var intentReco = this.privReco;
intentReco.setIntents(this.privAddedLmIntents, this.privUmbrellaIntent);
}
this.implRecognizerStart(Exports_1.RecognitionMode.Conversation, undefined, undefined);
// report result to promise.
if (!!cb) {
try {
cb();
}
catch (e) {
if (!!err) {
err(e);
}
}
cb = undefined;
}
}
catch (error) {
if (!!err) {
if (error instanceof Error) {
var typedError = error;
err(typedError.name + ": " + typedError.message);
}
else {
err(error);
}
}
// Destroy the recognizer.
this.dispose(true);
}
};
/**
* Stops continuous intent recognition.
* @member IntentRecognizer.prototype.stopContinuousRecognitionAsync
* @function
* @public
* @param cb - Callback invoked once the recognition has stopped.
* @param err - Callback invoked in case of an error.
*/
IntentRecognizer.prototype.stopContinuousRecognitionAsync = function (cb, err) {
try {
Contracts_1.Contracts.throwIfDisposed(this.privDisposedIntentRecognizer);
this.implRecognizerStop();
if (!!cb) {
try {
cb();
}
catch (e) {
if (!!err) {
err(e);
}
}
}
}
catch (error) {
if (!!err) {
if (error instanceof Error) {
var typedError = error;
err(typedError.name + ": " + typedError.message);
}
else {
err(error);
}
}
// Destroy the recognizer.
this.dispose(true);
}
};
/**
* Starts speech recognition with keyword spotting, until stopKeywordRecognitionAsync() is called.
* User must subscribe to events to receive recognition results.
* Note: Key word spotting functionality is only available on the Speech Devices SDK.
* This functionality is currently not included in the SDK itself.
* @member IntentRecognizer.prototype.startKeywordRecognitionAsync
* @function
* @public
* @param {KeywordRecognitionModel} model - The keyword recognition model that specifies the keyword to be recognized.
* @param cb - Callback invoked once the recognition has started.
* @param err - Callback invoked in case of an error.
*/
IntentRecognizer.prototype.startKeywordRecognitionAsync = function (model, cb, err) {
Contracts_1.Contracts.throwIfNull(model, "model");
if (!!err) {
err("Not yet implemented.");
}
};
/**
* Stops continuous speech recognition.
* Note: Key word spotting functionality is only available on the Speech Devices SDK.
* This functionality is currently not included in the SDK itself.
* @member IntentRecognizer.prototype.stopKeywordRecognitionAsync
* @function
* @public
* @param cb - Callback invoked once the recognition has stopped.
* @param err - Callback invoked in case of an error.
*/
IntentRecognizer.prototype.stopKeywordRecognitionAsync = function (cb, err) {
if (!!cb) {
cb();
}
};
/**
* Adds a phrase that should be recognized as intent.
* @member IntentRecognizer.prototype.addIntent
* @function
* @public
* @param {string} intentId - A String that represents the identifier of the intent to be recognized.
* @param {string} phrase - A String that specifies the phrase representing the intent.
*/
IntentRecognizer.prototype.addIntent = function (simplePhrase, intentId) {
Contracts_1.Contracts.throwIfDisposed(this.privDisposedIntentRecognizer);
Contracts_1.Contracts.throwIfNullOrWhitespace(intentId, "intentId");
Contracts_1.Contracts.throwIfNullOrWhitespace(simplePhrase, "simplePhrase");
this.privAddedIntents.push([intentId, simplePhrase]);
};
/**
* Adds an intent from Language Understanding service for recognition.
* @member IntentRecognizer.prototype.addIntentWithLanguageModel
* @function
* @public
* @param {string} intentId - A String that represents the identifier of the intent
* to be recognized. Ignored if intentName is empty.
* @param {string} model - The intent model from Language Understanding service.
* @param {string} intentName - The intent name defined in the intent model. If it
* is empty, all intent names defined in the model will be added.
*/
IntentRecognizer.prototype.addIntentWithLanguageModel = function (intentId, model, intentName) {
Contracts_1.Contracts.throwIfDisposed(this.privDisposedIntentRecognizer);
Contracts_1.Contracts.throwIfNullOrWhitespace(intentId, "intentId");
Contracts_1.Contracts.throwIfNull(model, "model");
var modelImpl = model;
Contracts_1.Contracts.throwIfNullOrWhitespace(modelImpl.appId, "model.appId");
this.privAddedLmIntents[intentId] = new Exports_1.AddedLmIntent(modelImpl, intentName);
};
/**
* @summary Adds all intents from the specified Language Understanding Model.
* @member IntentRecognizer.prototype.addAllIntents
* @function
* @public
* @function
* @public
* @param {LanguageUnderstandingModel} model - The language understanding model containing the intents.
* @param {string} intentId - A custom id String to be returned in the IntentRecognitionResult's getIntentId() method.
*/
IntentRecognizer.prototype.addAllIntents = function (model, intentId) {
Contracts_1.Contracts.throwIfNull(model, "model");
var modelImpl = model;
Contracts_1.Contracts.throwIfNullOrWhitespace(modelImpl.appId, "model.appId");
this.privUmbrellaIntent = new Exports_1.AddedLmIntent(modelImpl, intentId);
};
/**
* closes all external resources held by an instance of this class.
* @member IntentRecognizer.prototype.close
* @function
* @public
*/
IntentRecognizer.prototype.close = function () {
Contracts_1.Contracts.throwIfDisposed(this.privDisposedIntentRecognizer);
this.dispose(true);
};
IntentRecognizer.prototype.createRecognizerConfig = function (speechConfig) {
return new Exports_1.RecognizerConfig(speechConfig, this.properties);
};
IntentRecognizer.prototype.createServiceRecognizer = function (authentication, connectionFactory, audioConfig, recognizerConfig) {
var audioImpl = audioConfig;
return new Exports_1.IntentServiceRecognizer(authentication, connectionFactory, audioImpl, recognizerConfig, this);
};
IntentRecognizer.prototype.dispose = function (disposing) {
if (this.privDisposedIntentRecognizer) {
return;
}
if (disposing) {
this.privDisposedIntentRecognizer = true;
_super.prototype.dispose.call(this, disposing);
}
};
IntentRecognizer.prototype.buildSpeechContext = function () {
var appId;
var region;
var subscriptionKey;
var refGrammers = [];
if (undefined !== this.privUmbrellaIntent) {
appId = this.privUmbrellaIntent.modelImpl.appId;
region = this.privUmbrellaIntent.modelImpl.region;
subscriptionKey = this.privUmbrellaIntent.modelImpl.subscriptionKey;
}
// Build the reference grammer array.
for (var _i = 0, _a = Object.keys(this.privAddedLmIntents); _i < _a.length; _i++) {
var intentId = _a[_i];
var addedLmIntent = this.privAddedLmIntents[intentId];
// validate all the same model, region, and key...
if (appId === undefined) {
appId = addedLmIntent.modelImpl.appId;
}
else {
if (appId !== addedLmIntent.modelImpl.appId) {
throw new Error("Intents must all be from the same LUIS model");
}
}
if (region === undefined) {
region = addedLmIntent.modelImpl.region;
}
else {
if (region !== addedLmIntent.modelImpl.region) {
throw new Error("Intents must all be from the same LUIS model in a single region");
}
}
if (subscriptionKey === undefined) {
subscriptionKey = addedLmIntent.modelImpl.subscriptionKey;
}
else {
if (subscriptionKey !== addedLmIntent.modelImpl.subscriptionKey) {
throw new Error("Intents must all use the same subscription key");
}
}
var grammer = "luis/" + appId + "-PRODUCTION#" + intentId;
refGrammers.push(grammer);
}
return {
Intent: {
id: appId,
key: (subscriptionKey === undefined) ? this.privProperties.getProperty(Exports_2.PropertyId[Exports_2.PropertyId.SpeechServiceConnection_Key]) : subscriptionKey,
provider: "LUIS",
},
ReferenceGrammars: (undefined === this.privUmbrellaIntent) ? refGrammers : ["luis/" + appId + "-PRODUCTION"],
};
};
return IntentRecognizer;
}(Exports_2.Recognizer));
exports.IntentRecognizer = IntentRecognizer;
//# sourceMappingURL=IntentRecognizer.js.map