Unity 中使用 API 获取音频并播放 - 完整示例
<p>"<html><head><meta name="viewport" content="width=device-width"><style type="text/css">@font-face { font-family: TencentSans; src: url("chrome-extension://lkjkfecdnfjopaeaibboihfkmhdjmanm/static/fonts/TencentSans.woff2"); }</style></head><body><video controls="" autoplay="" name="media"><source src="https://genshinvoice.top/api?speaker=%E8%83%A1%E6%A1%83&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~&format=wav&length=1&noise=0.5&noisew=0.9&sdp_ratio=0.2" type="audio/wav"></video></body><div id="transmart-crx-shadow-root" style="all: initial;"></div></html>"\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("朗读声音设置")]\n public string speaker = "胡桃";\n /// <summary>\n /// 音频格式\n /// </summary>\n [Header("音频格式设置")]\n public string format = "wav";\n /// <summary>\n /// 音频长度\n /// </summary>\n [Header("音频长度设置")]\n public float length = 1f;\n /// <summary>\n /// 噪声\n /// </summary>\n [Header("噪声设置")]\n public float noise = 0.5f;\n /// <summary>\n /// 噪声权重\n /// </summary>\n [Header("噪声权重设置")]\n public float noisew = 0.9f;\n /// <summary>\n /// 声调比例\n /// </summary>\n [Header("声调比例设置")]\n public float sdp_ratio = 0.2f;\n\n [Header("音频播放设置")]\n public AudioSource audioSource;\n\n #endregion\n\n private void Awake()\n {\n m_PostURL = "https://genshinvoice.top/api"; \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<AudioClip, string> _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, "POST"))\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("语音合成失败: " + speechRequest.error);\n }\n }\n\n stopwatch.Stop();\n Debug.Log("Genshin语音合成耗时:" + 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<AudioClip, string> _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, "POST"))\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("传参的值是:" + 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("语音合成失败: " + speechRequest.error);\n }\n }\n\n stopwatch.Stop();\n Debug.Log("Genshin语音合成耗时:" + 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("?speaker={0}&text={1}&format={2}&length={3}&noise={4}&noisew={5}&sdp_ratio={6}", speaker, msg, format, length, noise, noisew, sdp_ratio);\n string url = m_PostURL + urlParams;\n\n return url;\n }\n</p>
原文地址: https://www.cveoy.top/t/topic/jzXM 著作权归作者所有。请勿转载和采集!