/// <summary> /// 合成语音,并保存语音文件(编辑器内) /// </summary> /// <param name="text">合成文本</param> /// <param name="savePath">语音文件保存路径</param> /// <param name="timeout">超时时长</param> /// <param name="audioType">音频文件格式</param> /// <param name="speaker">发音人</param> /// <param name="volume">音量</param> /// <param name="speed">音速</param> /// <param name="pitch">音调</param> private void SynthesisInEditor(string text, string savePath, SynthesisType audioType = SynthesisType.MP3, int timeout = 60000, Speaker speaker = Speaker.Woman_DuYaYa, int volume = 15, int speed = 5, int pitch = 5) { if (string.IsNullOrEmpty(text) || text == "" || Encoding.Default.GetByteCount(text) >= 1024) { GlobalTools.LogError("合成语音失败:文本为空或长度超出了1024字节的限制!"); return; } if (File.Exists(savePath)) { GlobalTools.LogError("合成语音失败:已存在音频文件 " + savePath); return; } Tts tts = new Tts(APIKEY, SECRETKEY); tts.Timeout = timeout; _ttsOptions["spd"] = Mathf.Clamp(speed, 0, 9); _ttsOptions["pit"] = Mathf.Clamp(pitch, 0, 9); _ttsOptions["vol"] = Mathf.Clamp(volume, 0, 15); _ttsOptions["per"] = (int)speaker; _ttsOptions["aue"] = (int)audioType; TtsResponse response = tts.Synthesis(text, _ttsOptions); if (response.Success) { File.WriteAllBytes(savePath, response.Data); AssetDatabase.Refresh(); Selection.activeObject = AssetDatabase.LoadAssetAtPath(string.Format("Assets{0}/{1}.{2}", _savePath, _saveName, _format), typeof(AudioClip)); } else { GlobalTools.LogError("合成语音失败:" + response.ErrorCode + " " + response.ErrorMsg); } }
private static IEnumerator SynthesisByKEYCoroutine(string text, HTFAction <AudioClip> handler, int timeout, Speaker speaker, int volume, int speed, int pitch) { Tts tts = GetTts(); tts.Timeout = timeout; TtsOptions["spd"] = Mathf.Clamp(speed, 0, 9); TtsOptions["pit"] = Mathf.Clamp(pitch, 0, 9); TtsOptions["vol"] = Mathf.Clamp(volume, 0, 15); TtsOptions["per"] = (int)speaker; TtsOptions["aue"] = 6; TtsResponse response = tts.Synthesis(text, TtsOptions); yield return(response); if (response.Success) { AudioClip audioClip = SpeechUtility.ToAudioClip(response.Data); handler?.Invoke(audioClip); } else { GlobalTools.LogError("合成语音失败:" + response.ErrorCode + " " + response.ErrorMsg); } RecycleTts(tts); }
public byte[] SpeechGenerate(string content) { byte[] bytes = null; if (!string.IsNullOrEmpty(content)) { Dictionary <string, object> options = null; if (_ttsParam.IsValid) { options = new Dictionary <string, object>() { { "spd", _ttsParam.speed }, { "vol", _ttsParam.vol }, { "pit", _ttsParam.pit }, { "per", (int)_ttsParam.speaker } }; } TtsResponse resp = _tts.Synthesis(content, options); bytes = resp?.Data; } return(bytes); }
public FileResult SpeechAPI(string txt, int spd = 5, int pit = 5, int vol = 5, int per = 0) { // 可选参数 var option = new Dictionary <string, object>() { { "spd", spd }, { "pit", pit }, { "vol", vol }, { "per", per } }; var client = new Tts(API_KEY, SECRET_KEY); TtsResponse result = client.Synthesis(txt, option); return(result.Success ? File(result.Data, "audio/mp3", Math.Abs(txt.GetHashCode()).ToString() + ".mp3") : null); }
//文字转语音,将音频文件输出到指定的路径 public static void Transform(string strWord, string path) { TtsResponse result = null; try { result = tts.Synthesis(strWord, options); if (result.ErrorCode == 0) // 或 result.Success { File.WriteAllBytes(path, result.Data); } } catch (AipException exception) { throw exception; } }
private static IEnumerator SynthesisByKEYCoroutine(string text, string savePath, SynthesisType audioType, int timeout, Speaker speaker, int volume, int speed, int pitch) { Tts tts = GetTts(); tts.Timeout = timeout; TtsOptions["spd"] = Mathf.Clamp(speed, 0, 9); TtsOptions["pit"] = Mathf.Clamp(pitch, 0, 9); TtsOptions["vol"] = Mathf.Clamp(volume, 0, 15); TtsOptions["per"] = (int)speaker; TtsOptions["aue"] = (int)audioType; TtsResponse response = tts.Synthesis(text, TtsOptions); yield return(response); if (response.Success) { File.WriteAllBytes(savePath, response.Data); } else { Debug.LogError("合成语音失败:" + response.ErrorCode + " " + response.ErrorMsg); } RecycleTts(tts); }
private void button3_Click(object sender, EventArgs e) { if (richTextBox2.Text == "") { MessageBox.Show("请输入文件用于语音合成"); return; } Tts tts = new Tts(API_KEY, SECRET_KEY); Dictionary <string, object> dic = new Dictionary <string, object>(); dic.Add("aue", "6"); TtsResponse result = tts.Synthesis(richTextBox2.Text, dic); if (!result.Success) { MessageBox.Show("合成失败"); return; } Byte[] data = result.Data; string filePath = System.IO.Path.Combine(Environment.CurrentDirectory, @"result.wav"); ToFile(data, filePath); // 播放音频文件 mciSendString("open result.wav alias temp_alias", null, 0, IntPtr.Zero); mciSendString("play temp_alias", null, 0, IntPtr.Zero); // 等待播放结束 StringBuilder strReturn = new StringBuilder(64); do { mciSendString("status temp_alias mode", strReturn, 64, IntPtr.Zero); } while (!strReturn.ToString().Contains("stopped")); // 关闭音频文件 mciSendString("close temp_alias", null, 0, IntPtr.Zero); }
public IEnumerator Tts(string text, Action <TtsResponse> callback) { var url = "http://tsn.baidu.com/text2audio"; var param = new Dictionary <string, string>(); param.Add("tex", text); param.Add("tok", Token); param.Add("cuid", SystemInfo.deviceUniqueIdentifier); param.Add("ctp", "1"); param.Add("lan", "zh"); param.Add("spd", "5"); param.Add("pit", "5"); param.Add("vol", "10"); param.Add("per", "1"); #if UNITY_STANDALONE || UNITY_EDITOR || UNITY_UWP param.Add("aue", "6"); //设置为wav格式,移动端需要mp3格式 #endif int i = 0; foreach (var p in param) { url += i != 0 ? "&" : "?"; url += p.Key + "=" + p.Value; i++; } // 根据不同平台,获取不同类型的音频格式 #if UNITY_STANDALONE || UNITY_EDITOR || UNITY_UWP var www = UnityWebRequestMultimedia.GetAudioClip(url, AudioType.WAV); #else var www = UnityWebRequestMultimedia.GetAudioClip(url, AudioType.MPEG); #endif Debug.Log("[WitBaiduAip]" + www.url); yield return(www.SendWebRequest()); if (www.isHttpError || www.isNetworkError) { Debug.LogError(www.error); } else { var type = www.GetResponseHeader("Content-Type"); Debug.Log("[WitBaiduAip]response type: " + type); if (type.Contains("audio")) { var response = new TtsResponse { clip = DownloadHandlerAudioClip.GetContent(www) }; callback(response); } else { var textBytes = www.downloadHandler.data; var errorText = Encoding.UTF8.GetString(textBytes); Debug.LogError("[WitBaiduAip]" + errorText); callback(JsonUtility.FromJson <TtsResponse>(errorText)); } } }
public IEnumerator Synthesis(string text, Action <TtsResponse> callback, int speed = 3, int pit = 8, int vol = 15, Pronouncer per = Pronouncer.Duyaya) { yield return(PreAction()); if (tokenFetchStatus == Base.TokenFetchStatus.Failed) { Debug.LogError("Token was fetched failed. Please check your APIKey and SecretKey"); callback(new TtsResponse() { err_no = -1, err_msg = "Token was fetched failed. Please check your APIKey and SecretKey" }); yield break; } var param = new Dictionary <string, string>(); param.Add("tex", text); param.Add("tok", Token); param.Add("cuid", SystemInfo.deviceUniqueIdentifier); param.Add("ctp", "1"); param.Add("lan", "zh"); param.Add("spd", speed.ToString()); param.Add("pit", pit.ToString()); param.Add("vol", vol.ToString()); param.Add("per", ((int)per).ToString()); #if UNITY_STANDALONE || UNITY_EDITOR || UNITY_UWP param.Add("aue", "6"); // set to wav, default is mp3 #endif string url = UrlTts; int i = 0; foreach (var p in param) { url += i != 0 ? "&" : "?"; url += p.Key + "=" + p.Value; i++; } #if UNITY_STANDALONE || UNITY_EDITOR || UNITY_UWP var www = UnityWebRequestMultimedia.GetAudioClip(url, AudioType.WAV); #else var www = UnityWebRequestMultimedia.GetAudioClip(url, AudioType.MPEG); #endif Debug.Log("[WitBaiduAip]" + www.url); yield return(www.SendWebRequest()); if (string.IsNullOrEmpty(www.error)) { var type = www.GetResponseHeader("Content-Type"); Debug.Log("[WitBaiduAip]response type: " + type); if (type.Contains("audio")) { #if UNITY_STANDALONE || UNITY_EDITOR || UNITY_UWP var clip = DownloadHandlerAudioClip.GetContent(www); var response = new TtsResponse { clip = clip }; #else var response = new TtsResponse { clip = DownloadHandlerAudioClip.GetContent(www) }; #endif callback(response); } else { var textBytes = www.downloadHandler.data; var errorText = Encoding.UTF8.GetString(textBytes); Debug.LogError("[WitBaiduAip]" + errorText); callback(JsonUtility.FromJson <TtsResponse>(errorText)); } } else { Debug.LogError(www.error); } }