[英]Why does UWP continuous speech recognition stop
我有一個 Windows 10 UWP 應用程序,我正在為文本框啟用語音識別。 是的,我知道我也可以為此利用 Cortana。 然而,Cortana 也有一些缺點,主要是您幾乎無法從應用程序內部控制 Cortana。
這就是 SpeechRecognizer 命名空間的連續識別的用武之地。我喜歡我擁有的控制量。 但是,它似乎在幾秒鍾后隨機停止收聽。
這是我如何實現它的。 請注意,我還嘗試將每個可能的超時設置為 0,這應該意味着沒有超時。
頁面上的屬性:
private SpeechRecognizer speechRecognizer;
private CoreDispatcher dispatcher;
頁面的 OnLoaded:
speechRecognizer = new SpeechRecognizer();
speechRecognizer.Timeouts.BabbleTimeout = TimeSpan.FromSeconds(0);
speechRecognizer.Timeouts.InitialSilenceTimeout = TimeSpan.FromSeconds(0);
speechRecognizer.Timeouts.EndSilenceTimeout = TimeSpan.FromSeconds(0);
speechRecognizer.ContinuousRecognitionSession.AutoStopSilenceTimeout = TimeSpan.FromSeconds(0);
SpeechRecognitionCompilationResult result = await speechRecognizer.CompileConstraintsAsync();
speechRecognizer.ContinuousRecognitionSession.ResultGenerated += ContinuousRecognitionSession_ResultGenerated;
speechRecognizer.StateChanged += SpeechRecognizer_StateChanged;
然后,當我點擊一個按鈕開始收聽時,我會這樣做來開始:
if (speechRecognizer.State == SpeechRecognizerState.Idle)
{
await speechRecognizer.ContinuousRecognitionSession.StartAsync();
}
最后,我監聽了上面的兩個事件處理程序,分別是 ResultGenerated 和 StateChanged。 我在這兩個事件中設置了斷點。 當頁面加載時,一切都被實例化了。 當我單擊按鈕開始收聽時,它也開始正常,我看到 StateChanged 事件處理程序觸發以表明它正在收聽。 但是,如果我讓應用程序閑置(不說話)幾秒鍾(秒數似乎是隨機的,可以在 2-5 秒之間的任何地方),StateChanged 事件將觸發並說它再次閑置。 在那之后,當我嘗試說話時我無法觸發 ResultGenerated 事件,這進一步表明它不再收聽了。
我可以點擊按鈕再次開始收聽,它會的,但同樣會再次隨機停止。
此外,如果我立即說話,在我單擊按鈕后,語音識別就可以正常工作。
我想要發生的是當您單擊按鈕時,我希望它無限期地收聽,直到我調用 StopAsync 並告訴它停止。 有誰知道為什么它會自行停止???
更新-我為完成添加了事件處理程序:
speechRecognizer.ContinuousRecognitionSession.Completed += ContinuousRecognitionSession_Completed;
因為這會在 args.Status 中給我一個狀態,我在那里放了一個斷點。 有趣的是,當連續識別停止時,這個斷點將在 2-5 秒內命中,並且它給出“成功”狀態,即使我沒有說任何話並且 ResultGenerated 事件從未觸發並沒有結果。 那么,沒有結果怎么會成功呢? 為什么這會導致它停止?
謝謝!
所以我遇到了同樣的問題,並且遇到了這個問題。 我想我終於明白了。 問題在於,當UWP應用從前台運行(例如切換到另一個應用)時,語音識別器將停止(不發生任何事件)。
當然,在調試時,這將在設置斷點時發生。 我認為問題可以通過重新啟動SpeechRecognizer使其再次進入前台來解決。
我有你的問題的答案。 經過將近 2 周的斗爭,我終於找到了問題的根源。 不幸的是,連續語音識別和普通語音識別沒有很多方法可以檢測其運行狀態。 我的建議是對連續語音識別使用條件遞歸。 這是一個例子:
代碼:
speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();
await speechRecognizer.CompileConstraintsAsync();
speechRecognizer.ContinuousRecognitionSession.AutoStopSilenceTimeout = TimeSpan.FromMilliseconds(0);
speechRecognizer.ContinuousRecognitionSession.ResultGenerated += ContinuousRecognitionSession_ResultGenerated;
speechRecognizer.ContinuousRecognitionSession.Completed += ContinuousRecognitionSession_Completed;
speechRecognizer.StateChanged += SpeechRecognizer_StateChanged;
await speechRecognizer.ContinuousRecognitionSession.StartAsync();
//這是在 ContinuousRecognitionSession_Completed 事件中。
speechRecognizer.Dispose();
speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();
await speechRecognizer.CompileConstraintsAsync();
speechRecognizer.ContinuousRecognitionSession.AutoStopSilenceTimeout = TimeSpan.FromMilliseconds(0);
speechRecognizer.ContinuousRecognitionSession.ResultGenerated += ContinuousRecognitionSession_ResultGenerated;
speechRecognizer.ContinuousRecognitionSession.Completed += ContinuousRecognitionSession_Completed;
speechRecognizer.StateChanged += SpeechRecognizer_StateChanged;
await speechRecognizer.ContinuousRecognitionSession.StartAsync();
}
catch { }
這意味着每次完成語音識別 session 時,您都會重新啟動連續語音識別器,這在函數術語中翻譯為完成。
您要記住的另一件事是 Windows.Media.SpeechRecognition.SpeechRecognizer 每次核心 window 失去焦點時都會暫停識別 session。 這無法通過 Activate() 方法解決。 這個問題只能通過 IsEnabled 屬性來解決。 我的建議是使用一個計時器,在指定的時間間隔將 IsEnabled 屬性設置為 true。
另一個主要建議是將 Windows.Media.SpeechRecognition API 遷移到 WPF 應用程序中,因為它使您可以更大程度地控制應用程序的功能。 API 遷移是通過下載名為 Microsoft.Windows.SDK.Contracts 的 NuGet package 完成的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.