예제 #1
0
        /// <summary>
        /// Creates a message request that will process a query string with NLU
        /// </summary>
        /// <param name="config"></param>
        /// <param name="query">Text string to process with the NLU</param>
        /// <returns></returns>
        public static WitRequest MessageRequest(this WitConfiguration config, string query, WitRequestOptions requestOptions, IDynamicEntitiesProvider[] additionalDynamicEntities = null)
        {
            List <WitRequest.QueryParam> queryParams = new List <WitRequest.QueryParam>
            {
                QueryParam("q", query)
            };

            if (null != requestOptions && -1 != requestOptions.nBestIntents)
            {
                queryParams.Add(QueryParam("n", requestOptions.nBestIntents.ToString()));
            }

            HandleWitRequestOptions(requestOptions, additionalDynamicEntities, queryParams);

            if (null != requestOptions && !string.IsNullOrEmpty(requestOptions.tag))
            {
                queryParams.Add(QueryParam("tag", requestOptions.tag));
            }

            var        path    = WitEndpointConfig.GetEndpointConfig(config).Message;
            WitRequest request = new WitRequest(config, path, queryParams.ToArray());

            if (null != requestOptions)
            {
                request.onResponse += requestOptions.onResponse;
                request.requestId   = requestOptions.requestID;
            }

            return(request);
        }
예제 #2
0
        /// <summary>
        /// Creates a request for getting the transcription from the mic data
        /// </summary>
        ///<param name="config"></param>
        /// <param name="requestOptions"></param>
        /// <returns>WitRequest</returns>
        public static WitRequest DictationRequest(this WitConfiguration config, WitRequestOptions requestOptions)
        {
            List <WitRequest.QueryParam> queryParams = new List <WitRequest.QueryParam>();
            var        path    = WitEndpointConfig.GetEndpointConfig(config).Dictation;
            WitRequest request = new WitRequest(config, path, queryParams.ToArray());

            if (null != requestOptions)
            {
                request.onResponse += requestOptions.onResponse;
                request.requestId   = requestOptions.requestID;
            }

            return(request);
        }
예제 #3
0
        /// <summary>
        /// Creates a request for nlu processing that includes a data stream for mic data
        /// </summary>
        /// <param name="config"></param>
        /// <returns></returns>
        public static WitRequest SpeechRequest(this WitConfiguration config, WitRequestOptions requestOptions)
        {
            List <WitRequest.QueryParam> queryParams = new List <WitRequest.QueryParam>();

            if (null != requestOptions && -1 != requestOptions.nBestIntents)
            {
                queryParams.Add(QueryParam("n", requestOptions.nBestIntents.ToString()));
            }

            if (null != requestOptions?.dynamicEntities)
            {
                queryParams.Add(QueryParam("entities", requestOptions.dynamicEntities.ToJSON()));
            }

            var path = WitEndpointConfig.GetEndpointConfig(config).Speech;

            return(new WitRequest(config, path, queryParams.ToArray()));
        }
예제 #4
0
        /// <summary>
        /// Creates a request for nlu processing that includes a data stream for mic data
        /// </summary>
        /// <param name="config"></param>
        /// <returns></returns>
        public static WitRequest SpeechRequest(this WitConfiguration config, WitRequestOptions requestOptions, IDynamicEntitiesProvider[] additionalEntityProviders = null)
        {
            List <WitRequest.QueryParam> queryParams = new List <WitRequest.QueryParam>();

            if (null != requestOptions && -1 != requestOptions.nBestIntents)
            {
                queryParams.Add(QueryParam("n", requestOptions.nBestIntents.ToString()));
            }

            HandleWitRequestOptions(requestOptions, additionalEntityProviders, queryParams);

            var        path    = WitEndpointConfig.GetEndpointConfig(config).Speech;
            WitRequest request = new WitRequest(config, path, queryParams.ToArray());

            if (null != requestOptions)
            {
                request.onResponse += requestOptions.onResponse;
                request.requestId   = requestOptions.requestID;
            }

            return(request);
        }
