in src/common.speech/TranscriptionServiceRecognizer.ts [60:184]
protected async processTypeSpecificMessages(connectionMessage: SpeechConnectionMessage): Promise<boolean> {
let result: SpeechRecognitionResult;
const resultProps: PropertyCollection = new PropertyCollection();
resultProps.setProperty(PropertyId.SpeechServiceResponse_JsonResult, connectionMessage.textBody);
let processed: boolean = false;
switch (connectionMessage.path.toLowerCase()) {
case "speech.hypothesis":
case "speech.fragment":
const hypothesis: SpeechHypothesis = SpeechHypothesis.fromJSON(connectionMessage.textBody);
const offset: number = hypothesis.Offset + this.privRequestSession.currentTurnAudioOffset;
result = new SpeechRecognitionResult(
this.privRequestSession.requestId,
ResultReason.RecognizingSpeech,
hypothesis.Text,
hypothesis.Duration,
offset,
hypothesis.Language,
hypothesis.LanguageDetectionConfidence,
hypothesis.SpeakerId,
undefined,
connectionMessage.textBody,
resultProps);
this.privRequestSession.onHypothesis(offset);
const ev = new SpeechRecognitionEventArgs(result, hypothesis.Duration, this.privRequestSession.sessionId);
if (!!this.privTranscriberRecognizer.recognizing) {
try {
this.privTranscriberRecognizer.recognizing(this.privTranscriberRecognizer, ev);
/* tslint:disable:no-empty */
} catch (error) {
// Not going to let errors in the event handler
// trip things up.
}
}
processed = true;
break;
case "speech.phrase":
const simple: SimpleSpeechPhrase = SimpleSpeechPhrase.fromJSON(connectionMessage.textBody);
const resultReason: ResultReason = EnumTranslation.implTranslateRecognitionResult(simple.RecognitionStatus);
this.privRequestSession.onPhraseRecognized(this.privRequestSession.currentTurnAudioOffset + simple.Offset + simple.Duration);
if (ResultReason.Canceled === resultReason) {
const cancelReason: CancellationReason = EnumTranslation.implTranslateCancelResult(simple.RecognitionStatus);
const cancellationErrorCode: CancellationErrorCode = EnumTranslation.implTranslateCancelErrorCode(simple.RecognitionStatus);
await this.cancelRecognitionLocal(
cancelReason,
cancellationErrorCode,
EnumTranslation.implTranslateErrorDetails(cancellationErrorCode));
} else {
if (!(this.privRequestSession.isSpeechEnded && resultReason === ResultReason.NoMatch && simple.RecognitionStatus !== RecognitionStatus.InitialSilenceTimeout)) {
if (this.privRecognizerConfig.parameters.getProperty(OutputFormatPropertyName) === OutputFormat[OutputFormat.Simple]) {
result = new SpeechRecognitionResult(
this.privRequestSession.requestId,
resultReason,
simple.DisplayText,
simple.Duration,
simple.Offset + this.privRequestSession.currentTurnAudioOffset,
simple.Language,
simple.LanguageDetectionConfidence,
simple.SpeakerId,
undefined,
connectionMessage.textBody,
resultProps);
} else {
const detailed: DetailedSpeechPhrase = DetailedSpeechPhrase.fromJSON(connectionMessage.textBody);
const totalOffset: number = detailed.Offset + this.privRequestSession.currentTurnAudioOffset;
const offsetCorrectedJson: string = detailed.getJsonWithCorrectedOffsets(totalOffset);
result = new SpeechRecognitionResult(
this.privRequestSession.requestId,
resultReason,
detailed.Text,
detailed.Duration,
totalOffset,
detailed.Language,
detailed.LanguageDetectionConfidence,
detailed.SpeakerId,
undefined,
offsetCorrectedJson,
resultProps);
}
const event: SpeechRecognitionEventArgs = new SpeechRecognitionEventArgs(result, result.offset, this.privRequestSession.sessionId);
if (!!this.privTranscriberRecognizer.recognized) {
try {
this.privTranscriberRecognizer.recognized(this.privTranscriberRecognizer, event);
/* tslint:disable:no-empty */
} catch (error) {
// Not going to let errors in the event handler
// trip things up.
}
}
}
if (!!this.privSuccessCallback) {
try {
this.privSuccessCallback(result);
} catch (e) {
if (!!this.privErrorCallback) {
this.privErrorCallback(e);
}
}
// Only invoke the call back once.
// and if it's successful don't invoke the
// error after that.
this.privSuccessCallback = undefined;
this.privErrorCallback = undefined;
}
}
processed = true;
break;
default:
break;
}
return processed;
}