/// <summary> /// Configures NAudio for audio capture from either the default or specified audio device index /// </summary> /// <param name="deviceNumber">Desired Capture Device Index; Default is 0</param> private void Initialize_NAudio(int deviceNumber = 0) { // If EventBasedAudio is already initialized, dispose if (EventBasedAudio != null) { EventBasedAudio.Dispose(); } EventBasedAudio = new WaveInEvent(); EventBasedAudio.DeviceNumber = deviceNumber; EventBasedAudio.WaveFormat = WaveFormat.CreateCustomFormat(WaveFormatEncoding.Pcm, 8000, 1, 32000, 2, 16); BufferedAudioProvider = new BufferedWaveProvider(EventBasedAudio.WaveFormat); BufferedAudioProvider.BufferDuration = TimeSpan.FromSeconds(1); Azure_NAudio_Callback = new NAudioCompatibleAudioCallback(ref BufferedAudioProvider, ref BufferedAudioProvider_LockObject); EventBasedAudio.DataAvailable += (s, e) => { lock (BufferedAudioProvider_LockObject) { BufferedAudioProvider.AddSamples(e.Buffer, 0, e.BytesRecorded); } if (AudioFileWriter != null) { AudioFileWriter.Write(e.Buffer, 0, e.BytesRecorded); } }; }
/// <summary> /// Configures and Instantiates the Azure Speech-To-Text API; <seealso cref="Initialize_NAudio"/> must be called before using this function /// </summary> /// <param name="subscriptionKey">Valid Azure Subscription Key</param> /// <param name="subscriptionRegion">Valid Azure Subscription Region</param> /// <param name="CallbackFunction">Audio Source Callback Function</param> private void Initialize_AzureSpeech(string subscriptionKey, string subscriptionRegion, NAudioCompatibleAudioCallback CallbackFunction) { // If SpeechRecognizer is already initialized, dispose if (AzureSpeechRecognizer != null) { AzureSpeechRecognizer.Dispose(); } // Configure SpeechConfig SpeechConfig AzureSpeechConfig = SpeechConfig.FromSubscription(subscriptionKey, subscriptionRegion); AzureSpeechConfig.SpeechRecognitionLanguage = "en-US"; AzureSpeechConfig.EnableDictation(); AzureSpeechConfig.EnableAudioLogging(); AzureSpeechConfig.SetProperty(PropertyId.Speech_LogFilename, @"C:\Users\Joe\source\repos\Monotone\Monotone\bin\x86\Debug x86\log.txt"); AzureSpeechConfig.SetProfanity(ProfanityOption.Raw); AzureSpeechConfig.OutputFormat = OutputFormat.Detailed; // Configure AudioConfig AudioConfig AzureAudioConfig = AudioConfig.FromStreamInput(CallbackFunction, AudioStreamFormat.GetWaveFormatPCM((uint)EventBasedAudio.WaveFormat.SampleRate, (byte)EventBasedAudio.WaveFormat.BitsPerSample, (byte)EventBasedAudio.WaveFormat.Channels)); // Initialize SpeechRecognizer AzureSpeechRecognizer = new SpeechRecognizer(AzureSpeechConfig, AzureAudioConfig); // Configure Recognizer Events Azure_StopRecognition = new TaskCompletionSource <int>(); //AzureSpeechRecognizer.Recognizing += (s, e) => //{ // Debug.WriteLine($"RECOGNIZING: Text ={e.Result.Text}"); //}; AzureSpeechRecognizer.Recognized += (s, e) => { if (e.Result.Reason == ResultReason.RecognizedSpeech) { monotone_RecordTranscribe1.AddEntryLine(e.Result.Text, (timeIndex_Stopwatch.Elapsed - e.Result.Duration)); } }; AzureSpeechRecognizer.Canceled += (s, e) => { if (e.Reason == CancellationReason.Error) { MessageBox.Show($"Canceled due to Error {e.ErrorCode}\n\n" + $"Details: {e.ErrorDetails}\n\n" + $"Did you update your subscription info?", $"Azure Speech Recognition Error {e.ErrorCode}", MessageBoxButtons.OK, MessageBoxIcon.Error); } StopRecording(this, new EventArgs()); }; AzureSpeechRecognizer.SessionStopped += (s, e) => { Debug.WriteLine("Session Stopped"); StopRecording(this, new EventArgs()); }; AzureSpeechRecognizer.SessionStarted += (s, e) => { Debug.WriteLine("Session Start"); }; AzureSpeechRecognizer.SessionStopped += (s, e) => { Debug.WriteLine("Session Stopped"); }; }