음성을 인식하는 방법
참조 설명서 | 패키지(NuGet) | GitHub의 추가 샘플
이 방법 가이드에서는 Azure AI 음성을 사용하여 실시간 음성 텍스트 변환 방법을 알아봅니다. 실시간 음성 인식은 받아쓰기, 콜 센터 지원, 라이브 모임을 위한 캡션 등의 즉각적인 대화 내용 기록이 필요한 애플리케이션에 적합합니다.
이미 빌드된 애플리케이션의 환경을 설정하는 방법을 알아보려면 빠른 시작: 음성 인식 및 음성 텍스트 변환을 참조하세요.
음성 구성 인스턴스 만들기
음성 SDK를 사용하여 Speech Service를 호출하려면 SpeechConfig
인스턴스를 만들어야 합니다. 이 클래스에는 키 및 연결된 지역, 엔드포인트, 호스트 또는 권한 부여 토큰과 같은 구독에 대한 정보가 포함됩니다.
- Azure portal에서 음성 리소스를 만듭니다. 음성 리소스 키 및 지역을 가져옵니다.
- 다음 코드를 사용하여
SpeechConfig
인스턴스를 만듭니다.YourSpeechKey
및YourSpeechRegion
을 음성 리소스 키 및 지역과 바꿉니다.
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
class Program
{
async static Task Main(string[] args)
{
var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
}
}
다음과 같은 몇 가지 다른 방법으로 SpeechConfig
를 초기화할 수 있습니다.
- 엔드포인트를 사용하고 Speech Service 엔드포인트를 전달합니다. 키 또는 권한 부여 토큰은 선택 사항입니다.
- 호스트를 사용하고 호스트 주소를 전달합니다. 키 또는 권한 부여 토큰은 선택 사항입니다.
- 연결된 지역/위치에 권한 부여 토큰을 사용합니다.
참고 항목
음성 인식, 음성 합성, 번역 또는 의도 인식을 수행하고 있는지 여부에 관계없이 항상 구성을 만들게 됩니다.
마이크에서 음성 인식
디바이스 마이크를 사용하여 음성을 인식하려면 FromDefaultMicrophoneInput()
메서드를 사용하여 AudioConfig
인스턴스를 만듭니다. 그런 다음, speechConfig
및 audioConfig
를 전달하여 SpeechRecognizer
개체를 초기화합니다.
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
class Program
{
async static Task FromMic(SpeechConfig speechConfig)
{
using var audioConfig = AudioConfig.FromDefaultMicrophoneInput();
using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);
Console.WriteLine("Speak into your microphone.");
var speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();
Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
}
async static Task Main(string[] args)
{
var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
await FromMic(speechConfig);
}
}
특정 오디오 입력 디바이스를 사용하려면 AudioConfig
에서 디바이스 ID를 지정해야 합니다. 장치 ID를 가져오는 방법을 알아보려면 Speech SDK를 사용하여 오디오 입력 장치 선택을 참조하세요.
파일에서 음성 인식
마이크 대신 오디오 파일에서 음성을 인식하려는 경우에도 AudioConfig
인스턴스를 만들어야 합니다. 그러나 FromDefaultMicrophoneInput()
을 호출하지는 않습니다. 그러나 FromWavFileInput()
을 호출하고 파일 경로를 전달합니다.
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
class Program
{
async static Task FromFile(SpeechConfig speechConfig)
{
using var audioConfig = AudioConfig.FromWavFileInput("PathToFile.wav");
using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);
var speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();
Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
}
async static Task Main(string[] args)
{
var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
await FromFile(speechConfig);
}
}
메모리 내 스트림에서 음성 인식
대다수의 사용 사례에서는 오디오 데이터가 Azure Blob Storage에서 전송되거나 byte[]
인스턴스 또는 유사한 원시 데이터 구조로 메모리에 이미 있을 가능성이 높습니다. 다음 예제에서는 기본적으로 추상화된 메모리 스트림인 PushAudioInputStream
을 사용하여 음성을 인식합니다. 이 예제 코드에서는 다음 작업을 수행합니다.
byte[]
인스턴스를 허용하는Write()
함수를 사용하여 원시 오디오 데이터를PushAudioInputStream
에 씁니다.- 데모를 위해
FileReader
을 사용하여 .wav 파일을 읽습니다. 오디오 데이터가 이미byte[]
인스턴스에 있는 경우 콘텐츠를 입력 스트림에 쓰는 과정으로 바로 건너뛸 수 있습니다. - 기본 형식은 16비트, 16KHz 모노 PCM(펄스 코드 변조) 데이터입니다. 형식을 사용자 지정하려면 정적 함수(
AudioStreamFormat.GetWaveFormatPCM(sampleRate, (byte)bitRate, (byte)channels)
)를 사용하여AudioStreamFormat
개체를CreatePushStream()
에 전달할 수 있습니다.
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
class Program
{
async static Task FromStream(SpeechConfig speechConfig)
{
var reader = new BinaryReader(File.OpenRead("PathToFile.wav"));
using var audioConfigStream = AudioInputStream.CreatePushStream();
using var audioConfig = AudioConfig.FromStreamInput(audioConfigStream);
using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);
byte[] readBytes;
do
{
readBytes = reader.ReadBytes(1024);
audioConfigStream.Write(readBytes, readBytes.Length);
} while (readBytes.Length > 0);
var speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();
Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
}
async static Task Main(string[] args)
{
var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
await FromStream(speechConfig);
}
}
푸시 스트림을 입력으로 사용하면 오디오 데이터가 원시 PCM이라고 가정하고 헤더를 건너뜁니다. 특정한 경우에는 헤더를 건너뛰지 않았는데도 API가 계속 작동합니다. 최상의 결과를 위해 오디오 데이터의 시작 시 byte[]
가 시작되도록 헤더를 읽는 논리를 구현하는 것이 좋습니다.
오류 처리
이전 예제에서는 단순히 speechRecognitionResult.Text
속성에서 인식된 텍스트를 가져옵니다. 오류 및 기타 응답을 처리하려면 결과를 처리하는 코드를 작성해야 합니다. 다음 코드에서는 speechRecognitionResult.Reason
속성을 평가하여 다음을 수행합니다.
- 인식 결과
ResultReason.RecognizedSpeech
를 출력합니다. - 일치하는 인식이 없는 경우 사용자에게
ResultReason.NoMatch
를 알립니다. - 오류가 발생하는 경우 오류 메시지
ResultReason.Canceled
를 출력합니다.
switch (speechRecognitionResult.Reason)
{
case ResultReason.RecognizedSpeech:
Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
break;
case ResultReason.NoMatch:
Console.WriteLine($"NOMATCH: Speech could not be recognized.");
break;
case ResultReason.Canceled:
var cancellation = CancellationDetails.FromResult(speechRecognitionResult);
Console.WriteLine($"CANCELED: Reason={cancellation.Reason}");
if (cancellation.Reason == CancellationReason.Error)
{
Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}");
Console.WriteLine($"CANCELED: ErrorDetails={cancellation.ErrorDetails}");
Console.WriteLine($"CANCELED: Did you set the speech resource key and region values?");
}
break;
}
연속 인식 사용
이전 예제에서는 단일 발화를 인식하는 단일 샷 인식을 사용합니다. 단일 발화의 끝은 끝에서 무음을 수신하거나 최대 15초의 오디오가 처리될 때까지 대기하여 결정됩니다.
이와 반대로 인식을 중지하는 시점을 제어하려는 경우 연속 인식을 사용합니다. Recognizing
, Recognized
및 Canceled
이벤트를 구독하여 인식 결과를 얻어야 합니다. 인식을 중지하려면 StopContinuousRecognitionAsync
를 호출해야 합니다. 다음은 오디오 입력 파일에서 연속 인식이 수행되는 방식을 보여주는 예입니다.
먼저 입력을 정의하고 SpeechRecognizer
를 초기화합니다.
using var audioConfig = AudioConfig.FromWavFileInput("YourAudioFile.wav");
using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);
그런 다음, 음성 인식 상태를 관리하는 TaskCompletionSource<int>
인스턴스를 만듭니다.
var stopRecognition = new TaskCompletionSource<int>();
다음으로, SpeechRecognizer
에서 보내는 이벤트를 구독합니다.
Recognizing
: 중간 인식 결과가 포함된 이벤트에 대한 신호입니다.Recognized
: 최종 인식 결과가 포함된 이벤트에 대한 신호입니다(성공적인 인식 시도를 나타냄).SessionStopped
: 인식 세션(작업)의 끝을 나타내는 이벤트에 대한 신호입니다.Canceled
: 취소된 인식 결과가 포함된 이벤트에 대한 신호입니다. 이러한 결과는 직접 취소 요청으로 인해 취소된 인식 시도를 나타냅니다. 또는 전송 또는 프로토콜 오류를 나타냅니다.
speechRecognizer.Recognizing += (s, e) =>
{
Console.WriteLine($"RECOGNIZING: Text={e.Result.Text}");
};
speechRecognizer.Recognized += (s, e) =>
{
if (e.Result.Reason == ResultReason.RecognizedSpeech)
{
Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
}
else if (e.Result.Reason == ResultReason.NoMatch)
{
Console.WriteLine($"NOMATCH: Speech could not be recognized.");
}
};
speechRecognizer.Canceled += (s, e) =>
{
Console.WriteLine($"CANCELED: Reason={e.Reason}");
if (e.Reason == CancellationReason.Error)
{
Console.WriteLine($"CANCELED: ErrorCode={e.ErrorCode}");
Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}");
Console.WriteLine($"CANCELED: Did you set the speech resource key and region values?");
}
stopRecognition.TrySetResult(0);
};
speechRecognizer.SessionStopped += (s, e) =>
{
Console.WriteLine("\n Session stopped event.");
stopRecognition.TrySetResult(0);
};
모든 설정이 완료되면 StartContinuousRecognitionAsync
를 호출하여 인식을 시작합니다.
await speechRecognizer.StartContinuousRecognitionAsync();
// Waits for completion. Use Task.WaitAny to keep the task rooted.
Task.WaitAny(new[] { stopRecognition.Task });
// Make the following call at some point to stop recognition:
// await speechRecognizer.StopContinuousRecognitionAsync();
원본 언어 변경
음성 인식에 대한 일반적인 작업 중 하나는 입력(또는 소스) 언어를 지정하는 것입니다. 다음 예제에서는 입력 언어를 이탈리아어로 변경하는 방법을 보여 줍니다. 코드에서 SpeechConfig
인스턴스를 찾아서 바로 아래에 다음 줄을 추가합니다.
speechConfig.SpeechRecognitionLanguage = "it-IT";
SpeechRecognitionLanguage
속성에는 언어 로캘 형식 문자열이 필요합니다. 지원되는 로캘 목록에 대해서는 Speech Service에 대한 언어 및 음성 지원을 참조하세요.
언어 식별
오디오 원본의 언어를 식별한 후 텍스트로 기록해야 하는 경우 음성 텍스트 변환 인식과 함께 언어 식별을 사용할 수 있습니다.
전체 코드 샘플은 언어 식별을 참조하세요.
사용자 지정 엔드포인트 사용
사용자 지정 음성을 사용하면 사용자 고유의 데이터를 업로드하고, 사용자 지정 모델을 테스트 및 학습시키고, 모델 간의 정확도를 비교하고, 모델을 사용자 지정 엔드포인트에 배포할 수 있습니다. 다음 예제에서는 사용자 지정 엔드포인트를 설정하는 방법을 보여 줍니다.
var speechConfig = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
speechConfig.EndpointId = "YourEndpointId";
var speechRecognizer = new SpeechRecognizer(speechConfig);
컨테이너 실행 및 사용
음성 컨테이너는 음성 SDK 및 음성 CLI를 통해 액세스되는 websocket 기반 쿼리 엔드포인트 API를 제공합니다. 기본적으로 음성 SDK 및 음성 CLI는 공개 음성 서비스를 사용합니다. 컨테이너를 사용하려면 초기화 메서드를 변경해야 합니다. 키 및 지역 대신 컨테이너 호스트 URL을 사용합니다.
컨테이너에 대한 자세한 내용은 Docker를 사용하여 음성 컨테이너 설치 및 실행에서 호스트 URL을 참조하세요.
무음 처리 방법 변경
사용자가 평소보다 더 빠르거나 느리게 말하게 되는 경우 입력 오디오에서 음성이 아닌 무음의 기본 동작이 예상대로 나타나지 않을 수 있습니다. 무음 처리의 일반적인 문제는 다음과 같습니다.
- 문장을 개별 결과로 나누는 대신 여러 문장을 단일 인식 결과로 연결하는 빠른 음성
- 단일 문장의 일부를 여러 결과로 분리하는 느린 음성
- 음성이 시작되기를 기다리는 동안 너무 빨리 끝나는 단일 샷 인식
이러한 문제는 SpeechConfig
인스턴스에서 SpeechRecognizer
를 만드는 데 사용되는 다음 두 시간 제한 속성 중 하나를 설정하여 해결할 수 있습니다.
- 구분 무음 시간 제한은 해당 구가 "완료"로 간주되기 전에 현재 말하고 있는 구 내에서 음성이 아닌 오디오가 허용되는 양을 조정합니다.
- 큰 값일수록 일반적으로 결과가 더 길어지고 문구 내 스피커에서 더 오래 일시 중지할 수 있지만, 도착하는 데 시간이 더 오래 걸립니다. 너무 높게 설정하면 별도의 구를 단일 결과로 결합할 수도 있습니다.
- 값을 낮추면 일반적으로 결과가 짧아지고, 구간에 프롬프트가 더 자주 등장하며, 자주 중단되지만 너무 낮게 설정하면 단일 구가 여러 결과로 분리될 수도 있습니다.
- 이 시간 제한은 100에서 5000 사이의 정수 값(밀리초)으로 설정할 수 있으며 일반적인 기본값은 500입니다.
- 초기 무음 시간 제한은 인식 시도가 "일치하지 않는" 결과로 끝나기 전의 구 앞에서 음성이 아닌 오디오가 허용되는 양을 조정합니다.
- 클수록 화자가 반응하고 말하기를 시작하는 데 더 많은 시간이 주지만 아무 말도 하지 않으면 응답 속도가 느려질 수 있습니다.
- 값을 낮추면 신속한 “일치하지 않음” 처리로 더 빠른 사용자 환경 및 더 제어된 오디오 처리를 제공하지만, 너무 낮게 설정하면 스피커가 너무 빨리 꺼질 수 있습니다.
- 연속 인식은 많은 결과를 생성하기 때문에 이 값은 "일치하지 않음" 결과가 도착하는 빈도를 결정하지만, 다른 방식으로 인식 결과의 내용에 영향을 주지 않습니다.
- 이 시간 제한은 음수가 아닌 정수 값(밀리초)으로 설정하거나 0으로 설정하여 완전히 사용하지 않도록 설정할 수 있습니다. 5000은 단일 샷 인식의 일반적인 기본값이지만 15000은 연속 인식의 일반적인 기본값입니다.
이러한 시간 제한을 수정할 때 단점이 있으므로 무음 처리와 관련된 문제가 있는 경우에만 설정을 변경하는 것이 좋습니다. 기본값은 대부분의 음성 오디오를 최적으로 처리하며 일반적이지 않은 시나리오에서만 문제가 발생합니다.
예: "ABC-123-4567"과 같은 일련 번호를 말하는 사용자가 문자 그룹 간에 일시 중지하는 시간이 길어 일련 번호가 여러 결과로 나뉩니다. 이 경우 분할 무음 시간 제한을 2000밀리초처럼 더 높은 값으로 설정해 봅니다.
speechConfig.SetProperty(PropertyId.Speech_SegmentationSilenceTimeoutMs, "2000");
예: 녹음된 발표자의 말이 빨라 한 행의 여러 문장이 결합되고, 큰 인식 결과는 분당 한두 번만 도착합니다. 이 경우 분할 무음 시간 제한을 300ms처럼 더 낮은 값으로 설정합니다.
speechConfig.SetProperty(PropertyId.Speech_SegmentationSilenceTimeoutMs, "300");
예: 발표자에게 일련 번호를 찾아서 읽도록 발표자에게 요청하는 단일 샷 인식이 숫자를 찾는 도중에 너무 빨리 끝납니다. 이 경우 10000ms와 같은 더 긴 초기 무음 시간 제한을 사용해 봅니다.
speechConfig.SetProperty(PropertyId.SpeechServiceConnection_InitialSilenceTimeoutMs, "10000");
의미 체계 구분
의미 체계 구분은 무음 기반 구분과 관련된 문제를 완화하도록 설계된 음성 인식 세분화 전략입니다.
- 세분화 아래: 사용자가 일시 중지 없이 오랫동안 말할 때 중단 없이 긴 텍스트 시퀀스("텍스트 벽")를 볼 수 있으므로 가독성 환경이 심각하게 저하됩니다.
- 초과 분할: 사용자가 짧은 시간 동안 일시 중지하면 무음 검색 메커니즘이 잘못 분할할 수 있습니다.
무음 시간 제한에 의존하는 대신 의미 체계 구분은 문장 끝 문장 부호(예: '.' 또는 '?')를 검색할 때 최종 결과를 세그먼트화하고 반환합니다. 이렇게 하면 더 높은 품질의 의미상 완전한 세그먼트로 사용자 환경을 개선하고 긴 중간 결과를 방지할 수 있습니다.
의미 체계 구분을 사용하려면 다음 속성을 만드는 데 사용되는 인스턴스에서 SpeechConfig
설정해야 합니다.SpeechRecognizer
speechConfig.SetProperty(PropertyId.Speech_SegmentationStrategy, "Semantic");
의미 체계 구분의 몇 가지 제한 사항은 다음과 같습니다.
- 의미 체계 구분을 사용하려면 Speech SDK 버전 1.41 이상이 필요합니다.
- 의미 체계 구분은 연속 인식에만 사용됩니다. 여기에는 전사 및 캡션과 같은 시나리오가 포함됩니다. 단일 인식 및 받아쓰기 모드에서는 사용하지 않아야 합니다.
- 의미 체계 구분은 모든 언어 및 로캘에 사용할 수 없습니다. 현재 의미 체계 구분은 en-US, en-GB, en-IN 및 en-AU와 같은 영어(en) 로캘에만 사용할 수 있습니다.
- 의미 체계 구분은 신뢰도 점수 및 NBest 목록을 아직 지원하지 않습니다. 따라서 신뢰도 점수 또는 NBest 목록을 사용하는 경우 의미 체계 구분을 사용하지 않는 것이 좋습니다.
참조 설명서 | 패키지(NuGet) | GitHub의 추가 샘플
이 방법 가이드에서는 Azure AI 음성을 사용하여 실시간 음성 텍스트 변환 방법을 알아봅니다. 실시간 음성 인식은 받아쓰기, 콜 센터 지원, 라이브 모임을 위한 캡션 등의 즉각적인 대화 내용 기록이 필요한 애플리케이션에 적합합니다.
이미 빌드된 애플리케이션의 환경을 설정하는 방법을 알아보려면 빠른 시작: 음성 인식 및 음성 텍스트 변환을 참조하세요.
음성 구성 인스턴스 만들기
음성 SDK를 사용하여 Speech Service를 호출하려면 SpeechConfig
인스턴스를 만들어야 합니다. 이 클래스에는 키 및 연결된 지역, 엔드포인트, 호스트 또는 권한 부여 토큰과 같은 구독에 대한 정보가 포함됩니다.
- Azure portal에서 음성 리소스를 만듭니다. 음성 리소스 키 및 지역을 가져옵니다.
- 다음 코드를 사용하여
SpeechConfig
인스턴스를 만듭니다.YourSpeechKey
및YourSpeechRegion
을 음성 리소스 키 및 지역과 바꿉니다.
using namespace std;
using namespace Microsoft::CognitiveServices::Speech;
auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");
다음과 같은 몇 가지 다른 방법으로 SpeechConfig
를 초기화할 수 있습니다.
- 엔드포인트를 사용하고 Speech Service 엔드포인트를 전달합니다. 키 또는 권한 부여 토큰은 선택 사항입니다.
- 호스트를 사용하고 호스트 주소를 전달합니다. 키 또는 권한 부여 토큰은 선택 사항입니다.
- 연결된 지역/위치에 권한 부여 토큰을 사용합니다.
참고 항목
음성 인식, 음성 합성, 번역 또는 의도 인식을 수행하고 있는지 여부에 관계없이 항상 구성을 만들게 됩니다.
마이크에서 음성 인식
디바이스 마이크를 사용하여 음성을 인식하려면 FromDefaultMicrophoneInput()
멤버 함수를 사용하여 AudioConfig
인스턴스를 만듭니다. 그런 다음, audioConfig
및 config
를 전달하여 SpeechRecognizer
개체를 초기화합니다.
using namespace Microsoft::CognitiveServices::Speech::Audio;
auto audioConfig = AudioConfig::FromDefaultMicrophoneInput();
auto speechRecognizer = SpeechRecognizer::FromConfig(config, audioConfig);
cout << "Speak into your microphone." << std::endl;
auto result = speechRecognizer->RecognizeOnceAsync().get();
cout << "RECOGNIZED: Text=" << result->Text << std::endl;
특정 오디오 입력 디바이스를 사용하려면 AudioConfig
에서 디바이스 ID를 지정해야 합니다. 장치 ID를 가져오는 방법을 알아보려면 Speech SDK를 사용하여 오디오 입력 장치 선택을 참조하세요.
파일에서 음성 인식
마이크를 사용하는 대신 오디오 파일에서 음성을 인식하려는 경우에도 AudioConfig
인스턴스를 만들어야 합니다. 그러나 FromDefaultMicrophoneInput()
을 호출하지는 않습니다. 그러나 FromWavFileInput()
을 호출하고 파일 경로를 전달합니다.
using namespace Microsoft::CognitiveServices::Speech::Audio;
auto audioConfig = AudioConfig::FromWavFileInput("YourAudioFile.wav");
auto speechRecognizer = SpeechRecognizer::FromConfig(config, audioConfig);
auto result = speechRecognizer->RecognizeOnceAsync().get();
cout << "RECOGNIZED: Text=" << result->Text << std::endl;
Recognizer 클래스를 사용하여 음성 인식
C++용 음성 SDK의 인식기 클래스는 음성 인식에 사용할 수 있는 몇 가지 메서드를 공개합니다.
단일 샷 인식
단일 샷 인식은 단일 발화를 비동기적으로 인식합니다. 단일 발화의 끝은 끝에서 무음을 수신하거나 최대 15초의 오디오가 처리될 때까지 대기하여 결정됩니다. 다음은 RecognizeOnceAsync
를 통한 비동기 단일 샷 인식의 예입니다.
auto result = speechRecognizer->RecognizeOnceAsync().get();
결과를 처리하는 코드를 작성해야 합니다. 이 샘플은 result->Reason
을 평가하고 다음을 수행합니다.
- 인식 결과
ResultReason::RecognizedSpeech
를 출력합니다. - 일치하는 인식이 없는 경우 사용자에게
ResultReason::NoMatch
를 알립니다. - 오류가 발생하는 경우 오류 메시지
ResultReason::Canceled
를 출력합니다.
switch (result->Reason)
{
case ResultReason::RecognizedSpeech:
cout << "We recognized: " << result->Text << std::endl;
break;
case ResultReason::NoMatch:
cout << "NOMATCH: Speech could not be recognized." << std::endl;
break;
case ResultReason::Canceled:
{
auto cancellation = CancellationDetails::FromResult(result);
cout << "CANCELED: Reason=" << (int)cancellation->Reason << std::endl;
if (cancellation->Reason == CancellationReason::Error) {
cout << "CANCELED: ErrorCode= " << (int)cancellation->ErrorCode << std::endl;
cout << "CANCELED: ErrorDetails=" << cancellation->ErrorDetails << std::endl;
cout << "CANCELED: Did you set the speech resource key and region values?" << std::endl;
}
}
break;
default:
break;
}
연속 인식
연속 인식은 단일 샷 인식보다 약간 더 복잡합니다. Recognizing
, Recognized
및 Canceled
이벤트를 구독하여 인식 결과를 얻어야 합니다. 인식을 중지하려면 StopContinuousRecognitionAsync를 호출해야 합니다. 다음은 오디오 입력 파일에서 수행되는 연속 인식의 예입니다.
먼저 입력을 정의하고 SpeechRecognizer
를 초기화합니다.
auto audioConfig = AudioConfig::FromWavFileInput("YourAudioFile.wav");
auto speechRecognizer = SpeechRecognizer::FromConfig(config, audioConfig);
다음으로, 음성 인식 상태를 관리하는 변수를 만듭니다. 인식을 시작할 때 인식이 완료되지 않았다고 안전하게 가정할 수 있으므로 promise<void>
를 선언합니다.
promise<void> recognitionEnd;
다음으로, SpeechRecognizer
에서 보내는 이벤트를 구독합니다.
Recognizing
: 중간 인식 결과가 포함된 이벤트에 대한 신호입니다.Recognized
: 최종 인식 결과가 포함된 이벤트에 대한 신호입니다(성공적인 인식 시도를 나타냄).SessionStopped
: 인식 세션(작업)의 끝을 나타내는 이벤트에 대한 신호입니다.Canceled
: 취소된 인식 결과가 포함된 이벤트에 대한 신호입니다. 이러한 결과는 직접 취소 요청으로 인해 취소된 인식 시도를 나타냅니다. 또는 전송 또는 프로토콜 오류를 나타냅니다.
speechRecognizer->Recognizing.Connect([](const SpeechRecognitionEventArgs& e)
{
cout << "Recognizing:" << e.Result->Text << std::endl;
});
speechRecognizer->Recognized.Connect([](const SpeechRecognitionEventArgs& e)
{
if (e.Result->Reason == ResultReason::RecognizedSpeech)
{
cout << "RECOGNIZED: Text=" << e.Result->Text
<< " (text could not be translated)" << std::endl;
}
else if (e.Result->Reason == ResultReason::NoMatch)
{
cout << "NOMATCH: Speech could not be recognized." << std::endl;
}
});
speechRecognizer->Canceled.Connect([&recognitionEnd](const SpeechRecognitionCanceledEventArgs& e)
{
cout << "CANCELED: Reason=" << (int)e.Reason << std::endl;
if (e.Reason == CancellationReason::Error)
{
cout << "CANCELED: ErrorCode=" << (int)e.ErrorCode << "\n"
<< "CANCELED: ErrorDetails=" << e.ErrorDetails << "\n"
<< "CANCELED: Did you set the speech resource key and region values?" << std::endl;
recognitionEnd.set_value(); // Notify to stop recognition.
}
});
speechRecognizer->SessionStopped.Connect([&recognitionEnd](const SessionEventArgs& e)
{
cout << "Session stopped.";
recognitionEnd.set_value(); // Notify to stop recognition.
});
모든 설정이 완료되면 StartContinuousRecognitionAsync
를 호출하여 인식을 시작합니다.
// Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
speechRecognizer->StartContinuousRecognitionAsync().get();
// Waits for recognition end.
recognitionEnd.get_future().get();
// Stops recognition.
speechRecognizer->StopContinuousRecognitionAsync().get();
원본 언어 변경
음성 인식에 대한 일반적인 작업 중 하나는 입력(또는 소스) 언어를 지정하는 것입니다. 다음 예제에서는 입력 언어를 독일어로 변경하는 방법을 보여 줍니다. 코드에서 SpeechConfig
인스턴스를 찾아서 바로 아래에 다음 줄을 추가합니다.
speechConfig->SetSpeechRecognitionLanguage("de-DE");
SetSpeechRecognitionLanguage
는 문자열을 인수로 사용하는 매개 변수입니다. 지원되는 로캘 목록에 대해서는 Speech Service에 대한 언어 및 음성 지원을 참조하세요.
언어 식별
오디오 원본의 언어를 식별한 후 텍스트로 기록해야 하는 경우 음성 텍스트 변환 인식과 함께 언어 식별을 사용할 수 있습니다.
전체 코드 샘플은 언어 식별을 참조하세요.
사용자 지정 엔드포인트 사용
사용자 지정 음성을 사용하면 사용자 고유의 데이터를 업로드하고, 사용자 지정 모델을 테스트 및 학습시키고, 모델 간의 정확도를 비교하고, 모델을 사용자 지정 엔드포인트에 배포할 수 있습니다. 다음 예제에서는 사용자 지정 엔드포인트를 설정하는 방법을 보여 줍니다.
auto speechConfig = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
speechConfig->SetEndpointId("YourEndpointId");
auto speechRecognizer = SpeechRecognizer::FromConfig(speechConfig);
컨테이너 실행 및 사용
음성 컨테이너는 음성 SDK 및 음성 CLI를 통해 액세스되는 websocket 기반 쿼리 엔드포인트 API를 제공합니다. 기본적으로 음성 SDK 및 음성 CLI는 공개 음성 서비스를 사용합니다. 컨테이너를 사용하려면 초기화 메서드를 변경해야 합니다. 키 및 지역 대신 컨테이너 호스트 URL을 사용합니다.
컨테이너에 대한 자세한 내용은 Docker를 사용하여 음성 컨테이너 설치 및 실행에서 호스트 URL을 참조하세요.
의미 체계 구분
의미 체계 구분은 무음 기반 구분과 관련된 문제를 완화하도록 설계된 음성 인식 세분화 전략입니다.
- 세분화 아래: 사용자가 일시 중지 없이 오랫동안 말할 때 중단 없이 긴 텍스트 시퀀스("텍스트 벽")를 볼 수 있으므로 가독성 환경이 심각하게 저하됩니다.
- 초과 분할: 사용자가 짧은 시간 동안 일시 중지하면 무음 검색 메커니즘이 잘못 분할할 수 있습니다.
무음 시간 제한에 의존하는 대신 의미 체계 구분은 문장 끝 문장 부호(예: '.' 또는 '?')를 검색할 때 최종 결과를 세그먼트화하고 반환합니다. 이렇게 하면 더 높은 품질의 의미상 완전한 세그먼트로 사용자 환경을 개선하고 긴 중간 결과를 방지할 수 있습니다.
의미 체계 구분을 사용하려면 다음 속성을 만드는 데 사용되는 인스턴스에서 SpeechConfig
설정해야 합니다.SpeechRecognizer
speechConfig->SetProperty(PropertyId::Speech_SegmentationStrategy, "Semantic");
의미 체계 구분의 몇 가지 제한 사항은 다음과 같습니다.
- 의미 체계 구분을 사용하려면 Speech SDK 버전 1.41 이상이 필요합니다.
- 의미 체계 구분은 연속 인식에만 사용됩니다. 여기에는 전사 및 캡션과 같은 시나리오가 포함됩니다. 단일 인식 및 받아쓰기 모드에서는 사용하지 않아야 합니다.
- 의미 체계 구분은 모든 언어 및 로캘에 사용할 수 없습니다. 현재 의미 체계 구분은 en-US, en-GB, en-IN 및 en-AU와 같은 영어(en) 로캘에만 사용할 수 있습니다.
- 의미 체계 구분은 신뢰도 점수 및 NBest 목록을 아직 지원하지 않습니다. 따라서 신뢰도 점수 또는 NBest 목록을 사용하는 경우 의미 체계 구분을 사용하지 않는 것이 좋습니다.
참조 설명서 | 패키지(Go) | GitHub의 추가 샘플
이 방법 가이드에서는 Azure AI 음성을 사용하여 실시간 음성 텍스트 변환 방법을 알아봅니다. 실시간 음성 인식은 받아쓰기, 콜 센터 지원, 라이브 모임을 위한 캡션 등의 즉각적인 대화 내용 기록이 필요한 애플리케이션에 적합합니다.
이미 빌드된 애플리케이션의 환경을 설정하는 방법을 알아보려면 빠른 시작: 음성 인식 및 음성 텍스트 변환을 참조하세요.
마이크에서 음성 텍스트 변환 인식
- Azure portal에서 음성 리소스를 만듭니다. 음성 리소스 키 및 지역을 가져옵니다.
- 다음 코드 샘플을 사용하여 기본 디바이스 마이크에서 음성 인식을 실행할 수 있습니다.
YourSpeechKey
및YourSpeechRegion
을 음성 리소스 키 및 지역과 바꿉니다. 스크립트를 실행하면 기본 마이크 및 출력 텍스트에서 인식 세션이 시작됩니다.
package main
import (
"bufio"
"fmt"
"os"
"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)
func sessionStartedHandler(event speech.SessionEventArgs) {
defer event.Close()
fmt.Println("Session Started (ID=", event.SessionID, ")")
}
func sessionStoppedHandler(event speech.SessionEventArgs) {
defer event.Close()
fmt.Println("Session Stopped (ID=", event.SessionID, ")")
}
func recognizingHandler(event speech.SpeechRecognitionEventArgs) {
defer event.Close()
fmt.Println("Recognizing:", event.Result.Text)
}
func recognizedHandler(event speech.SpeechRecognitionEventArgs) {
defer event.Close()
fmt.Println("Recognized:", event.Result.Text)
}
func cancelledHandler(event speech.SpeechRecognitionCanceledEventArgs) {
defer event.Close()
fmt.Println("Received a cancellation: ", event.ErrorDetails)
fmt.Println("Did you set the speech resource key and region values?")
}
func main() {
subscription := "YourSpeechKey"
region := "YourSpeechRegion"
audioConfig, err := audio.NewAudioConfigFromDefaultMicrophoneInput()
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer audioConfig.Close()
config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer config.Close()
speechRecognizer, err := speech.NewSpeechRecognizerFromConfig(config, audioConfig)
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer speechRecognizer.Close()
speechRecognizer.SessionStarted(sessionStartedHandler)
speechRecognizer.SessionStopped(sessionStoppedHandler)
speechRecognizer.Recognizing(recognizingHandler)
speechRecognizer.Recognized(recognizedHandler)
speechRecognizer.Canceled(cancelledHandler)
speechRecognizer.StartContinuousRecognitionAsync()
defer speechRecognizer.StopContinuousRecognitionAsync()
bufio.NewReader(os.Stdin).ReadBytes('\n')
}
다음 명령을 실행하여 GitHub에서 호스팅되는 구성 요소에 연결되는 go.mod 파일을 만듭니다.
go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go
이제 코드를 빌드하고 실행합니다.
go build
go run quickstart
자세한 내용은 SpeechConfig
클래스 및 SpeechRecognizer
클래스에 대한 참조 콘텐츠를 참조하세요.
오디오 파일에서 음성 텍스트 변환 인식
오디오 파일에서 음성 인식을 실행하려면 다음 샘플을 사용합니다. YourSpeechKey
및 YourSpeechRegion
을 음성 리소스 키 및 지역과 바꿉니다. 또한 변수 file
을 .wav 파일의 경로로 바꿉니다. 스크립트를 실행하면 파일에서 음성을 인식하고 텍스트 결과를 출력합니다.
package main
import (
"fmt"
"time"
"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)
func main() {
subscription := "YourSpeechKey"
region := "YourSpeechRegion"
file := "path/to/file.wav"
audioConfig, err := audio.NewAudioConfigFromWavFileInput(file)
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer audioConfig.Close()
config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer config.Close()
speechRecognizer, err := speech.NewSpeechRecognizerFromConfig(config, audioConfig)
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer speechRecognizer.Close()
speechRecognizer.SessionStarted(func(event speech.SessionEventArgs) {
defer event.Close()
fmt.Println("Session Started (ID=", event.SessionID, ")")
})
speechRecognizer.SessionStopped(func(event speech.SessionEventArgs) {
defer event.Close()
fmt.Println("Session Stopped (ID=", event.SessionID, ")")
})
task := speechRecognizer.RecognizeOnceAsync()
var outcome speech.SpeechRecognitionOutcome
select {
case outcome = <-task:
case <-time.After(5 * time.Second):
fmt.Println("Timed out")
return
}
defer outcome.Close()
if outcome.Error != nil {
fmt.Println("Got an error: ", outcome.Error)
}
fmt.Println("Got a recognition!")
fmt.Println(outcome.Result.Text)
}
다음 명령을 실행하여 GitHub에서 호스팅되는 구성 요소에 연결되는 go.mod 파일을 만듭니다.
go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go
이제 코드를 빌드하고 실행합니다.
go build
go run quickstart
자세한 내용은 SpeechConfig
클래스 및 SpeechRecognizer
클래스에 대한 참조 콘텐츠를 참조하세요.
컨테이너 실행 및 사용
음성 컨테이너는 음성 SDK 및 음성 CLI를 통해 액세스되는 websocket 기반 쿼리 엔드포인트 API를 제공합니다. 기본적으로 음성 SDK 및 음성 CLI는 공개 음성 서비스를 사용합니다. 컨테이너를 사용하려면 초기화 메서드를 변경해야 합니다. 키 및 지역 대신 컨테이너 호스트 URL을 사용합니다.
컨테이너에 대한 자세한 내용은 Docker를 사용하여 음성 컨테이너 설치 및 실행에서 호스트 URL을 참조하세요.
이 방법 가이드에서는 Azure AI 음성을 사용하여 실시간 음성 텍스트 변환 방법을 알아봅니다. 실시간 음성 인식은 받아쓰기, 콜 센터 지원, 라이브 모임을 위한 캡션 등의 즉각적인 대화 내용 기록이 필요한 애플리케이션에 적합합니다.
이미 빌드된 애플리케이션의 환경을 설정하는 방법을 알아보려면 빠른 시작: 음성 인식 및 음성 텍스트 변환을 참조하세요.
음성 구성 인스턴스 만들기
음성 SDK를 사용하여 Speech Service를 호출하려면 SpeechConfig 인스턴스를 만들어야 합니다. 이 클래스에는 키 및 연결된 지역, 엔드포인트, 호스트 또는 권한 부여 토큰과 같은 구독에 대한 정보가 포함됩니다.
- Azure portal에서 음성 리소스를 만듭니다. 음성 리소스 키 및 지역을 가져옵니다.
- 음성 키와 지역을 사용하여
SpeechConfig
인스턴스를 만듭니다.
import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
public class Program {
public static void main(String[] args) throws InterruptedException, ExecutionException {
SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key>", "<paste-your-region>");
}
}
다음과 같은 몇 가지 다른 방법으로 SpeechConfig
를 초기화할 수 있습니다.
- 엔드포인트를 사용하고 Speech Service 엔드포인트를 전달합니다. 키 또는 권한 부여 토큰은 선택 사항입니다.
- 호스트를 사용하고 호스트 주소를 전달합니다. 키 또는 권한 부여 토큰은 선택 사항입니다.
- 연결된 지역/위치에 권한 부여 토큰을 사용합니다.
참고 항목
음성 인식, 음성 합성, 번역 또는 의도 인식을 수행하고 있는지 여부에 관계없이 항상 구성을 만들게 됩니다.
마이크에서 음성 인식
디바이스 마이크를 사용하여 음성을 인식하려면 fromDefaultMicrophoneInput()
메서드를 사용하여 AudioConfig
인스턴스를 만듭니다. 그런 다음, audioConfig
및 config
를 전달하여 SpeechRecognizer
개체를 초기화합니다.
import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
public class Program {
public static void main(String[] args) throws InterruptedException, ExecutionException {
SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key>", "<paste-your-region>");
fromMic(speechConfig);
}
public static void fromMic(SpeechConfig speechConfig) throws InterruptedException, ExecutionException {
AudioConfig audioConfig = AudioConfig.fromDefaultMicrophoneInput();
SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);
System.out.println("Speak into your microphone.");
Future<SpeechRecognitionResult> task = speechRecognizer.recognizeOnceAsync();
SpeechRecognitionResult speechRecognitionResult = task.get();
System.out.println("RECOGNIZED: Text=" + speechRecognitionResult.getText());
}
}
특정 오디오 입력 디바이스를 사용하려면 AudioConfig
에서 디바이스 ID를 지정해야 합니다. 장치 ID를 가져오는 방법을 알아보려면 Speech SDK를 사용하여 오디오 입력 장치 선택을 참조하세요.
파일에서 음성 인식
마이크를 사용하는 대신 오디오 파일에서 음성을 인식하려는 경우에도 AudioConfig
인스턴스를 만들어야 합니다. 그러나 FromDefaultMicrophoneInput()
을 호출하지는 않습니다. 그러나 fromWavFileInput()
을 호출하고 파일 경로를 전달합니다.
import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
public class Program {
public static void main(String[] args) throws InterruptedException, ExecutionException {
SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key>", "<paste-your-region>");
fromFile(speechConfig);
}
public static void fromFile(SpeechConfig speechConfig) throws InterruptedException, ExecutionException {
AudioConfig audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);
Future<SpeechRecognitionResult> task = speechRecognizer.recognizeOnceAsync();
SpeechRecognitionResult speechRecognitionResult = task.get();
System.out.println("RECOGNIZED: Text=" + speechRecognitionResult.getText());
}
}
오류 처리
이전 예제에서는 단순히 speechRecognitionResult.getText()
를 사용하여 인식된 텍스트를 가져옵니다. 오류 및 기타 응답을 처리하려면 결과를 처리하는 코드를 작성해야 합니다. 다음 예제는 speechRecognitionResult.getReason()
을 평가합니다. 그리고
- 인식 결과
ResultReason.RecognizedSpeech
를 출력합니다. - 일치하는 인식이 없는 경우 사용자에게
ResultReason.NoMatch
를 알립니다. - 오류가 발생하는 경우 오류 메시지
ResultReason.Canceled
를 출력합니다.
switch (speechRecognitionResult.getReason()) {
case ResultReason.RecognizedSpeech:
System.out.println("We recognized: " + speechRecognitionResult.getText());
exitCode = 0;
break;
case ResultReason.NoMatch:
System.out.println("NOMATCH: Speech could not be recognized.");
break;
case ResultReason.Canceled: {
CancellationDetails cancellation = CancellationDetails.fromResult(speechRecognitionResult);
System.out.println("CANCELED: Reason=" + cancellation.getReason());
if (cancellation.getReason() == CancellationReason.Error) {
System.out.println("CANCELED: ErrorCode=" + cancellation.getErrorCode());
System.out.println("CANCELED: ErrorDetails=" + cancellation.getErrorDetails());
System.out.println("CANCELED: Did you set the speech resource key and region values?");
}
}
break;
}
연속 인식 사용
이전 예제에서는 단일 발화를 인식하는 단일 샷 인식을 사용합니다. 단일 발화의 끝은 끝에서 무음을 수신하거나 최대 15초의 오디오가 처리될 때까지 대기하여 결정됩니다.
이와 반대로 인식을 중지하는 시점을 제어하려는 경우 연속 인식을 사용합니다. recognizing
, recognized
및 canceled
이벤트를 구독하여 인식 결과를 얻어야 합니다. 인식을 중지하려면 stopContinuousRecognitionAsync
를 호출해야 합니다. 다음은 오디오 입력 파일에서 연속 인식을 수행하는 방법을 보여 주는 예입니다.
먼저 입력을 정의하고 SpeechRecognizer
를 초기화합니다.
AudioConfig audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
SpeechRecognizer speechRecognizer = new SpeechRecognizer(config, audioConfig);
다음으로, 음성 인식 상태를 관리하는 변수를 만듭니다. 클래스 범위에서 Semaphore
인스턴스를 선언합니다.
private static Semaphore stopTranslationWithFileSemaphore;
다음으로, SpeechRecognizer
에서 보내는 이벤트를 구독합니다.
recognizing
: 중간 인식 결과가 포함된 이벤트에 대한 신호입니다.recognized
: 최종 인식 결과가 포함된 이벤트에 대한 신호입니다(성공적인 인식 시도를 나타냄).sessionStopped
: 인식 세션(작업)의 끝을 나타내는 이벤트에 대한 신호입니다.canceled
: 취소된 인식 결과가 포함된 이벤트에 대한 신호입니다. 이러한 결과는 직접 취소 요청으로 인해 취소된 인식 시도를 나타냅니다. 또는 전송 또는 프로토콜 오류를 나타냅니다.
// First initialize the semaphore.
stopTranslationWithFileSemaphore = new Semaphore(0);
speechRecognizer.recognizing.addEventListener((s, e) -> {
System.out.println("RECOGNIZING: Text=" + e.getResult().getText());
});
speechRecognizer.recognized.addEventListener((s, e) -> {
if (e.getResult().getReason() == ResultReason.RecognizedSpeech) {
System.out.println("RECOGNIZED: Text=" + e.getResult().getText());
}
else if (e.getResult().getReason() == ResultReason.NoMatch) {
System.out.println("NOMATCH: Speech could not be recognized.");
}
});
speechRecognizer.canceled.addEventListener((s, e) -> {
System.out.println("CANCELED: Reason=" + e.getReason());
if (e.getReason() == CancellationReason.Error) {
System.out.println("CANCELED: ErrorCode=" + e.getErrorCode());
System.out.println("CANCELED: ErrorDetails=" + e.getErrorDetails());
System.out.println("CANCELED: Did you set the speech resource key and region values?");
}
stopTranslationWithFileSemaphore.release();
});
speechRecognizer.sessionStopped.addEventListener((s, e) -> {
System.out.println("\n Session stopped event.");
stopTranslationWithFileSemaphore.release();
});
모든 설정이 완료되면 startContinuousRecognitionAsync
를 호출하여 인식을 시작합니다.
// Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
speechRecognizer.startContinuousRecognitionAsync().get();
// Waits for completion.
stopTranslationWithFileSemaphore.acquire();
// Stops recognition.
speechRecognizer.stopContinuousRecognitionAsync().get();
원본 언어 변경
음성 인식에 대한 일반적인 작업 중 하나는 입력(또는 소스) 언어를 지정하는 것입니다. 다음 예제에서는 입력 언어를 프랑스어로 변경하는 방법을 보여 줍니다. 코드에서 SpeechConfig
인스턴스를 찾아서 바로 아래에 다음 줄을 추가합니다.
config.setSpeechRecognitionLanguage("fr-FR");
setSpeechRecognitionLanguage
는 문자열을 인수로 사용하는 매개 변수입니다. 지원되는 음성 텍스트 변환 로캘 목록을 참조하세요.
언어 식별
오디오 원본의 언어를 식별한 후 텍스트로 기록해야 하는 경우 음성 텍스트 변환 인식과 함께 언어 식별을 사용할 수 있습니다.
전체 코드 샘플은 언어 식별을 참조하세요.
사용자 지정 엔드포인트 사용
사용자 지정 음성을 사용하면 사용자 고유의 데이터를 업로드하고, 사용자 지정 모델을 테스트 및 학습시키고, 모델 간의 정확도를 비교하고, 모델을 사용자 지정 엔드포인트에 배포할 수 있습니다. 다음 예제에서는 사용자 지정 엔드포인트를 설정하는 방법을 보여 줍니다.
SpeechConfig speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourServiceRegion");
speechConfig.setEndpointId("YourEndpointId");
SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig);
컨테이너 실행 및 사용
음성 컨테이너는 음성 SDK 및 음성 CLI를 통해 액세스되는 websocket 기반 쿼리 엔드포인트 API를 제공합니다. 기본적으로 음성 SDK 및 음성 CLI는 공개 음성 서비스를 사용합니다. 컨테이너를 사용하려면 초기화 메서드를 변경해야 합니다. 키 및 지역 대신 컨테이너 호스트 URL을 사용합니다.
컨테이너에 대한 자세한 내용은 Docker를 사용하여 음성 컨테이너 설치 및 실행에서 호스트 URL을 참조하세요.
의미 체계 구분
의미 체계 구분은 무음 기반 구분과 관련된 문제를 완화하도록 설계된 음성 인식 세분화 전략입니다.
- 세분화 아래: 사용자가 일시 중지 없이 오랫동안 말할 때 중단 없이 긴 텍스트 시퀀스("텍스트 벽")를 볼 수 있으므로 가독성 환경이 심각하게 저하됩니다.
- 초과 분할: 사용자가 짧은 시간 동안 일시 중지하면 무음 검색 메커니즘이 잘못 분할할 수 있습니다.
무음 시간 제한에 의존하는 대신 의미 체계 구분은 문장 끝 문장 부호(예: '.' 또는 '?')를 검색할 때 최종 결과를 세그먼트화하고 반환합니다. 이렇게 하면 더 높은 품질의 의미상 완전한 세그먼트로 사용자 환경을 개선하고 긴 중간 결과를 방지할 수 있습니다.
의미 체계 구분을 사용하려면 다음 속성을 만드는 데 사용되는 인스턴스에서 SpeechConfig
설정해야 합니다.SpeechRecognizer
speechConfig.SetProperty(PropertyId.Speech_SegmentationStrategy, "Semantic");
의미 체계 구분의 몇 가지 제한 사항은 다음과 같습니다.
- 의미 체계 구분을 사용하려면 Speech SDK 버전 1.41 이상이 필요합니다.
- 의미 체계 구분은 연속 인식에만 사용됩니다. 여기에는 전사 및 캡션과 같은 시나리오가 포함됩니다. 단일 인식 및 받아쓰기 모드에서는 사용하지 않아야 합니다.
- 의미 체계 구분은 모든 언어 및 로캘에 사용할 수 없습니다. 현재 의미 체계 구분은 en-US, en-GB, en-IN 및 en-AU와 같은 영어(en) 로캘에만 사용할 수 있습니다.
- 의미 체계 구분은 신뢰도 점수 및 NBest 목록을 아직 지원하지 않습니다. 따라서 신뢰도 점수 또는 NBest 목록을 사용하는 경우 의미 체계 구분을 사용하지 않는 것이 좋습니다.
참조 설명서 | 패키지(npm) | GitHub의 추가 샘플 | 라이브러리 소스 코드
이 방법 가이드에서는 Azure AI 음성을 사용하여 실시간 음성 텍스트 변환 방법을 알아봅니다. 실시간 음성 인식은 받아쓰기, 콜 센터 지원, 라이브 모임을 위한 캡션 등의 즉각적인 대화 내용 기록이 필요한 애플리케이션에 적합합니다.
이미 빌드된 애플리케이션의 환경을 설정하는 방법을 알아보려면 빠른 시작: 음성 인식 및 음성 텍스트 변환을 참조하세요.
음성 구성 인스턴스 만들기
음성 SDK를 사용하여 Speech Service를 호출하려면 SpeechConfig
인스턴스를 만들어야 합니다. 이 클래스에는 키 및 연결된 지역, 엔드포인트, 호스트 또는 권한 부여 토큰과 같은 구독에 대한 정보가 포함됩니다.
- Azure portal에서 음성 리소스를 만듭니다. 음성 리소스 키 및 지역을 가져옵니다.
- 다음 코드를 사용하여
SpeechConfig
인스턴스를 만듭니다.YourSpeechKey
및YourSpeechRegion
을 음성 리소스 키 및 지역과 바꿉니다.
const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
다음과 같은 몇 가지 다른 방법으로 SpeechConfig
를 초기화할 수 있습니다.
- 엔드포인트를 사용하고 Speech Service 엔드포인트를 전달합니다. 키 또는 권한 부여 토큰은 선택 사항입니다.
- 호스트를 사용하고 호스트 주소를 전달합니다. 키 또는 권한 부여 토큰은 선택 사항입니다.
- 연결된 지역/위치에 권한 부여 토큰을 사용합니다.
참고 항목
음성 인식, 음성 합성, 번역 또는 의도 인식을 수행하고 있는지 여부에 관계없이 항상 구성을 만들게 됩니다.
마이크에서 음성 인식
마이크의 음성 인식은 Node.js에서 지원되지 않습니다. 이는 브라우저 기반 JavaScript 환경에서만 지원됩니다. 자세한 내용은 GitHub의 React 샘플 및 마이크의 음성 텍스트 변환 구현을 참조하세요. React 샘플은 인증 토큰의 교환 및 관리를 위한 디자인 패턴을 보여줍니다. 또한 음성 텍스트 변환을 위해 마이크 또는 파일에서 오디오 캡처를 보여줍니다.
참고 항목
특정 오디오 입력 디바이스를 사용하려면 AudioConfig
에서 디바이스 ID를 지정해야 합니다. 장치 ID를 가져오는 방법을 알아보려면 Speech SDK를 사용하여 오디오 입력 장치 선택을 참조하세요.
파일에서 음성 인식
오디오 파일에서 음성을 인식하려면 Buffer
개체를 수락하는 fromWavFileInput()
메서드를 사용하여 AudioConfig
인스턴스를 만듭니다. 그런 다음, audioConfig
및 speechConfig
를 전달하여 SpeechRecognizer
를 초기화합니다.
const fs = require('fs');
const sdk = require("microsoft-cognitiveservices-speech-sdk");
const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
function fromFile() {
let audioConfig = sdk.AudioConfig.fromWavFileInput(fs.readFileSync("YourAudioFile.wav"));
let speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);
speechRecognizer.recognizeOnceAsync(result => {
console.log(`RECOGNIZED: Text=${result.text}`);
speechRecognizer.close();
});
}
fromFile();
메모리 내 스트림에서 음성 인식
대부분의 사용 사례에서 오디오 데이터는 Azure Blob Storage에서 전송될 가능성이 높습니다. 또는 ArrayBuffer
나 유사한 원시 데이터 구조로 이미 메모리에 있을 것입니다. 코드는 다음과 같습니다.
createPushStream()
을 사용하여 푸시 스트림을 만듭니다.- 데모를 위해
fs.createReadStream
을 사용하여 .wav 파일을 읽습니다. 오디오 데이터가 이미ArrayBuffer
에 있는 경우 콘텐츠를 입력 스트림에 쓰는 과정으로 바로 건너뛸 수 있습니다. - 푸시 스트림을 사용하여 오디오 구성을 만듭니다.
const fs = require('fs');
const sdk = require("microsoft-cognitiveservices-speech-sdk");
const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
function fromStream() {
let pushStream = sdk.AudioInputStream.createPushStream();
fs.createReadStream("YourAudioFile.wav").on('data', function(arrayBuffer) {
pushStream.write(arrayBuffer.slice());
}).on('end', function() {
pushStream.close();
});
let audioConfig = sdk.AudioConfig.fromStreamInput(pushStream);
let speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);
speechRecognizer.recognizeOnceAsync(result => {
console.log(`RECOGNIZED: Text=${result.text}`);
speechRecognizer.close();
});
}
fromStream();
푸시 스트림을 입력으로 사용하면 오디오 데이터가 원시 PCM(펄스 코드 변조) 데이터라고 가정하고 헤더를 건너뜁니다. 특정한 경우에는 헤더를 건너뛰지 않았는데도 API가 계속 작동합니다. 최상의 결과를 위해 오디오 데이터의 시작 시 fs
가 시작되도록 헤더를 읽는 논리를 구현하는 것이 좋습니다.
오류 처리
이전 예제에서는 단순히 result.text
속성에서 인식된 텍스트를 가져옵니다. 오류 및 기타 응답을 처리하려면 결과를 처리하는 코드를 작성해야 합니다. 다음 코드에서는 result.reason
속성을 평가하여 다음을 수행합니다.
- 인식 결과
ResultReason.RecognizedSpeech
를 출력합니다. - 일치하는 인식이 없는 경우 사용자에게
ResultReason.NoMatch
를 알립니다. - 오류가 발생하는 경우 오류 메시지
ResultReason.Canceled
를 출력합니다.
switch (result.reason) {
case sdk.ResultReason.RecognizedSpeech:
console.log(`RECOGNIZED: Text=${result.text}`);
break;
case sdk.ResultReason.NoMatch:
console.log("NOMATCH: Speech could not be recognized.");
break;
case sdk.ResultReason.Canceled:
const cancellation = sdk.CancellationDetails.fromResult(result);
console.log(`CANCELED: Reason=${cancellation.reason}`);
if (cancellation.reason == sdk.CancellationReason.Error) {
console.log(`CANCELED: ErrorCode=${cancellation.ErrorCode}`);
console.log(`CANCELED: ErrorDetails=${cancellation.errorDetails}`);
console.log("CANCELED: Did you set the speech resource key and region values?");
}
break;
}
연속 인식 사용
이전 예제에서는 단일 발화를 인식하는 단일 샷 인식을 사용합니다. 단일 발화의 끝은 끝에서 무음을 수신하거나 최대 15초의 오디오가 처리될 때까지 대기하여 결정됩니다.
이와 반대로 인식을 중지하는 시점을 제어하려는 경우 연속 인식을 사용할 수 있습니다. Recognizing
, Recognized
및 Canceled
이벤트를 구독하여 인식 결과를 얻어야 합니다. 인식을 중지하려면 [stopContinuousRecognitionAsync
] (/javascript/api/microsoft-cognitiveservices-speech-sdk/speechrecognizer#microsoft-cognitiveservices-speech-sdk-speechrecognizer-stopcontinuousrecognitionasync)를 호출해야 합니다. 다음은 오디오 입력 파일에서 연속 인식이 수행되는 방식을 보여주는 예입니다.
먼저 입력을 정의하고 SpeechRecognizer
를 초기화합니다.
const speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);
다음으로, SpeechRecognizer
에서 보낸 이벤트를 구독합니다.
recognizing
: 중간 인식 결과가 포함된 이벤트에 대한 신호입니다.recognized
: 최종 인식 결과가 포함된 이벤트에 대한 신호입니다(성공적인 인식 시도를 나타냄).sessionStopped
: 인식 세션(작업)의 끝을 나타내는 이벤트에 대한 신호입니다.canceled
: 취소된 인식 결과가 포함된 이벤트에 대한 신호입니다. 이러한 결과는 직접 취소 요청으로 인해 취소된 인식 시도를 나타냅니다. 또는 전송 또는 프로토콜 오류를 나타냅니다.
speechRecognizer.recognizing = (s, e) => {
console.log(`RECOGNIZING: Text=${e.result.text}`);
};
speechRecognizer.recognized = (s, e) => {
if (e.result.reason == sdk.ResultReason.RecognizedSpeech) {
console.log(`RECOGNIZED: Text=${e.result.text}`);
}
else if (e.result.reason == sdk.ResultReason.NoMatch) {
console.log("NOMATCH: Speech could not be recognized.");
}
};
speechRecognizer.canceled = (s, e) => {
console.log(`CANCELED: Reason=${e.reason}`);
if (e.reason == sdk.CancellationReason.Error) {
console.log(`"CANCELED: ErrorCode=${e.errorCode}`);
console.log(`"CANCELED: ErrorDetails=${e.errorDetails}`);
console.log("CANCELED: Did you set the speech resource key and region values?");
}
speechRecognizer.stopContinuousRecognitionAsync();
};
speechRecognizer.sessionStopped = (s, e) => {
console.log("\n Session stopped event.");
speechRecognizer.stopContinuousRecognitionAsync();
};
모든 설정이 완료되면 [startContinuousRecognitionAsync
](/javascript/api/microsoft-cognitiveservices-speech-sdk/speechrecognizer#microsoft-cognitiveservices-speech-sdk-speechrecognizer-startkeywordrecognitionasync)를 호출하여 인식을 시작합니다.
speechRecognizer.startContinuousRecognitionAsync();
// Make the following call at some point to stop recognition:
// speechRecognizer.stopContinuousRecognitionAsync();
원본 언어 변경
음성 인식에 대한 일반적인 작업 중 하나는 입력(또는 소스) 언어를 지정하는 것입니다. 다음 예제에서는 입력 언어를 이탈리아어로 변경하는 방법을 보여 줍니다. 코드에서 SpeechConfig
인스턴스를 찾아서 바로 아래에 다음 줄을 추가합니다.
speechConfig.speechRecognitionLanguage = "it-IT";
speechRecognitionLanguage
속성에는 언어 로캘 형식 문자열이 필요합니다. 지원되는 로캘 목록에 대해서는 Speech Service에 대한 언어 및 음성 지원을 참조하세요.
언어 식별
오디오 원본의 언어를 식별한 후 텍스트로 기록해야 하는 경우 음성 텍스트 변환 인식과 함께 언어 식별을 사용할 수 있습니다.
전체 코드 샘플은 언어 식별을 참조하세요.
사용자 지정 엔드포인트 사용
사용자 지정 음성을 사용하면 사용자 고유의 데이터를 업로드하고, 사용자 지정 모델을 테스트 및 학습시키고, 모델 간의 정확도를 비교하고, 모델을 사용자 지정 엔드포인트에 배포할 수 있습니다. 다음 예제에서는 사용자 지정 엔드포인트를 설정하는 방법을 보여 줍니다.
var speechConfig = SpeechSDK.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
speechConfig.endpointId = "YourEndpointId";
var speechRecognizer = new SpeechSDK.SpeechRecognizer(speechConfig);
컨테이너 실행 및 사용
음성 컨테이너는 음성 SDK 및 음성 CLI를 통해 액세스되는 websocket 기반 쿼리 엔드포인트 API를 제공합니다. 기본적으로 음성 SDK 및 음성 CLI는 공개 음성 서비스를 사용합니다. 컨테이너를 사용하려면 초기화 메서드를 변경해야 합니다. 키 및 지역 대신 컨테이너 호스트 URL을 사용합니다.
컨테이너에 대한 자세한 내용은 Docker를 사용하여 음성 컨테이너 설치 및 실행에서 호스트 URL을 참조하세요.
참조 설명서 | 패키지(다운로드) | GitHub의 추가 샘플
이 방법 가이드에서는 Azure AI 음성을 사용하여 실시간 음성 텍스트 변환 방법을 알아봅니다. 실시간 음성 인식은 받아쓰기, 콜 센터 지원, 라이브 모임을 위한 캡션 등의 즉각적인 대화 내용 기록이 필요한 애플리케이션에 적합합니다.
이미 빌드된 애플리케이션의 환경을 설정하는 방법을 알아보려면 빠른 시작: 음성 인식 및 음성 텍스트 변환을 참조하세요.
Speech SDK 설치 및 샘플
Azure-Samples/cognitive-services-speech-sdk 리포지토리에는 Objective-C로 작성된 iOS 및 Mac용 샘플이 포함되어 있습니다. 각 샘플에 대한 설치 지침을 보려면 링크를 선택합니다.
자세한 내용은 Objective-C용 음성 SDK 참조를 참조하세요.
사용자 지정 엔드포인트 사용
사용자 지정 음성을 사용하면 사용자 고유의 데이터를 업로드하고, 사용자 지정 모델을 테스트 및 학습시키고, 모델 간의 정확도를 비교하고, 모델을 사용자 지정 엔드포인트에 배포할 수 있습니다. 다음 예제에서는 사용자 지정 엔드포인트를 설정하는 방법을 보여 줍니다.
SPXSpeechConfiguration *speechConfig = [[SPXSpeechConfiguration alloc] initWithSubscription:"YourSubscriptionKey" region:"YourServiceRegion"];
speechConfig.endpointId = "YourEndpointId";
SPXSpeechRecognizer* speechRecognizer = [[SPXSpeechRecognizer alloc] init:speechConfig];
컨테이너 실행 및 사용
음성 컨테이너는 음성 SDK 및 음성 CLI를 통해 액세스되는 websocket 기반 쿼리 엔드포인트 API를 제공합니다. 기본적으로 음성 SDK 및 음성 CLI는 공개 음성 서비스를 사용합니다. 컨테이너를 사용하려면 초기화 메서드를 변경해야 합니다. 키 및 지역 대신 컨테이너 호스트 URL을 사용합니다.
컨테이너에 대한 자세한 내용은 Docker를 사용하여 음성 컨테이너 설치 및 실행에서 호스트 URL을 참조하세요.
참조 설명서 | 패키지(다운로드) | GitHub의 추가 샘플
이 방법 가이드에서는 Azure AI 음성을 사용하여 실시간 음성 텍스트 변환 방법을 알아봅니다. 실시간 음성 인식은 받아쓰기, 콜 센터 지원, 라이브 모임을 위한 캡션 등의 즉각적인 대화 내용 기록이 필요한 애플리케이션에 적합합니다.
이미 빌드된 애플리케이션의 환경을 설정하는 방법을 알아보려면 빠른 시작: 음성 인식 및 음성 텍스트 변환을 참조하세요.
Speech SDK 설치 및 샘플
Azure-Samples/cognitive-services-speech-sdk 리포지토리에는 Swift로 작성된 iOS 및 Mac용 샘플이 포함되어 있습니다. 각 샘플에 대한 설치 지침을 보려면 링크를 선택합니다.
자세한 내용은 Objective-C용 음성 SDK 참조를 참조하세요.
사용자 지정 엔드포인트 사용
사용자 지정 음성을 사용하면 사용자 고유의 데이터를 업로드하고, 사용자 지정 모델을 테스트 및 학습시키고, 모델 간의 정확도를 비교하고, 모델을 사용자 지정 엔드포인트에 배포할 수 있습니다. 다음 예제에서는 사용자 지정 엔드포인트를 설정하는 방법을 보여 줍니다.
let speechConfig = SPXSpeechConfiguration(subscription: "YourSubscriptionKey", region: "YourServiceRegion");
speechConfig.endpointId = "YourEndpointId";
let speechRecognizer = SPXSpeechRecognizer(speechConfiguration: speechConfig);
컨테이너 실행 및 사용
음성 컨테이너는 음성 SDK 및 음성 CLI를 통해 액세스되는 websocket 기반 쿼리 엔드포인트 API를 제공합니다. 기본적으로 음성 SDK 및 음성 CLI는 공개 음성 서비스를 사용합니다. 컨테이너를 사용하려면 초기화 메서드를 변경해야 합니다. 키 및 지역 대신 컨테이너 호스트 URL을 사용합니다.
컨테이너에 대한 자세한 내용은 Docker를 사용하여 음성 컨테이너 설치 및 실행에서 호스트 URL을 참조하세요.
참조 설명서 | 패키지(PyPi) | GitHub의 추가 샘플
이 방법 가이드에서는 Azure AI 음성을 사용하여 실시간 음성 텍스트 변환 방법을 알아봅니다. 실시간 음성 인식은 받아쓰기, 콜 센터 지원, 라이브 모임을 위한 캡션 등의 즉각적인 대화 내용 기록이 필요한 애플리케이션에 적합합니다.
이미 빌드된 애플리케이션의 환경을 설정하는 방법을 알아보려면 빠른 시작: 음성 인식 및 음성 텍스트 변환을 참조하세요.
음성 구성 인스턴스 만들기
음성 SDK를 사용하여 Speech Service를 호출하려면 SpeechConfig
인스턴스를 만들어야 합니다. 이 클래스에는 음성 키 및 연결된 지역, 엔드포인트, 호스트 또는 권한 부여 토큰과 같은 구독에 대한 정보가 포함됩니다.
- Azure portal에서 음성 리소스를 만듭니다. 음성 리소스 키 및 지역을 가져옵니다.
- 다음 코드를 사용하여
SpeechConfig
인스턴스를 만듭니다.YourSpeechKey
및YourSpeechRegion
을 음성 리소스 키 및 지역과 바꿉니다.
speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")
다음과 같은 몇 가지 다른 방법으로 SpeechConfig
를 초기화할 수 있습니다.
- 엔드포인트를 사용하고 Speech Service 엔드포인트를 전달합니다. 음성 키 또는 권한 부여 토큰은 선택 사항입니다.
- 호스트를 사용하고 호스트 주소를 전달합니다. 음성 키 또는 권한 부여 토큰은 선택 사항입니다.
- 연결된 지역/위치에 권한 부여 토큰을 사용합니다.
참고 항목
음성 인식, 음성 합성, 번역 또는 의도 인식을 수행하고 있는지 여부에 관계없이 항상 구성을 만들게 됩니다.
마이크에서 음성 인식
디바이스 마이크를 사용하여 음성을 인식하려면 AudioConfig
를 전달하지 않고 SpeechRecognizer
인스턴스를 만든 후 speech_config
를 전달하면 됩니다.
import azure.cognitiveservices.speech as speechsdk
def from_mic():
speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config)
print("Speak into your microphone.")
speech_recognition_result = speech_recognizer.recognize_once_async().get()
print(speech_recognition_result.text)
from_mic()
특정 오디오 입력 디바이스를 사용하려면 AudioConfig
에서 디바이스 ID를 지정하고 이를 SpeechRecognizer
생성자의 audio_config
매개 변수에 전달해야 합니다. 장치 ID를 가져오는 방법을 알아보려면 Speech SDK를 사용하여 오디오 입력 장치 선택을 참조하세요.
파일에서 음성 인식
마이크 대신 오디오 파일에서 음성을 인식하려면 AudioConfig
인스턴스를 만들고 filename
매개 변수를 사용합니다.
import azure.cognitiveservices.speech as speechsdk
def from_file():
speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")
audio_config = speechsdk.AudioConfig(filename="your_file_name.wav")
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)
speech_recognition_result = speech_recognizer.recognize_once_async().get()
print(speech_recognition_result.text)
from_file()
오류 처리
이전 예제에서는 단순히 speech_recognition_result.text
속성에서 인식된 텍스트를 가져옵니다. 오류 및 기타 응답을 처리하려면 결과를 처리하는 코드를 작성해야 합니다. 다음 코드에서는 speech_recognition_result.reason
속성을 평가하여 다음을 수행합니다.
- 인식 결과
speechsdk.ResultReason.RecognizedSpeech
를 출력합니다. - 일치하는 인식이 없는 경우 사용자에게
speechsdk.ResultReason.NoMatch
를 알립니다. - 오류가 발생하는 경우 오류 메시지
speechsdk.ResultReason.Canceled
를 출력합니다.
if speech_recognition_result.reason == speechsdk.ResultReason.RecognizedSpeech:
print("Recognized: {}".format(speech_recognition_result.text))
elif speech_recognition_result.reason == speechsdk.ResultReason.NoMatch:
print("No speech could be recognized: {}".format(speech_recognition_result.no_match_details))
elif speech_recognition_result.reason == speechsdk.ResultReason.Canceled:
cancellation_details = speech_recognition_result.cancellation_details
print("Speech Recognition canceled: {}".format(cancellation_details.reason))
if cancellation_details.reason == speechsdk.CancellationReason.Error:
print("Error details: {}".format(cancellation_details.error_details))
print("Did you set the speech resource key and region values?")
연속 인식 사용
이전 예제에서는 단일 발화를 인식하는 단일 샷 인식을 사용합니다. 단일 발화의 끝은 끝에서 무음을 수신하거나 최대 15초의 오디오가 처리될 때까지 대기하여 결정됩니다.
이와 반대로 인식을 중지하는 시점을 제어하려는 경우 연속 인식을 사용합니다. EventSignal
에 연결하여 인식 결과를 얻어야 합니다. 인식을 중지하려면 stop_continuous_recognition() 또는 stop_continuous_recognition_async()를 호출해야 합니다. 다음은 오디오 입력 파일에서 연속 인식이 수행되는 방식을 보여주는 예입니다.
먼저 입력을 정의하고 SpeechRecognizer
를 초기화합니다.
audio_config = speechsdk.audio.AudioConfig(filename=weatherfilename)
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)
다음으로, 음성 인식 상태를 관리하는 변수를 만듭니다. 인식을 시작할 때 인식이 완료되지 않았다고 안전하게 가정할 수 있으므로 변수를 False
로 설정합니다.
done = False
이제 evt
가 수신되면 연속 인식을 중지하는 콜백을 만듭니다. 다음 포인트를 기억하세요.
evt
가 수신되면evt
메시지가 출력됩니다.evt
가 수신된 후에는 인식을 중지하기 위해 stop_continuous_recognition()가 호출됩니다.- 인식 상태가
True
로 변경됩니다.
def stop_cb(evt):
print('CLOSING on {}'.format(evt))
speech_recognizer.stop_continuous_recognition()
nonlocal done
done = True
다음 코드 샘플은 SpeechRecognizer
에서 보낸 이벤트에 콜백을 연결하는 방법을 보여줍니다. 이벤트는 다음과 같습니다.
recognizing
: 중간 인식 결과가 포함된 이벤트에 대한 신호입니다.recognized
: 최종 인식 결과가 포함된 이벤트에 대한 신호입니다(성공적인 인식 시도를 나타냄).session_started
: 인식 세션(작업)의 시작을 나타내는 이벤트에 대한 신호입니다.session_stopped
: 인식 세션(작업)의 끝을 나타내는 이벤트에 대한 신호입니다.canceled
: 취소된 인식 결과가 포함된 이벤트에 대한 신호입니다. 이러한 결과는 직접 취소 요청으로 인해 취소된 인식 시도를 나타냅니다. 또는 전송 또는 프로토콜 오류를 나타냅니다.
speech_recognizer.recognizing.connect(lambda evt: print('RECOGNIZING: {}'.format(evt)))
speech_recognizer.recognized.connect(lambda evt: print('RECOGNIZED: {}'.format(evt)))
speech_recognizer.session_started.connect(lambda evt: print('SESSION STARTED: {}'.format(evt)))
speech_recognizer.session_stopped.connect(lambda evt: print('SESSION STOPPED {}'.format(evt)))
speech_recognizer.canceled.connect(lambda evt: print('CANCELED {}'.format(evt)))
speech_recognizer.session_stopped.connect(stop_cb)
speech_recognizer.canceled.connect(stop_cb)
모든 설정이 끝났으면 start_continuous_recognition()을 호출할 수 있습니다.
speech_recognizer.start_continuous_recognition()
while not done:
time.sleep(.5)
원본 언어 변경
음성 인식에 대한 일반적인 작업 중 하나는 입력(또는 소스) 언어를 지정하는 것입니다. 다음 예제에서는 입력 언어를 독일어로 변경하는 방법을 보여 줍니다. 코드에서 SpeechConfig
인스턴스를 찾아서 바로 아래에 다음 줄을 추가합니다.
speech_config.speech_recognition_language="de-DE"
speech_recognition_language
는 문자열을 인수로 사용하는 매개 변수입니다. 지원되는 로캘 목록에 대해서는 Speech Service에 대한 언어 및 음성 지원을 참조하세요.
언어 식별
오디오 원본의 언어를 식별한 후 텍스트로 기록해야 하는 경우 음성 텍스트 변환 인식과 함께 언어 식별을 사용할 수 있습니다.
전체 코드 샘플은 언어 식별을 참조하세요.
사용자 지정 엔드포인트 사용
사용자 지정 음성을 사용하면 사용자 고유의 데이터를 업로드하고, 사용자 지정 모델을 테스트 및 학습시키고, 모델 간의 정확도를 비교하고, 모델을 사용자 지정 엔드포인트에 배포할 수 있습니다. 다음 예제에서는 사용자 지정 엔드포인트를 설정하는 방법을 보여 줍니다.
speech_config = speechsdk.SpeechConfig(subscription="YourSubscriptionKey", region="YourServiceRegion")
speech_config.endpoint_id = "YourEndpointId"
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config)
컨테이너 실행 및 사용
음성 컨테이너는 음성 SDK 및 음성 CLI를 통해 액세스되는 websocket 기반 쿼리 엔드포인트 API를 제공합니다. 기본적으로 음성 SDK 및 음성 CLI는 공개 음성 서비스를 사용합니다. 컨테이너를 사용하려면 초기화 메서드를 변경해야 합니다. 키 및 지역 대신 컨테이너 호스트 URL을 사용합니다.
컨테이너에 대한 자세한 내용은 Docker를 사용하여 음성 컨테이너 설치 및 실행에서 호스트 URL을 참조하세요.
의미 체계 구분
의미 체계 구분은 무음 기반 구분과 관련된 문제를 완화하도록 설계된 음성 인식 세분화 전략입니다.
- 세분화 아래: 사용자가 일시 중지 없이 오랫동안 말할 때 중단 없이 긴 텍스트 시퀀스("텍스트 벽")를 볼 수 있으므로 가독성 환경이 심각하게 저하됩니다.
- 초과 분할: 사용자가 짧은 시간 동안 일시 중지하면 무음 검색 메커니즘이 잘못 분할할 수 있습니다.
무음 시간 제한에 의존하는 대신 의미 체계 구분은 문장 끝 문장 부호(예: '.' 또는 '?')를 검색할 때 최종 결과를 세그먼트화하고 반환합니다. 이렇게 하면 더 높은 품질의 의미상 완전한 세그먼트로 사용자 환경을 개선하고 긴 중간 결과를 방지할 수 있습니다.
의미 체계 구분을 사용하려면 다음 속성을 만드는 데 사용되는 인스턴스에서 SpeechConfig
설정해야 합니다.SpeechRecognizer
speech_config.set_property(speechsdk.PropertyId.Speech_SegmentationStrategy, "Semantic")
의미 체계 구분의 몇 가지 제한 사항은 다음과 같습니다.
- 의미 체계 구분을 사용하려면 Speech SDK 버전 1.41 이상이 필요합니다.
- 의미 체계 구분은 연속 인식에만 사용됩니다. 여기에는 전사 및 캡션과 같은 시나리오가 포함됩니다. 단일 인식 및 받아쓰기 모드에서는 사용하지 않아야 합니다.
- 의미 체계 구분은 모든 언어 및 로캘에 사용할 수 없습니다. 현재 의미 체계 구분은 en-US, en-GB, en-IN 및 en-AU와 같은 영어(en) 로캘에만 사용할 수 있습니다.
- 의미 체계 구분은 신뢰도 점수 및 NBest 목록을 아직 지원하지 않습니다. 따라서 신뢰도 점수 또는 NBest 목록을 사용하는 경우 의미 체계 구분을 사용하지 않는 것이 좋습니다.
음성 텍스트 변환 REST API 참조 | 짧은 오디오 참조를 위한 음성 텍스트 변환 REST API | GitHub의 추가 샘플
이 방법 가이드에서는 Azure AI 음성을 사용하여 실시간 음성 텍스트 변환 방법을 알아봅니다. 실시간 음성 인식은 받아쓰기, 콜 센터 지원, 라이브 모임을 위한 캡션 등의 즉각적인 대화 내용 기록이 필요한 애플리케이션에 적합합니다.
이미 빌드된 애플리케이션의 환경을 설정하는 방법을 알아보려면 빠른 시작: 음성 인식 및 음성 텍스트 변환을 참조하세요.
음성을 텍스트로 변환
명령 프롬프트에서 다음 명령을 실행합니다. 명령에 다음 값을 삽입합니다.
- 음성 리소스의 구독 키
- Speech Service 지역
- 입력 오디오 파일의 경로
curl --location --request POST 'https://INSERT_REGION_HERE.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=en-US' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: audio/wav' \
--data-binary @'INSERT_AUDIO_FILE_PATH_HERE'
다음 예와 같은 응답을 받게 됩니다.
{
"RecognitionStatus": "Success",
"DisplayText": "My voice is my passport, verify me.",
"Offset": 6600000,
"Duration": 32100000
}
자세한 내용은 음성 텍스트 변환 REST API 참조를 참조하세요.
이 방법 가이드에서는 Azure AI 음성을 사용하여 실시간 음성 텍스트 변환 방법을 알아봅니다. 실시간 음성 인식은 받아쓰기, 콜 센터 지원, 라이브 모임을 위한 캡션 등의 즉각적인 대화 내용 기록이 필요한 애플리케이션에 적합합니다.
이미 빌드된 애플리케이션의 환경을 설정하는 방법을 알아보려면 빠른 시작: 음성 인식 및 음성 텍스트 변환을 참조하세요.
마이크에서 음성 인식
PC 마이크를 꽂고 켭니다. 마이크를 사용할 수도 있는 모든 앱을 끕니다. 일부 컴퓨터에는 기본 제공 마이크가 있지만 다른 컴퓨터에는 Bluetooth 디바이스를 구성해야 합니다.
이제 음성 CLI를 실행하여 마이크의 음성을 인식할 준비가 되었습니다. 명령줄에서 Speech CLI 이진 파일이 포함된 디렉터리로 변경합니다. 그런 후 다음 명령을 실행합니다.
spx recognize --microphone
참고 항목
Speech CLI의 기본값은 영어입니다. 음성 텍스트 변환 테이블에서 다른 언어를 선택할 수 있습니다. 예를 들어 독일어 음성을 인식하도록 --source de-DE
를 추가합니다.
마이크에 대고 말하면 실시간으로 단어를 텍스트로 기록하는 것을 볼 수 있습니다. 음성 CLI는 일정 시간 침묵 후 또는 Ctrl+C를 선택하면 중지됩니다.
파일에서 음성 인식
Speech CLI는 다양한 파일 형식과 자연어로 음성을 인식할 수 있습니다. 이 예제에서는 영어 음성이 포함된 .wav 파일(16KHz 또는 8KHz, 16비트, 모노 PCM)을 사용할 수 있습니다. 또는 빠른 샘플을 원하는 경우 whatstheweatherlike.wav 파일을 다운로드하여 Speech CLI 이진 파일과 동일한 디렉터리에 복사합니다.
오디오 파일에서 찾은 음성을 인식하기 위해 다음 명령을 사용하여 음성 CLI를 실행합니다.
spx recognize --file whatstheweatherlike.wav
참고 항목
Speech CLI의 기본값은 영어입니다. 음성 텍스트 변환 테이블에서 다른 언어를 선택할 수 있습니다. 예를 들어 독일어 음성을 인식하도록 --source de-DE
를 추가합니다.
Speech CLI는 화면에 음성의 텍스트 전사를 표시합니다.
컨테이너 실행 및 사용
음성 컨테이너는 음성 SDK 및 음성 CLI를 통해 액세스되는 websocket 기반 쿼리 엔드포인트 API를 제공합니다. 기본적으로 음성 SDK 및 음성 CLI는 공개 음성 서비스를 사용합니다. 컨테이너를 사용하려면 초기화 메서드를 변경해야 합니다. 키 및 지역 대신 컨테이너 호스트 URL을 사용합니다.
컨테이너에 대한 자세한 내용은 Docker를 사용하여 음성 컨테이너 설치 및 실행에서 호스트 URL을 참조하세요.