예제 #5
0
        // Get uri
        private static Uri GetUri(WitConfiguration configuration, string path, Dictionary <string, string> queryParams)
        {
            // Uri builder
            UriBuilder uriBuilder = new UriBuilder();

            // Append endpoint data
            var endpointConfig = WitEndpointConfig.GetEndpointConfig(configuration);

            uriBuilder.Scheme = endpointConfig.UriScheme;
            uriBuilder.Host   = endpointConfig.Authority;
            if (endpointConfig.Port > 0)
            {
                uriBuilder.Port = endpointConfig.Port;
            }

            // Set path
            uriBuilder.Path = path;

            // Build query
            uriBuilder.Query = $"v={endpointConfig.WitApiVersion}";
            if (queryParams != null)
            {
                foreach (string key in queryParams.Keys)
                {
                    string val = Uri.EscapeDataString(queryParams[key]);
                    uriBuilder.Query += $"&{key}={val}";
                }
            }

            // Return custom uri
            if (OnProvideCustomUri != null)
            {
                return(OnProvideCustomUri(uriBuilder));
            }

            // Return uri
            return(uriBuilder.Uri);
        }
예제 #6
0
        /// <summary>
        /// Start the async request for data from the Wit.ai servers
        /// </summary>
        public void Request()
        {
            responseStarted = false;

            UriBuilder uriBuilder = new UriBuilder();

            var endpointConfig = WitEndpointConfig.GetEndpointConfig(configuration);

            uriBuilder.Scheme = endpointConfig.UriScheme;

            uriBuilder.Host = endpointConfig.Authority;

            var api = endpointConfig.WitApiVersion;

            if (endpointConfig.Port > 0)
            {
                uriBuilder.Port = endpointConfig.Port;
            }

            uriBuilder.Query = $"v={api}";

            uriBuilder.Path = path;

            callingStackTrace = Environment.StackTrace;

            if (queryParams.Any())
            {
                var p = queryParams.Select(par =>
                                           $"{par.key}={Uri.EscapeDataString(par.value)}");
                uriBuilder.Query += "&" + string.Join("&", p);
            }

            var uri = null == onCustomizeUri ? uriBuilder.Uri : onCustomizeUri(uriBuilder);

            StartRequest(uri);
        }
예제 #7
0
 private bool RequestRequiresBody(string command)
 {
     return(command == WitEndpointConfig.GetEndpointConfig(configuration).Speech ||
            command == WitEndpointConfig.GetEndpointConfig(configuration).Dictation);
 }
예제 #8
0
        private void StartRequest(Uri uri)
        {
            if (!configuration && configurationRequired)
            {
                statusDescription = "Configuration is not set. Cannot start request.";
                Debug.LogError(statusDescription);
                statusCode = ERROR_CODE_NO_CONFIGURATION;
                SafeInvoke(onResponse);
                return;
            }

            if (!isServerAuthRequired && string.IsNullOrEmpty(configuration.clientAccessToken))
            {
                statusDescription = "Client access token is not defined. Cannot start request.";
                Debug.LogError(statusDescription);
                statusCode = ERROR_CODE_NO_CLIENT_TOKEN;
                SafeInvoke(onResponse);
                return;
            }

            //allow app to intercept request and potentially modify uri or add custom headers
            //NOTE: the callback depends on knowing the original Uri, before it is modified
            Dictionary <string, string> customHeaders = null;

            if (onPreSendRequest != null)
            {
                onPreSendRequest(ref uri, out customHeaders);
            }

            WrapHttpWebRequest wr = new WrapHttpWebRequest((HttpWebRequest)WebRequest.Create(uri.AbsoluteUri));

            //request = (IRequest)(HttpWebRequest) WebRequest.Create(uri);
            _request = wr;
            if (isServerAuthRequired)
            {
                _request.Headers["Authorization"] =
                    $"Bearer {serverToken}";
            }
            else
            {
                _request.Headers["Authorization"] =
                    $"Bearer {configuration.clientAccessToken.Trim()}";
            }

            if (null != postContentType)
            {
                _request.Method        = "POST";
                _request.ContentType   = postContentType;
                _request.ContentLength = postData.Length;
            }

            // Configure additional headers
            if (WitEndpointConfig.GetEndpointConfig(configuration).Speech == command ||
                WitEndpointConfig.GetEndpointConfig(configuration).Dictation == command)
            {
                _request.ContentType = audioEncoding.ToString();
                _request.Method      = "POST";
                _request.SendChunked = true;
            }

            _request.Headers["X-Wit-Client-Request-Id"] = requestId;

            requestRequiresBody = RequestRequiresBody(command);

            var configId = "not-yet-configured";

#if UNITY_EDITOR
            if (configuration)
            {
                if (string.IsNullOrEmpty(configuration.configId))
                {
                    configuration.configId = Guid.NewGuid().ToString();
                    EditorUtility.SetDirty(configuration);
                }

                configId = configuration.configId;
            }
#endif

            _request.UserAgent = GetUserAgent(configuration);

            requestStartTime  = DateTime.UtcNow;
            isActive          = true;
            statusCode        = 0;
            statusDescription = "Starting request";
            _request.Timeout  = configuration ? configuration.timeoutMS : 10000;
            WatchMainThreadCallbacks();

            if (null != onProvideCustomHeaders)
            {
                foreach (var header in onProvideCustomHeaders())
                {
                    _request.Headers[header.Key] = header.Value;
                }
            }

            //apply any modified headers last, as this allows us to overwrite headers if need be
            if (customHeaders != null)
            {
                foreach (var pair in customHeaders)
                {
                    _request.Headers[pair.Key] = pair.Value;
                }
            }

            if (_request.Method == "POST")
            {
                var getRequestTask = _request.BeginGetRequestStream(HandleRequestStream, _request);
                ThreadPool.RegisterWaitForSingleObject(getRequestTask.AsyncWaitHandle,
                                                       HandleTimeoutTimer, _request, Timeout, true);
            }
            else
            {
                StartResponse();
            }
        }
