예제 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="encoding"></param>
        /// <param name="sampleRateHertz"></param>
        /// <param name="languageCode"></param>
        /// <param name="intermResults"></param>
        public async Task ConfigureSpeechRequest(
            RecognitionConfig.Types.AudioEncoding encoding,
            int sampleRateHertz,
            string languageCode,
            bool intermResults)
        {
            if (null == speechClient)
            {
                return;
            }

            streamingCall = speechClient.StreamingRecognize();

            request = new StreamingRecognizeRequest()
            {
                StreamingConfig = new StreamingRecognitionConfig()
                {
                    Config = new RecognitionConfig()
                    {
                        Encoding        = encoding,
                        SampleRateHertz = sampleRateHertz,
                        LanguageCode    = languageCode,
                    },

                    InterimResults = intermResults,
                }
            };

            // Write the initial request with the config.
            await streamingCall.WriteAsync(request);
        }
예제 #2
0
 /// <summary>
 /// Asynchronously sends chunks of audio to the server.
 /// </summary>
 /// <param name="call">Bidirectional streaming call whose request stream to write to.</param>
 static async Task SendChunks(AsyncDuplexStreamingCall <StreamingRecognizeRequest, StreamingRecognizeResponse> call)
 {
     while (!m_DoneStreaming)
     {
         if (m_AudioChunksQueue.Count > 0)
         {
             var audioRequest = new StreamingRecognizeRequest();
             audioRequest.AudioContent = m_AudioChunksQueue.Dequeue();
             await call.RequestStream.WriteAsync(audioRequest);
         }
         await Task.Delay(k_MillisecondsBetweenChunks);
     }
 }
