是否可以将实时数据发送到 Bing 语音识别?
Posted
技术标签:
【中文标题】是否可以将实时数据发送到 Bing 语音识别?【英文标题】:Is it possible to send real-time data to Bing Speech Recognition? 【发布时间】:2016-12-12 08:48:04 【问题描述】:我正在编写一个应用程序,它应该接收音频并将其发送到 Bing Recognition API 以获取文本。 我使用了服务库,它适用于 wav 文件。因此,我编写了自己的流类来接收来自麦克风或网络 (RTP) 的音频,并将其发送到识别 API。当我在音频流前面添加 WAV 标头时,它会工作几秒钟。
调试显示,识别 api 读取表单流的速度快于由音频源填充(16k 采样率,16 位,单声道)。
所以我的问题是:有没有办法将识别 api 与实时(连续)音频流一起使用?
我知道有一个麦克风客户端的示例,但它仅适用于麦克风,我需要它用于不同的来源。
【问题讨论】:
您是否只想实时发送音频并在有人讲话时返回结果?或者您想发送任意长的音频流?也许如果您链接到麦克风示例,您的问题会更清楚。 我想实时发送音频,以便在讲话过程中获得部分结果。主要类似于示例文件夹中的microphone sample,但适用于不同的来源(例如 RTP)。但我希望我找到了解决方案(必须做更多的测试)。如果可行,我将创建一个带有描述的答案。 【参考方案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
类,方法是调用SpeechRecognitionServiceFactory
的CreateDataClient
方法。拥有客户端对象后,您可以从任何来源获取音频——麦克风、网络、从文件中读取等——并将其发送给客户端的SendAudio
方法进行处理。当您收到每个音频缓冲区时,您会重新调用 SendAudio
。
当您正在使用SendAudio
发送音频时,您将以客户端的OnPartialResponse
事件的形式实时(或关闭)收到部分识别结果。
发送完音频后,您可以通过调用EndAudio
向客户端发出信号,表明您已准备好接受最终识别结果。然后,您应该会收到来自客户端的 OnResponseReceived
事件,其中包含最终识别假设。
【讨论】:
有效!现在我有一个解决方案,客户端 dll(Microsoft.ProjectOxford.SpeechRecognition)和我的 AutioStream 类(见上面的答案)也适用于服务库(Microsoft.Bing.Speech)。【参考方案3】:添加有关此主题的其他支持信息:流实现必须支持并发读/写操作,并在没有数据时阻塞。
【讨论】:
以上是关于是否可以将实时数据发送到 Bing 语音识别?的主要内容,如果未能解决你的问题,请参考以下文章
基于kaldi的iOS实时语音识别(本地)+03+音频采集传输
是否有一种方法可以将实时记录的音频片段连续发送到Flutter.io中的后端服务器?