오디오 입력 스트림을 사용하는 방법
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}");
}
}