2014-12-03 103 views
0

我正在嘗試使用Powershell做一些簡單的語音識別(從.wav文件)。我正在使用Microsoft.Speech.Recognition.SpeechRecognitionEngine。可悲的是,我有一些嚴重的問題,但第一關在這裏是我的代碼:MS 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不處理單個字符(如果有的話)。我可能會嘗試下一個獅身人面像。非常感謝brandon投入了太多時間來幫助我。

+0

對於識別引擎能夠識別任何這些字符,.wav文件應該只是那些「詞」之一。因此,如果您的.wav文件不是單個字符(通過「Z」說的「A」)或單詞「紅色」或「四個」,它不會識別任何內容。簡而言之:你的wav文件是什麼? – Brandon 2014-12-03 17:58:34

+0

哦,我很抱歉,我沒有看到那裏的評論。等一下,評論 – Brandon 2014-12-03 18:16:10

+0

我加了一個回答總結一切 – Brandon 2014-12-03 18:26:49

回答

2

這是從我刪除評論,因爲它是答案的一部分:

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文檔的鏈接,它將向您顯示引發的事件家庭。

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

+0

謝謝你的廣泛解釋,特別是關於'承認()'(沒有期望它像那樣工作)。我會嘗試處理SpeechRecognized事件並報告回來! – Paul 2014-12-03 18:37:45

+0

很酷。讓我知道你如何得到 – Brandon 2014-12-03 18:38:02

+0

好吧,我現在已經測試了一個'SpeechRecognized'的處理程序,但沒有成功。我實際上從'RecognizeCompleted'處理程序的EventArgs得到了一些輸出(帶有一個空的結果字段),所以它可能只是因爲它不能識別任何東西......我上傳了一個我測試過的wav文件,如果有人有興趣嘗試一下:http://1drv.ms/1tF729M。你有沒有其他建議可以嘗試讓它認識到這一點?它不像文件中有很多噪音,所以我很失望,它不承認任何東西 – Paul 2014-12-03 19:06:30