【问题标题】:Is it possible to send real-time data to Bing Speech Recognition?是否可以将实时数据发送到 Bing 语音识别?
【发布时间】:2016-12-12 08:48:04
【问题描述】:

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

调试显示,识别 api 读取表单流的速度快于由音频源填充(16k 采样率,16 位,单声道)。

所以我的问题是:有没有办法将识别 api 与实时(连续)音频流一起使用?

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

【问题讨论】:

  • 您是否只想实时发送音频并在有人讲话时返回结果?或者您想发送任意长的音频流?也许如果您链接到麦克风示例,您的问题会更清楚。
  • 我想实时发送音频,以便在讲话过程中获得部分结果。主要类似于示例文件夹中的microphone sample,但适用于不同的来源(例如 RTP)。但我希望我找到了解决方案(必须做更多的测试)。如果可行,我将创建一个带有描述的答案。

标签: c# speech-to-text bing microsoft-cognitive


【解决方案1】:

我找到了解决问题的方法。我写了一个类AudioStream 继承自流,它缓冲输入并在调用Read 方法并且其缓冲区为空时等待。这可以防止识别器停止,因为 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.
}
......

}

由于连续接收音频数据,Read 方法不会“挂起”超过几毫秒(例如,RTP 包在 20 毫秒内都被接收)。

【讨论】:

  • 不错!如有疑问,请发挥创意。我很抱歉认为这是一个僵局。
【解决方案2】:

如果您想使用麦克风以外的来源,您可以使用DataRecognitionClient 类,方法是调用SpeechRecognitionServiceFactoryCreateDataClient 方法。拥有客户端对象后,您可以从任何来源获取音频——麦克风、网络、从文件中读取等——并将其发送给客户端的SendAudio 方法进行处理。当您收到每个音频缓冲区时,您会重新调用 SendAudio

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

发送完音频后,您可以通过调用EndAudio 向客户端发出信号,表明您已准备好接受最终识别结果。然后,您应该会收到来自客户端的 OnResponseReceived 事件,其中包含最终识别假设。

【讨论】:

  • 有效!现在我有一个解决方案,客户端 dll(Microsoft.ProjectOxford.SpeechRecognition)和我的 AutioStream 类(见上面的答案)也适用于服务库(Microsoft.Bing.Speech)。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多