2012-09-10 35 views
5

我試圖讓SAPI 5.4(也是MS Speech Platform SDK v11)對從Skype進入的音頻執行連續的語音識別呼叫。使用SAPI 5.4或MS Speech SDK v11在C#語音識別中使用來自Skype的MemoryStream呼叫

我可以使用SKYPE4COMLib抓取來自Skype的音頻,並通過發出ALTER CALL指令將其推送到TCP端口。您可以將Skype音頻指向文件或TCP套接字。文件工作正常,但我希望它運行識別,所以使用TCP套接字。

然後,我構建了一個TCP偵聽器來收集傳入數據(音頻原始格式)並將字節數組作爲MemoryStream傳遞給SAPI。我已經設置SAPI,以期望16bit,16khz,單聲道,PCM格式的原始音頻。但是,識別事件從未發生?!

我嘗試將原始音頻保存到磁盤,然後將其讀入SAPI,並且它工作正常......所以數據本身很好,Skype正確地在音頻上發送。但是,這並不能讓我做我需要的持續認可。

使用WAV文件或從磁盤或麥克風加載的原始文件,SAPI識別碼可正常工作。我只是無法從MemoryStream中獲得它的工作。

我發現了這篇相似的文章,似乎沒有任何建議對我有用,而且討論似乎已經平靜下來。

Streaming input to System.Speech.Recognition.SpeechRecognitionEngine

有沒有人對如何順利拿到SAPI不斷從發送,在C#中的MemoryStream原始音頻識別語音的指導意見?

+0

如果你想要做連續的認可,你爲什麼用'MemoryStream'緩衝呢?你應該直接給SAPI一個'NetworkStream',可選地在它前面有一個BufferedStream。您可能需要從'NetworkStream'派生來覆蓋'Seek'。 –

+0

我嘗試了這個問題中的鏈接建議,但我無法得到它的工作。這是你的建議嗎? NetworkStream netStream = new NetworkStream(socket,true); BufferedStream buffStream = new BufferedStream(netStream,8000 * 16 * 1); appRecognizer.SetInputToAudioStream(buffStream,formatInfo); – timemirror

+0

您需要從流中派生並覆蓋Seek,如上所述。 –

回答

0

當您使用的音頻流,我認爲你應該使用 recognizer.RecognizeAsync

+0

嗨Patel.NET - 謝謝,你我使用的是Recognizer.RecognizeAsync(RecognizeMode.Multiple)。問題在於,當您傳輸數據時,它永遠不會引發識別事件,因此您需要覆蓋流類。 – timemirror