首页 > 解决方案 > 使用连续听写

问题描述

一切正常,我只是想知道如何让我的听写会话保持活跃,直到我再次按下按钮,因为现在发生的事情是,如果我停止说话 10 秒钟并再次开始说话,它将覆盖我所拥有的,所以我希望只有当我再次按下按钮时才能停止会话

  case "0":
                isListening = true;
                var dictationConstraint = new SpeechRecognitionTopicConstraint(SpeechRecognitionScenario.Dictation, "dictation");
                speechRecognizer.Constraints.Add(dictationConstraint);
                SpeechRecognitionCompilationResult result = await speechRecognizer.CompileConstraintsAsync();
                speechRecognizer.ContinuousRecognitionSession.Completed += ContinuousRecognitionSession_Completed;
                speechRecognizer.ContinuousRecognitionSession.ResultGenerated += ContinuousRecognitionSession_ResultGenerated;
                speechRecognizer.HypothesisGenerated += SpeechRecognizer_HypothesisGenerated;
                if (isListening) {
                    await speechRecognizer.ContinuousRecognitionSession.StartAsync();
                    textToSpeech.Background = (SolidColorBrush)Resources[ON];
                }
                break;
            case "1":
                if (richEbitBox.Document.Selection.CharacterFormat.Bold == FormatEffect.On) {
                    richEbitBox.Document.Selection.CharacterFormat.Bold = FormatEffect.Off;
                    FormatBoltText.Background = (SolidColorBrush)Resources[OFF];
                } else {
                    richEbitBox.Document.Selection.CharacterFormat.Bold = FormatEffect.On;
                    FormatBoltText.Background = (SolidColorBrush)Resources[ON];
                }
                break;
            case "2":
                if (richEbitBox.Document.Selection.CharacterFormat.Italic == FormatEffect.On) {
                    richEbitBox.Document.Selection.CharacterFormat.Italic = FormatEffect.Off;
                    formatItalicText.Background = (SolidColorBrush)Resources[OFF];
                } else {
                    richEbitBox.Document.Selection.CharacterFormat.Italic = FormatEffect.On;
                    formatItalicText.Background = (SolidColorBrush)Resources[ON];
                }
                break;
            case "3":
                if (richEbitBox.Document.Selection.CharacterFormat.Underline == UnderlineType.Single) {
                    richEbitBox.Document.Selection.CharacterFormat.Underline = UnderlineType.None;
                    formatUnderlineText.Background = (SolidColorBrush)Resources[OFF];
                } else {
                    richEbitBox.Document.Selection.CharacterFormat.Underline = UnderlineType.Single;
                    formatUnderlineText.Background = (SolidColorBrush)Resources[ON];
                }
                break;
            case "4":
                if (Ink_cnvas.Visibility == Visibility.Collapsed) {
                    formatDraw.Background = (SolidColorBrush)Resources[ON];
                    Ink_cnvas.Visibility = Visibility.Visible;
                    richEbitBox.Visibility = Visibility.Collapsed;
                } else if (Ink_cnvas.Visibility == Visibility.Visible) {
                    Ink_cnvas.Visibility = Visibility.Collapsed;
                    formatDraw.Background = (SolidColorBrush)Resources[OFF];
                    richEbitBox.Visibility = Visibility.Visible;
                }
                break;
            case "5":
                richEbitBox.Document.GetText(TextGetOptions.AdjustCrlf, out string value);
                speak(value);
                break;
            default:
                break;
        }
    }

    private async void SpeechRecognizer_HypothesisGenerated(SpeechRecognizer sender, SpeechRecognitionHypothesisGeneratedEventArgs args) {
        string hypothesis = args.Hypothesis.Text;
        string textboxContent = dictateBuilder.ToString() + " " + hypothesis + " ...";

        await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            richEbitBox.Document.SetText(TextSetOptions.None, textboxContent);
        });
    }

    private async void ContinuousRecognitionSession_ResultGenerated(SpeechContinuousRecognitionSession sender, SpeechContinuousRecognitionResultGeneratedEventArgs args) {
        await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
            richEbitBox.Document.SetText(TextSetOptions.None, args.Result.Text);
        });
    }

    private async void ContinuousRecognitionSession_Completed(SpeechContinuousRecognitionSession sender, SpeechContinuousRecognitionCompletedEventArgs args) {
    }

标签: uwp

解决方案


使用连续听写

通过简单的检查,我发现您缺少一些代码。如果您想使用听写,请添加以下代码。

var dictationConstraint = new SpeechRecognitionTopicConstraint(SpeechRecognitionScenario.Dictation, "dictation");
speechRecognizer.Constraints.Add(dictationConstraint);

我们有完整的示例可以使用,请查看 SpeechRecognitionAndSynthesis 代码示例Scenario_ContinuousDictation。我已经测试并且效果很好,请将此场景集成到您的应用程序中。

更新

例如,开始写“我的蓝鸭子有马尾”,然后我点击空格并说“我想自杀”。我也想在按下按钮时停止听写。

基于官方代码示例很容易实现,您只需使用dictatedTextBuilderappend 当前文本框的文本 before StartAsync, clearedTextBuilder afterStopAsync方法如下,如下所示。并且请是官方代码示例dictationTextBox是只读的,请修改为IsReadOnly="False".

public async void ContinuousRecognize_Click(object sender, RoutedEventArgs e)
{
    btnContinuousRecognize.IsEnabled = false;
    if (isListening == false)
    {
        // The recognizer can only start listening in a continuous fashion if the recognizer is currently idle.
        // This prevents an exception from occurring.
        if (speechRecognizer.State == SpeechRecognizerState.Idle)
        {
            DictationButtonText.Text = " Stop Dictation";
            cbLanguageSelection.IsEnabled = false;
            hlOpenPrivacySettings.Visibility = Visibility.Collapsed;
            discardedTextBlock.Visibility = Windows.UI.Xaml.Visibility.Collapsed;

            try
            {
                isListening = true;
                dictatedTextBuilder.Append(dictationTextBox.Text);
                await speechRecognizer.ContinuousRecognitionSession.StartAsync();
            }
            catch (Exception ex)
            {
                if ((uint)ex.HResult == HResultPrivacyStatementDeclined)
                {
                    // Show a UI link to the privacy settings.
                    hlOpenPrivacySettings.Visibility = Visibility.Visible;
                }
                else
                {
                    var messageDialog = new Windows.UI.Popups.MessageDialog(ex.Message, "Exception");
                    await messageDialog.ShowAsync();
                }

                isListening = false;
                DictationButtonText.Text = " Dictate";
                cbLanguageSelection.IsEnabled = true;

            }
        }
    }
    else
    {
        isListening = false;
        DictationButtonText.Text = " Dictate";
        cbLanguageSelection.IsEnabled = true;

        if (speechRecognizer.State != SpeechRecognizerState.Idle)
        {
            // Cancelling recognition prevents any currently recognized speech from
            // generating a ResultGenerated event. StopAsync() will allow the final session to 
            // complete.
            try
            {
                await speechRecognizer.ContinuousRecognitionSession.StopAsync();

                // Ensure we don't leave any hypothesis text behind
                dictationTextBox.Text = dictatedTextBuilder.ToString();
                dictatedTextBuilder.Clear();
            }
            catch (Exception exception)
            {
                var messageDialog = new Windows.UI.Popups.MessageDialog(exception.Message, "Exception");
                await messageDialog.ShowAsync();
            }
        }
    }
    btnContinuousRecognize.IsEnabled = true;

}

推荐阅读