繁体   English   中英

是否可以将实时数据发送到Bing语音识别?

[英]Is it possible to send real-time data to Bing Speech Recognition?

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

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

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

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

我找到了解决问题的方法。 我编写了一个从流继承的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方法的“挂起”时间不会超过几毫秒(例如,整个20 ms都接收到RTP包)。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM