{"version":3,"sources":["src/common.speech/TranscriptionServiceRecognizer.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,YAAY,EACZ,WAAW,EAEd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACH,qBAAqB,EACrB,kBAAkB,EAOlB,uBAAuB,EAC1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAGhF,OAAO,EAEH,6BAA6B,EAC7B,qBAAqB,EACxB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAGhF,qBAAa,8BAA+B,SAAQ,6BAA6B;IAE7E,OAAO,CAAC,yBAAyB,CAAwB;gBAGrD,cAAc,EAAE,eAAe,EAC/B,iBAAiB,EAAE,kBAAkB,EACrC,WAAW,EAAE,YAAY,EACzB,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,EAAE,qBAAqB;IASzB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5E,2BAA2B,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3F,SAAS,CAAC,2BAA2B,CAAC,iBAAiB,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;IAInG,SAAS,CAAC,wBAAwB,CAAC,MAAM,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAyB5G,SAAS,CAAC,yBAAyB,CAAC,MAAM,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAY/G,SAAS,CAAC,iBAAiB,CACvB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,kBAAkB,EACtC,SAAS,EAAE,qBAAqB,EAChC,KAAK,EAAE,MAAM,GAAG,IAAI;cAuDR,0BAA0B,CAAC,UAAU,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAelF,SAAS,CAAC,eAAe,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE;QAAE,CAAC,EAAE,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjG,OAAO,CAAC,wBAAwB;IAOhC,OAAO,CAAC,+BAA+B;CAO1C","file":"TranscriptionServiceRecognizer.d.ts","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\nimport {\n    IAudioSource,\n    IConnection,\n    MessageType\n} from \"../common/Exports.js\";\nimport {\n    CancellationErrorCode,\n    CancellationReason,\n    ConversationTranscriptionCanceledEventArgs,\n    MeetingTranscriptionCanceledEventArgs,\n    PropertyCollection,\n    PropertyId,\n    ResultReason,\n    SpeechRecognitionEventArgs,\n    SpeechRecognitionResult,\n} from \"../sdk/Exports.js\";\nimport { ConversationInfo, MeetingInfo } from \"../sdk/Transcription/Exports.js\";\nimport { ConversationProperties } from \"../sdk/Transcription/IConversation.js\";\nimport { MeetingProperties } from \"../sdk/Transcription/IMeeting.js\";\nimport {\n    CancellationErrorCodePropertyName,\n    ConversationServiceRecognizer,\n    TranscriberRecognizer\n} from \"./Exports.js\";\nimport { IAuthentication } from \"./IAuthentication.js\";\nimport { IConnectionFactory } from \"./IConnectionFactory.js\";\nimport { RecognizerConfig } from \"./RecognizerConfig.js\";\nimport { SpeechConnectionMessage } from \"./SpeechConnectionMessage.Internal.js\";\n\n// eslint-disable-next-line max-classes-per-file\nexport class TranscriptionServiceRecognizer extends ConversationServiceRecognizer {\n\n    private privTranscriberRecognizer: TranscriberRecognizer;\n\n    public constructor(\n        authentication: IAuthentication,\n        connectionFactory: IConnectionFactory,\n        audioSource: IAudioSource,\n        recognizerConfig: RecognizerConfig,\n        transcriber: TranscriberRecognizer) {\n        super(authentication, connectionFactory, audioSource, recognizerConfig, transcriber);\n        this.privTranscriberRecognizer = transcriber;\n        this.sendPrePayloadJSONOverride = (connection: IConnection): Promise<void> => this.sendTranscriptionStartJSON(connection);\n        if (this.privRecognizerConfig.parameters.getProperty(PropertyId.SpeechServiceResponse_RequestWordLevelTimestamps) === \"true\") {\n            this.privSpeechContext.setWordLevelTimings();\n        }\n    }\n\n    public async sendSpeechEventAsync(info: ConversationInfo, command: string): Promise<void> {\n        if (!!this.privRequestSession.isRecognizing) {\n            const connection: IConnection = await this.fetchConnection();\n            await this.sendSpeechEvent(connection, this.createSpeechEventPayload(info, command));\n        }\n    }\n\n    public async sendMeetingSpeechEventAsync(info: MeetingInfo, command: string): Promise<void> {\n        if (!!this.privRequestSession.isRecognizing) {\n            const connection: IConnection = await this.fetchConnection();\n            await this.sendSpeechEvent(connection, this.createMeetingSpeechEventPayload(info, command));\n        }\n    }\n\n    protected processTypeSpecificMessages(connectionMessage: SpeechConnectionMessage): Promise<boolean> {\n        return this.processSpeechMessages(connectionMessage);\n    }\n\n    protected handleRecognizedCallback(result: SpeechRecognitionResult, offset: number, sessionId: string): void {\n        try {\n            const event: SpeechRecognitionEventArgs = new SpeechRecognitionEventArgs(result, offset, sessionId);\n            this.privTranscriberRecognizer.recognized(this.privTranscriberRecognizer, event);\n            if (!!this.privSuccessCallback) {\n                try {\n                    this.privSuccessCallback(result);\n                } catch (e) {\n                    if (!!this.privErrorCallback) {\n                        this.privErrorCallback(e as string);\n                    }\n                }\n                // Only invoke the call back once.\n                // and if it's successful don't invoke the\n                // error after that.\n                this.privSuccessCallback = undefined;\n                this.privErrorCallback = undefined;\n            }\n        /* eslint-disable no-empty */\n        } catch (error) {\n            // Not going to let errors in the event handler\n            // trip things up.\n        }\n    }\n\n    protected handleRecognizingCallback(result: SpeechRecognitionResult, duration: number, sessionId: string): void {\n        try {\n            const ev = new SpeechRecognitionEventArgs(result, duration, sessionId);\n            this.privTranscriberRecognizer.recognizing(this.privTranscriberRecognizer, ev);\n            /* eslint-disable no-empty */\n        } catch (error) {\n            // Not going to let errors in the event handler\n            // trip things up.\n        }\n    }\n\n    // Cancels recognition.\n    protected cancelRecognition(\n        sessionId: string,\n        requestId: string,\n        cancellationReason: CancellationReason,\n        errorCode: CancellationErrorCode,\n        error: string): void {\n\n        const properties: PropertyCollection = new PropertyCollection();\n        properties.setProperty(CancellationErrorCodePropertyName, CancellationErrorCode[errorCode]);\n\n        if (this.privTranscriberRecognizer.IsMeetingRecognizer()) {\n            if (!!this.privTranscriberRecognizer.canceled) {\n                const cancelEvent: MeetingTranscriptionCanceledEventArgs = new MeetingTranscriptionCanceledEventArgs(\n                    cancellationReason,\n                    error,\n                    errorCode,\n                    undefined,\n                    sessionId);\n                try {\n                    this.privTranscriberRecognizer.canceled(this.privTranscriberRecognizer, cancelEvent);\n                    /* eslint-disable no-empty */\n                } catch { }\n            }\n        } else {\n            if (!!this.privTranscriberRecognizer.canceled) {\n                const cancelEvent: ConversationTranscriptionCanceledEventArgs = new ConversationTranscriptionCanceledEventArgs(\n                    cancellationReason,\n                    error,\n                    errorCode,\n                    undefined,\n                    sessionId);\n                try {\n                    this.privTranscriberRecognizer.canceled(this.privTranscriberRecognizer, cancelEvent);\n                    /* eslint-disable no-empty */\n                } catch { }\n            }\n        }\n\n        if (!!this.privSuccessCallback) {\n            const result: SpeechRecognitionResult = new SpeechRecognitionResult(\n                requestId,\n                ResultReason.Canceled,\n                undefined, // Text\n                undefined, // Duration\n                undefined, // Offset\n                undefined, // Language\n                undefined, // Language Detection Confidence\n                undefined, // Speaker Id\n                error,\n                undefined, // Json\n                properties);\n            try {\n                this.privSuccessCallback(result);\n                this.privSuccessCallback = undefined;\n                /* eslint-disable no-empty */\n            } catch { }\n        }\n    }\n\n    // Encapsulated for derived service recognizers that need to send additional JSON\n    protected async sendTranscriptionStartJSON(connection: IConnection): Promise<void> {\n        await this.sendSpeechContext(connection, true);\n        if (this.privTranscriberRecognizer.IsMeetingRecognizer()) {\n            const info: MeetingInfo = this.privTranscriberRecognizer.getMeetingInfo();\n            const payload: { [id: string]: any } = this.createMeetingSpeechEventPayload(info, \"start\");\n            await this.sendSpeechEvent(connection, payload);\n        } else {\n            const info: ConversationInfo = this.privTranscriberRecognizer.getConversationInfo();\n            const payload: { [id: string]: any } = this.createSpeechEventPayload(info, \"start\");\n            await this.sendSpeechEvent(connection, payload);\n        }\n        await this.sendWaveHeader(connection);\n        return;\n    }\n\n    protected sendSpeechEvent(connection: IConnection, payload: { [id: string]: any }): Promise<void> {\n        const speechEventJson = JSON.stringify(payload);\n\n        if (speechEventJson) {\n            return connection.send(new SpeechConnectionMessage(\n                MessageType.Text,\n                \"speech.event\",\n                this.privRequestSession.requestId,\n                \"application/json\",\n                speechEventJson));\n        }\n        return;\n    }\n\n    private createSpeechEventPayload(info: ConversationInfo, command: string): { [id: string]: any } {\n        const eventDict: { id: string; name: string; meeting: ConversationProperties } = { id: \"meeting\", name: command, meeting: info.conversationProperties };\n        eventDict.meeting.id = info.id;\n        eventDict.meeting.attendees = info.participants;\n        return eventDict;\n    }\n\n    private createMeetingSpeechEventPayload(info: MeetingInfo, command: string): { [id: string]: any } {\n        const eventDict: { id: string; name: string; meeting: MeetingProperties } = { id: \"meeting\", name: command, meeting: info.meetingProperties };\n        eventDict.meeting.id = info.id;\n        eventDict.meeting.attendees = info.participants;\n        return eventDict;\n    }\n\n}\n"]}