Использование входного потока аудио

Пакет SDK службы "Речь" предоставляет способ потоковой передачи звука в распознаватель в качестве альтернативы микрофону или файловому вводу.

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

Дополнительные примеры распознавания речи в тексте с потоком ввода звука на сайте GitHub.

Определение формата аудиопотока

Определите формат аудиопотока.

Поддерживаемые примеры звука:

  • Формат PCM (int-16, подписанный)
  • Один канал
  • 16 бит на выборку, 8 000 или 16 000 выборок в секунду (16 000 байт или 32 000 байт в секунду)
  • Выравнивание по двум блокам (16 бит, включая отступы для образца)

Соответствующий код в пакете SDK для создания звукового формата выглядит следующим образом:

byte channels = 1;
byte bitsPerSample = 16;
int samplesPerSecond = 16000; // or 8000
var audioFormat = AudioStreamFormat.GetWaveFormatPCM(samplesPerSecond, bitsPerSample, channels);

Убедитесь, что ваш код может предоставлять необработанные аудиоданные, соответствующие указанным выше характеристикам. Также убедитесь, что 16-битные образцы поступают в формате с прямым порядком байтов. Если источник аудиоданных не соответствует поддерживаемым форматам, звук необходимо перекодировать в требуемый формат.

Создание собственного класса входного потока аудио

Вы можете создать собственный класс аудиопотока, производный от PullAudioInputStreamCallback. Реализуйте члены Read() и Close(). Точная сигнатура функции зависит от языка, однако код выглядит аналогично этому примеру кода:

public class ContosoAudioStream : PullAudioInputStreamCallback 
{
    public ContosoAudioStream() {}

    public override int Read(byte[] buffer, uint size) 
    {
        // Returns audio data to the caller.
        // E.g., return read(config.YYY, buffer, size);
        return 0;
    }

    public override void Close() 
    {
        // Close and clean up resources.
    }
}

Создайте конфигурацию звука на основе формата звука и пользовательского потока ввода звука. Например:

var audioConfig = AudioConfig.FromStreamInput(new ContosoAudioStream(), audioFormat);

Вот как используется пользовательский поток ввода звука в контексте распознавателя речи:

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

public class ContosoAudioStream : PullAudioInputStreamCallback 
{
    public ContosoAudioStream() {}

    public override int Read(byte[] buffer, uint size) 
    {
        // Returns audio data to the caller.
        // E.g., return read(config.YYY, buffer, size);
        return 0;
    }

    public override void Close() 
    {
        // Close and clean up resources.
    }
}

class Program 
{
    static string speechKey = Environment.GetEnvironmentVariable("SPEECH_KEY");
    static string speechRegion = Environment.GetEnvironmentVariable("SPEECH_REGION");

    async static Task Main(string[] args)
    {
        byte channels = 1;
        byte bitsPerSample = 16;
        uint samplesPerSecond = 16000; // or 8000
        var audioFormat = AudioStreamFormat.GetWaveFormatPCM(samplesPerSecond, bitsPerSample, channels);
        var audioConfig = AudioConfig.FromStreamInput(new ContosoAudioStream(), audioFormat);

        var speechConfig = SpeechConfig.FromSubscription(speechKey, speechRegion); 
        speechConfig.SpeechRecognitionLanguage = "en-US";
        var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

        Console.WriteLine("Speak into your microphone.");
        var speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
    }
}

Следующие шаги