<p>&quot;<html><head><meta name="viewport" content="width=device-width"><style type="text/css">@font-face { font-family: TencentSans; src: url(&quot;chrome-extension://lkjkfecdnfjopaeaibboihfkmhdjmanm/static/fonts/TencentSans.woff2&quot;); }</style></head><body><video controls="" autoplay="" name="media"><source src="https://genshinvoice.top/api?speaker=%E8%83%A1%E6%A1%83&amp;text=%E5%93%88%E5%93%88%EF%BC%8C%E4%BD%A0%E5%A5%BD%E5%91%80~%E6%97%85%E8%A1%8C%E8%80%85~&amp;format=wav&amp;length=1&amp;noise=0.5&amp;noisew=0.9&amp;sdp_ratio=0.2" type="audio/wav"></video></body><div id="transmart-crx-shadow-root" style="all: initial;"></div></html>&quot;\nusing System;\nusing System.Collections;\nusing System.Xml.Linq;\nusing UnityEngine;\nusing UnityEngine.Networking;\n\npublic class GenshinTextToSpeech : TTS\n{\n\n    #region 参数定义\n    /// <summary>\n    /// Genshin配置项\n    /// </summary>\n    /// <summary>\n    /// 朗读的角色\n    /// </summary>\n    [Header(&quot;朗读声音设置&quot;)]\n    public string speaker = &quot;胡桃&quot;;\n    /// <summary>\n    /// 音频格式\n    /// </summary>\n    [Header(&quot;音频格式设置&quot;)]\n    public string format = &quot;wav&quot;;\n    /// <summary>\n    /// 音频长度\n    /// </summary>\n    [Header(&quot;音频长度设置&quot;)]\n    public float length = 1f;\n    /// <summary>\n    /// 噪声\n    /// </summary>\n    [Header(&quot;噪声设置&quot;)]\n    public float noise = 0.5f;\n    /// <summary>\n    /// 噪声权重\n    /// </summary>\n    [Header(&quot;噪声权重设置&quot;)]\n    public float noisew = 0.9f;\n    /// <summary>\n    /// 声调比例\n    /// </summary>\n    [Header(&quot;声调比例设置&quot;)]\n    public float sdp_ratio = 0.2f;\n\n    [Header(&quot;音频播放设置&quot;)]\n    public AudioSource audioSource;\n\n    #endregion\n\n    private void Awake()\n    {\n        m_PostURL = &quot;https://genshinvoice.top/api&quot;; \n    }\n\n    /// <summary>\n    /// 语音合成\n    /// </summary>\n    /// <param name="_msg"></param>\n    /// <param name="_callback"></param>\n    public override void Speak(string _msg, Action<AudioClip> _callback)\n    {\n        StartCoroutine(GetVoice(_msg, _callback));\n    }\n\n    /// <summary>\n    /// 语音合成,返回合成文本\n    /// </summary>\n    /// <param name="_msg"></param>\n    /// <param name="_callback"></param>\n    public override void Speak(string _msg, Action&lt;AudioClip, string&gt; _callback)\n    {\n        StartCoroutine(GetVoice(_msg, _callback));\n    }\n\n    /// <summary>\n    /// restful api语音合成\n    /// </summary>\n    /// <param name="_msg"></param>\n    /// <param name="_callback"></param>\n    /// <returns></returns>\n    private IEnumerator GetVoice(string _msg, Action<AudioClip> _callback)\n    {\n        stopwatch.Restart();\n        //发送报文\n        string textToSpeechRequestBody = GenerateTextToSpeech(speaker, _msg, format, length, noise, noisew, sdp_ratio);\n\n        using (UnityWebRequest speechRequest = new UnityWebRequest(m_PostURL, &quot;POST&quot;))\n        {\n            byte[] data = System.Text.Encoding.UTF8.GetBytes(textToSpeechRequestBody);\n            speechRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(data);\n            speechRequest.downloadHandler = (DownloadHandler)new DownloadHandlerAudioClip(speechRequest.uri, AudioType.WAV);\n\n            yield return speechRequest.SendWebRequest();\n\n            if (speechRequest.responseCode == 200)\n            {\n                AudioClip audioClip = DownloadHandlerAudioClip.GetContent(speechRequest);\n                _callback(audioClip);\n\n                // 播放音频\n                audioSource.clip = audioClip;\n                audioSource.Play();\n            }\n            else\n            {\n                Debug.LogError(&quot;语音合成失败: &quot; + speechRequest.error);\n            }\n        }\n\n        stopwatch.Stop();\n        Debug.Log(&quot;Genshin语音合成耗时:&quot; + stopwatch.Elapsed.TotalSeconds);\n    }\n\n    /// <summary>\n    ///  restful api语音合成,返回合成文本\n    /// </summary>\n    /// <param name="_msg"></param>\n    /// <param name="_callback"></param>\n    /// <returns></returns>\n    private IEnumerator GetVoice(string _msg, Action&lt;AudioClip, string&gt; _callback)\n    {\n        stopwatch.Restart();\n        //发送报文\n        string textToSpeechRequestBody = GenerateTextToSpeech(speaker, _msg, format, length, noise, noisew, sdp_ratio);\n\n        using (UnityWebRequest speechRequest = new UnityWebRequest(m_PostURL, &quot;POST&quot;))\n        {\n            byte[] data = System.Text.Encoding.UTF8.GetBytes(textToSpeechRequestBody);\n            speechRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(data);\n            speechRequest.downloadHandler = (DownloadHandler)new DownloadHandlerAudioClip(speechRequest.uri, AudioType.WAV);\n            Debug.Log(&quot;传参的值是:&quot; + textToSpeechRequestBody);\n            yield return speechRequest.SendWebRequest();\n\n            if (speechRequest.responseCode == 200)\n            {\n                AudioClip audioClip = DownloadHandlerAudioClip.GetContent(speechRequest);\n                _callback(audioClip, _msg);\n\n                // 播放音频\n                audioSource.clip = audioClip;\n                audioSource.Play();\n            }\n            else\n            {\n                \n                Debug.LogError(&quot;语音合成失败: &quot; + speechRequest.error);\n            }\n        }\n\n        stopwatch.Stop();\n        Debug.Log(&quot;Genshin语音合成耗时:&quot; + stopwatch.Elapsed.TotalSeconds);\n    }\n\n    /// <summary>\n    /// 报文格式转换\n    /// </summary>\n    /// <param name="speaker"></param>\n    /// <param name="msg"></param>\n    /// <param name="format"></param>\n    /// <param name="length"></param>\n    /// <param name="noise"></param>\n    /// <param name="noisew"></param>\n    /// <param name="sdp_ratio"></param>\n    /// <returns></returns>\n    public string GenerateTextToSpeech(string speaker, string msg, string format, float length, float noise, float noisew, float sdp_ratio)\n    {\n        string urlParams = string.Format(&quot;?speaker={0}&amp;text={1}&amp;format={2}&amp;length={3}&amp;noise={4}&amp;noisew={5}&amp;sdp_ratio={6}&quot;, speaker, msg, format, length, noise, noisew, sdp_ratio);\n        string url = m_PostURL + urlParams;\n\n        return url;\n    }\n</p>
Unity 中使用 API 获取音频并播放 - 完整示例

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

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