2016-12-12 50 views
3

我正在編寫一個應用程序,該應用程序應接收音頻並將其發送到Bing Recognition API以獲取文本。 我使用了服務庫,它與一個wav文件一起工作。所以我寫了自己的流類來接收來自麥克風或網絡(RTP)的音頻,並將其發送到識別API。當我在音頻流的前面添加一個WAV標題時,它可以工作幾秒鐘。是否可以將實時數據發送到Bing語音識別?

調試所示,爲識別API讀取形式流快於它是由音頻源(16K採樣率,16位,單聲道)填充。

所以我的問題是:有沒有使用識別API和實時(連續)音頻流的方法嗎?

我知道有一個麥克風客戶機的示例,但它只有麥克風工作以及我需要它不同的來源。

+0

你只是想在實時發送音頻,並取回結果有人在說話?或者你想發送一個任意長的音頻流?也許如果你鏈接到麥克風的例子,你的問題會更清楚。 –

+0

我想在實時發送音頻以獲得部分結果。原則上類似於示例文件夾中的[麥克風示例](https://github.com/Microsoft/Cognitive-Speech-STT-Windows),但適用於不同的來源(例如RTP)。但我希望我找到了一個解決方案(必須做更多的測試)。如果有效,我會用描述創建一個答案。 –

回答

1

如果您想使用麥克風以外的來源,則可以使用DataRecognitionClient類,方法是調用SpeechRecognitionServiceFactoryCreateDataClient方法。獲得客戶端對象後,您可以從任何來源獲取音頻 - 麥克風,網絡,從文件中讀取數據等 - 並將其發送到客戶端的SendAudio方法進行處理。當您收到每個音頻緩衝區時,您將撥打SendAudio的新電話。

當您正在通過SendAudio發送音頻時,您將以客戶端OnPartialResponse事件的形式實時(或關閉)接收部分識別結果。

當您完成發送音頻,你發出信號,告知您已經準備好通過調用EndAudio最終的識別結果的客戶端。然後,您應該收到包含最終識別假設的客戶的事件OnResponseReceived

+0

聽起來不錯。我會測試這個。 –

+0

它的工作原理!現在我爲客戶端DLL(Microsoft.ProjectOxford.SpeechRecognition)和AutioStream類(參見上面的答案)也爲服務庫(Microsoft.Bing.Speech)提供瞭解決方案。 –

2

,我發現我的問題的解決方案。我寫了一個繼承自流的類AudioStream,它緩衝輸入並等待Read方法被調用並且其緩衝區爲空時等待。這防止了識別器停止,因爲所讀取的方法總是返回一個值> 0 下面是這個類的重要組成部分的代碼:

public class AudioStream : Stream { 
private AutoResetEvent _waitEvent = new AutoResetEvent(false); 

internal void AddData(byte[] buffer, int count) { 
    _buffer.Add(buffer, count); 
    // Enable Read 
    _waitEvent.Set(); 
} 
public override int Read(byte[] buffer, int offset, int count) { 
    int readCount = 0; 
    if ((_buffer.Empty) { 
     // Wait for input 
     _waitEvent.WaitOne(); 
    } 
    ...... 
    // Fill buffer from _buffer; 

    _waitEvent.Reset(); 
    return length; 
} 
protected override void Dispose(bool disposing) { 
    // Make sure, that there is no waiting Read 
    // Clear buffer, dispose wait event etc. 
} 
...... 

}

由於音頻數據被接收汽車無,讀取方法不會「掛起」超過一些毫秒(例如RTP包全部收到20毫秒)。

+0

不錯!如有疑問,請發揮創意。我很抱歉認爲這是一個僵局。 –

0

添加關於此主題的其他支持信息:流實現必須支持併發讀/寫操作,並在沒有數據時阻塞。

相關問題