/// <summary>Snippet for StreamingDetectIntent</summary>
        public async Task StreamingDetectIntent()
        {
            // Snippet: StreamingDetectIntent(CallSettings, BidirectionalStreamingSettings)
            // Create client
            SessionsClient sessionsClient = SessionsClient.Create();

            // Initialize streaming call, retrieving the stream object
            SessionsClient.StreamingDetectIntentStream response = sessionsClient.StreamingDetectIntent();

            // Sending requests and retrieving responses can be arbitrarily interleaved
            // Exact sequence will depend on client/server behavior

            // Create task to do something with responses from server
            Task responseHandlerTask = Task.Run(async() =>
            {
                // Note that C# 8 code can use await foreach
                AsyncResponseStream <StreamingDetectIntentResponse> responseStream = response.GetResponseStream();
                while (await responseStream.MoveNextAsync())
                {
                    StreamingDetectIntentResponse responseItem = responseStream.Current;
                    // Do something with streamed response
                }
                // The response stream has completed
            });

            // Send requests to the server
            bool done = false;

            while (!done)
            {
                // Initialize a request
                StreamingDetectIntentRequest request = new StreamingDetectIntentRequest
                {
                    Session               = "",
                    QueryParams           = new QueryParameters(),
                    QueryInput            = new QueryInput(),
                    OutputAudioConfig     = new OutputAudioConfig(),
                    InputAudio            = ByteString.Empty,
                    OutputAudioConfigMask = new FieldMask(),
                };
                // Stream a request to the server
                await response.WriteAsync(request);

                // Set "done" to true when sending requests is complete
            }

            // Complete writing requests to the stream
            await response.WriteCompleteAsync();

            // Await the response handler
            // This will complete once all server responses have been processed
            await responseHandlerTask;
            // End snippet
        }
        /// <summary>Snippet for StreamingDetectIntent</summary>
        public async Task StreamingDetectIntent()
        {
            // Snippet: StreamingDetectIntent(CallSettings,BidirectionalStreamingSettings)
            // Create client
            SessionsClient sessionsClient = SessionsClient.Create();

            // Initialize streaming call, retrieving the stream object
            SessionsClient.StreamingDetectIntentStream duplexStream = sessionsClient.StreamingDetectIntent();

            // Sending requests and retrieving responses can be arbitrarily interleaved.
            // Exact sequence will depend on client/server behavior.

            // Create task to do something with responses from server
            Task responseHandlerTask = Task.Run(async() =>
            {
                IAsyncEnumerator <StreamingDetectIntentResponse> responseStream = duplexStream.ResponseStream;
                while (await responseStream.MoveNext())
                {
                    StreamingDetectIntentResponse response = responseStream.Current;
                    // Do something with streamed response
                }
                // The response stream has completed
            });

            // Send requests to the server
            bool done = false;

            while (!done)
            {
                // Initialize a request
                StreamingDetectIntentRequest request = new StreamingDetectIntentRequest
                {
                    Session    = "",
                    QueryInput = new QueryInput(),
                };
                // Stream a request to the server
                await duplexStream.WriteAsync(request);

                // Set "done" to true when sending requests is complete
            }
            // Complete writing requests to the stream
            await duplexStream.WriteCompleteAsync();

            // Await the response handler.
            // This will complete once all server responses have been processed.
            await responseHandlerTask;
            // End snippet
        }
Beispiel #3
0
        /// <summary>
        /// Detects the intent from a stream asynchronously.
        /// </summary>
        /// <param name="projectId">The project identifier.</param>
        /// <param name="sessionId">The session identifier.</param>
        /// <param name="filePath">The file path.</param>
        /// <returns>The detected results from dialogflow.</returns>
        public async Task <List <QueryResult> > DetectIntentFromStreamAsync(string projectId, string sessionId, string filePath)
        {
            List <QueryResult> results = new List <QueryResult>();
            SessionsClient     client  = SessionsClient.Create();
            var sessionName            = SessionName.FromProjectSession(projectId, sessionId).ToString();

            // Initialize streaming call, retrieving the stream object
            var streamingDetectIntent = client.StreamingDetectIntent();

            // Define a task to process results from the API
            var responseHandlerTask = Task.Run(async() =>
            {
                var responseStream = streamingDetectIntent.GetResponseStream();
                while (await responseStream.MoveNextAsync())
                {
                    var response    = responseStream.Current;
                    var queryResult = response.QueryResult;

                    if (queryResult != null)
                    {
                        Console.WriteLine($"Query text: {queryResult.QueryText}");
                        if (queryResult.Intent != null)
                        {
                            Console.Write("Intent detected:");
                            Console.WriteLine(queryResult.Intent.DisplayName);
                        }

                        results.Add(queryResult);
                    }
                }
            });

            // Instructs the speech recognizer how to process the audio content.
            // Note: hard coding audioEncoding, sampleRateHertz for simplicity.
            var queryInput = new QueryInput
            {
                AudioConfig = new InputAudioConfig
                {
                    AudioEncoding   = AudioEncoding.Linear16,
                    LanguageCode    = "de-DE",
                    SampleRateHertz = 11025
                }
            };

            // The first request must **only** contain the audio configuration:
            await streamingDetectIntent.WriteAsync(new StreamingDetectIntentRequest
            {
                QueryInput = queryInput,
                Session    = sessionName
            });

            try
            {
                using (var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
                {
                    // Subsequent requests must **only** contain the audio data.
                    // Following messages: audio chunks. We just read the file in
                    // fixed-size chunks. In reality you would split the user input
                    // by time.
                    var buffer = new byte[32 * 1024];
                    int bytesRead;
                    while ((bytesRead = await fs.ReadAsync(
                                buffer, 0, buffer.Length)) > 0)
                    {
                        await streamingDetectIntent.WriteAsync(new StreamingDetectIntentRequest
                        {
                            Session    = sessionName,
                            InputAudio = Google.Protobuf.ByteString.CopyFrom(buffer, 0, bytesRead)
                        });
                    }
                    ;
                }
            }
            catch { }

            // Tell the service you are done sending data
            await streamingDetectIntent.WriteCompleteAsync();

            // This will complete once all server responses have been processed.
            await responseHandlerTask;

            return(results);
        }