Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dowiedz się, jak rejestrować i rozpoznawać długie, ciągłe dyktowane dane mowy.
Ważne interfejsy API: SpeechContinuousRecognitionSession, ContinuousRecognitionSession
W funkcji rozpoznawania mowy przedstawiono sposób przechwytywania i rozpoznawania stosunkowo krótkich danych wejściowych mowy przy użyciu metod RecognizeAsync lub RecognizeWithUIAsync obiektu SpeechRecognizer, na przykład podczas komponowania krótkiej wiadomości (SMS) lub podczas zadawania pytania.
W przypadku dłuższych sesji ciągłego rozpoznawania mowy, takich jak dyktowanie lub poczta e-mail, użyj właściwości ContinuousRecognitionSession obiektu SpeechRecognizer , aby uzyskać obiekt SpeechContinuousRecognitionSession .
Uwaga / Notatka
Obsługa języka dyktowania zależy od urządzenia , na którym jest uruchomiona aplikacja. W przypadku komputerów i laptopów rozpoznawane są tylko en-US, a konsola Xbox i telefony mogą rozpoznawać wszystkie języki obsługiwane przez rozpoznawanie mowy. Aby uzyskać więcej informacji, zobacz Określanie języka rozpoznawania mowy.
Ustawienia
Aplikacja potrzebuje kilku obiektów do zarządzania sesją ciągłego dyktowania:
- Wystąpienie obiektu SpeechRecognizer .
- Odwołanie do dyspozytora interfejsu użytkownika w celu zaktualizowania interfejsu użytkownika podczas dyktowania.
- Sposób śledzenia skumulowanych słów wypowiadanych przez użytkownika.
W tym miejscu deklarujemy instancję SpeechRecognizer jako prywatne pole klasy code-behind. Aplikacja musi przechowywać odwołanie w innym miejscu, jeśli chcesz, aby ciągłe dyktowanie utrzymywało się poza jedną stroną języka XAML (Extensible Application Markup Language).
private SpeechRecognizer speechRecognizer;
Podczas dyktowania rozpoznawacz wywołuje zdarzenia z wątku w tle. Ponieważ wątek w tle nie może bezpośrednio zaktualizować interfejsu użytkownika w języku XAML, aplikacja musi użyć dyspozytora, aby zaktualizować interfejs użytkownika w odpowiedzi na zdarzenia rozpoznawania.
W tym miejscu deklarujemy pole prywatne, które zostanie zainicjowane później za pomocą dyspozytora interfejsu użytkownika.
// Speech events may originate from a thread other than the UI thread.
// Keep track of the UI thread dispatcher so that we can update the
// UI in a thread-safe manner.
private CoreDispatcher dispatcher;
Aby śledzić to, co mówi użytkownik, musisz obsługiwać zdarzenia rozpoznawania zgłaszane przez rozpoznawanie mowy. Te zdarzenia udostępniają wyniki rozpoznawania fragmentów wypowiedzi użytkownika.
W tym miejscu używamy obiektu StringBuilder do przechowywania wszystkich wyników rozpoznawania uzyskanych podczas sesji. Nowe wyniki są dołączane do StringBuilder w miarę ich przetwarzania.
private StringBuilder dictatedTextBuilder;
Inicjalizacja
Podczas inicjowania ciągłego rozpoznawania mowy należy:
- Pobierz dyspozytor dla wątku interfejsu użytkownika, jeśli aktualizujesz interfejs użytkownika swojej aplikacji w obsługach zdarzeń ciągłego rozpoznawania.
- Zainicjuj rozpoznawanie mowy.
- Skompiluj wbudowaną gramatykę dyktowania. Uwaga Rozpoznawanie mowy wymaga co najmniej jednego ograniczenia w celu zdefiniowania rozpoznawalnego zasobu słów. Jeśli nie określono żadnego ograniczenia, zostanie użyta wstępnie zdefiniowana gramatyka dyktowania. Zobacz Rozpoznawanie mowy.
- Skonfiguruj odbiorniki zdarzeń na potrzeby zdarzeń rozpoznawania.
W tym przykładzie inicjujemy rozpoznawanie mowy w zdarzeniu strony OnNavigatedTo .
- Ponieważ zdarzenia wywoływane przez aparat rozpoznawania mowy występują w wątku w tle, utwórz odwołanie do dyspozytora w celu aktualizacji wątku interfejsu użytkownika. OnNavigatedTo jest zawsze wywoływany w wątku UI.
this.dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
- Następnie inicjujemy instancję SpeechRecognizer.
this.speechRecognizer = new SpeechRecognizer();
Następnie dodamy i skompilujemy gramatykę, która definiuje wszystkie wyrazy i frazy, które mogą być rozpoznawane przez speechRecognizer.
Jeśli nie określisz gramatyki jawnie, domyślnie jest używana wstępnie zdefiniowana gramatyka dyktowania. Zazwyczaj domyślna gramatyka jest najlepsza w przypadku ogólnego dyktowania.
W tym miejscu natychmiast wywołujemy metodę CompileConstraintsAsync bez dodawania gramatyki.
SpeechRecognitionCompilationResult result =
await speechRecognizer.CompileConstraintsAsync();
Obsługa zdarzeń rozpoznawania
Możesz przechwycić jedną, krótką wypowiedź lub frazę, wywołując metodę RecognizeAsync lub RecognizeWithUIAsync.
Jednak aby przechwycić dłuższą sesję ciągłego rozpoznawania, określamy nasłuchiwacze zdarzeń do uruchomienia w tle, gdy użytkownik mówi, i definiujemy procedury obsługi w celu utworzenia ciągu dyktowania.
Następnie użyjemy właściwości ContinuousRecognitionSession naszego rozpoznawania, aby uzyskać obiekt SpeechContinuousRecognitionSession , który udostępnia metody i zdarzenia do zarządzania sesją ciągłego rozpoznawania.
W szczególności dwa zdarzenia mają krytyczne znaczenie:
- ResultGenerated, który występuje, gdy rozpoznawanie wygenerowało kilka wyników.
- Ukończono, co następuje po zakończeniu sesji ciągłego rozpoznawania.
Zdarzenie ResultGenerated jest zgłaszane, gdy użytkownik mówi. Rozpoznawanie stale nasłuchuje użytkownika i okresowo zgłasza zdarzenie, które przekazuje fragment danych wejściowych mowy. Musisz zbadać dane wejściowe mowy przy użyciu właściwości Result argumentu zdarzenia i podjąć odpowiednie działania w procedurze obsługi zdarzeń, takie jak dołączanie tekstu do obiektu StringBuilder.
Jako wystąpienie funkcji SpeechRecognitionResult właściwość Result jest przydatna do określania, czy chcesz zaakceptować dane wejściowe mowy. Funkcja SpeechRecognitionResult udostępnia dwie właściwości dla tego:
- Stan wskazuje, czy rozpoznawanie zakończyło się pomyślnie. Rozpoznawanie może zakończyć się niepowodzeniem z różnych powodów.
- Pewność wskazuje względną pewność, że rozpoznawanie właściwie zrozumiało słowa.
Poniżej przedstawiono podstawowe kroki obsługi ciągłego rozpoznawania:
- W tym miejscu rejestrujemy procedurę obsługi zdarzenia ResultGenerated ciągłego rozpoznawania w zdarzeniu strony OnNavigatedTo .
speechRecognizer.ContinuousRecognitionSession.ResultGenerated +=
ContinuousRecognitionSession_ResultGenerated;
Następnie sprawdzamy właściwość Ufność . Jeśli wartość Ufność jest średnia lub lepsza, dołączamy tekst do obiektu StringBuilder. Aktualizujemy również interfejs użytkownika podczas zbierania danych wejściowych.
Zwróć uwagę , że zdarzenie ResultGenerated jest wywoływane w wątku w tle, który nie może bezpośrednio zaktualizować interfejsu użytkownika. Jeśli program obsługi musi zaktualizować interfejs użytkownika (jak w przykładzie [Mowa i TTS]), należy wysłać aktualizacje do wątku interfejsu użytkownika za pomocą metody RunAsync dyspozytora.
private async void ContinuousRecognitionSession_ResultGenerated(
SpeechContinuousRecognitionSession sender,
SpeechContinuousRecognitionResultGeneratedEventArgs args)
{
if (args.Result.Confidence == SpeechRecognitionConfidence.Medium ||
args.Result.Confidence == SpeechRecognitionConfidence.High)
{
dictatedTextBuilder.Append(args.Result.Text + " ");
await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
dictationTextBox.Text = dictatedTextBuilder.ToString();
btnClearText.IsEnabled = true;
});
}
else
{
await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
dictationTextBox.Text = dictatedTextBuilder.ToString();
});
}
}
Następnie obsługujemy zdarzenie Ukończone , które wskazuje koniec ciągłego dyktowania.
Sesja kończy się po wywołaniu metod StopAsync lub CancelAsync (opisanych w następnej sekcji). Sesja może również zakończyć się, gdy wystąpi błąd lub gdy użytkownik przestał mówić. Sprawdź właściwość Status argumentu zdarzenia, aby określić, dlaczego sesja została zakończona (SpeechRecognitionResultStatus).
W tym miejscu rejestrujemy procedurę obsługi dla zdarzenia ukończonego ciągłego rozpoznawania w zdarzeniu strony OnNavigatedTo .
speechRecognizer.ContinuousRecognitionSession.Completed +=
ContinuousRecognitionSession_Completed;
Procedura obsługi zdarzeń sprawdza właściwość Status, aby określić, czy rozpoznawanie zakończyło się pomyślnie. Obsługuje również przypadek, w którym użytkownik przestał mówić. Często element TimeoutExceeded jest uznawany za pomyślne rozpoznanie, ponieważ oznacza to, że użytkownik zakończył mówienie. Ten przypadek należy obsłużyć w Twoim kodzie, aby zapewnić dobre doświadczenie użytkownika.
Zwróć uwagę , że zdarzenie ResultGenerated jest wywoływane w wątku w tle, który nie może bezpośrednio zaktualizować interfejsu użytkownika. Jeśli program obsługi musi zaktualizować interfejs użytkownika, jak to robi przykład [Mowa i TTS], należy wysłać aktualizacje do wątku interfejsu użytkownika za pomocą metody RunAsync dyspozytora.
private async void ContinuousRecognitionSession_Completed(
SpeechContinuousRecognitionSession sender,
SpeechContinuousRecognitionCompletedEventArgs args)
{
if (args.Status != SpeechRecognitionResultStatus.Success)
{
if (args.Status == SpeechRecognitionResultStatus.TimeoutExceeded)
{
await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
rootPage.NotifyUser(
"Automatic Time Out of Dictation",
NotifyType.StatusMessage);
DictationButtonText.Text = " Continuous Recognition";
dictationTextBox.Text = dictatedTextBuilder.ToString();
});
}
else
{
await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
rootPage.NotifyUser(
"Continuous Recognition Completed: " + args.Status.ToString(),
NotifyType.StatusMessage);
DictationButtonText.Text = " Continuous Recognition";
});
}
}
}
Przekazywanie informacji zwrotnych dotyczących ciągłego rozpoznawania
Kiedy ludzie mówią, często polegają na kontekście, aby w pełni zrozumieć, co mówi się. Podobnie rozpoznawanie mowy często wymaga kontekstu, aby zapewnić wyniki rozpoznawania wysokiej pewności. Na przykład same wyrazy "waga" i "wait" są nie do odróżnienia, dopóki więcej kontekstu nie będzie można zebrać z otaczających słów. Dopóki rozpoznawacz nie będzie miał pewności, że słowo lub słowa zostały prawidłowo rozpoznane, nie wygeneruje zdarzenia ResultGenerated.
Może to spowodować mniej niż idealne doświadczenie dla użytkownika, ponieważ użytkownik kontynuuje mówienie, a wyniki nie są dostarczane, dopóki rozpoznawanie mowy nie osiągnie wystarczającego poziomu pewności, aby wygenerować zdarzenie "ResultGenerated".
Obsłuż zdarzenie HypothesisGenerated, aby poprawić ten widoczny brak reakcji. To zdarzenie jest wywoływane za każdym razem, gdy rozpoznawanie generuje nowy zestaw potencjalnych dopasowań dla przetwarzanego słowa. Argument zdarzenia zawiera właściwość Hipoteza, która zawiera bieżące dopasowania. Pokaż je użytkownikowi, gdy będą kontynuować mówienie i zapewnij ich, że przetwarzanie jest nadal aktywne. Gdy pewność jest wysoka i zostanie określony wynik rozpoznawania, zastąp tymczasowe wyniki Hipotezy wynikiem końcowym podanym w zdarzeniu ResultGenerated.
W tym miejscu dołączamy hipotetyczny tekst i wielokropek ("...") do bieżącej wartości wyjściowego pola tekstowego. Zawartość pola tekstowego jest aktualizowana w miarę generowania nowych hipotez i do momentu uzyskania wyników końcowych ze zdarzenia ResultGenerated .
private async void SpeechRecognizer_HypothesisGenerated(
SpeechRecognizer sender,
SpeechRecognitionHypothesisGeneratedEventArgs args)
{
string hypothesis = args.Hypothesis.Text;
string textboxContent = dictatedTextBuilder.ToString() + " " + hypothesis + " ...";
await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
dictationTextBox.Text = textboxContent;
btnClearText.IsEnabled = true;
});
}
Uruchamianie i zatrzymywanie rozpoznawania
Przed rozpoczęciem sesji rozpoznawania sprawdź wartość właściwości stanu rozpoznawania mowy. Rozpoznawanie mowy musi być w stanie spoczynku.
Po sprawdzeniu stanu aparatu rozpoznawania mowy rozpoczynamy sesję, wywołując metodę StartAsync właściwości ContinuousRecognitionSession aparatu rozpoznawania mowy.
if (speechRecognizer.State == SpeechRecognizerState.Idle)
{
await speechRecognizer.ContinuousRecognitionSession.StartAsync();
}
Rozpoznawanie można zatrzymać na dwa sposoby:
- StopAsync umożliwia zakończenie oczekujących zdarzeń rozpoznawania (ResultGenerated będzie nadal wywoływany do momentu zakończenia wszystkich oczekujących operacji rozpoznawania).
- CancelAsync natychmiast kończy sesję rozpoznawania i odrzuca wszystkie oczekujące wyniki.
Po sprawdzeniu stanu rozpoznawania mowy zatrzymamy sesję, wywołując metodę CancelAsync właściwości ContinuousRecognitionSession aparatu rozpoznawania mowy.
if (speechRecognizer.State != SpeechRecognizerState.Idle)
{
await speechRecognizer.ContinuousRecognitionSession.CancelAsync();
}
Uwaga / Notatka
Zdarzenie ResultGenerated może wystąpić po wywołaniu metody CancelAsync.
Ze względu na wielowątkowość zdarzenie ResultGenerated może nadal pozostawać na stosie po wywołaniu metody CancelAsync . Jeśli tak, zdarzenie ResultGenerated nadal jest uruchamiane .
Jeśli podczas anulowania sesji rozpoznawania ustawisz jakiekolwiek pola prywatne, zawsze potwierdź ich wartości w procedurze obsługi ResultGenerated . Na przykład nie zakładaj, że pole jest inicjowane w programie obsługi, jeśli ustawisz je na wartość null po anulowaniu sesji.
Powiązane artykuły
Próbki
Windows developer