다음을 통해 공유


오디오 입력 스트림을 사용하는 방법

Speech SDK는 마이크 또는 파일 입력의 대안으로 오디오를 인식기에 스트리밍하는 방법을 제공합니다.

이 가이드에서는 오디오 입력 스트림을 사용하는 방법을 설명합니다. 또한 오디오 입력 스트림의 몇 가지 요구 사항 및 제한 사항에 대해서도 설명합니다.

GitHub에서 오디오 입력 스트림을 사용하여 음성 텍스트 변환 인식의 더 많은 예제를 참조하세요.

오디오 스트림의 형식을 식별합니다.

오디오 스트림의 형식을 식별합니다.

지원되는 오디오 샘플은 다음과 같습니다.

  • PCM 형식(int-16, 부호화)
  • 하나의 채널
  • 샘플당 16비트, 초당 샘플 8,000개 또는 샘플 16,000개(초당 16,000바이트 또는 초당 32,000바이트)
  • 2블록 맞춤(샘플의 안쪽 여백 포함 16비트)

오디오 형식을 만들기 위한 SDK의 해당 코드는 다음 예제와 같습니다.

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

코드가 이러한 사양에 따라 RAW 오디오 데이터를 제공하는지 확인합니다. 또한 16비트 샘플이 little-endian 형식인지 확인합니다. 오디오 원본 데이터가 지원되는 형식과 일치하지 않는 경우 오디오를 필요한 형식으로 트랜스코딩해야 합니다.

고유한 오디오 입력 스트림 클래스 만들기

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}");
    }
}

다음 단계