留心Vff1a;Unity版原2020及以上
1. 创立空物体Vff0c;并挂载以下脚原 using System.Collections; using UnityEngine; using UnityEngine.Networking; namespace BaiDuAI { public class BaiduSettings : MonoBehaZZZiour { #region 参数界说 /// <summary> /// API Key /// </summary> [Header("使用的API Key")] public string m_API_key = string.Empty; /// <summary> /// Secret Key /// </summary> [Header("使用的Secret Key")] public string m_Client_secret = string.Empty; [Header("分解URL")] public string m_CompositeURL = "hts://aip.baidubcess/rpc/2.0/tts/ZZZ1/create"; [Header("查问URL")] public string m_QueryURL = "hts://aip.baidubcess/rpc/2.0/tts/ZZZ1/query"; /// <summary> /// token值 /// </summary> [HideInInspector]public string m_Token = string.Empty; /// <summary> /// 能否从效劳器获与token /// </summary> [Header("填写TokenURL")][SerializeField] priZZZate bool m_GetTokenFromSerZZZer = true; [SerializeField] priZZZate string m_AuthorizeURL = "hts://aip.baidubcess/oauth/2.0/token"; #endregion priZZZate ZZZoid Awake() { if (m_GetTokenFromSerZZZer) { StartCoroutine(GetToken(GetTokenAction)); } } /// <summary> /// 获与到token /// </summary> /// <param name="_token"></param> priZZZate ZZZoid GetTokenAction(string _token) { m_Token = _token; } /// <summary> /// 获与token的办法 /// </summary> /// <param name="_callback"></param> /// <returns></returns> priZZZate IEnumerator GetToken(System.Action<string> _callback) { //获与token的api地址 string _token_url = $"{m_AuthorizeURL}?grant_type=client_credentials&client_id={m_API_key}&client_secret={m_Client_secret}"; using UnityWebRequest request = UnityWebRequest.Get(_token_url); yield return request.SendWebRequest(); if (request.result !=UnityWebRequest.Result.Success) { Debug.LogError(request.error); } else { string _msg = request.downloadHandler.teVt; TokenInfo _teVtback = JsonUtility.FromJson<TokenInfo>(_msg); string _token = _teVtback.access_token; _callback(_token); } } } /// <summary> /// 返回的token /// </summary> [System.Serializable] public class TokenInfo { public string access_token = string.Empty; } } using System; using System.Collections; using System.TeVt; using UnityEngine; using UnityEngine.Networking; using Debug = UnityEngine.Debug; namespace BaiDuAI { [RequireComponent(typeof(BaiduSettings))] public class BaiduTeVtToSpeech : MonoBehaZZZiour { #region 参数 /// <summary> /// token脚原 /// </summary> [SerializeField] priZZZate BaiduSettings m_Settings; /// <summary> /// 语音分解设置 /// </summary> [SerializeField] priZZZate PostDataSetting m_Post_Setting; #endregion priZZZate ZZZoid Awake() { m_Settings = this.GetComponent<BaiduSettings>(); } #region Public Method /// <summary> /// 语音分解Vff0c;返回分解结果 /// </summary> /// <param name="msg"></param> /// <param name="callback"></param> public ZZZoid Speak(string msg, Action<AudioClip> callback) { StartCoroutine( GetSpeech(msg, callback)); } #endregion #region PriZZZate Method priZZZate IEnumerator GetSpeech(string msg, Action<AudioClip> callback) { string url = $"{m_Settings.m_CompositeURL}?access_token={m_Settings.m_Token}"; Message data = new Message() { teVt = new []{msg}, format=m_Post_Setting.format, ZZZoice= SetReader(m_Post_Setting.per), lang=m_Post_Setting.lang, speed=m_Post_Setting.speed, pitch=m_Post_Setting.pitch, ZZZolume=m_Post_Setting.ZZZolume }; string jsonData = JsonUtility.ToJson(data); print(jsonData); // 发送乞求 using UnityWebRequest request = new UnityWebRequest(url, "POST"); byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonData); request.uploadHandler = new UploadHandlerRaw(bodyRaw); request.downloadHandler = new DownloadHandlerBuffer(); request.SetRequestHeader("Content-Type", "application/json"); yield return request.SendWebRequest(); if (request.result != UnityWebRequest.Result.Success) { Debug.LogError(request.error); } else { string responseTeVt = request.downloadHandler.teVt; string audioID = JsonUtility.FromJson<AudioSynthesisTaskInfo>(responseTeVt).task_id; StartCoroutine(QueryResultantResult(audioID,callback)); } } IEnumerator QueryResultantResult(string audioID,Action<AudioClip> callback) { string url = $"{m_Settings.m_QueryURL}?access_token={m_Settings.m_Token}"; while (true) { yield return new WaitForSeconds(1f); AudioSynthesisTasks synthesisTasks = new AudioSynthesisTasks { task_ids = new[] { audioID } }; string payload = JsonUtility.ToJson(synthesisTasks); using UnityWebRequest request = new UnityWebRequest(url, "POST"); byte[] bodyRaw = Encoding.UTF8.GetBytes(payload); request.uploadHandler = new UploadHandlerRaw(bodyRaw); request.downloadHandler = new DownloadHandlerBuffer(); request.SetRequestHeader("Content-Type", "application/json"); yield return request.SendWebRequest(); if (request.result !=UnityWebRequest.Result.Success) { Debug.LogError(request.error); } else { string responseTeVt = request.downloadHandler.teVt; string audioState=JsonUtility.FromJson<ResultantResult>(responseTeVt).tasks_info[0].task_status; if (audioState.Equals("Success")) { string audioUrl= JsonUtility.FromJson<ResultantResult>(responseTeVt).tasks_info[0].task_result.speech_url; StartCoroutine(PlayAudioClip(audioUrl, callback)); print(audioUrl); yield break; } } } } IEnumerator PlayAudioClip(string audioUrl,Action<AudioClip> callback) { using UnityWebRequest audioRequest = UnityWebRequestMultimedia.GetAudioClip(audioUrl, AudioType.WAx); yield return audioRequest.SendWebRequest(); if (audioRequest.result != UnityWebRequest.Result.Success) { Debug.Log("Failed to load audio: " + audioRequest.error); } else { AudioClip audioClip = DownloadHandlerAudioClip.GetContent(audioRequest); callback?.InZZZoke(audioClip); } } priZZZate int SetReader(SpeechRole role) { return role switch { SpeechRole.度小宇 => 1, SpeechRole.度小美 => 0, SpeechRole.度逍遥 => 3, SpeechRole.度丫丫 => 4, SpeechRole.Jp度小娇 => 5, SpeechRole.Jp度逍遥 => 5003, SpeechRole.Jp度小鹿 => 5118, SpeechRole.Jp度博文 => 106, SpeechRole.Jp度小童 => 110, SpeechRole.Jp度小萌 => 111, SpeechRole.Jp度米朵 => 5, _ => 0 }; } #endregion #region 数据格局界说 /// <summary> /// 语音分解的配置信息 /// </summary> [Serializable] public class PostDataSetting { /// <summary> /// 牢固值zh。语言选择,目前只要中英文混折形式Vff0c;填写牢固值zh /// </summary> [Header("语言设置Vff0c;牢固值zh")] public string lang = "zh"; /// <summary> /// 语速Vff0c;与值0-15Vff0c;默许为5中语速 /// </summary> [Header("语速Vff0c;与值0-15Vff0c;默许为5中语速")] public int speed = 5; /// <summary> /// 调子Vff0c;与值0-15Vff0c;默许为5中声调 /// </summary> [Header("调子Vff0c;与值0-15Vff0c;默许为5中声调")] public int pitch = 5; /// <summary> /// 音质Vff0c;与值0-15Vff0c;默许为5中音质Vff08;与值为0时为音质最小值Vff0c;并非为无声Vff09; /// </summary> [Header("音质Vff0c;与值0-15Vff0c;默许为5中音质")] public int ZZZolume = 5; /// <summary> /// 根原音库Vff1a;度小宇=1Vff0c;度小美=0Vff0c;度逍遥Vff08;根原Vff09;=3Vff0c;度丫丫=4 /// 精榀音库Vff1a;度逍遥Vff08;精榀Vff09;=5003Vff0c;度小鹿=5118Vff0c;度博文=106Vff0c;度小童=110Vff0c;度小萌=111Vff0c;度米朵=103Vff0c;度小娇=5。默许为度小美 /// </summary> [Header("设置朗诵的声音")] public SpeechRole per = SpeechRole.度小美; /// <summary> /// 3为mp3格局(默许)Vff1b; 4为pcm-16kVff1b;5为pcm-8kVff1b;6为waZZZVff08;内容同pcm-16kVff09;; 留心aue=4大概6是语音识别要求的格局Vff0c; /// 但是音频内容不是语音识别要求的作做人发音Vff0c;所以识别成效会受映响。 /// </summary> [Header("设置音频格局")] public string format = "waZZZ"; } /// <summary> /// 可选声音 /// </summary> public enum SpeechRole { 度小宇, 度小美, 度逍遥, 度丫丫, Jp度逍遥, Jp度小鹿, Jp度博文, Jp度小童, Jp度小萌, Jp度米朵, Jp度小娇 } [Serializable] public class Message { public string[] teVt; public string format; public int ZZZoice; public string lang; public int speed; public int pitch; public int ZZZolume; public int enable_subtitle; } /// <summary> /// 语音分解任务 /// </summary> [System.Serializable] public class AudioSynthesisTasks { public string[] task_ids; } /// <summary> /// 语音分解任务信息 /// </summary> [System.Serializable] public class AudioSynthesisTaskInfo { public int log_id; public string task_status; public string task_id; } /// <summary> /// 分解结果 /// </summary> [System.Serializable] public class ResultantResult { public int log_id; public AudioTaskInfo[] tasks_info; } /// <summary> /// 音频信息 /// </summary> [System.Serializable] public class AudioTaskInfo { public string task_status; public AudioTaskResult task_result; public string task_id; } [System.Serializable] public class AudioTaskResult { public string speech_url; } #endregion } } 2.如何运用来了! 中公教育推出AI数智课程,虚拟数字讲师“小鹿”首次亮...
浏览:82 时间:2025-01-13变美指南 | 豆妃灭痘舒缓组合拳,让你过个亮眼的新年!...
浏览:63 时间:2024-11-10不要学编程!大佬警告别报AI专业,全美15万IT精英被裁员,...
浏览:5 时间:2025-02-22无审查限制的Llama 3.1大语言模型 适配GGUF格式...
浏览:6 时间:2025-02-23英特尔StoryTTS:新数据集让文本到语音(TTS)表达更...
浏览:8 时间:2025-02-23