Skip to content

Added dtmf data in streaming data parser and added unit test. #49992

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Original file line number Diff line number Diff line change
Expand Up @@ -703,6 +703,13 @@ public void AddSipUui(string value) { }
public void AddSipX(string key, string value) { }
public void AddVoip(string key, string value) { }
}
public partial class DtmfData : Azure.Communication.CallAutomation.StreamingData
{
public DtmfData(string data) { }
public string Data { get { throw null; } }
public Azure.Communication.CommunicationIdentifier Participant { get { throw null; } }
public System.DateTimeOffset Timestamp { get { throw null; } }
}
public partial class DtmfResult : Azure.Communication.CallAutomation.RecognizeResult
{
internal DtmfResult() { }
Expand Down Expand Up @@ -1445,6 +1452,7 @@ public enum StreamingDataKind
AudioMetadata = 1,
TranscriptionData = 2,
TranscriptionMetadata = 3,
DtmfData = 4,
}
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public readonly partial struct StreamingTransport : System.IEquatable<Azure.Communication.CallAutomation.StreamingTransport>
Expand Down Expand Up @@ -1499,6 +1507,7 @@ internal TranscriptionMetadata() { }
public string CallConnectionId { get { throw null; } }
public string CorrelationId { get { throw null; } }
public string Locale { get { throw null; } }
public string SpeechRecognitionModelEndpointId { get { throw null; } }
public string TranscriptionSubscriptionId { get { throw null; } }
}
public partial class TranscriptionOptions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -702,6 +702,13 @@ public void AddSipUui(string value) { }
public void AddSipX(string key, string value) { }
public void AddVoip(string key, string value) { }
}
public partial class DtmfData : Azure.Communication.CallAutomation.StreamingData
{
public DtmfData(string data) { }
public string Data { get { throw null; } }
public Azure.Communication.CommunicationIdentifier Participant { get { throw null; } }
public System.DateTimeOffset Timestamp { get { throw null; } }
}
public partial class DtmfResult : Azure.Communication.CallAutomation.RecognizeResult
{
internal DtmfResult() { }
Expand Down Expand Up @@ -1444,6 +1451,7 @@ public enum StreamingDataKind
AudioMetadata = 1,
TranscriptionData = 2,
TranscriptionMetadata = 3,
DtmfData = 4,
}
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public readonly partial struct StreamingTransport : System.IEquatable<Azure.Communication.CallAutomation.StreamingTransport>
Expand Down Expand Up @@ -1498,6 +1506,7 @@ internal TranscriptionMetadata() { }
public string CallConnectionId { get { throw null; } }
public string CorrelationId { get { throw null; } }
public string Locale { get { throw null; } }
public string SpeechRecognitionModelEndpointId { get { throw null; } }
public string TranscriptionSubscriptionId { get { throw null; } }
}
public partial class TranscriptionOptions
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System;

