// 音声認識の開始処理 public void StartRecognizing() { RecognizedText = string.Empty; IsRecognizing = true; // 音声認識の許可をユーザーに求める。 SFSpeechRecognizer.RequestAuthorization((SFSpeechRecognizerAuthorizationStatus status) => { switch (status) { case SFSpeechRecognizerAuthorizationStatus.Authorized: // 音声認識がユーザーに許可された場合、必要なインスタンスを生成した後に音声認識の本処理を実行する。 // SFSpeechRecognizerのインスタンス生成時、コンストラクタの引数でlocaleを指定しなくても、 // 端末の標準言語が日本語なら日本語は問題なく認識される。 audioEngine = new AVAudioEngine(); speechRecognizer = new SFSpeechRecognizer(); recognitionRequest = new SFSpeechAudioBufferRecognitionRequest(); startRecognitionSession(); break; default: // 音声認識がユーザーに許可されなかった場合、処理を終了する。 return; } } ); }
// ============== Speech Recognition Functions ============ public void StartRecording() { Querybox.Placeholder = "Recording"; recognitionRequest = new SFSpeechAudioBufferRecognitionRequest(); audioEngine.Prepare(); NSError error; audioEngine.StartAndReturnError(out error); if (error != null) { Console.WriteLine(error.ToString()); return; } recognitionTask = speechRecognizer.GetRecognitionTask(recognitionRequest, (SFSpeechRecognitionResult result, NSError err) => { if (err != null) { Console.WriteLine(err.ToString()); } else { if (result.Final == true) { YouAskedLabel.Text = "You asked: " + result.BestTranscription.FormattedString; final_query = result.BestTranscription.FormattedString; } } }); }
public void StartRecording(Action <string> callback) { var audioSession = AVAudioSession.SharedInstance(); var error = audioSession.SetCategory(AVAudioSessionCategory.Record); audioSession.SetMode(AVAudioSession.ModeMeasurement, out error); error = audioSession.SetActive(true, AVAudioSessionSetActiveOptions.NotifyOthersOnDeactivation); _speechRecognitionRequest = new SFSpeechAudioBufferRecognitionRequest(); var inputNode = _audioEngine.InputNode; var recordingFormat = inputNode.GetBusOutputFormat(0); inputNode.InstallTapOnBus(0, 1024, recordingFormat, (buffer, when) => { _speechRecognitionRequest?.Append(buffer); }); _audioEngine.Prepare(); _audioEngine.StartAndReturnError(out error); _speechRecognitionTask = _speechRecognizer.GetRecognitionTask(_speechRecognitionRequest, (result, recognitionError) => { if (result != null) { var transcribedText = result.BestTranscription.FormattedString; callback?.Invoke(transcribedText); } }); }
public void StartSpeechRecognition() { listeningLabel.Text = "Listening"; recognitionRequest = new SFSpeechAudioBufferRecognitionRequest(); audioEngine.Prepare(); NSError error; audioEngine.StartAndReturnError(out error); if (error != null) { Console.WriteLine(error.ToString()); return; } recognitionTask = speechRecognizer.GetRecognitionTask(recognitionRequest, (SFSpeechRecognitionResult result, NSError err) => { if (err != null) { Console.WriteLine(err.ToString()); } else { if (result.Final == true) { var results = result.BestTranscription.FormattedString; if (results.ToLower() == "left") { CameraCommand(results); } listeningLabel.Text = result.BestTranscription.FormattedString; } } }); }
private void StartRecordingAndRecognizing() { _timer = NSTimer.CreateRepeatingScheduledTimer(5, delegate { DidFinishTalk(); }); _recognitionTask?.Cancel(); _recognitionTask = null; var audioSession = AVAudioSession.SharedInstance(); NSError nsError; nsError = audioSession.SetCategory(AVAudioSessionCategory.PlayAndRecord); audioSession.SetMode(AVAudioSession.ModeDefault, out nsError); nsError = audioSession.SetActive(true, AVAudioSessionSetActiveOptions.NotifyOthersOnDeactivation); audioSession.OverrideOutputAudioPort(AVAudioSessionPortOverride.Speaker, out nsError); _recognitionRequest = new SFSpeechAudioBufferRecognitionRequest(); var inputNode = _audioEngine.InputNode; if (inputNode == null) { throw new Exception(); } var recordingFormat = inputNode.GetBusOutputFormat(0); inputNode.InstallTapOnBus(0, 1024, recordingFormat, (buffer, when) => { _recognitionRequest?.Append(buffer); }); _audioEngine.Prepare(); _audioEngine.StartAndReturnError(out nsError); _recognitionTask = _speechRecognizer.GetRecognitionTask(_recognitionRequest, (result, error) => { var isFinal = false; if (result != null) { _recognizedString = result.BestTranscription.FormattedString; //MessagingCenter.Send<ISpeechToText, string>(this, "STT", _recognizedString); _timer.Invalidate(); _timer = null; _timer = NSTimer.CreateRepeatingScheduledTimer(2, delegate { DidFinishTalk(); }); } if (error != null || isFinal) { MessagingCenter.Send <ISpeechToText, string>(this, "STT", _recognizedString); MessagingCenter.Send <ISpeechToText>(this, "Final"); StopRecordingAndRecognition(audioSession); } }); }
public IAsyncAction StopRecognitionAsync() { _recognitionRequest?.EndAudio(); _recognitionRequest?.Dispose(); _recognitionRequest = null; return(Task.CompletedTask.AsAsyncAction()); }
void StartRecording() { // Cancel the previous task if it's running. recognitionTask?.Cancel(); recognitionTask = null; var audioSession = AVAudioSession.SharedInstance(); NSError err; err = audioSession.SetCategory(AVAudioSessionCategory.Record); audioSession.SetMode(AVAudioSession.ModeMeasurement, out err); err = audioSession.SetActive(true, AVAudioSessionSetActiveOptions.NotifyOthersOnDeactivation); // Configure request so that results are returned before audio recording is finished recognitionRequest = new SFSpeechAudioBufferRecognitionRequest { ShouldReportPartialResults = true }; var inputNode = audioEngine.InputNode; if (inputNode == null) { throw new InvalidProgramException("Audio engine has no input node"); } // A recognition task represents a speech recognition session. // We keep a reference to the task so that it can be cancelled. recognitionTask = speechRecognizer.GetRecognitionTask(recognitionRequest, (result, error) => { var isFinal = false; if (result != null) { textView.Text = result.BestTranscription.FormattedString; isFinal = result.Final; } if (error != null || isFinal) { audioEngine.Stop(); inputNode.RemoveTapOnBus(0); recognitionRequest = null; recognitionTask = null; recordButton.Enabled = true; recordButton.SetTitle("Start Recording", UIControlState.Normal); } }); var recordingFormat = inputNode.GetBusOutputFormat(0); inputNode.InstallTapOnBus(0, 1024, recordingFormat, (buffer, when) => { recognitionRequest?.Append(buffer); }); audioEngine.Prepare(); audioEngine.StartAndReturnError(out err); textView.Text = "(Throw Darts!)"; textView2.Text = ""; }
public void StartSpeechRecognition() { StopSpeechRecognizer(false); StopAudio(); _recognizerText = ""; AVAudioSession.SharedInstance().SetActive(true, AVAudioSessionSetActiveOptions.NotifyOthersOnDeactivation); var request = new SFSpeechAudioBufferRecognitionRequest(); request.ShouldReportPartialResults = true; var inputNode = engine.InputNode; _task = _recognizer.GetRecognitionTask(request, (result, error) => { if (result != null) { _recognizerText = result.BestTranscription.FormattedString; if (_recognizerTimer == null) { _recognizerTimer = new Timer(RecognizeTimerElapsed, this, TimeSpan.FromSeconds(1), Timeout.InfiniteTimeSpan); } else { _recognizerTimer.Change(TimeSpan.FromSeconds(1), Timeout.InfiniteTimeSpan); } if (result.Final) { SpeechRecognitionResult?.Invoke(this, new SpeechRecognitionEventArgs(_recognizerText)); } else { SpeechRecognitionPartialResult?.Invoke(this, new SpeechRecognitionEventArgs(_recognizerText)); } } if (error != null || result?.Final == true) { StopSpeechRecognizer(false); } }); var recordingFormat = inputNode.GetBusOutputFormat(0); inputNode.InstallTapOnBus(0, 1024, recordingFormat, (AVAudioPcmBuffer buffer, AVAudioTime when) => { request.Append(buffer); }); engine.Prepare(); NSError engineError = null; if (engine.StartAndReturnError(out engineError)) { } }
private void ResetSpeechToText() { _speechRecognizer = new SFSpeechRecognizer(); _speechAudioEngine = new AVAudioEngine(); _speechRecognitionRequest = new SFSpeechAudioBufferRecognitionRequest(); _speechRecognitionRequest.ShouldReportPartialResults = true; _speechRecognitionRequest.TaskHint = SFSpeechRecognitionTaskHint.Search; _speechRecognitionRequest.ContextualStrings = new string[] { "for", "the", "a", "an" }; _speechRecognitionTask = null; }
private void StopRecordingAndRecognition(AVAudioSession aVAudioSession = null) { if (_audioEngine.Running) { _audioEngine.Stop(); _audioEngine.InputNode.RemoveTapOnBus(0); _recognitionTask?.Cancel(); _recognitionRequest.EndAudio(); _recognitionRequest = null; _recognitionTask = null; } }
public SpeechToText() { _audioEngine = new AVAudioEngine(); _speechRecognizer = new SFSpeechRecognizer(); _speechRecognitionRequest = new SFSpeechAudioBufferRecognitionRequest(); _speechRecognitionTask = new SFSpeechRecognitionTask(); SFSpeechRecognizer.RequestAuthorization((SFSpeechRecognizerAuthorizationStatus status) => { // We're going to assume that you've selected to authorise the request, otherwise, // you're wasting your own time. }); }
public void Start() { recognitionTask?.Cancel(); recognitionTask = null; recognizedText = ""; var audioSession = AVAudioSession.SharedInstance(); NSError err; err = audioSession.SetCategory(AVAudioSessionCategory.Record); audioSession.SetMode(AVAudioSession.ModeMeasurement, out err); err = audioSession.SetActive(true, AVAudioSessionSetActiveOptions.NotifyOthersOnDeactivation); liveRequest = new SFSpeechAudioBufferRecognitionRequest { ShouldReportPartialResults = true }; var node = audioEngine.InputNode; var recordingFormat = node.GetBusOutputFormat(0); node.InstallTapOnBus(0, 1024, recordingFormat, (AVAudioPcmBuffer buffer, AVAudioTime when) => { // Append buffer to recognition request liveRequest.Append(buffer); }); recognitionTask = speechRecognizer.GetRecognitionTask(liveRequest, (SFSpeechRecognitionResult result, NSError error) => { var isFinal = false; if (result != null) { recognizedText = result.BestTranscription.FormattedString; OnSpeechRecognized(new SpeechRecognizedEvent(recognizedText)); isFinal = result.Final; } if (error != null || isFinal) { audioSession.SetCategory(AVAudioSessionCategory.Playback); audioSession.SetMode(AVAudioSession.ModeDefault, out err); node.RemoveTapOnBus(0); audioEngine.Dispose(); liveRequest.Dispose(); recognitionTask.Dispose(); liveRequest = null; recognitionTask = null; } }); audioEngine.Prepare(); audioEngine.StartAndReturnError(out err); }
void StartRecording () { // Cancel the previous task if it's running. recognitionTask?.Cancel (); recognitionTask = null; var audioSession = AVAudioSession.SharedInstance (); NSError err; err = audioSession.SetCategory (AVAudioSessionCategory.Record); audioSession.SetMode (AVAudioSession.ModeMeasurement, out err); err = audioSession.SetActive (true, AVAudioSessionSetActiveOptions.NotifyOthersOnDeactivation); // Configure request so that results are returned before audio recording is finished recognitionRequest = new SFSpeechAudioBufferRecognitionRequest { ShouldReportPartialResults = true }; var inputNode = audioEngine.InputNode; if (inputNode == null) throw new InvalidProgramException ("Audio engine has no input node"); // A recognition task represents a speech recognition session. // We keep a reference to the task so that it can be cancelled. recognitionTask = speechRecognizer.GetRecognitionTask (recognitionRequest, (result, error) => { var isFinal = false; if (result != null) { textView.Text = result.BestTranscription.FormattedString; isFinal = result.Final; } if (error != null || isFinal) { audioEngine.Stop (); inputNode.RemoveTapOnBus (0); recognitionRequest = null; recognitionTask = null; recordButton.Enabled = true; recordButton.SetTitle ("Start Recording", UIControlState.Normal); } }); var recordingFormat = inputNode.GetBusOutputFormat (0); inputNode.InstallTapOnBus (0, 1024, recordingFormat, (buffer, when) => { recognitionRequest?.Append (buffer); }); audioEngine.Prepare (); audioEngine.StartAndReturnError (out err); textView.Text = "(Go ahead, I'm listening)"; }
public void StopRecording() { try { _audioEngine.Stop(); _audioEngine.InputNode.RemoveTapOnBus(0); _speechRecognitionTask?.Cancel(); _speechRecognitionRequest.EndAudio(); _speechRecognitionRequest = null; _speechRecognitionTask = null; } catch (Exception ex) { } }
public async Task <string> RecognizeAsync() { var node = audioEngine.InputNode; var recordingFormat = node.GetBusOutputFormat(0); var liveSpeechRequest = new SFSpeechAudioBufferRecognitionRequest(); node.InstallTapOnBus(0, 1024, recordingFormat, (AVAudioPcmBuffer buffer, AVAudioTime when) => { // Append buffer to recognition request liveSpeechRequest.Append(buffer); }); // Start recording audioEngine.Prepare(); NSError error; audioEngine.StartAndReturnError(out error); // Did recording start? if (error != null) { return(null); } var taskCompletionSource = new TaskCompletionSource <string>(); // Start recognition var recognitionTask = speechRecognizer.GetRecognitionTask(liveSpeechRequest, (SFSpeechRecognitionResult recognitionResult, NSError err) => { // Was there an error? if (err != null) { taskCompletionSource?.SetResult(null); } else { taskCompletionSource?.SetResult(recognitionResult.BestTranscription.FormattedString); } }); var result = await taskCompletionSource.Task; taskCompletionSource = null; audioEngine.Stop(); liveSpeechRequest.EndAudio(); node.RemoveTapOnBus(0); return(result); }
private void StartSpeechRecognizer() { if (!recording) { speechRecognizer = new SFSpeechRecognizer(); node = audioEngine.InputNode; var recordingFormat = node.GetBusOutputFormat(0); liveSpeechRequest = new SFSpeechAudioBufferRecognitionRequest(); node.InstallTapOnBus(0, 1024, recordingFormat, (AVAudioPcmBuffer buffer, AVAudioTime when) => { liveSpeechRequest.Append(buffer); }); recording = true; audioEngine.Prepare(); audioEngine.StartAndReturnError(out NSError error); if (error != null) { return; } Timer timer = new Timer(2000); timer.Start(); timer.Elapsed += EndRecognition; RecognitionTask = speechRecognizer.GetRecognitionTask(liveSpeechRequest, (SFSpeechRecognitionResult result, NSError err) => { if (err != null) { Recorded?.Invoke(""); return; } else { lastSpokenString = result.BestTranscription.FormattedString; timer.Stop(); timer.Interval = 2000; timer.Start(); } }); } else { Recorded?.Invoke(""); } }
static void StopInstances() { AudioEngine?.InputNode?.RemoveTapOnBus(0); AudioEngine?.Stop(); AudioEngine?.Dispose(); AudioEngine = null; LiveSpeechRequest?.EndAudio(); LiveSpeechRequest?.Dispose(); LiveSpeechRequest = null; SpeechRecognizer?.Dispose(); SpeechRecognizer = null; //Timer?.Dispose(); //Timer = null; }
private void StopRecordingAndRecognition() { try { if (!_audioEngine.Running) { return; } _audioEngine.Stop(); _audioEngine.InputNode.RemoveTapOnBus(0); _recognitionTask?.Cancel(); _recognitionRequest.EndAudio(); _recognitionRequest = null; _recognitionTask = null; } catch (Exception ex) { Console.WriteLine(ex.Message); } }
public void InitializeProperties() { AudioEngine = new AVAudioEngine(); SpeechRecognizer = new SFSpeechRecognizer(); LiveSpeechRequest = new SFSpeechAudioBufferRecognitionRequest(); }
static void StartRecording() { lock (Lock) { if (SpeechRecognizer == null) { SpeechRecognizer = new SFSpeechRecognizer(); LiveSpeechRequest = new SFSpeechAudioBufferRecognitionRequest(); } var audioSession = AVAudioSession.SharedInstance(); audioSession.SetCategory(AVAudioSessionCategory.PlayAndRecord); audioSession.SetMode(AVAudioSession.ModeDefault, out NSError error); audioSession.OverrideOutputAudioPort(AVAudioSessionPortOverride.Speaker, out NSError speakerError); audioSession.SetActive(true); if (LogErrorAndStop(error) || LogErrorAndStop(speakerError)) { return; } AudioEngine = new AVAudioEngine(); var node = AudioEngine.InputNode; LiveSpeechRequest.ShouldReportPartialResults = true; RecognitionTask = SpeechRecognizer.GetRecognitionTask(LiveSpeechRequest, (SFSpeechRecognitionResult result, NSError err) => { if (LogErrorAndStop(err)) { return; } var currentText = result.BestTranscription.FormattedString; if (currentText.HasValue()) { Listeners?.Invoke(currentText, result.Final); } if (IsContinuous) { Timer = new System.Timers.Timer(20000) { Enabled = true }; Timer.Elapsed += (s, ev) => { StopInstances(); StartRecording(); }; Timer.Start(); } }); var recordingFormat = node.GetBusOutputFormat(0); node.InstallTapOnBus(0, 1024, recordingFormat, (AVAudioPcmBuffer buffer, AVAudioTime when) => { LiveSpeechRequest.Append(buffer); }); if (AudioEngine == null) { Stop(); return; } AudioEngine?.Prepare(); AudioEngine?.StartAndReturnError(out error); if (LogErrorAndStop(error)) { return; } } }
private void StartRecordingAndRecognizing() { try { _timer = NSTimer.CreateRepeatingScheduledTimer(5, delegate { DidFinishTalk(); }); // Cancel the previous task if it's running. _recognitionTask?.Cancel(); _recognitionTask = null; var audioSession = AVAudioSession.SharedInstance(); var nsError = audioSession.SetCategory(AVAudioSessionCategory.PlayAndRecord); audioSession.SetMode(AVAudioSession.ModeDefault, out nsError); nsError = audioSession.SetActive(true, AVAudioSessionSetActiveOptions.NotifyOthersOnDeactivation); audioSession.OverrideOutputAudioPort(AVAudioSessionPortOverride.Speaker, out nsError); // Configure request so that results are returned before audio recording is finished _recognitionRequest = new SFSpeechAudioBufferRecognitionRequest(); var inputNode = _audioEngine.InputNode; if (inputNode == null) { throw new InvalidProgramException("Audio engine has no input node"); } var recordingFormat = inputNode.GetBusOutputFormat(0); inputNode.InstallTapOnBus(0, 1024, recordingFormat, (buffer, when) => { _recognitionRequest?.Append(buffer); }); _audioEngine.Prepare(); _audioEngine.StartAndReturnError(out nsError); // A recognition task represents a speech recognition session. // We keep a reference to the task so that it can be cancelled. _recognitionTask = _speechRecognizer.GetRecognitionTask(_recognitionRequest, (result, error) => { if (result != null) { var eventArg = new TextReceivedEventArg { Text = result.BestTranscription.FormattedString }; OnTextReceived(eventArg); _timer.Invalidate(); _timer = null; _timer = NSTimer.CreateRepeatingScheduledTimer(2, delegate { DidFinishTalk(); }); } if (error == null) { return; } OnStoppedListening(); StopRecordingAndRecognition(); }); } catch (Exception ex) { Console.WriteLine(ex.Message); } }
public Recorder() { AudioEngine = new AVAudioEngine(); SpeechRecognizer = new SFSpeechRecognizer(); LiveSpeechRequest = new SFSpeechAudioBufferRecognitionRequest(); }
void StartRecording() { if (recognitionTask != null) { recognitionTask.Cancel(); recognitionTask = null; } var audioSession = AVAudioSession.SharedInstance(); try { NSError err; audioSession.SetCategory(AVAudioSessionCategory.PlayAndRecord); audioSession.SetMode(AVAudioSession.ModeMeasurement, out err); audioSession.SetActive(true); } catch (Exception ex) { var s = ex.ToString(); } recognitionRequest = new SFSpeechAudioBufferRecognitionRequest(); var inputNode = audioEngine.InputNode; recognitionRequest.ShouldReportPartialResults = true; recognitionTask = speechRecognizer.GetRecognitionTask(recognitionRequest, (arg1, arg2) => { var isFinal = false; if (arg1 != null) { var inputtedText = arg1.BestTranscription.FormattedString; englishText.Text = inputtedText; var fromLanguage = LanguageCodes.English; var toLangague = AppDelegate.CurrentLanguage.LanguageCode; translator.TranslateText(inputtedText, fromLanguage, toLangague).ContinueWith(async(arg) => { var translated = await arg; InvokeOnMainThread(() => translatedText.Text = translated); }); isFinal = arg1.Final; } if (arg2 != null || isFinal) { audioEngine.Stop(); inputNode.RemoveTapOnBus(0); recognitionRequest = null; recognitionTask = null; askQuestion.Enabled = true; } }); var recordingFormat = inputNode.GetBusOutputFormat(0); inputNode.InstallTapOnBus(0, 1024, recordingFormat, (buffer, when) => { recognitionRequest?.Append(buffer); }); audioEngine.Prepare(); try { NSError err = new NSError(); audioEngine.StartAndReturnError(out err); englishText.Text = "OK, here we go!"; translatedText.Text = ""; } catch (Exception) { } }
public void StartRecording(string voice, bool longTimeout = false) { if (!SpeechEnabled) { return; } // Setup audio session LastResult = ""; AudioEngine = new AVAudioEngine(); NSLocale voiceLocale = NSLocale.FromLocaleIdentifier(voice); SpeechRecognizer = new SFSpeechRecognizer(voiceLocale); LiveSpeechRequest = new SFSpeechAudioBufferRecognitionRequest(); NSError error; var audioSession = AVAudioSession.SharedInstance(); audioSession.SetCategory(AVAudioSessionCategory.Record); audioSession.SetMode(AVAudioSession.ModeMeasurement, out error); if (error != null) { OnSpeechError?.Invoke("Audio session error: " + error.ToString()); return; } audioSession.SetActive(true, AVAudioSessionSetActiveOptions.NotifyOthersOnDeactivation); LiveSpeechRequest.ShouldReportPartialResults = true; var node = AudioEngine.InputNode; if (node == null) { OnSpeechError?.Invoke("Couldn't initialize Speech Input"); return; } RecognitionTask = SpeechRecognizer.GetRecognitionTask(LiveSpeechRequest, (SFSpeechRecognitionResult result, NSError err) => { if (IsCancelled) { node.RemoveTapOnBus(0); return; } if (err != null) { OnSpeechError?.Invoke(err.ToString()); } else if (result != null) { LastResult = result.BestTranscription.FormattedString; Console.WriteLine("You said: \"{0}\". Final: {1}", LastResult, result.Final); m_lastSpeech = DateTime.Now; if (result.Final)// || !IsRecording) { { OnSpeechOK?.Invoke(LastResult); } } if ((result != null && result.Final) || err != null || !IsRecording) { IsRecording = false; //node.RemoveTapOnBus(0); AudioEngine.Stop(); m_speechTimer.Close(); } }); var recordingFormat = node.GetBusOutputFormat(0); node.InstallTapOnBus(0, 1024, recordingFormat, (AVAudioPcmBuffer buffer, AVAudioTime when) => { //Console.WriteLine("--> {0}: {1} {2}.{3}", buffer.FrameLength, when.HostTime); // Append buffer to recognition request LiveSpeechRequest.Append(buffer); }); // Start recording AudioEngine.Prepare(); AudioEngine.StartAndReturnError(out error); if (error != null) { OnSpeechError?.Invoke("Speech init error: " + error.ToString()); IsRecording = false; return; } IsRecording = true; IsCancelled = false; LastResult = ""; m_lastSpeech = DateTime.MaxValue; m_startSpeech = DateTime.Now; m_timeout = longTimeout ? m_phraseTimeout : m_wordTimeout; m_speechTimer = new System.Timers.Timer(250); m_speechTimer.AutoReset = true; m_speechTimer.Elapsed += (sender, e) => { CheckRecording(); }; m_speechTimer.Start(); }
void StartRecording() { // Cancel the previous task if it's running. recognitionTask?.Cancel(); recognitionTask = null; var audioSession = AVAudioSession.SharedInstance(); NSError err; err = audioSession.SetCategory(AVAudioSessionCategory.PlayAndRecord, AVAudioSessionCategoryOptions.DefaultToSpeaker); audioSession.SetMode(AVAudioSession.ModeMeasurement, out err); err = audioSession.SetActive(true, AVAudioSessionSetActiveOptions.NotifyOthersOnDeactivation); // Configure request so that results are returned before audio recording is finished recognitionRequest = new SFSpeechAudioBufferRecognitionRequest { ShouldReportPartialResults = true, }; var inputNode = audioEngine.InputNode; if (inputNode == null) { throw new InvalidProgramException("Audio engine has no input node"); } // A recognition task represents a speech recognition session. // We keep a reference to the task so that it can be cancelled. recognitionTask = speechRecognizer.GetRecognitionTask(recognitionRequest, (result, error) => { var isFinal = false; if (result != null) { speechIdleTimer.Stop(); speechIdleTimer.Start(); textView.Text = result.BestTranscription.FormattedString; isFinal = result.Final; } if (error != null || isFinal) { if (result != null) { var intent = nlp.GetMatchingIntent(result.BestTranscription.FormattedString); string resultText; if (intent != null) { textView.Text += "\nAction is " + intent.Action + "."; resultText = "Action is " + intent.Action + ". "; if (intent.Parameters != null) { intent.Parameters.ForEach(p => { resultText += "Parameter " + p.Key + " with values" + string.Join(",", p.Value) + ". "; textView.Text += "\nParameter " + p.Key + " with values " + string.Join(",", p.Value) + ". "; }); } } else { resultText = "Sorry, I did not get that."; } var su = new AVSpeechUtterance(resultText) { Rate = AVSpeechUtterance.MaximumSpeechRate / 2, Voice = AVSpeechSynthesisVoice.FromLanguage("en-US"), PitchMultiplier = 1.0f, Volume = 1 }; ss.SpeakUtterance(su); } audioEngine.Stop(); inputNode.RemoveTapOnBus(0); recognitionRequest = null; recognitionTask = null; recordButton.Enabled = true; //recordButton.SetTitle ("Start Recording", UIControlState.Normal); recordButton.Hidden = false; recordStatus.Hidden = true; speechIdleTimer.Stop(); } }); var recordingFormat = inputNode.GetBusOutputFormat(0); inputNode.InstallTapOnBus(0, 1024, recordingFormat, (buffer, when) => { recognitionRequest?.Append(buffer); }); audioEngine.Prepare(); audioEngine.StartAndReturnError(out err); }
public IAsyncOperation <SpeechRecognitionResult> RecognizeAsync() { _initialSilenceTimeout = new Timer(); _initialSilenceTimeout.Interval = Math.Max(Timeouts.InitialSilenceTimeout.TotalMilliseconds, 5000); _initialSilenceTimeout.Elapsed += OnTimeout; _endSilenceTimeout = new Timer(); _endSilenceTimeout.Interval = Math.Max(Timeouts.EndSilenceTimeout.TotalMilliseconds, 150); _endSilenceTimeout.Elapsed += OnTimeout; // Cancel the previous task if it's running. _recognitionTask?.Cancel(); _recognitionTask = null; var audioSession = AVAudioSession.SharedInstance(); NSError err; err = audioSession.SetCategory(AVAudioSessionCategory.Record); audioSession.SetMode(AVAudioSession.ModeMeasurement, out err); err = audioSession.SetActive(true, AVAudioSessionSetActiveOptions.NotifyOthersOnDeactivation); // Configure request to get partial results _recognitionRequest = new SFSpeechAudioBufferRecognitionRequest { ShouldReportPartialResults = true, TaskHint = SFSpeechRecognitionTaskHint.Dictation }; var inputNode = _audioEngine.InputNode; if (inputNode == null) { throw new InvalidProgramException("Audio engine has no input node"); } var tcs = new TaskCompletionSource <SpeechRecognitionResult>(); // Keep a reference to the task so that it can be cancelled. _recognitionTask = _speechRecognizer.GetRecognitionTask(_recognitionRequest, (result, error) => { var isFinal = false; var bestMatch = default(SpeechRecognitionResult); if (result != null) { _initialSilenceTimeout.Stop(); _endSilenceTimeout.Stop(); _endSilenceTimeout.Start(); bestMatch = new SpeechRecognitionResult() { Text = result.BestTranscription.FormattedString, Alternates = result.Transcriptions? .Select(t => new SpeechRecognitionResult() { Text = t.FormattedString }) .ToList() }; isFinal = result.Final; OnHypothesisGenerated(bestMatch.Text); } if (error != null || isFinal) { _initialSilenceTimeout.Stop(); _endSilenceTimeout.Stop(); _audioEngine.Stop(); inputNode.RemoveTapOnBus(0); inputNode.Reset(); audioSession = AVAudioSession.SharedInstance(); err = audioSession.SetCategory(AVAudioSessionCategory.Playback); audioSession.SetMode(AVAudioSession.ModeDefault, out err); err = audioSession.SetActive(false, AVAudioSessionSetActiveOptions.NotifyOthersOnDeactivation); _recognitionTask = null; OnStateChanged(SpeechRecognizerState.Idle); if (bestMatch != null) { tcs.TrySetResult(bestMatch); } else { tcs.TrySetException(new Exception($"Error during speech recognition: {error.LocalizedDescription}")); } } }); var recordingFormat = new AVAudioFormat(sampleRate: 44100, channels: 1); inputNode.InstallTapOnBus(0, 1024, recordingFormat, (buffer, when) => { _recognitionRequest?.Append(buffer); }); _initialSilenceTimeout.Start(); _audioEngine.Prepare(); _audioEngine.StartAndReturnError(out err); OnStateChanged(SpeechRecognizerState.Capturing); return(tcs.Task.AsAsyncOperation()); }