![](/img/trans.png)
[英]Is it possible to send real-time data to Azure Speaker Recognition API?
[英]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包)。
如果要使用麦克风以外的其他来源,则可以通过调用SpeechRecognitionServiceFactory
的CreateDataClient
方法来使用DataRecognitionClient
类。 拥有客户端对象后,您可以从任何来源获取音频(麦克风,网络,从文件中读取文件等),并将其发送以使用客户端的SendAudio
方法进行处理。 收到每个音频缓冲区时,您SendAudio
进行新调用。
在使用SendAudio
发送音频的过程中,您将以客户端的OnPartialResponse
事件的形式实时(或关闭)接收部分识别结果。
发送完音频后,您可以通过调用EndAudio
向客户端发出信号,表示您已准备好获得最终的识别结果。 然后,您应该从客户端收到一个包含最终识别假设的OnResponseReceived
事件。
添加有关此主题的其他支持信息:流实现必须支持并发的读/写操作,并在没有数据时阻塞。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.