Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

import { CommunicationIdentifier } from "@azure/communication-common";

/**
* The status of the result of transcription.
*/
export enum ResultStatus {
/** Intermediate result.*/
Intermediate = "intermediate",
/** Final result.*/
Final = "final",
}

/**
* The format of transcription text.
*/
export enum TextFormat {
/** Formatted recognize text with punctuations.*/
Disply = "display",
}

/**
* Text in the phrase.
*/
export interface WordData {
/** Text in the phrase.*/
text: string;
/** The word's position within the phrase.*/
offset: number;
/** Duration in ticks. 1 tick = 100 nanoseconds.*/
duration: number;
}

/**
* Metadata for Transcription Streaming.
*/
export interface TranscriptionMetadata {
/** Transcription Subscription Id.*/
subscriptionId: string;
/** The target locale in which the translated text needs to be.*/
locale: string;
/** call connection Id.*/
callConnectionId: string;
/** correlation Id.*/
correlationId: string;
}

/**
* Streaming Transcription.
*/
export interface TranscriptionData {
/** The display form of the recognized word.*/
text: string;
/** The format of text.*/
format: TextFormat;
/** Confidence of recognition of the whole phrase, from 0.0 (no confidence) to 1.0 (full confidence). */
confidence: number;
/** The position of this payload. */
offset: number;
/** Duration in ticks. 1 tick = 100 nanoseconds. */
duration: number;
/** The result for each word of the phrase. */
words: WordData[];
/** The identified speaker based on participant raw ID. */
participant: CommunicationIdentifier;
/** Status of the result of transcription. */
resultStatus: ResultStatus;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

import { createIdentifierFromRawId } from "@azure/communication-common";
import { TranscriptionMetadata, TranscriptionData } from "../models/transcription";

/** Parse the incoming package. */
export function streamingData(
packetData: string | ArrayBuffer,
): TranscriptionMetadata | TranscriptionData {
let stringJson: string;
if (typeof packetData === "string") {
stringJson = packetData;
} else {
const decoder = new TextDecoder();
stringJson = decoder.decode(packetData);
}

const jsonObject = JSON.parse(stringJson);
const kind: string = jsonObject.kind;

switch (kind) {
case "TranscriptionMetadata": {
const transcriptionMetadata: TranscriptionMetadata = jsonObject.transcriptionMetadata;
return transcriptionMetadata;
}
case "TranscriptionData": {
const transcriptionData: TranscriptionData = {
text: jsonObject.transcriptionData.text,
format: jsonObject.transcriptionData.format,
confidence: jsonObject.transcriptionData.confidence,
offset: jsonObject.transcriptionData.offset,
duration: jsonObject.transcriptionData.duration,
words: jsonObject.transcriptionData.words,
participant: createIdentifierFromRawId(jsonObject.transcriptionData.participantRawID),
resultStatus: jsonObject.transcriptionData.resultStatus,
};
return transcriptionData;
}
default:
throw new Error(stringJson);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

import { TranscriptionData, TranscriptionMetadata } from "../src/models/transcription";
import { streamingData } from "../src/utli/streamingDataParser";
import { assert } from "chai";

describe("Stream data parser unit tests", function () {
const encoder = new TextEncoder();
const transcriptionMetaDataJson =
'{"kind":"TranscriptionMetadata","transcriptionMetadata":{"subscriptionId":"0000a000-9999-5555-ae00-cd00e0bc0000","locale":"en-US","callConnectionId":"6d09449c-6677-4f91-8cb7-012c338e6ec1","correlationId":"6d09449c-6677-4f91-8cb7-012c338e6ec1"}}';
const transcriptionDataJson =
'{"kind":"TranscriptionData","transcriptionData":{"text":"Hello everyone.","format":"display","confidence":0.8249790668487549,"offset":2516933652456984600,"words":[{"text":"hello","offset":2516933652456984600},{"text":"everyone","offset":2516933652459784700}],"participantRawID":"4:+910000000000","resultStatus":"Final"}}';

it("Successfully parse binary data to transcription meta data ", function () {
const transcriptionMetaDataBinary = encoder.encode(transcriptionMetaDataJson);
const parsedData = streamingData(transcriptionMetaDataBinary);
if ("locale" in parsedData) {
validateTranscriptionMetadata(parsedData);
}
});

it("Successfully parse json data to transcription meta data ", function () {
const parsedData = streamingData(transcriptionMetaDataJson);
if ("locale" in parsedData) {
validateTranscriptionMetadata(parsedData);
}
});

it("Successfully parse binary data to transcription data ", function () {
const transcriptionDataBinary = encoder.encode(transcriptionDataJson);
const parsedData = streamingData(transcriptionDataBinary);
if ("text" in parsedData) {
validateTranscriptionData(parsedData);
}
});

it("Successfully parse json data to transcription data ", function () {
const parsedData = streamingData(transcriptionDataJson);
if ("text" in parsedData) {
validateTranscriptionData(parsedData);
}
});
});

function validateTranscriptionMetadata(transcriptionMetadata: TranscriptionMetadata): void {
assert.equal(transcriptionMetadata.subscriptionId, "0000a000-9999-5555-ae00-cd00e0bc0000");
assert.equal(transcriptionMetadata.locale, "en-US");
assert.equal(transcriptionMetadata.correlationId, "6d09449c-6677-4f91-8cb7-012c338e6ec1");
assert.equal(transcriptionMetadata.callConnectionId, "6d09449c-6677-4f91-8cb7-012c338e6ec1");
}

function validateTranscriptionData(transcriptionData: TranscriptionData): void {
assert.equal(transcriptionData.text, "Hello everyone.");
assert.equal(transcriptionData.resultStatus, "Final");
assert.equal(transcriptionData.confidence, 0.8249790668487549);
assert.equal(transcriptionData.offset, 2516933652456984600);
assert.equal(transcriptionData.words.length, 2);
assert.equal(transcriptionData.words[0].text, "hello");
assert.equal(transcriptionData.words[0].offset, 2516933652456984600);
assert.equal(transcriptionData.words[1].text, "everyone");
assert.equal(transcriptionData.words[1].offset, 2516933652459784700);
if ("kind" in transcriptionData.participant) {
assert.equal(transcriptionData.participant.kind, "phoneNumber");
}
if ("phoneNumber" in transcriptionData.participant) {
assert.equal(transcriptionData.participant.phoneNumber, "+910000000000");
}
}