예제 #3
0
        /// <summary>Snippet for StreamingRecognize</summary>
        public async Task StreamingRecognize()
        {
            // Snippet: StreamingRecognize(CallSettings, BidirectionalStreamingSettings)
            // Create client
            SpeechClient speechClient = SpeechClient.Create();

            // Initialize streaming call, retrieving the stream object
            SpeechClient.StreamingRecognizeStream response = speechClient.StreamingRecognize();

            // 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 <StreamingRecognizeResponse> responseStream = response.GetResponseStream();
                while (await responseStream.MoveNextAsync())
                {
                    StreamingRecognizeResponse 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
                StreamingRecognizeRequest request = new StreamingRecognizeRequest
                {
                    StreamingConfig = new StreamingRecognitionConfig(),
                    AudioContent    = ByteString.Empty,
                };
                // 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
        }
 public GoogleRecognitionEngineProvider(IMicrophoneContext microphoneContext, ISpeechHandlerChain speechHandlerChain)
 {
     try
     {
         m_client            = SpeechClient.Create();
         m_microphoneContext = microphoneContext;
         m_bytesPerSecond    = m_microphoneContext.SampleRate() *
                               m_microphoneContext.ChannelCount() *
                               m_microphoneContext.BytesPerSample();
         m_speechHandlerChain        = speechHandlerChain;
         m_streamingRecognizeRequest = CreateStreamingRecognizeRequest();
     }
     catch (Exception e)
     {
         Console.WriteLine(e.ToString());
     }
 }
예제 #5
0
        /// <summary>Snippet for StreamingRecognize</summary>
        public async Task StreamingRecognize()
        {
            // Snippet: StreamingRecognize(CallSettings,BidirectionalStreamingSettings)
            // Create client
            SpeechClient speechClient = SpeechClient.Create();

            // Initialize streaming call, retrieving the stream object
            SpeechClient.StreamingRecognizeStream duplexStream = speechClient.StreamingRecognize();

            // 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 <StreamingRecognizeResponse> responseStream = duplexStream.ResponseStream;
                while (await responseStream.MoveNext())
                {
                    StreamingRecognizeResponse 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
                StreamingRecognizeRequest request = new StreamingRecognizeRequest();
                // 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
        }
예제 #6
0
            public async Task StreamingRecognizeWAV(StreamingRecognitionConfig config, Stream audioStream)
            {
                var streamingSTT      = _clientSTT.StreamingRecognize(GetMetadataSTT());
                var requestWithConfig = new StreamingRecognizeRequest
                {
                    StreamingConfig = config
                };
                await streamingSTT.RequestStream.WriteAsync(requestWithConfig); //передаем параметры аудио

                Task PrintResponsesTask = Task.Run(async() =>                   // Пишем ответ в консоль
                {
                    while (await streamingSTT.ResponseStream.MoveNext())
                    {
                        foreach (var result in streamingSTT.ResponseStream.Current.Results)
                        {
                            foreach (var alternative in result.RecognitionResult.Alternatives)
                            {
                                System.Console.WriteLine(alternative.Transcript);
                                text += alternative.Transcript;
                            }
                        }
                    }
                });

                var buffer = new byte[config.Config.SampleRateHertz / 10];
                int bytesRead;

                //   audioStream.Position = 44;
                while ((bytesRead = audioStream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    await streamingSTT.RequestStream.WriteAsync(
                        new StreamingRecognizeRequest
                    {
                        AudioContent = Google.Protobuf
                                       .ByteString.CopyFrom(buffer, 0, bytesRead),
                    });
                }

                await streamingSTT.RequestStream.CompleteAsync();

                await PrintResponsesTask;
            }
        private static StreamingRecognizeRequest GetStreamingRecognizeRequest(SpeechContext speechContext)
        {
            var streamingRecognizeRequest = new StreamingRecognizeRequest
            {
                StreamingConfig = new StreamingRecognitionConfig
                {
                    Config = new RecognitionConfig
                    {
                        Encoding =
                            RecognitionConfig.Types.AudioEncoding.Linear16,
                        SampleRateHertz = 16000,
                        LanguageCode    = "ru",
                        MaxAlternatives = 0,
                        SpeechContexts  = { speechContext }
                    },
                    InterimResults = true,
                }
            };

            return(streamingRecognizeRequest);
        }
        public async Task StreamingRecognize(StreamingRecognitionConfig config, Stream audioStream)
        {
            var streamingSTT      = _clientSTT.StreamingRecognize(GetMetadataSTT());
            var requestWithConfig = new StreamingRecognizeRequest
            {
                StreamingConfig = config
            };
            await streamingSTT.RequestStream.WriteAsync(requestWithConfig);

            Task PrintResponsesTask = Task.Run(async() =>
            {
                while (await streamingSTT.ResponseStream.MoveNext())
                {
                    foreach (var result in streamingSTT.ResponseStream.Current.Results)
                    {
                        foreach (var alternative in result.RecognitionResult.Alternatives)
                        {
                            System.Console.WriteLine(alternative.Transcript);
                        }
                    }
                }
            });

            var buffer = new byte[2 * 1024];
            int bytesRead;

            while ((bytesRead = audioStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                await streamingSTT.RequestStream.WriteAsync(
                    new StreamingRecognizeRequest
                {
                    AudioContent = Google.Protobuf
                                   .ByteString.CopyFrom(buffer, 0, bytesRead),
                });
            }

            await streamingSTT.RequestStream.CompleteAsync();

            await PrintResponsesTask;
        }
예제 #9
0
        private async void OnDataAvailable(object sender, WaveInEventArgs e)
        {
            //Debug.WriteLine(nameof(OnDataAvailable) + ": Start");

            var audioRequest = new StreamingRecognizeRequest()
            {
                AudioContent = RecognitionAudio.FromBytes(e.Buffer, 0, e.BytesRecorded).Content
            };

            try
            {
                if (_call != null && _canWrite)
                {
                    await _call.RequestStream.WriteAsync(audioRequest);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(nameof(OnDataAvailable) + ": Failed send data" + ex.Message);
            }
            //Debug.WriteLine(nameof(OnDataAvailable) + ": End");
        }
예제 #10
0
 public override stt::Task WriteAsync(StreamingRecognizeRequest message, grpccore::WriteOptions options) =>
 _writeBuffer.WriteAsync(ModifyRequest(message), options);
예제 #11
0
 private StreamingRecognizeRequest ModifyRequest(StreamingRecognizeRequest request)
 {
     _service.Modify_StreamingRecognizeRequestRequest(ref request);
     return(request);
 }
예제 #12
0
 public override stt::Task WriteAsync(StreamingRecognizeRequest message) =>
 _writeBuffer.WriteAsync(ModifyRequest(message));
예제 #13
0
 partial void Modify_StreamingRecognizeRequestRequest(ref StreamingRecognizeRequest request);
        private async Task <int> StreamingMicRecognizeAsync()
        {
            try
            {
                _writeMore = true;
                timer      = new Stopwatch();
                timer.Start();
                if (WaveIn.DeviceCount < 1)
                {
                    throw new ApplicationException("No microphone!");
                }

                _speechClient = SpeechClient.Create();
                var stream = _speechClient.StreamingRecognize();
                streams.Add(stream);
                var speechContext = new SpeechContext();
                speechContext.Phrases.AddRange(new[]
                                               { "int", "for", "true", "false", "public", "private", "bool", "static", "void", "переменная" }
                                               /*.Concat(_variableProvider.GetVariables().Select(v => v.Name))*/);
                // Write the initial request with the config.
                StreamingRecognizeRequest recognizeRequest = GetStreamingRecognizeRequest(speechContext);
                await stream.WriteAsync(recognizeRequest);

                // Print responses as they arrive.

                Task printResponses = Task.Run(async() =>
                {
                    while (await stream.ResponseStream.MoveNext(default(CancellationToken)))
                    {
                        foreach (StreamingRecognitionResult streamingRecognitionResult in stream
                                 .ResponseStream
                                 .Current.Results)
                        {
                            if (streamingRecognitionResult.IsFinal)
                            {
                                var transcript = streamingRecognitionResult.Alternatives[0].Transcript;
                                OnSpeechRecognized?.Invoke(this, new SpeechRecognizerEventArgs(transcript));
                                if (timer.Elapsed.TotalSeconds >= threshold)
                                {
                                    Restart();
                                }
                            }
                        }
                    }
                });
                // Read from the microphone and stream to API.
                ActivateMicrophone();
                Console.WriteLine("Speak now.");
                //await Task.Delay(TimeSpan.FromSeconds(seconds));
                // Stop recording and shut down.
                //StopRecognition();
                await printResponses;
                //await printResponses;
                return(0);
            }
            catch (Exception e)
            {
                Debug.WriteLine(e);
            }

            return(-1);
        }
 /// <inheritdoc/>
 public override Task TryWriteAsync(StreamingRecognizeRequest message, WriteOptions options) =>
 _writeBuffer.TryWriteAsync(ModifyRequest(message), options);
예제 #16
0
        static void Main(string[] args)
        {
            // 証明書を作成
            var credential = GoogleCredential.FromJson(File.ReadAllText("SpeechTest-4db378c087bb.json"));

            credential = credential.CreateScoped("https://www.googleapis.com/auth/cloud-platform");

            // サーバに接続するためのチャンネルを作成
            var channel = new Channel("speech.googleapis.com:443", credential.ToChannelCredentials());

            // Google Speech APIを利用するためのクライアントを作成
            var client = new Speech.SpeechClient(channel);

            // ストリーミングの設定
            var streamingConfig = new StreamingRecognitionConfig
            {
                Config = new RecognitionConfig
                {
                    SampleRate   = 16000,
                    Encoding     = RecognitionConfig.Types.AudioEncoding.Linear16,
                    LanguageCode = "ja-JP",
                },
                InterimResults  = true,
                SingleUtterance = false,
            };

            // ストリーミングを開始
            using (var call = client.StreamingRecognize())
            {
                Console.WriteLine("-----------\nstart.\n");

                // Cloud Speech APIからレスポンスが返ってきた時の挙動を設定
                var responseReaderTask = Task.Run(async() =>
                {
                    // MoveNext1回につきレスポンス1回分のデータがくる
                    while (await call.ResponseStream.MoveNext())
                    {
                        var note = call.ResponseStream.Current;

                        // データがあれば、認識結果を出力する
                        if (note.Results != null && note.Results.Count > 0 &&
                            note.Results[0].Alternatives.Count > 0)
                        {
                            Console.WriteLine("result: " + note.Results[0].Alternatives[0].Transcript);
                        }
                    }
                });

                // 最初の呼び出しを行う。最初は設定データだけを送る
                var initialRequest = new StreamingRecognizeRequest
                {
                    StreamingConfig = streamingConfig,
                };
                call.RequestStream.WriteAsync(initialRequest).Wait();

                // 録音モデルの作成
                IAudioRecorder recorder = new RecordModel();

                // 録音モデルが音声データを吐いたら、それをすかさずサーバに送信する
                recorder.RecordDataAvailabled += (sender, e) =>
                {
                    if (e.Length > 0)
                    {
                        // WriteAsyncは一度に一回しか実行できないので非同期処理の時は特に注意
                        // ここではlockをかけて処理が重ならないようにしている
                        lock (recorder)
                        {
                            call.RequestStream.WriteAsync(new StreamingRecognizeRequest
                            {
                                AudioContent = RecognitionAudio.FromBytes(e.Buffer, 0, e.Length).Content,
                            }).Wait();
                        }
                    }
                };

                // 録音の開始
                recorder.Start();

                // Cloud Speech APIのストリーミングは1回60秒までなので、50秒まできたら打ち切る
                var timer = new Timer(1000 * 50);
                timer.Start();

                // 50秒経過した時、実際に打ち切るコード
                timer.Elapsed += async(sender, e) =>
                {
                    recorder.Stop();
                    await call.RequestStream.CompleteAsync();
                };

                // 待機
                responseReaderTask.Wait();

                // ここに到達した時点で、APIの呼び出しが終了したということなので、タイマーを切る
                timer.Dispose();
            }

            Console.WriteLine("\n-----------\nCompleted (Time out)");
            Console.ReadKey();
        }
예제 #17
0
        /// <summary>
        /// Asynchronously streams audio to the Google Cloud Speech server and receives results.
        /// </summary>
        static async Task StreamingRequest()
        {
            using (var call = m_Client.StreamingRecognize())
            {
                Task responseReaderTask = Task.Run(async() =>
                {
                    while (await call.ResponseStream.MoveNext())
                    {
                        StreamingRecognizeResponse response = call.ResponseStream.Current;
                        var responseJSON = new JSONObject();
                        if (response.Error != null)
                        {
                            var errorJSON = new JSONObject();
                            errorJSON.AddField("code", response.Error.Code);
                            errorJSON.AddField("message", response.Error.Message);
                            responseJSON.AddField("error", errorJSON);
                        }
                        if (response.Results != null && response.Results.Count > 0)
                        {
                            var resultsJSON = new JSONObject();
                            foreach (var result in response.Results)
                            {
                                var resultJSON = new JSONObject();
                                if (result.Alternatives != null && result.Alternatives.Count > 0)
                                {
                                    var alternativesJSON = new JSONObject();
                                    foreach (var alternative in result.Alternatives)
                                    {
                                        var alternativeJSON = new JSONObject();
                                        alternativeJSON.AddField("transcript", alternative.Transcript);
                                        alternativeJSON.AddField("confidence", alternative.Confidence);
                                        alternativesJSON.Add(alternativeJSON);
                                    }
                                    resultJSON.AddField("alternatives", alternativesJSON);
                                    resultJSON.AddField("is_final", result.IsFinal);
                                    resultJSON.AddField("stability", result.Stability);
                                }
                                resultsJSON.Add(resultJSON);
                            }
                            responseJSON.AddField("results", resultsJSON);
                        }
                        responseJSON.AddField("result_index", response.ResultIndex);
                        responseJSON.AddField("endpointer_type", response.EndpointerType.ToString());
                        Console.WriteLine("response: " + responseJSON);
                    }
                });

                // Send initial config request
                var configRequest = new StreamingRecognizeRequest();
                var streamingRecognitionConfig = new StreamingRecognitionConfig();
                var recognitionConfig          = new RecognitionConfig();
                recognitionConfig.Encoding   = RecognitionConfig.Types.AudioEncoding.LINEAR16;
                recognitionConfig.SampleRate = 16000;
                streamingRecognitionConfig.InterimResults  = true;
                streamingRecognitionConfig.SingleUtterance = false;
                streamingRecognitionConfig.Config          = recognitionConfig;
                configRequest.StreamingConfig = streamingRecognitionConfig;
                await call.RequestStream.WriteAsync(configRequest);

                // Send audio chunks
                Task sendChunksTask = SendChunks(call);

                await sendChunksTask;
                await call.RequestStream.CompleteAsync();

                await responseReaderTask;

                call.Dispose();
            }
        }