Exemple #1
0
        public override async Task <SpeechEnroller.Result> TrainAsync()
        {
            if (IsSessionOpen && !IsSessionClosing)
            {
                IsSessionClosing = true;
                EnrollResults.Clear();
                Content.Clear();

                Uri uri = Configuration.Server.BuildEndpoint(URI_PATH_TRAIN);

                Logger?.LogDebug("SpeechEnroller_HttpClient_Version1.TrainAsync(): URI: " + uri.ToString());

                using (var request = BuildRequest(CallMode.Train, uri))
                {
                    try
                    {
                        await HandleResponse(CallMode.Train, request, await mHttpClient.SendAsync(request));
                    }
                    catch (HttpRequestException ex)
                    {
                        EnrollResult = SpeechEnroller.Result.Timeout;
                        Logger?.LogError(ex);
                    }
                    return(EnrollResult);
                }
            }
            return(EnrollResult = SpeechEnroller.Result.Invalid);
        }
Exemple #2
0
        public override SpeechEnroller.Result Post()
        {
            if (IsSessionOpen && !IsSessionClosing)
            {
                EnrollResults.Clear();

                Uri uri = Configuration.Server.BuildEndpoint(URI_PATH_PROCESS);

                Logger?.LogDebug("SpeechEnroller_HttpClient_Version1.Post(): URI: " + uri.ToString());

                using (var request = BuildRequest(CallMode.Process, uri))
                {
                    try
                    {
                        var responseTask = mHttpClient.SendAsync(request);

                        responseTask.RunSynchronously();

                        var resultTask = HandleResponse(CallMode.Process, request, responseTask.Result);

                        resultTask.RunSynchronously();
                    }
                    catch (HttpRequestException ex)
                    {
                        EnrollResult = SpeechEnroller.Result.Timeout;
                        Logger?.LogError(ex);
                    }
                    return(EnrollResult);
                }
            }
            return(EnrollResult = SpeechEnroller.Result.Invalid);
        }
Exemple #3
0
        public override void Cancel(string reason, SpeechEnroller.CancelCallback callback)
        {
            if (IsSessionOpen && !IsSessionClosing)
            {
                IsSessionClosing = true;
                EnrollResults.Clear();
                Content.Clear();

                if (string.IsNullOrEmpty(reason))
                {
                    reason = "Unknown";
                }
                else
                {
                    reason = reason.Replace(' ', '-').Substring(0, System.Math.Min(reason.Length, 64));
                }

                Uri uri = Configuration.Server.BuildEndpoint(URI_PATH_CANCEL, reason);

                Logger?.LogDebug("SpeechEnroller_HttpClient_Version1.Cancel(callback): URI: " + uri.ToString());

                using (var request = BuildRequest(CallMode.Cancel, uri))
                {
                    var task = mHttpClient.SendAsync(request).ContinueWith((requestTask) => {
                        if (requestTask.IsFaulted)
                        {
                            EnrollResult = SpeechEnroller.Result.Timeout;
                            Logger?.LogError(requestTask.Exception);
                            callback?.Invoke();
                            return;
                        }
                        HandleResponse(CallMode.Cancel, request, requestTask.Result).ContinueWith((responseTask) => {
                            if (responseTask.IsFaulted)
                            {
                                EnrollResult = SpeechEnroller.Result.Timeout;
                                Logger?.LogError(responseTask.Exception);
                                callback?.Invoke();
                                return;
                            }
                            callback?.Invoke();
                        });
                    });

                    if (task.IsFaulted)
                    {
                        EnrollResult = SpeechEnroller.Result.Timeout;
                        Logger?.LogError(task.Exception);
                        callback?.Invoke();
                    }

                    return;
                }
            }
            EnrollResult = SpeechEnroller.Result.Invalid;
            callback?.Invoke();
        }
