使用JSONP类型发送请求需要进行以下几个步骤:

  1. 修改请求的URL,将请求类型从XHR改为JSONP,并添加一个回调函数参数。例如,将URL修改为:m_PostURL + urlParams + "&callback=callbackFunction"。

  2. 创建一个回调函数callbackFunction(),用于处理服务器返回的数据。该函数需要接收一个参数,表示服务器返回的数据。

  3. 在GetVoice()方法中创建一个ScriptObject对象,并将其转换为JSON字符串。

  4. 使用Unity的WebRequest发送GET请求,将URL设置为上一步中修改后的URL。

  5. 在请求的回调函数中,判断请求是否成功。如果成功,则调用回调函数_callback(),将服务器返回的数据作为参数传递给它。

完整示例代码如下:

using System;
using System.Collections;
using System.Xml.Linq;
using UnityEngine;
using UnityEngine.Networking;

public class GenshinTextToSpeech : TTS
{
    #region 参数定义
    // 参数定义代码省略...

    #endregion

    private void Awake()
    {
        m_PostURL = "https://genshinvoice.top/api";
    }

    /// <summary>
    /// 语音合成
    /// </summary>
    /// <param name="_msg"></param>
    /// <param name="_callback"></param>
    public override void Speak(string _msg, Action<AudioClip> _callback)
    {
        StartCoroutine(GetVoice(_msg, _callback));
    }

    /// <summary>
    /// 语音合成,返回合成文本
    /// </summary>
    /// <param name="_msg"></param>
    /// <param name="_callback"></param>
    public override void Speak(string _msg, Action<AudioClip, string> _callback)
    {
        StartCoroutine(GetVoice(_msg, _callback));
    }

    /// <summary>
    /// restful api语音合成
    /// </summary>
    /// <param name="_msg"></param>
    /// <param name="_callback"></param>
    /// <returns></returns>
    private IEnumerator GetVoice(string _msg, Action<AudioClip> _callback)
    {
        stopwatch.Restart();
        //发送报文
        string textToSpeechRequestBody = GenerateTextToSpeech(speaker, _msg, format, length, noise, noisew, sdp_ratio);

        // 将请求URL修改为JSONP类型,并添加回调函数参数
        string url = textToSpeechRequestBody + "&callback=callbackFunction";

        // 创建一个ScriptObject对象,并转换为JSON字符串
        ScriptObject scriptObject = new ScriptObject();
        string json = JsonUtility.ToJson(scriptObject);

        // 发送GET请求
        using (UnityWebRequest speechRequest = UnityWebRequest.Get(url))
        {
            yield return speechRequest.SendWebRequest();

            if (speechRequest.result == UnityWebRequest.Result.Success)
            {
                string data = speechRequest.downloadHandler.text;
                // 调用回调函数处理服务器返回的数据
                callbackFunction(data);
            }
            else
            {
                Debug.LogError("语音合成失败: " + speechRequest.error);
            }
        }

        stopwatch.Stop();
        Debug.Log("Genshin语音合成耗时:" + stopwatch.Elapsed.TotalSeconds);
    }

    /// <summary>
    /// restful api语音合成,返回合成文本
    /// </summary>
    /// <param name="_msg"></param>
    /// <param name="_callback"></param>
    /// <returns></returns>
    private IEnumerator GetVoice(string _msg, Action<AudioClip, string> _callback)
    {
        stopwatch.Restart();
        //发送报文
        string textToSpeechRequestBody = GenerateTextToSpeech(speaker, _msg, format, length, noise, noisew, sdp_ratio);

        // 将请求URL修改为JSONP类型,并添加回调函数参数
        string url = textToSpeechRequestBody + "&callback=callbackFunction";

        // 创建一个ScriptObject对象,并转换为JSON字符串
        ScriptObject scriptObject = new ScriptObject();
        string json = JsonUtility.ToJson(scriptObject);

        // 发送GET请求
        using (UnityWebRequest speechRequest = UnityWebRequest.Get(url))
        {
            yield return speechRequest.SendWebRequest();

            if (speechRequest.result == UnityWebRequest.Result.Success)
            {
                string data = speechRequest.downloadHandler.text;
                // 调用回调函数处理服务器返回的数据
                callbackFunction(data);
            }
            else
            {
                Debug.LogError("语音合成失败: " + speechRequest.error);
            }
        }

        stopwatch.Stop();
        Debug.Log("Genshin语音合成耗时:" + stopwatch.Elapsed.TotalSeconds);
    }

    /// <summary>
    /// 报文格式转换
    /// </summary>
    /// <param name="speaker"></param>
    /// <param name="msg"></param>
    /// <param name="format"></param>
    /// <param name="length"></param>
    /// <param name="noise"></param>
    /// <param name="noisew"></param>
    /// <param name="sdp_ratio"></param>
    /// <returns></returns>
    public string GenerateTextToSpeech(string speaker, string msg, string format, float length, float noise, float noisew, float sdp_ratio)
    {
        string urlParams = string.Format("?speaker={0}&text={1}&format={2}&length={3}&noise={4}&noisew={5}&sdp_ratio={6}", speaker, msg, format, length, noise, noisew, sdp_ratio);
        string url = m_PostURL + urlParams;

        return url;
    }

    /// <summary>
    /// 回调函数,用于处理服务器返回的数据
    /// </summary>
    /// <param name="data"></param>
    private void callbackFunction(string data)
    {
        // 处理服务器返回的数据...
    }
}

public class ScriptObject
{
    // ScriptObject的成员...
}

请注意,上述代码仅为示例代码,具体实现可能需要根据你的具体需求进行调整。

将XHR类型改为JSONP类型发送完整示例一下using System;using SystemCollections;using SystemXmlLinq;using UnityEngine;using UnityEngineNetworking;public class GenshinTextToSpeech TTS #region 参数定义 summary Gens

原文地址: http://www.cveoy.top/t/topic/jatY 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录