Share via


Xamarin.Essentials: 텍스트 음성 변환

TextToSpeech 클래스를 사용하면 애플리케이션이 기본 제공 텍스트 음성 변환 엔진을 이용하여 디바이스에서 텍스트를 말하고, 엔진이 지원할 수 있는 사용 가능한 언어를 쿼리할 수도 있습니다.

시작하기

이 API를 사용하기 전에 라이브러리가 제대로 설치되고 프로젝트에 설정되어 있는지 확인하기 위해 Xamarin.Essentials에 대한 시작 가이드를 읽어보세요.

TextToSpeech 기능에 액세스하려면 다음 플랫폼 관련 설정이 필요합니다.

프로젝트의 대상 Android 버전이 Android 11(R API 30)로 설정된 경우 새 패키지 가시성 요구 사항에 사용되는 쿼리로 해당 Android 매니페스트를 업데이트해야 합니다.

속성 폴더 아래의 AndroidManifest.xml 파일을 열고 매니페스트 노드 내부에 다음을 추가합니다.

<queries>
  <intent>
    <action android:name="android.intent.action.TTS_SERVICE" />
  </intent>
</queries>

텍스트 음성 변환 사용

클래스에서 Xamarin.Essentials에 대한 참조를 추가합니다.

using Xamarin.Essentials;

텍스트 음성 변환은 텍스트 및 선택적 매개 변수로 SpeakAsync 메서드를 호출하여 작동하며, 발화가 완료된 후 반환됩니다.

public async Task SpeakNowDefaultSettings()
{
    await TextToSpeech.SpeakAsync("Hello World");

    // This method will block until utterance finishes.
}

public void SpeakNowDefaultSettings2()
{
    TextToSpeech.SpeakAsync("Hello World").ContinueWith((t) =>
    {
        // Logic that will run after utterance finishes.

    }, TaskScheduler.FromCurrentSynchronizationContext());
}

이 메서드는 선택적 CancellationToken을 사용하여 시작된 발화를 중지합니다.

CancellationTokenSource cts;
public async Task SpeakNowDefaultSettings()
{
    cts = new CancellationTokenSource();
    await TextToSpeech.SpeakAsync("Hello World", cancelToken: cts.Token);

    // This method will block until utterance finishes.
}

// Cancel speech if a cancellation token exists & hasn't been already requested.
public void CancelSpeech()
{
    if (cts?.IsCancellationRequested ?? true)
        return;

    cts.Cancel();
}

텍스트 음성 변환은 동일한 스레드의 음성 요청을 자동으로 큐에 넣습니다.

bool isBusy = false;
public void SpeakMultiple()
{
    isBusy = true;
    Task.Run(async () =>
    {
        await TextToSpeech.SpeakAsync("Hello World 1");
        await TextToSpeech.SpeakAsync("Hello World 2");
        await TextToSpeech.SpeakAsync("Hello World 3");
        isBusy = false;
    });

    // or you can query multiple without a Task:
    Task.WhenAll(
        TextToSpeech.SpeakAsync("Hello World 1"),
        TextToSpeech.SpeakAsync("Hello World 2"),
        TextToSpeech.SpeakAsync("Hello World 3"))
        .ContinueWith((t) => { isBusy = false; }, TaskScheduler.FromCurrentSynchronizationContext());
}

음성 설정

볼륨, 피치 및 로캘을 설정할 수 있는 SpeechOptions를 사용하여 오디오를 말하는 방법을 세부적으로 제어할 수 있습니다.

public async Task SpeakNow()
{
    var settings = new SpeechOptions()
        {
            Volume = .75f,
            Pitch = 1.0f
        };

    await TextToSpeech.SpeakAsync("Hello World", settings);
}

다음은 이러한 매개 변수에 대해 지원되는 값입니다.

매개 변수 최소 최대
피치 0 2.0
볼륨 0 1.0

음성 로캘

각 플랫폼은 서로 다른 언어와 악센트로 텍스트를 말하기 위해 다양한 로캘을 지원합니다. 플랫폼마다 각기 다른 코드와 방법으로 로캘을 지정하며, 이 때문에 Xamarin.Essentials는 플랫폼 간 Locale 클래스와 GetLocalesAsync로 쿼리하는 방법을 제공합니다.

public async Task SpeakNow()
{
    var locales = await TextToSpeech.GetLocalesAsync();

    // Grab the first locale
    var locale = locales.FirstOrDefault();

    var settings = new SpeechOptions()
        {
            Volume = .75f,
            Pitch = 1.0f,
            Locale = locale
        };

    await TextToSpeech.SpeakAsync("Hello World", settings);
}

제한 사항

  • 여러 스레드에서 호출하는 경우 발화 큐는 보장되지 않습니다.
  • 백그라운드 오디오 재생은 공식적으로 지원되지 않습니다.

API

Channel 9YouTube에서 더 많은 Xamarin 비디오를 확인하세요.