簡體   English   中英

為什么UWP連續語音識別停止

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM