uwp - 使用连续听写
问题描述
一切正常,我只是想知道如何让我的听写会话保持活跃,直到我再次按下按钮,因为现在发生的事情是,如果我停止说话 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) {
}
解决方案
使用连续听写
通过简单的检查,我发现您缺少一些代码。如果您想使用听写,请添加以下代码。
var dictationConstraint = new SpeechRecognitionTopicConstraint(SpeechRecognitionScenario.Dictation, "dictation");
speechRecognizer.Constraints.Add(dictationConstraint);
我们有完整的示例可以使用,请查看 SpeechRecognitionAndSynthesis 代码示例Scenario_ContinuousDictation
。我已经测试并且效果很好,请将此场景集成到您的应用程序中。
更新
例如,开始写“我的蓝鸭子有马尾”,然后我点击空格并说“我想自杀”。我也想在按下按钮时停止听写。
基于官方代码示例很容易实现,您只需使用dictatedTextBuilder
append 当前文本框的文本 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;
}
推荐阅读
- xml - 使用 XSLT 添加新的父节点
- javascript - 2048 Game - 在控制台中触发关键事件?
- bash - 为什么我要在完成后添加等待?
- excel - 删除重复项
- ios - 如何使 UITableView 滚动视图在到达末尾时反弹父视图?
- docker - 每次运行“子”容器时,Docker 是否都会构建基础映像?
- node.js - Kibana - 无法在 Windows 10 上启动 kibana
- java - 尝试更改 JavaFX 应用程序图标时出错
- c++ - 使用 PostgreSQL RETURNING .. INTO 子句将插入的值返回到变量中
- mysql-8.0 - 如何将带有查询的mysql输出保存到cav文件中