Exemple #4
0
        public override void Train(SpeechEnroller.TrainCallback callback)
        {
            if (IsSessionOpen && !IsSessionClosing)
            {
                IsSessionClosing = true;
                EnrollResults.Clear();
                Content.Clear();

                Uri uri = Configuration.Server.BuildEndpoint(URI_PATH_TRAIN);

                Logger?.LogDebug("SpeechEnroller_HttpClient_Version1.Train(callback): URI: " + uri.ToString());

                using (var request = BuildRequest(CallMode.Train, uri))
                {
                    var task = mHttpClient.SendAsync(request).ContinueWith((requestTask) => {
                        if (requestTask.IsFaulted)
                        {
                            EnrollResult = SpeechEnroller.Result.Timeout;
                            Logger?.LogError(requestTask.Exception);
                            callback?.Invoke(EnrollResult);
                            return;
                        }
                        HandleResponse(CallMode.Train, request, requestTask.Result).ContinueWith((responseTask) => {
                            if (responseTask.IsFaulted)
                            {
                                EnrollResult = SpeechEnroller.Result.Timeout;
                                Logger?.LogError(responseTask.Exception);
                                callback?.Invoke(EnrollResult);
                                return;
                            }
                            callback?.Invoke(EnrollResult);
                        });
                    });

                    if (task.IsFaulted)
                    {
                        EnrollResult = SpeechEnroller.Result.Timeout;
                        Logger?.LogError(task.Exception);
                        callback?.Invoke(EnrollResult);
                    }

                    return;
                }
            }
            callback?.Invoke(EnrollResult = SpeechEnroller.Result.Invalid);
        }
Exemple #5
0
        public override bool Cancel(string reason)
        {
            if (IsSessionOpen && !IsSessionClosing)
            {
                IsSessionClosing = true;
                EnrollResults.Clear();
                Content.Clear();

                if (string.IsNullOrEmpty(reason))
                {
                    reason = "Unknown";
                }
                else
                {
                    reason = reason.Replace(' ', '-').Substring(0, System.Math.Min(reason.Length, 64));
                }

                Uri uri = Configuration.Server.BuildEndpoint(URI_PATH_CANCEL, reason);

                Logger?.LogDebug("SpeechEnroller_HttpClient_Version1.Cancel(): URI: " + uri.ToString());

                using (var request = BuildRequest(CallMode.Cancel, uri))
                {
                    try
                    {
                        var responseTask = mHttpClient.SendAsync(request);

                        responseTask.RunSynchronously();

                        var resultTask = HandleResponse(CallMode.Cancel, request, responseTask.Result);

                        resultTask.RunSynchronously();

                        return(resultTask.Result);
                    }
                    catch (HttpRequestException ex)
                    {
                        EnrollResult = SpeechEnroller.Result.Timeout;
                        Logger?.LogError(ex);
                    }
                }
            }
            return(false);
        }
 protected void ResetEnroller()
 {
     SessionId = "";
     Codec     = WaveFormatEncoding.Unknown;
     Profiles.Clear();
     EnrollResults.Clear();
     EnrollResult = SpeechEnroller.Result.NeedMore;
     MetaData.Clear();
     ExtraData.Clear();
     Content.Clear();
     CookieContainer     = new CookieContainer();
     TotalSnippetsSent   = 0;
     TotalAudioBytesSent = 0;
     TotalProcessCalls   = 0;
     SpeechRequired      = 0;
     SpeechExtracted     = 0;
     IsSessionOpen       = false;
     IsSessionClosing    = false;
     IsTooSoft           = false;
     IsTooLoud           = false;
 }
        protected void AddResult(uint index, string name, SpeechEnroller.InstanceResult result)
        {
            SpeechEnroller.Profile profile = Profiles[index];

            if (result.SpeechExtracted.HasValue)
            {
                result.SpeechTrained = 0.0;
                if (result.SpeechExtracted.Value >= profile.MinimumSecondsOfSpeech)
                {
                    result.Result = SpeechEnroller.Result.Success;
                }
                else
                {
                    result.Result = SpeechEnroller.Result.NeedMore;
                }
            }
            else if (result.SpeechTrained.HasValue)
            {
                result.Result          = SpeechEnroller.Result.Success;
                result.SpeechExtracted = 0.0;
            }
            else
            {
                // Error
                result.Result = SpeechEnroller.Result.Invalid;
            }

            Logger?.LogDebug("SpeechEnrollerBase.AddResult(): {0} - ErrorCode: {1}", name, result.ErrorCode);
            Logger?.LogDebug("SpeechEnrollerBase.AddResult(): {0} - SpeechExtracted: {1}", name, result.SpeechExtracted);
            Logger?.LogDebug("SpeechEnrollerBase.AddResult(): {0} - SpeechTrained: {1}", name, result.SpeechTrained);
            Logger?.LogDebug("SpeechEnrollerBase.AddResult(): {0} - Result: {1}", name, result.Result);

            foreach (var extra in result.Extra)
            {
                Logger?.LogDebug("SpeechEnrollerBase.AddResult(): {0} - {1}: {2}", name, extra.Key, extra.Value);
            }

            EnrollResults.Add(name, result);
        }
