C# 是否可以向Bing语音识别发送实时数据?

C# 是否可以向Bing语音识别发送实时数据?,c#,speech-to-text,bing,microsoft-cognitive,C#,Speech To Text,Bing,Microsoft Cognitive,我正在编写一个应用程序,它应该接收音频并发送到Bing识别API以获取文本。 我使用了服务库,它使用wav文件。因此,我编写了自己的流类,从麦克风或网络(RTP)接收音频,并将其发送到识别API。当我在音频流前面添加WAV头时,它会工作几秒钟 调试表明,识别api读取表单流的速度比音频源(16k samplerate,16位,mono)填充的速度快 所以我的问题是:有没有一种方法可以将recognizeapi用于实时(连续)音频流 我知道有一个麦克风客户端的例子,但它只适用于麦克风,我需要它用于

我正在编写一个应用程序,它应该接收音频并发送到Bing识别API以获取文本。 我使用了服务库,它使用wav文件。因此,我编写了自己的流类,从麦克风或网络(RTP)接收音频,并将其发送到识别API。当我在音频流前面添加WAV头时,它会工作几秒钟

调试表明,识别api读取表单流的速度比音频源(16k samplerate,16位,mono)填充的速度快

所以我的问题是:有没有一种方法可以将recognizeapi用于实时(连续)音频流


我知道有一个麦克风客户端的例子,但它只适用于麦克风,我需要它用于不同的来源。

我找到了解决问题的方法。我编写了一个从流继承的类
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毫秒内全部接收)。

如果要使用麦克风以外的源,可以通过调用的
CreateDataClient
方法使用类。拥有客户机对象后,您可以从任何来源(麦克风、网络、读取文件等)获取音频,并将其发送到客户机方法进行处理。当您收到每个音频缓冲区时,您将对
SendAudio
进行新的调用

当您使用
SendAudio
发送音频时,您将以客户端的
OnPartialResponse
事件的形式实时(或关闭)收到部分识别结果


发送完音频后,通过调用
EndAudio
,向客户端发出信号,表示您已准备好获得最终识别结果。然后,您应该从客户端收到一个包含最终识别假设的
OnResponseReceived
事件。

添加有关此主题的其他支持信息:流实现必须支持并发读/写操作,并在没有数据时进行阻止。

您是否只想在有人讲话时实时发送音频并返回结果?或者你想发送任意长的音频流?如果你链接到麦克风示例,你的问题可能会更清楚。我想实时发送音频,以便在演讲期间获得部分结果。原则上类似于示例文件夹中的,但用于不同的源(例如RTP)。但我希望我找到了一个解决方案(必须做更多的测试)。如果它工作,我会创建一个与描述的答案。好!当有疑问时,要有创造力。我很抱歉,我认为这是一个僵局。这是有效的!现在我有了一个解决方案,既可以用于客户端dll(Microsoft.ProjectOxford.SpeechRecognition),也可以用于服务库(Microsoft.Bing.Speech)。