我如何使用Unity Web Requests流音频...我想使用基于云的TTS

时间:2019-04-21 21:31:28

标签: c# unity3d

我正在尝试在Unity游戏中使用云TTS。

使用较新版本(我正在使用2019.1)时,他们已弃用WWW,而改用API中的UnityWebRequest。

我尝试过Unity Documentation,但这对我没有用。

我还尝试了其他线程,它们使用的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”内完成了。

我要去哪里错了?

预先感谢
乔什

1 个答案:

答案 0 :(得分:0)

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

在智能手机上键入内容,因此没有保修,但希望您能理解