繁体   English   中英

Azure 认知语音到文本的详细语音识别结果未检测到明确的标点符号

[英]Azure Cognitive Speech-to-text DetailedSpeechRecognitionResult is not detecting explicit punctuation

当我使用自信时,标点符号不起作用,就像我说问号一样,它是在即时输入问号? 当我说句号时,它正在输入句号。 当您单击标点符号所在的复选框时,我已经制作了一个复选框

SpeechConfig config = SpeechConfig.FromSubscription("key", "region");
config.OutputFormat = OutputFormat.Detailed;
if (Properties.Settings.Default.Punctuation)
{
    config.SetServiceProperty("punctuation", "explicit", ServicePropertyChannel.UriQueryParameter);
}
recognizer = new SpeechRecognizer(config);
recognizer. Recognizer. Recognizedecognizer_Recognized;
 
...

private void SpeechRecognizer_Recognized(object sender, SpeechRecognitionEventArgs e)
{
    if (e.Result.Reason == ResultReason.RecognizedSpeech)
    {
        if (e.Result.Text.ToLower().Equals("new line") || e.Result.Text.ToLower().Equals("newline"))
        {
            SendKeys.SendWait(Environment.NewLine);
        }
        else
        {
            var detailedResults = e.Result.Best();
            if (detailedResults != null && detailedResults.Any())
            {
               
                var bestResults = detailedResults?.ToList()[0];
                foreach (var word in bestResults.Words)
                {
                    double per = word.Confidence * 100;
                    SendKeys.SendWait($"{word.Word} [{per:0.##}] ");
                }

            }
        }
    }
}

使用认知服务我无法重现您的问题。 设置config.OutputFormat = OutputFormat.Detailedconfig.RequestWordLevelTimestamps(); 不影响显式标点识别。

从您的示例中不清楚的是您设置的当前state 如有疑问,如果我们使用设置切换逻辑,并且即使我们更改设置值,我们观察到的行为也是相同的,那么显而易见的检查代码就是设置值本身

请尝试注释掉您的逻辑以像这样切换标点符号:

//if (Properties.Settings.Default.Punctuation)
{
    config.SetServiceProperty("punctuation", "explicit", ServicePropertyChannel.UriQueryParameter);
}

如果这解决了它,那么有两个考虑因素:

  1. Properties.Settings.Default.Punctuation设置的初始 state 是什么? 您的应用程序逻辑是否没有在您期望的时候更新值? 任何影响该设置的变异逻辑都可能需要调用Properties.Settings.Default.Save()来保存更改。 当然,对此的扩展是,根据您的变异逻辑从何处执行,您可能需要调用Properties.Settings.Default.Reload()以确保从存储中加载当前值,但这通常不是必需的如果您在同一个线程空间中操作,那么您很可能会在WinForms中。

  2. 配置是否加载一次,是在切换设置值之前加载一次吗? 从您的描述和代码示例中,工作流程中的该步骤不清楚。 如果您正在使用连续识别,或者您正在为表单的生命周期创建一个SpeechRecognizer实例,那么对您的设置所做的更改将不会应用到Speech Configuration中。

    您需要重新初始化SpeechRecognizer ,作为处理设置更改事件的逻辑的一部分,或者在语音事件处理程序中有一些其他例程来检测此设置的更改并重新启动SpeechRecognizer连接和进程。

您所观察的是设计使然 在大多数情况下,检查识别语音结果的细节是没有必要的,甚至没有帮助。 看起来你误解了如何使用细节。

您没有意识到这一点,但是您将“换"new line""newline"检测为关键短语并将其解释为将换行符注入 output 的请求的示例与工作过程完全相同。

要在语音中检测到标点符号,分类器必须做的第一件事就是解析单词 只有在单词被解析之后,服务才能对结果进行后处理,以将单词分类为自然单词或标点符号。

过程有点像这样:

  1. 以高置信度检测到“逗号”一词
  2. 如果punctuation设置设置为explicit ,则该词是单独的还是位于已识别序列的末尾,后跟一个停顿
  3. 如果是,则将其解释为","而不是"comma"

出于这个原因,重要的是要理解,当punctuation设置设置为explicit时,标点必须与口语文本的正常句子节奏隔离开来。

把这句话读成一个没有标点符号的匀速句子:

这是一个没有逗号或句号但感叹号看起来不错的句子

如果你阅读足够快和流利,output 中应该没有标点符号,即使单词被高度识别。 要将标点符号放入相同的文本中,您实际上需要阅读以下脚本:

这是一个没有逗号的句子。
逗号。
或句号。
逗号。
但是感叹号看起来不错。
感叹号。

 This is a sentence that doesn't have a comma , or a full stop , but an exclamation mark would look nice !

我的测试的每个单词分析如下所示:

单词 信心
这个 85.99%
95.93%
一个 68.49%
句子 96.99%
90.03%
没有 96.75%
94.57%
一个 87.88%
逗号 94.58%
逗号 94.34%
或者 67.14%
一个 64.68%
句号 77.63%
逗号 94.90%
91.17%
一个 62.65%
感叹 98.44%
标记 68.58%
86.15%
91.58%
好的 97.40%
感叹 97.05%
标记 96.61%

请注意,表示标点符号的单词都具有高置信度,但在 output 中,并非所有单词都被实际解释为标点符号。 在此屏幕截图中可能会更清楚,其中我突出显示了 output 中的两个逗号,但被正确识别为单词

文本与单词的示例输出

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM