Esempio n. 1
0
        /// <summary>
        /// Builds and runs a speech recognition pipeline using the Azure speech recognizer. Requires a valid Cognitive Services
        /// subscription key. See https://docs.microsoft.com/en-us/azure/cognitive-services/cognitive-services-apis-create-account.
        /// </summary>
        /// <remarks>
        /// If you are getting a <see cref="System.InvalidOperationException"/> with the message 'AzureSpeechRecognizer returned
        /// OnConversationError with error code: LoginFailed. Original error text: Transport error', this most likely is due to
        /// an invalid subscription key. Please check your Azure portal at https://portal.azure.com and ensure that you have
        /// added a subscription to the Azure Speech API on your account.
        /// </remarks>
        public static void RunAzureSpeech()
        {
            // Create the pipeline object.
            using (Pipeline pipeline = Pipeline.Create())
            {
                // Create the AudioSource component to capture audio from the default device in 16 kHz 1-channel
                // PCM format as required by both the voice activity detector and speech recognition components.
                IProducer <AudioBuffer> audioInput = new AudioCapture(pipeline, new AudioCaptureConfiguration()
                {
                    DeviceName = "plughw:0,0", Format = WaveFormat.Create16kHz1Channel16BitPcm()
                });

                // Perform voice activity detection using the voice activity detector component
                var vad = new SimpleVoiceActivityDetector(pipeline);
                audioInput.PipeTo(vad);

                // Create Azure speech recognizer component
                var recognizer = new AzureSpeechRecognizer(pipeline, new AzureSpeechRecognizerConfiguration()
                {
                    SubscriptionKey = Program.azureSubscriptionKey, Region = Program.azureRegion
                });

                // The input audio to the Azure speech recognizer needs to be annotated with a voice activity flag.
                // This can be constructed by using the Psi Join() operator to combine the audio and VAD streams.
                var annotatedAudio = audioInput.Join(vad);

                // Subscribe the recognizer to the annotated audio
                annotatedAudio.PipeTo(recognizer);

                // Partial and final speech recognition results are posted on the same stream. Here
                // we use Psi's Where() operator to filter out only the final recognition results.
                var finalResults = recognizer.Out.Where(result => result.IsFinal);

                // Print the recognized text of the final recognition result to the console.
                finalResults.Do(result => Console.WriteLine(result.Text));

                // Register an event handler to catch pipeline errors
                pipeline.PipelineExceptionNotHandled += Pipeline_PipelineException;

                // Register an event handler to be notified when the pipeline completes
                pipeline.PipelineCompleted += Pipeline_PipelineCompleted;

                // Run the pipeline
                pipeline.RunAsync();

                // Azure speech transcribes speech to text
                Console.WriteLine("Say anything");

                Console.WriteLine("Press any key to exit...");
                Console.ReadKey(true);
            }
        }
        public void VoiceActivity_DetectFromFile()
        {
            // Initialize components and wire up pipeline.
            using (var pipeline = Pipeline.Create(nameof(this.VoiceActivity_DetectFromFile)))
            {
                var vad        = new SimpleVoiceActivityDetector(pipeline, new SimpleVoiceActivityDetectorConfiguration());
                var audioInput = new WaveFileAudioSource(pipeline, "16kHz1chan.wav", null, 20);
                audioInput.PipeTo(vad);

                // Add results from outputs.
                var results = new List <bool>();
                vad.Out.Do(r => results.Add(r));

                // Run pipeline and wait for completion.
                pipeline.Run(null, false);

                Assert.IsTrue(results.Count > 0, "No results!");
                CollectionAssert.AreEqual(Enumerable.Repeat(false, 29).ToList(), results.GetRange(0, 29), "Initial silence detection failed!");
                CollectionAssert.AreEqual(Enumerable.Repeat(true, 182).ToList(), results.GetRange(29, 182), "Voice activity detection failed!");
                CollectionAssert.AreEqual(Enumerable.Repeat(false, 62).ToList(), results.GetRange(211, 62), "Trailing silence detection failed!");
            }
        }