2016-12-12 10 views
3

Я пишу приложение, которое должно получать аудио и отправлять его в Bing Recognition API для получения текста. Я использовал служебную библиотеку, и она работает с wav-файлом. Поэтому я написал собственный класс потока для приема звука с микрофона или сети (RTP), как отправить его в API распознавания. Когда я добавляю заголовок WAV перед аудиопотоком, он работает в течение нескольких секунд.Можно ли отправлять данные в реальном времени в Bing Speech Recognition?

Отладка показывает, что распознавание api считывает поток формы быстрее, чем заполняется источником звука (16 кб, 16 бит, моно).

Итак, мой вопрос: есть ли способ использовать распознавание api с непрерывным звуковым потоком в реальном времени?

Я знаю, что есть пример с микрофонным клиентом, но он работает только с микрофоном, и мне это нужно для разных источников.

+0

Вы хотите просто отправить аудио в реальном времени и получить результаты, когда кто-то говорит? Или вы хотите отправить произвольно длинный поток аудио? Возможно, если вы ссылаетесь на пример микрофона, ваш вопрос будет более ясным. –

+0

Я хочу отправить аудио в реальном времени, чтобы получить частичные результаты во время разговора. В основном, как [образец микрофона] (https://github.com/Microsoft/Cognitive-Speech-STT-Windows) в папке с образцом, но для разных источников (например, RTP). Но я надеюсь, что нашел решение (нужно сделать еще несколько тестов). Если это сработает, я создам ответ с описанием. –

ответ

1

Если вы хотите использовать источники, отличные от микрофона, вы можете использовать класс DataRecognitionClient, позвонив по телефону SpeechRecognitionServiceFactoryCreateDataClient. После того, как у вас есть клиентский объект, вы можете взять звук из любого источника - микрофон, сеть, чтение из файла и т. Д. - и отправить его для обработки с помощью метода клиента. Когда вы получаете каждый звуковой буфер, вы делаете новый звонок SendAudio.

Пока вы отправляете аудио с SendAudio, вы получите результаты частичного распознавания в реальном времени (или закрытии) в форме события OnPartialResponse клиента.

Когда вы закончите передачу звука, вы сообщаете клиенту, что вы готовы к окончательному результату распознавания, вызвав EndAudio. Затем вы должны получить событие OnResponseReceived от клиента, содержащего гипотезы окончательного признания.

+0

Звук хороший. Я проверю это. –

+0

Он работает! Теперь у меня есть решение как для клиентской dll (Microsoft.ProjectOxford.SpeechRecognition), так и для моего класса AutioStream (см. Ответ выше) также для библиотеки сервисов (Microsoft.Bing.Speech). –

2

Я нашел решение для своей проблемы. Я написал класс AudioStream, унаследованный от потока, который буферизует ввод и ждет, когда вызывается метод 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. 
} 
...... 

}

Поскольку аудиоданные принимаются непрерывно, метод чтения не будет «зависать» дольше, чем за несколько миллисекунд (например, пакеты RTP принимаются всего 20 мс).

+0

Ницца! Когда вы сомневаетесь, проявляйте творческий подход. Приношу свои извинения за то, что он был в тупике. –

0

Добавление дополнительной вспомогательной информации по этой теме: Реализация потока должна поддерживать одновременные операции чтения/записи и блокировать, когда у нее нет данных.