예제 #9
0
        private void StartRequest(Uri uri)
        {
            if (!configuration && configurationRequired)
            {
                statusDescription = "Configuration is not set. Cannot start request.";
                Debug.LogError(statusDescription);
                statusCode = ERROR_CODE_NO_CONFIGURATION;
                SafeInvoke(onResponse);
                return;
            }

            if (!isServerAuthRequired && string.IsNullOrEmpty(configuration.clientAccessToken))
            {
                statusDescription = "Client access token is not defined. Cannot start request.";
                Debug.LogError(statusDescription);
                statusCode = ERROR_CODE_NO_CLIENT_TOKEN;
                SafeInvoke(onResponse);
                return;
            }

            request = (HttpWebRequest)WebRequest.Create(uri);

            if (isServerAuthRequired)
            {
                request.Headers["Authorization"] =
                    $"Bearer {serverToken}";
            }
            else
            {
                request.Headers["Authorization"] =
                    $"Bearer {configuration.clientAccessToken.Trim()}";
            }

            if (null != postContentType)
            {
                request.Method        = "POST";
                request.ContentType   = postContentType;
                request.ContentLength = postData.Length;
            }

            // Configure additional headers
            if (WitEndpointConfig.GetEndpointConfig(configuration).Speech == command)
            {
                request.ContentType = audioEncoding.ToString();
                request.Method      = "POST";
                request.SendChunked = true;
            }

            var configId = "not-yet-configured";

#if UNITY_EDITOR
            if (configuration)
            {
                if (string.IsNullOrEmpty(configuration.configId))
                {
                    configuration.configId = Guid.NewGuid().ToString();
                    EditorUtility.SetDirty(configuration);
                }

                configId = configuration.configId;
            }
#endif

            request.UserAgent = $"voice-sdk-35.0.0.98.175,wit-unity-{WIT_SDK_VERSION},{operatingSystem},{deviceModel},{configId},{Application.identifier}";

#if UNITY_EDITOR
            request.UserAgent += ",Editor";
#else
            request.UserAgent += ",Runtime";
#endif

            requestStartTime  = DateTime.Now;
            isActive          = true;
            statusCode        = 0;
            statusDescription = "Starting request";
            request.Timeout   = configuration ? configuration.timeoutMS : 10000;

            if (null != onProvideCustomHeaders)
            {
                foreach (var header in onProvideCustomHeaders())
                {
                    request.Headers[header.Key] = header.Value;
                }
            }
            if (request.Method == "POST")
            {
                var getRequestTask = request.BeginGetRequestStream(HandleRequestStream, request);
                ThreadPool.RegisterWaitForSingleObject(getRequestTask.AsyncWaitHandle,
                                                       HandleTimeoutTimer, request, Timeout, true);
            }
            else
            {
                StartResponse();
            }
        }