Как я могу использовать Unity Web Requests для потоковой передачи аудио ... Я хочу использовать облачный TTS - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь использовать облачный TTS в моей игре Unity.

В более новых версиях (я использую 2019.1) они отказались от WWW в пользу UnityWebRequest (s) в API.

Я попробовал Документацию Unity , но это не сработало для меня.

Я также пробовал другие потоки, и они используют WWW, который не рекомендуется для моей версии Unity.

    void Start()
    {
        StartCoroutine(PlayTTS());
    }

    IEnumerator PlayTTS()
    {
        using (UnityWebRequestMultimedia wr = new UnityWebRequestMultimedia.GetAudioClip(
            "https://example.com/tts?text=Sample%20Text&voice=Male",
            AudioType.OGGVORBIS)
        )

        {
            yield return wr.Send();

            if (wr.isNetworkError)
            {
                Debug.LogWarning(wr.error);
            }

            else
            {
                //AudioClip ttsClip = DownloadHandlerAudioClip.GetContent(wr);
            }
        }
    }

URL в браузере (я использовал Firefox) успешно загрузил аудиоклип, позволяя мне его воспроизвести.

Я хочу, чтобы он воспроизводил TTS, когда что-то происходитв игре это было сделано в рамках «void Start» для целей тестирования.

Где я ошибаюсь?

Заранее спасибо Josh

1 Ответ

0 голосов
/ 22 апреля 2019

UnityWebRequestMultimedia.GetAudioClip автоматически добавляет значение по умолчанию DownloadHandlerAudioClip, которое имеет свойство streamAudio.

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

Что-то вроде

public AudioSource source;

IEnumerator PlayTTS()
{
    using (var wr = new UnityWebRequestMultimedia.GetAudioClip(
        "https://example.com/tts?text=Sample%20Text&voice=Male",
        AudioType.OGGVORBIS)
    )

    {
        ((DownloadHandlerAudioClip)wr.downloadHandler).streamAudio = true;

        wr.Send();

        while(!wr.isNetworkError && wr.downloadedBytes <= someThreshold)
        {
            yield return null;
        }

        if (wr.isNetworkError)
        {
            Debug.LogWarning(wr.error);
        }

        else
        {
            // Here I'm not sure if you would use
            source.PlayOneShot(DownloadHandlerAudioClip.GetContent(wr)); 
            // or rather
            source.PlayOneShot((DownloadHandlerAudioClip)wr.downloadHandler).audioClip);     
        }
    }
}

Напечатано на смартфоне, поэтому нет гарантии, но я надеюсь, что вы поняли

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...