namespace Azure.Communication.CallAutomation
{
/// <summary>
/// Streaming dtmf data.
/// </summary>
public class DtmfData : StreamingData
{
/// <summary>
/// The dtmf data, encoded as a base64 string
/// </summary>
/// <param name="data"></param>
public DtmfData(string data)
{
Data = data;
}

internal DtmfData(string data, DateTime timestamp, string participantId)
{
Data = !string.IsNullOrWhiteSpace(data) ? data : default;
Timestamp = timestamp;
if (participantId != null)
{
Participant = CommunicationIdentifier.FromRawId(participantId);
}
}

/// <summary>
/// The dtmf data in base64 string.
/// </summary>
public string Data { get; }

/// <summary>
/// The timestamp indicating when the media content was received by the bot,
/// or if the bot is sending media, the timestamp of when the media was sourced.
/// The format is ISO 8601 (yyyy-mm-ddThh:mm).
/// </summary>
public DateTimeOffset Timestamp { get; }

/// <summary>
/// The raw ID of the participant.
/// </summary>
public CommunicationIdentifier Participant { get; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System;
using System.Text.Json.Serialization;

namespace Azure.Communication.CallAutomation
{
/// <summary>
/// Streaming dtmf.
/// </summary>
internal class DtmfDataInternal
{
/// <summary>
/// The dtmf data in base64 string.
/// </summary>
[JsonPropertyName("data")]
public string Data { get; set; }

/// <summary>
/// The timestamp of thwn the media was sourced.
/// </summary>
[JsonPropertyName("timestamp")]
public DateTime Timestamp { get; set; }

/// <summary>
/// Participant ID.
/// </summary>
[JsonPropertyName("participantRawID")]
public string ParticipantRawId { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,15 @@ private static StreamingData ParseStreamingData(string base64Data)

#endregion

#region Dtmf
case "DtmfData":
DtmfDataInternal dtmfInternal = JsonSerializer.Deserialize<DtmfDataInternal>(streamingData.GetProperty("dtmfData").ToString());
return new DtmfData(dtmfInternal.Data, dtmfInternal.Timestamp, dtmfInternal.ParticipantRawId);
#endregion

#region Transcription
case "TranscriptionMetadata":
var transcriptionMetadataInternal = JsonSerializer.Deserialize<TranscriptionMetadataInternal>(streamingData.GetProperty("transcriptionMetadata").ToString());
TranscriptionMetadataInternal transcriptionMetadataInternal = JsonSerializer.Deserialize<TranscriptionMetadataInternal>(streamingData.GetProperty("transcriptionMetadata").ToString());
return new TranscriptionMetadata(transcriptionMetadataInternal);

case "TranscriptionData":
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ public enum StreamingDataKind
/// <summary>
/// Transcription metadata type
/// </summary>
TranscriptionMetadata
TranscriptionMetadata,
/// <summary>
/// Dtmf data type
/// </summary>
DtmfData,
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ internal TranscriptionMetadata(TranscriptionMetadataInternal transcriptionMetada
Locale = transcriptionMetadataInternal.Locale;
CallConnectionId = transcriptionMetadataInternal.CallConnectionId;
CorrelationId = transcriptionMetadataInternal.CorrelationId;
SpeechRecognitionModelEndpointId = transcriptionMetadataInternal.SpeechRecognitionModelEndpointId;
}
/// <summary>
/// Transcription Subscription Id.
Expand All @@ -35,6 +36,11 @@ internal TranscriptionMetadata(TranscriptionMetadataInternal transcriptionMetada
/// <summary>
/// correlation Id.
/// </summary>
public string CorrelationId { get; }
public string CorrelationId { get; }

/// <summary>
/// The custom speech recognition model endpoint id
/// </summary>
public string SpeechRecognitionModelEndpointId { get; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,11 @@ internal class TranscriptionMetadataInternal
/// </summary>
[JsonPropertyName("correlationId")]
public string CorrelationId { get; set; }

/// <summary>
/// The custom speech recognition model endpoint id
/// </summary>
[JsonPropertyName("speechRecognitionModelEndpointId")]
public string SpeechRecognitionModelEndpointId { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,31 @@ private static void ValidateAudioData(AudioData streamingAudio)
Assert.AreEqual("participantId", streamingAudio.Participant.RawId);
Assert.IsFalse(streamingAudio.IsSilent);
}
private static void ValidateAudioDataNoParticipant(AudioData streamingAudio)
#endregion

#region DTMF
[Test]
public void ParseDtmfData_Test()
{
Assert.IsNotNull(streamingAudio);
Assert.AreEqual(Convert.FromBase64String("AQIDBAU="), streamingAudio.Data);
Assert.AreEqual(2022, streamingAudio.Timestamp.Year);
Assert.IsNull(streamingAudio.Participant);
Assert.IsFalse(streamingAudio.IsSilent);
string dtmfJson = "{"
+ "\"kind\": \"DtmfData\","
+ "\"dtmfData\": {"
+ "\"data\": \"5\","
+ "\"timestamp\": \"2022-08-23T11:48:05Z\","
+ "\"participantRawID\": \"participantId\""
+ "}"
+ "}";

DtmfData streamingDtmf = (DtmfData)StreamingData.Parse(dtmfJson);
ValidateDtmfData(streamingDtmf);
}
private static void ValidateDtmfData(DtmfData streamingDtmf)
{
Assert.IsNotNull(streamingDtmf);
Assert.AreEqual("5", streamingDtmf.Data);
Assert.AreEqual(2022, streamingDtmf.Timestamp.Year);
Assert.IsTrue(streamingDtmf.Participant is CommunicationIdentifier);
Assert.AreEqual("participantId", streamingDtmf.Participant.RawId);
}
#endregion

Expand All @@ -87,7 +105,8 @@ public void ParseTranscriptionMetadata_Test()
"\"subscriptionId\":\"subscriptionId\"," +
"\"locale\":\"en-US\"," +
"\"callConnectionId\":\"callConnectionId\"," +
"\"correlationId\":\"correlationId\"" +
"\"correlationId\":\"correlationId\"," +
"\"speechRecognitionModelEndpointId\":\"speechRecognitionModelEndpointId\"" +
"}" +
"}";

Expand Down Expand Up @@ -153,6 +172,7 @@ private static void ValidateTranscriptionMetadata(TranscriptionMetadata transcri
Assert.AreEqual("en-US", transcriptionMetadata.Locale);
Assert.AreEqual("callConnectionId", transcriptionMetadata.CallConnectionId);
Assert.AreEqual("correlationId", transcriptionMetadata.CorrelationId);
Assert.AreEqual("speechRecognitionModelEndpointId", transcriptionMetadata.SpeechRecognitionModelEndpointId);
}

private static void ValidateTranscriptionDataWithWordsNull(TranscriptionData transcription)
Expand Down