是否可以将实时数据发送到 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 类,方法是调用SpeechRecognitionServiceFactoryCreateDataClient 方法。拥有客户端对象后,您可以从任何来源获取音频——麦克风、网络、从文件中读取等——并将其发送给客户端的SendAudio 方法进行处理。当您收到每个音频缓冲区时,您会重新调用 SendAudio

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

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

【讨论】:

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

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

【讨论】:

以上是关于是否可以将实时数据发送到 Bing 语音识别?的主要内容,如果未能解决你的问题,请参考以下文章

使用实时流进行语音识别

基于kaldi的iOS实时语音识别(本地)+03+音频采集传输

是否有一种方法可以将实时记录的音频片段连续发送到Flutter.io中的后端服务器?

使用Watson SDK进行连续语音到文本

飞桨PaddleSpeech语音技术课程— 语音识别-流式服务

Python实时语音识别控制