{"version":3,"sources":["src/sdk/IntentRecognizer.ts"],"names":[],"mappings":"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","file":"IntentRecognizer.d.ts","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport {\r\n    AddedLmIntent,\r\n    IAuthentication,\r\n    IConnectionFactory,\r\n    IntentConnectionFactory,\r\n    IntentServiceRecognizer,\r\n    RecognitionMode,\r\n    RecognizerConfig,\r\n    ServiceRecognizerBase,\r\n    SpeechServiceConfig,\r\n} from \"../common.speech/Exports\";\r\nimport { marshalPromiseToCallbacks } from \"../common/Exports\";\r\nimport { AudioConfigImpl } from \"./Audio/AudioConfig\";\r\nimport { Contracts } from \"./Contracts\";\r\nimport {\r\n    AudioConfig,\r\n    IntentRecognitionCanceledEventArgs,\r\n    IntentRecognitionEventArgs,\r\n    IntentRecognitionResult,\r\n    KeywordRecognitionModel,\r\n    LanguageUnderstandingModel,\r\n    PropertyCollection,\r\n    PropertyId,\r\n    Recognizer,\r\n    SpeechConfig,\r\n} from \"./Exports\";\r\nimport { LanguageUnderstandingModelImpl } from \"./LanguageUnderstandingModel\";\r\nimport { SpeechConfigImpl } from \"./SpeechConfig\";\r\n\r\n/**\r\n * Intent recognizer.\r\n * @class\r\n */\r\nexport class IntentRecognizer extends Recognizer {\r\n    private privDisposedIntentRecognizer: boolean;\r\n    private privAddedIntents: string[][];\r\n    private privAddedLmIntents: { [id: string]: AddedLmIntent; };\r\n    private privUmbrellaIntent: AddedLmIntent;\r\n\r\n    /**\r\n     * Initializes an instance of the IntentRecognizer.\r\n     * @constructor\r\n     * @param {SpeechConfig} speechConfig - The set of configuration properties.\r\n     * @param {AudioConfig} audioConfig - An optional audio input config associated with the recognizer\r\n     */\r\n    public constructor(speechConfig: SpeechConfig, audioConfig?: AudioConfig) {\r\n        Contracts.throwIfNullOrUndefined(speechConfig, \"speechConfig\");\r\n        const configImpl: SpeechConfigImpl = speechConfig as SpeechConfigImpl;\r\n        Contracts.throwIfNullOrUndefined(configImpl, \"speechConfig\");\r\n\r\n        super(audioConfig, configImpl.properties, new IntentConnectionFactory());\r\n        this.privAddedIntents = [];\r\n        this.privAddedLmIntents = {};\r\n\r\n        this.privDisposedIntentRecognizer = false;\r\n        this.privProperties = configImpl.properties;\r\n\r\n        Contracts.throwIfNullOrWhitespace(this.properties.getProperty(PropertyId.SpeechServiceConnection_RecoLanguage), PropertyId[PropertyId.SpeechServiceConnection_RecoLanguage]);\r\n    }\r\n\r\n    /**\r\n     * The event recognizing signals that an intermediate recognition result is received.\r\n     * @member IntentRecognizer.prototype.recognizing\r\n     * @function\r\n     * @public\r\n     */\r\n    public recognizing: (sender: IntentRecognizer, event: IntentRecognitionEventArgs) => void;\r\n\r\n    /**\r\n     * The event recognized signals that a final recognition result is received.\r\n     * @member IntentRecognizer.prototype.recognized\r\n     * @function\r\n     * @public\r\n     */\r\n    public recognized: (sender: IntentRecognizer, event: IntentRecognitionEventArgs) => void;\r\n\r\n    /**\r\n     * The event canceled signals that an error occurred during recognition.\r\n     * @member IntentRecognizer.prototype.canceled\r\n     * @function\r\n     * @public\r\n     */\r\n    public canceled: (sender: IntentRecognizer, event: IntentRecognitionCanceledEventArgs) => void;\r\n\r\n    /**\r\n     * Gets the spoken language of recognition.\r\n     * @member IntentRecognizer.prototype.speechRecognitionLanguage\r\n     * @function\r\n     * @public\r\n     * @returns {string} the spoken language of recognition.\r\n     */\r\n    public get speechRecognitionLanguage(): string {\r\n        Contracts.throwIfDisposed(this.privDisposedIntentRecognizer);\r\n\r\n        return this.properties.getProperty(PropertyId.SpeechServiceConnection_RecoLanguage);\r\n    }\r\n\r\n    /**\r\n     * Gets the authorization token used to communicate with the service.\r\n     * @member IntentRecognizer.prototype.authorizationToken\r\n     * @function\r\n     * @public\r\n     * @returns {string} Authorization token.\r\n     */\r\n    public get authorizationToken(): string {\r\n        return this.properties.getProperty(PropertyId.SpeechServiceAuthorization_Token);\r\n    }\r\n\r\n    /**\r\n     * Gets/Sets the authorization token used to communicate with the service.\r\n     * Note: Please use a token derived from your LanguageUnderstanding subscription key for the Intent recognizer.\r\n     * @member IntentRecognizer.prototype.authorizationToken\r\n     * @function\r\n     * @public\r\n     * @param {string} value - Authorization token.\r\n     */\r\n    public set authorizationToken(value: string) {\r\n        this.properties.setProperty(PropertyId.SpeechServiceAuthorization_Token, value);\r\n    }\r\n\r\n    /**\r\n     * The collection of properties and their values defined for this IntentRecognizer.\r\n     * @member IntentRecognizer.prototype.properties\r\n     * @function\r\n     * @public\r\n     * @returns {PropertyCollection} The collection of properties and their\r\n     *          values defined for this IntentRecognizer.\r\n     */\r\n    public get properties(): PropertyCollection {\r\n        return this.privProperties;\r\n    }\r\n\r\n    /**\r\n     * Starts intent recognition, and stops after the first utterance is recognized.\r\n     * The task returns the recognition text and intent as result.\r\n     * Note: RecognizeOnceAsync() returns when the first utterance has been recognized,\r\n     *       so it is suitable only for single shot recognition like command or query.\r\n     *       For long-running recognition, use StartContinuousRecognitionAsync() instead.\r\n     * @member IntentRecognizer.prototype.recognizeOnceAsync\r\n     * @function\r\n     * @public\r\n     * @param cb - Callback that received the recognition has finished with an IntentRecognitionResult.\r\n     * @param err - Callback invoked in case of an error.\r\n     */\r\n    public recognizeOnceAsync(cb?: (e: IntentRecognitionResult) => void, err?: (e: string) => void): void {\r\n        Contracts.throwIfDisposed(this.privDisposedIntentRecognizer);\r\n\r\n        if (Object.keys(this.privAddedLmIntents).length !== 0 || undefined !== this.privUmbrellaIntent) {\r\n            const context: IIntentContext = this.buildSpeechContext();\r\n\r\n            this.privReco.speechContext.setSection(\"intent\", context.Intent);\r\n            this.privReco.dynamicGrammar.addReferenceGrammar(context.ReferenceGrammars);\r\n\r\n            const intentReco: IntentServiceRecognizer = this.privReco as IntentServiceRecognizer;\r\n            intentReco.setIntents(this.privAddedLmIntents, this.privUmbrellaIntent);\r\n        }\r\n\r\n        marshalPromiseToCallbacks(this.recognizeOnceAsyncImpl(RecognitionMode.Interactive), cb, err);\r\n    }\r\n\r\n    /**\r\n     * Starts speech recognition, until stopContinuousRecognitionAsync() is called.\r\n     * User must subscribe to events to receive recognition results.\r\n     * @member IntentRecognizer.prototype.startContinuousRecognitionAsync\r\n     * @function\r\n     * @public\r\n     * @param cb - Callback invoked once the recognition has started.\r\n     * @param err - Callback invoked in case of an error.\r\n     */\r\n    public startContinuousRecognitionAsync(cb?: () => void, err?: (e: string) => void): void {\r\n        if (Object.keys(this.privAddedLmIntents).length !== 0 || undefined !== this.privUmbrellaIntent) {\r\n            const context: IIntentContext = this.buildSpeechContext();\r\n\r\n            this.privReco.speechContext.setSection(\"intent\", context.Intent);\r\n            this.privReco.dynamicGrammar.addReferenceGrammar(context.ReferenceGrammars);\r\n\r\n            const intentReco: IntentServiceRecognizer = this.privReco as IntentServiceRecognizer;\r\n            intentReco.setIntents(this.privAddedLmIntents, this.privUmbrellaIntent);\r\n        }\r\n\r\n        marshalPromiseToCallbacks(this.startContinuousRecognitionAsyncImpl(RecognitionMode.Conversation), cb, err);\r\n    }\r\n\r\n    /**\r\n     * Stops continuous intent recognition.\r\n     * @member IntentRecognizer.prototype.stopContinuousRecognitionAsync\r\n     * @function\r\n     * @public\r\n     * @param cb - Callback invoked once the recognition has stopped.\r\n     * @param err - Callback invoked in case of an error.\r\n     */\r\n    public stopContinuousRecognitionAsync(cb?: () => void, err?: (e: string) => void): void {\r\n        marshalPromiseToCallbacks(this.stopContinuousRecognitionAsyncImpl(), cb, err);\r\n    }\r\n\r\n    /**\r\n     * Starts speech recognition with keyword spotting, until stopKeywordRecognitionAsync() is called.\r\n     * User must subscribe to events to receive recognition results.\r\n     * Note: Key word spotting functionality is only available on the Speech Devices SDK.\r\n     *       This functionality is currently not included in the SDK itself.\r\n     * @member IntentRecognizer.prototype.startKeywordRecognitionAsync\r\n     * @function\r\n     * @public\r\n     * @param {KeywordRecognitionModel} model - The keyword recognition model that specifies the keyword to be recognized.\r\n     * @param cb - Callback invoked once the recognition has started.\r\n     * @param err - Callback invoked in case of an error.\r\n     */\r\n    public startKeywordRecognitionAsync(model: KeywordRecognitionModel, cb?: () => void, err?: (e: string) => void): void {\r\n        Contracts.throwIfNull(model, \"model\");\r\n\r\n        if (!!err) {\r\n            err(\"Not yet implemented.\");\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Stops continuous speech recognition.\r\n     * Note: Key word spotting functionality is only available on the Speech Devices SDK.\r\n     *       This functionality is currently not included in the SDK itself.\r\n     * @member IntentRecognizer.prototype.stopKeywordRecognitionAsync\r\n     * @function\r\n     * @public\r\n     * @param cb - Callback invoked once the recognition has stopped.\r\n     * @param err - Callback invoked in case of an error.\r\n     */\r\n    public stopKeywordRecognitionAsync(cb?: () => void, err?: (e: string) => void): void {\r\n        if (!!cb) {\r\n            cb();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Adds a phrase that should be recognized as intent.\r\n     * @member IntentRecognizer.prototype.addIntent\r\n     * @function\r\n     * @public\r\n     * @param {string} intentId - A String that represents the identifier of the intent to be recognized.\r\n     * @param {string} phrase - A String that specifies the phrase representing the intent.\r\n     */\r\n    public addIntent(simplePhrase: string, intentId?: string): void {\r\n        Contracts.throwIfDisposed(this.privDisposedIntentRecognizer);\r\n        Contracts.throwIfNullOrWhitespace(intentId, \"intentId\");\r\n        Contracts.throwIfNullOrWhitespace(simplePhrase, \"simplePhrase\");\r\n\r\n        this.privAddedIntents.push([intentId, simplePhrase]);\r\n    }\r\n\r\n    /**\r\n     * Adds an intent from Language Understanding service for recognition.\r\n     * @member IntentRecognizer.prototype.addIntentWithLanguageModel\r\n     * @function\r\n     * @public\r\n     * @param {string} intentId - A String that represents the identifier of the intent\r\n     *        to be recognized. Ignored if intentName is empty.\r\n     * @param {string} model - The intent model from Language Understanding service.\r\n     * @param {string} intentName - The intent name defined in the intent model. If it\r\n     *        is empty, all intent names defined in the model will be added.\r\n     */\r\n    public addIntentWithLanguageModel(intentId: string, model: LanguageUnderstandingModel, intentName?: string): void {\r\n        Contracts.throwIfDisposed(this.privDisposedIntentRecognizer);\r\n        Contracts.throwIfNullOrWhitespace(intentId, \"intentId\");\r\n        Contracts.throwIfNull(model, \"model\");\r\n\r\n        const modelImpl: LanguageUnderstandingModelImpl = model as LanguageUnderstandingModelImpl;\r\n        Contracts.throwIfNullOrWhitespace(modelImpl.appId, \"model.appId\");\r\n\r\n        this.privAddedLmIntents[intentId] = new AddedLmIntent(modelImpl, intentName);\r\n    }\r\n\r\n    /**\r\n     * @summary Adds all intents from the specified Language Understanding Model.\r\n     * @member IntentRecognizer.prototype.addAllIntents\r\n     * @function\r\n     * @public\r\n     * @function\r\n     * @public\r\n     * @param {LanguageUnderstandingModel} model - The language understanding model containing the intents.\r\n     * @param {string} intentId - A custom id String to be returned in the IntentRecognitionResult's getIntentId() method.\r\n     */\r\n    public addAllIntents(model: LanguageUnderstandingModel, intentId?: string): void {\r\n        Contracts.throwIfNull(model, \"model\");\r\n\r\n        const modelImpl: LanguageUnderstandingModelImpl = model as LanguageUnderstandingModelImpl;\r\n        Contracts.throwIfNullOrWhitespace(modelImpl.appId, \"model.appId\");\r\n\r\n        this.privUmbrellaIntent = new AddedLmIntent(modelImpl, intentId);\r\n    }\r\n\r\n    /**\r\n     * closes all external resources held by an instance of this class.\r\n     * @member IntentRecognizer.prototype.close\r\n     * @function\r\n     * @public\r\n     */\r\n    public close(cb?: () => void, errorCb?: (error: string) => void): void {\r\n        Contracts.throwIfDisposed(this.privDisposedIntentRecognizer);\r\n\r\n        marshalPromiseToCallbacks(this.dispose(true), cb, errorCb);\r\n    }\r\n\r\n    protected createRecognizerConfig(speechConfig: SpeechServiceConfig): RecognizerConfig {\r\n        return new RecognizerConfig(speechConfig, this.properties);\r\n    }\r\n\r\n    protected createServiceRecognizer(authentication: IAuthentication, connectionFactory: IConnectionFactory, audioConfig: AudioConfig, recognizerConfig: RecognizerConfig): ServiceRecognizerBase {\r\n        const audioImpl: AudioConfigImpl = audioConfig as AudioConfigImpl;\r\n        return new IntentServiceRecognizer(authentication, connectionFactory, audioImpl, recognizerConfig, this);\r\n    }\r\n\r\n    protected async dispose(disposing: boolean): Promise<void> {\r\n        if (this.privDisposedIntentRecognizer) {\r\n            return;\r\n        }\r\n\r\n        if (disposing) {\r\n            this.privDisposedIntentRecognizer = true;\r\n            await super.dispose(disposing);\r\n        }\r\n    }\r\n\r\n    private buildSpeechContext(): IIntentContext {\r\n        let appId: string;\r\n        let region: string;\r\n        let subscriptionKey: string;\r\n        const refGrammers: string[] = [];\r\n\r\n        if (undefined !== this.privUmbrellaIntent) {\r\n            appId = this.privUmbrellaIntent.modelImpl.appId;\r\n            region = this.privUmbrellaIntent.modelImpl.region;\r\n            subscriptionKey = this.privUmbrellaIntent.modelImpl.subscriptionKey;\r\n        }\r\n\r\n        // Build the reference grammer array.\r\n        for (const intentId of Object.keys(this.privAddedLmIntents)) {\r\n            const addedLmIntent: AddedLmIntent = this.privAddedLmIntents[intentId];\r\n\r\n            // validate all the same model, region, and key...\r\n            if (appId === undefined) {\r\n                appId = addedLmIntent.modelImpl.appId;\r\n            } else {\r\n                if (appId !== addedLmIntent.modelImpl.appId) {\r\n                    throw new Error(\"Intents must all be from the same LUIS model\");\r\n                }\r\n            }\r\n\r\n            if (region === undefined) {\r\n                region = addedLmIntent.modelImpl.region;\r\n            } else {\r\n                if (region !== addedLmIntent.modelImpl.region) {\r\n                    throw new Error(\"Intents must all be from the same LUIS model in a single region\");\r\n                }\r\n            }\r\n\r\n            if (subscriptionKey === undefined) {\r\n                subscriptionKey = addedLmIntent.modelImpl.subscriptionKey;\r\n            } else {\r\n                if (subscriptionKey !== addedLmIntent.modelImpl.subscriptionKey) {\r\n                    throw new Error(\"Intents must all use the same subscription key\");\r\n                }\r\n            }\r\n\r\n            const grammer: string = \"luis/\" + appId + \"-PRODUCTION#\" + intentId;\r\n            refGrammers.push(grammer);\r\n        }\r\n\r\n        return {\r\n            Intent: {\r\n                id: appId,\r\n                key: (subscriptionKey === undefined) ? this.privProperties.getProperty(PropertyId[PropertyId.SpeechServiceConnection_Key]) : subscriptionKey,\r\n                provider: \"LUIS\",\r\n            },\r\n            ReferenceGrammars: (undefined === this.privUmbrellaIntent) ? refGrammers : [\"luis/\" + appId + \"-PRODUCTION\"],\r\n        };\r\n    }\r\n}\r\n\r\ninterface IIntentContext {\r\n    Intent: {\r\n        id: string,\r\n        key: string,\r\n        provider: string,\r\n    };\r\n    ReferenceGrammars: string[];\r\n}\r\n"]}