【问题标题】:MS SpeechRecognitionEngine not returning resultsMS SpeechRecognitionEngine 不返回结果
【发布时间】:2023-03-20 02:13:01
【问题描述】:

我正在尝试使用 Powershell 进行一些简单的语音识别(来自 .wav 文件)。我正在使用Microsoft.Speech.Recognition.SpeechRecognitionEngine。可悲的是我有一些严重的问题,但首先是我的代码:

[System.Reflection.Assembly]::LoadFrom("C:\Program Files\Microsoft SDKs\Speech\v11.0\Assembly\Microsoft.Speech.dll")
[System.Reflection.Assembly]::LoadWithPartialName("System.Speech")


$cult = New-Object System.Globalization.CultureInfo("en-US")

$listener = New-Object Microsoft.Speech.Recognition.SpeechRecognitionEngine($cult)
$listener.SetInputToWaveFile("C:\Users\user\Downloads\audio.wav")

$arr = @("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q" ,"r", "s", "t", "u","v","w","x","y","z","four","red")
$text = New-Object Microsoft.Speech.Recognition.Choices
$text.Add($arr)
$toGram = New-Object Microsoft.Speech.Recognition.GrammarBuilder($text)
$toGram.Culture = $cult
$gram = New-Object Microsoft.Speech.Recognition.Grammar($toGram)
$listener.LoadGrammar($gram)

Register-ObjectEvent $listener RecognizeCompleted -SourceIdentifier "RecognizeCompleted" -Action {if($EventArgs){$EventArgs.Result.Text; write-host $EventArgs.Result.Confidence} else {write-host "nope"} }
$listener.RecognizeAsync()

我的问题是,当我使用 .Recognize() 时,我根本没有输出,甚至没有输出 0 结果。 当注册完成异步方法(.RecognizeAsync())时,处理程序被调用并且$EventArgs确实存在,但我无法访问变量的任何属性,甚至无法从Get-Member获取输出。

我在这里做一些明显错误的事情吗?我会很感激任何意见,因为我现在有点发疯了......

我也愿意接受 MS Speech API 的任何替代方案(任何可以用英语进行基本语音识别的命令行工具都可以)。

更新:波形文件包含一系列字母或数字。例如“3 D 6 H Y”

更新:我很欣赏编辑,但我不欣赏有人删除代码!谢谢!不要这样做!

更新:似乎 SAPI 不能很好地处理单个字符(如果有的话)。接下来我可能会尝试狮身人面像。不过感谢布兰登投入这么多时间来帮助我。

【问题讨论】:

  • 为了让识别引擎能够识别这些字符中的任何一个,.wav 文件应该只是这些“单词”之一。因此,如果您的 .wav 文件不是单个字符(发音为“A”到“Z”)或单词“red”或“four”,它不会识别任何内容。简而言之:你的 wav 文件中有什么?
  • 哦,很抱歉我没有看到上面的评论。稍等,评论
  • 我添加了一个答案来总结一切
  • There is a better way 生成一个字母数组。

标签: .net powershell speech-recognition sapi


【解决方案1】:

这是来自我删除的评论,因为它是答案的一部分:

Recognize() 正在阻塞。它正在执行一个单一的识别操作,每个调用都按照您现在的方式进行。我对 Powershell 没有任何经验,所以如果我错了,请纠正我,但看起来你每次想要得到认可时都会调用那个函数、过程或脚本等。

基本上:如果它听到“A”,就是这样;您必须再次致电Recognize 才能获得“B”。用麦克风试试 (SetInputToDefaultAudioDevice)。最后,Recognize[Async]() 引发了 SpeechRecognized 事件,您可以在其中检索结果,但看起来不像您处理的那样。

您可能希望改为调用RecognizeAsync,以便引擎可以在同一操作中处理多个语音文本。但是,它可以通过两种方式完成。

再次,因为我不熟悉 Powershell,这里有一些伪/c# 代码可以让你走上正轨:

Recognize()方法:

function InitializeRecognizer
    setup your recognizer and audio input, .wav file etc.
    add the handler for the SpeechRecognized event.
    call the Recognize method

function SpeechRecognizedHandler
    read the EventArgs data to get the speech element
    do your output or logic
    if we want to listen to some more stuff
        call Recognize() again

RecognizeAsync()方法:

function InitializeRecognizer
    setup your recognizer and audio input, .wav file etc.
    add the handler for the SpeechRecognized event.
    call the RecognizeAsync() method

function SpeechRecognizedHandler
    read the EventArgs data to get the speech element
    do your output or logic
    (Note: you may have to call RecognizeAsyncCancel()
       or something similar here if you run into issues 
       where it's recognizing stuff in a weird order)

这是RecognizeAsync() MSDN 文档的链接,它将向您展示Recognize 家族提出的事件。

http://msdn.microsoft.com/en-us/library/system.speech.recognition.speechrecognitionengine.recognizeasync%28v=vs.110%29.aspx

【讨论】:

  • 感谢您的广泛解释,尤其是关于recognize()(没想到它会这样工作)。我将尝试处理SpeechRecognized 事件并报告!
  • 酷。让我知道你的进展情况
  • 好的,我现在已经用 SpeechRecognized 的处理程序进行了测试,但还没有成功。实际上,我现在从 RecognizeCompleted 处理程序的 EventArgs 中得到了一些输出(结果字段为空),所以它可能只是因为它不识别任何东西......我已经上传了一个我正在测试的 wav 文件,如果有人是有兴趣尝试一下:1drv.ms/1tF729M。你有什么其他建议我可以尝试让它认识到这一点吗?文件中没有太多噪音,所以我很失望它没有识别任何东西
  • 它在调用你的SpeechRecognized 处理程序吗?你试过麦克风吗?
  • 刚刚尝试使用麦克风但它无法识别任何东西,RecognizeCompleted 处理程序在大约 5-6 秒内被调用,错误和结果字段为空,并且 Canceled = False
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
相关资源
最近更新 更多