2016-12-12 21 views
3

私は、オーディオを受信して​​テキストを取得するためにBing Recognition APIに送信するアプリケーションを作成しています。 私はサービスライブラリを使用し、wavファイルで動作します。そこで私は自分のストリームクラスを書いて、マイクやネットワーク(RTP)からオーディオを受け取って認識APIに送りました。オーディオストリームの前にWAVヘッダーを追加すると、数秒間動作します。Bing Speech Recognitionにリアルタイムのデータを送信することは可能ですか?

デバッグでは、認識APIがオーディオソース(16kサンプル、16ビット、モノラル)で満たされているよりも速くフォームストリームを読み取ることが示されています。

私の質問です:リアルタイム(連続)オーディオストリームで認識APIを使用する方法はありますか?

マイククライアントの使用例がありますが、マイクのみで動作するため、さまざまなソースが必要です。

+0

リアルタイムで音声を送信し、誰かが話すときに結果を戻したいだけですか?または、任意の長いオーディオストリームを送信したいですか?たぶんマイクの例にリンクすれば、あなたの質問はより明確になります。 –

+0

私はリアルタイムで音声を送り、話し中に部分的な結果を得たいです。基本的にサンプルフォルダには[マイクサンプル](https://github.com/Microsoft/Cognitive-Speech-STT-Windows)がありますが、さまざまなソース(RTPなど)に対応しています。しかし、私は解決策を見つけてほしい(もう少しテストをしなければならない)。それがうまくいくならば、私はその説明で答えを作ります。 –

答えて

1

マイク以外のソースを使用する場合は、SpeechRecognitionServiceFactoryCreateDataClientメソッドを呼び出すことで、DataRecognitionClientクラスを使用できます。クライアントオブジェクトを取得したら、マイク、ネットワーク、ファイルからの読み込みなどのあらゆるソースからオーディオを取り込み、クライアントのSendAudioメソッドで処理するために送信することができます。各オーディオバッファを受信すると、SendAudioへの新しい呼び出しが行われます。

SendAudioで音声を送信している間に、クライアントのOnPartialResponseイベントの形でリアルタイム(または終了)で部分認識結果が表示されます。

オーディオの送信が完了したら、EndAudioに電話して、最終的な認識結果の準備が完了したことをクライアントに通知します。最終的な認識仮説を含むクライアントからOnResponseReceivedイベントを受け取る必要があります。

+0

いいですね。私はこれをテストします。 –

+0

それは動作します!今度は、クライアントDLL(Microsoft.ProjectOxford.SpeechRecognition)とAutioStreamクラス(上記の回答を参照)の両方のサービスライブラリ(Microsoft.Bing.Speech)のソリューションもあります。 –

2

私の問題の解決策が見つかりました。私は、入力をバッファし、Readメソッドが呼び出され、そのバッファが空のときに待機する、ストリームから継承したクラスAudioStreamを書きました。オーディオデータを継続的に受信されているのでReadメソッド、

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. 
} 
...... 

}

:readメソッドの戻り値は常にここ> 0 値は、このクラスの重要な部分のコードであるため、これは停止し、認識を防止します(例えば、RTPパッケージはすべて20ミリ秒で受信されます)。

+0

ニース!疑わしいときは、創造的になりなさい。これが難点だと思って謝罪しました。 –

0

このトピックに関する追加情報の追加ストリームの実装では、同時読み書き操作をサポートする必要があり、データがない場合はブロックします。

関連する問題