Exemple #8
0
        private async Task <bool> HandleResponse(CallMode mode, HttpRequestMessage request, HttpResponseMessage response)
        {
            Content.Clear();
            ExtraData.Clear();

            if (response == null)
            {
                Logger?.LogError("SpeechEnroller_HttpClient_Version1.HandleResponse(): Timeout occurred");
                EnrollResult = SpeechEnroller.Result.Timeout;
                return(false);
            }

            try
            {
                HttpStatusCode code        = response.StatusCode;
                string         description = response.ReasonPhrase;

                Logger?.LogDebug($"SpeechEnroller_HttpClient_Version1.HandleResponse(): Http Status Code: {code}");
                Logger?.LogDebug($"SpeechEnroller_HttpClient_Version1.HandleResponse(): Http Status Description: {description}");

                if (code == HttpStatusCode.OK)
                {
                    if (mode == CallMode.Start)
                    {
                        if (!response.Headers.TryGetValues(SpeechApi.SESSION_ID, out var sessionValue))
                        {
                            Logger?.LogError("SpeechEnroller_HttpClient_Version1.HandleResponse(): Invalid start response, no Vv-Session-Id");
                            return(false);
                        }

                        SessionId = sessionValue.FirstOrDefault();
                        if (string.IsNullOrEmpty(SessionId))
                        {
                            Logger?.LogError("SpeechEnroller_HttpClient_Version1.HandleResponse(): Invalid start response, empty Vv-Session-Id");
                            return(false);
                        }

                        IsSessionOpen = true;
                    }
                    else if (mode == CallMode.Train)
                    {
                        SessionId     = "";
                        IsSessionOpen = false;
                    }
                    else if (mode == CallMode.Cancel)
                    {
                        SessionId     = "";
                        IsSessionOpen = false;
                        return(true);
                    }
                }

                if (response.Headers.TryGetValues(SpeechApi.SET_COOKIE, out var newCookies))
                {
                    foreach (var item in SetCookieHeaderValue.ParseList(newCookies.ToList()))
                    {
                        var uri = new Uri(request.RequestUri, item.Path.Value);
                        Logger?.LogDebug("{0}: {1} - {2} - {3}", SpeechApi.SET_COOKIE, item.Name.Value, item.Value.Value, item.Path.Value);
                        CookieContainer.Add(uri, new Cookie(item.Name.Value, item.Value.Value, item.Path.Value));
                    }
                }

                if (response.Content == null)
                {
                    Logger?.LogError("SpeechEnroller_HttpClient_Version1.HandleResponse(): Expected Content Type: 'application/json'. Actual Content Type: 'Empty'");
                    return(false);
                }
                else if (!response.Content.Headers.ContentType.MediaType.Equals("application/json"))
                {
                    Logger?.LogError("SpeechEnroller_HttpClient_Version1.HandleResponse(): Expected Content Type: 'application/json'. Actual Content Type: '{0}'", response.Content.Headers.ContentType.MediaType);
                    return(false);
                }

                var content = await response.Content.ReadAsStringAsync();

                if (content == null || content.Length == 0)
                {
                    Logger?.LogError("SpeechEnroller_HttpClient_Version1.HandleResponse(): Expected Content Data: Length 0");
                    return(false);
                }

                Logger?.LogDebug("SpeechEnroller_HttpClient_Version1.HandleResponse(): Http Content: {0}", content);

                SpeechEnroller_Version1_Response version1Response = JsonConvert.DeserializeObject <SpeechEnroller_Version1_Response>(content);

                if (code == HttpStatusCode.OK)
                {
                    switch (mode)
                    {
                    case CallMode.Profile:
                        if (version1Response.EnrollProfile != null)
                        {
                            mLastProfileIndex = AddProfile(version1Response.EnrollProfile.Index, version1Response.EnrollProfile.Profile);
                        }
                        break;

                    case CallMode.Start:
                        if (version1Response.EnrollProfile != null)
                        {
                            mLastProfileIndex = AddProfile(version1Response.EnrollProfile.Index, version1Response.EnrollProfile.Profile);
                        }
                        if (version1Response.ResultData != null)
                        {
                            foreach (var kv in version1Response.ResultData)
                            {
                                ExtraData.Add(kv.Key, kv.Value);
                            }
                        }
                        break;

                    case CallMode.Process:
                        if (version1Response.EnrollResults != null)
                        {
                            foreach (var kv in version1Response.EnrollResults)
                            {
                                AddResult(kv.Value.Index, kv.Key, kv.Value.Instance);
                            }

                            if (!string.IsNullOrEmpty(ClientId) && EnrollResults.ContainsKey(ClientId.ToLower()))
                            {
                                SpeechEnroller.InstanceResult result = EnrollResults[ClientId.ToLower()];
                                SpeechTrained = 0;
                                if (result.SpeechExtracted.HasValue)
                                {
                                    SpeechExtracted = result.SpeechExtracted.Value;
                                }
                                EnrollResult = result.Result;
                            }
                            else
                            {
                                SpeechExtracted = 0;
                                SpeechTrained   = 0;
                                EnrollResult    = SpeechEnroller.Result.Unknown;
                            }
                        }
                        if (version1Response.ResultData != null)
                        {
                            foreach (var kv in version1Response.ResultData)
                            {
                                ExtraData.Add(kv.Key, kv.Value);
                            }
                        }
                        break;

                    case CallMode.Train:
                        if (version1Response.EnrollResults != null)
                        {
                            foreach (var kv in version1Response.EnrollResults)
                            {
                                AddResult(kv.Value.Index, kv.Key, kv.Value.Instance);
                            }

                            if (!string.IsNullOrEmpty(ClientId) && EnrollResults.ContainsKey(ClientId.ToLower()))
                            {
                                SpeechEnroller.InstanceResult result = EnrollResults[ClientId.ToLower()];
                                SpeechExtracted = 0;
                                if (result.SpeechTrained.HasValue)
                                {
                                    SpeechTrained = result.SpeechTrained.Value;
                                }
                                EnrollResult = result.Result;
                            }
                            else
                            {
                                SpeechExtracted = 0;
                                SpeechTrained   = 0;
                                EnrollResult    = SpeechEnroller.Result.Unknown;
                            }
                        }
                        if (version1Response.ResultData != null)
                        {
                            foreach (var kv in version1Response.ResultData)
                            {
                                ExtraData.Add(kv.Key, kv.Value);
                            }
                        }
                        break;
                    }

                    return(true);
                }
                else
                {
                    if (version1Response.Error.HasValue)
                    {
                        EnrollResult = GetErrorResult(version1Response.Error.Value);
                    }
                    else
                    {
                        EnrollResult = SpeechEnroller.Result.Unknown;
                    }

                    if (EnrollResult == SpeechEnroller.Result.NeedMore)
                    {
                        if (IsTooSoft)
                        {
                            EnrollResult = SpeechEnroller.Result.TooSoft;
                        }
                        else if (IsTooLoud)
                        {
                            EnrollResult = SpeechEnroller.Result.TooLoud;
                        }
                    }
                    else if (EnrollResult == SpeechEnroller.Result.TooSoft)
                    {
                        IsTooSoft = true;
                    }
                    else if (EnrollResult == SpeechEnroller.Result.TooLoud)
                    {
                        IsTooLoud = true;
                    }

                    Logger?.LogError(
                        "SpeechEnroller_HttpClient_Version1.HandleResponse(): Error detected.\r\n\tUri: {0}\r\n\tResult: {1}\r\n\tCode: {2}\r\n\tDescription: {3}",
                        request.RequestUri,
                        EnrollResult,
                        version1Response.Error.HasValue ? "" + version1Response.Error.Value + "" : "?",
                        version1Response.Description);

                    return(false);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return(false);
            }
        }