/// <summary> /// /// </summary> /// <param name="synthesisType"></param> /// <returns></returns> public static string SynthesisTypeAsString(SynthesisType synthesisType) { var map = new Dictionary <SynthesisType, string> { { SynthesisType.Ai, Strings.ESynthesisTypeAi }, { SynthesisType.Ai2, Strings.ESynthesisTypeAi2 }, { SynthesisType.Access, Strings.ESynthesisTypeAccess }, { SynthesisType.Hi, Strings.ESynthesisTypeHi }, { SynthesisType.Eds, Strings.ESynthesisTypeEds }, { SynthesisType.Edsi, Strings.ESynthesisTypeEdsi }, { SynthesisType.Edsx, Strings.ESynthesisTypeEdsx }, { SynthesisType.Mmt, Strings.ESynthesisTypeMmt }, { SynthesisType.AnalogModeling, Strings.ESynthesisTypeAnalogModeling }, { SynthesisType.MossZ1, Strings.ESynthesisTypeMossZ1 }, { SynthesisType.Radias, Strings.ESynthesisTypeRadias }, { SynthesisType.Hd1, Strings.ESynthesisTypeHd1 }, { SynthesisType.Exi, Strings.ESynthesisTypeExi } }; if (map.ContainsKey(synthesisType)) { return(map[synthesisType]); } throw new ApplicationException("Illegal case"); }
private void SynthesisArgsGUI() { GUILayout.BeginVertical(EditorGlobalTools.Styles.Box); GUILayout.BeginHorizontal(); GUILayout.Label("Save Path:", GUILayout.Width(80)); EditorGUILayout.TextField(_savePath); if (GUILayout.Button("Browse", EditorStyles.miniButton)) { string path = EditorUtility.OpenFolderPanel("Select Save Path", Application.dataPath, ""); if (path.Length != 0) { _savePath = path.Replace(Application.dataPath, ""); } } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Save Name:", GUILayout.Width(80)); _saveName = EditorGUILayout.TextField(_saveName, GUILayout.Width(120)); GUILayout.Label("Format:"); _format = (SynthesisType)EditorGUILayout.EnumPopup(_format); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Speaker:", GUILayout.Width(80)); if (GUILayout.Button(_speaker.GetRemark(), EditorGlobalTools.Styles.MiniPopup, GUILayout.Width(120))) { GenericMenu gm = new GenericMenu(); foreach (var speaker in typeof(Speaker).GetEnumValues()) { Speaker s = (Speaker)speaker; gm.AddItem(new GUIContent(s.GetRemark()), _speaker == s, () => { _speaker = s; }); } gm.ShowAsContext(); } GUILayout.Label("Timeout:"); _timeout = EditorGUILayout.IntField(_timeout); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Volume:", GUILayout.Width(80)); _volume = EditorGUILayout.IntSlider(_volume, 0, 15); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Speed:", GUILayout.Width(80)); _speed = EditorGUILayout.IntSlider(_speed, 0, 9); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Pitch:", GUILayout.Width(80)); _pitch = EditorGUILayout.IntSlider(_pitch, 0, 9); GUILayout.EndHorizontal(); GUILayout.EndVertical(); }
/// <summary> /// /// </summary> /// <param name="programBanks"></param> /// <param name="type"></param> /// <param name="id"></param> /// <param name="pcgId"></param> /// <param name="synthesisType"></param> /// <param name="description"></param> protected ProgramBank(IBanks programBanks, BankType.EType type, string id, int pcgId, SynthesisType synthesisType, string description) : base(programBanks, type, id, pcgId) { BankSynthesisType = synthesisType; Description = description; }
/// <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); } }
/// <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> /// <returns>合成语音的协程</returns> public static Coroutine Synthesis(string text, string savePath, SynthesisType audioType = SynthesisType.MP3, int timeout = 60000, Speaker speaker = Speaker.DuYaYa, int volume = 15, int speed = 5, int pitch = 5) { if (string.IsNullOrEmpty(text) || text == "" || Encoding.Default.GetByteCount(text) >= 1024) { Log.Error("合成语音失败:文本为空或长度超出了1024字节的限制!"); return(null); } return(Main.Current.StartCoroutine(SynthesisCoroutine(text, savePath, audioType, timeout, speaker, volume, speed, pitch))); }
public double[] Synthetize(Bitmap image, int samplerate, SynthesisType type) { switch (type) { case SynthesisType.SYNTHESIS_SINE: return(SynthetizeSine(image, samplerate)); case SynthesisType.SYNTHESIS_NOISE: return(SynthetizeNoise(image, samplerate)); } return(null); }
public double[] synthetize(Bitmap image, int samplerate, SynthesisType type) { switch (type) { case SynthesisType.SYNTHESIS_SINE: return(synt_sine(image, samplerate)); case SynthesisType.SYNTHESIS_NOISE: return(synt_noise(image, samplerate)); } Debug.Assert(false); return(null); }
/// <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> public static void SynthesisByKEY(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 (!Coroutiner) { GameObject obj = new GameObject("Coroutiner"); Coroutiner = obj.AddComponent <SpeechCoroutiner>(); Object.DontDestroyOnLoad(obj); } Coroutiner.StartCoroutine(SynthesisByKEYCoroutine(text, savePath, audioType, timeout, speaker, volume, speed, pitch)); }
private static IEnumerator SynthesisCoroutine(string text, string savePath, SynthesisType audioType, int timeout, Speaker speaker, int volume, int speed, int pitch) { string url = string.Format("{0}?tex='{1}'&tok={2}&cuid={3}&ctp={4}&lan={5}&spd={6}&pit={7}&vol={8}&per={9}&aue={10}", SynthesisAPI, text, TOKEN, SystemInfo.deviceUniqueIdentifier, 1, "zh", speed, pitch, volume, (int)speaker, (int)audioType); using (UnityWebRequest request = UnityWebRequestMultimedia.GetAudioClip(url, audioType == SynthesisType.MP3 ? AudioType.MPEG : AudioType.WAV)) { yield return(request.SendWebRequest()); if (!request.isNetworkError && !request.isHttpError) { File.WriteAllBytes(savePath, request.downloadHandler.data); } else { Log.Error("合成语音失败:" + request.responseCode + " " + request.error); } } }
/// <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.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; } string url = string.Format("{0}?tex='{1}'&tok={2}&cuid={3}&ctp={4}&lan={5}&spd={6}&pit={7}&vol={8}&per={9}&aue={10}", SynthesisAPI, text, TOKEN, SystemInfo.deviceUniqueIdentifier, 1, "zh", speed, pitch, volume, (int)speaker, (int)audioType); UnityWebRequest request = UnityWebRequestMultimedia.GetAudioClip(url, audioType == SynthesisType.MP3 ? AudioType.MPEG : AudioType.WAV); UnityWebRequestAsyncOperation async = request.SendWebRequest(); async.completed += SynthesisDone; _isSynthesis = true; }
/// <summary> /// /// </summary> /// <param name="programBanks"></param> /// <param name="type"></param> /// <param name="id"></param> /// <param name="pcgId"></param> /// <param name="synthesisType"></param> /// <param name="description"></param> public TrinityGmProgramBank(IBanks programBanks, BankType.EType type, string id, int pcgId, SynthesisType synthesisType, string description) : base(programBanks, type, id, pcgId, synthesisType, description) { }
/// <summary> /// /// </summary> /// <param name="programBanks"></param> /// <param name="type"></param> /// <param name="id"></param> /// <param name="pcgId"></param> /// <param name="synthesisType"></param> /// <param name="description"></param> public MicroKorgXlPlusProgramBank(IBanks programBanks, BankType.EType type, string id, int pcgId, SynthesisType synthesisType, string description) : base(programBanks, type, id, pcgId, synthesisType, description) { }
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); }
/// <summary> /// /// </summary> /// <param name="programBanks"></param> /// <param name="type"></param> /// <param name="id"></param> /// <param name="pcgId"></param> /// <param name="synthesisType"></param> /// <param name="description"></param> public TritonTrClassicStudioRackProgramBank(IBanks programBanks, BankType.EType type, string id, int pcgId, SynthesisType synthesisType, string description) : base(programBanks, type, id, pcgId, synthesisType, description) { }
/// <summary> /// /// </summary> /// <param name="programBanks"></param> /// <param name="type"></param> /// <param name="id"></param> /// <param name="pcgId"></param> /// <param name="synthesisType"></param> /// <param name="description"></param> protected TritonProgramBank(IBanks programBanks, BankType.EType type, string id, int pcgId, SynthesisType synthesisType, string description) : base(programBanks, type, id, pcgId, synthesisType, description) { }
private void SynthesisArgsGUI() { GUILayout.BeginVertical("Box"); GUILayout.BeginHorizontal(); GUILayout.Label("Save Path:", GUILayout.Width(80)); _savePath = EditorGUILayout.TextField(_savePath); if (GUILayout.Button("Browse", "Minibutton")) { string path = EditorUtility.OpenFolderPanel("Select Save Path", Application.dataPath, ""); if (path.Length != 0) { _savePath = path.Replace(Application.dataPath, ""); } } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Save Name:", GUILayout.Width(80)); _saveName = EditorGUILayout.TextField(_saveName); GUILayout.Label("Format:"); _format = (SynthesisType)EditorGUILayout.EnumPopup(_format); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Timeout:", GUILayout.Width(80)); _timeout = EditorGUILayout.IntField(_timeout); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Speaker:", GUILayout.Width(80)); bool man = GUILayout.Toggle(_speaker == Speaker.Man, "Man"); if (man) { _speaker = Speaker.Man; } bool woman = GUILayout.Toggle(_speaker == Speaker.Woman, "Woman"); if (woman) { _speaker = Speaker.Woman; } bool man_DuXiaoYao = GUILayout.Toggle(_speaker == Speaker.Man_DuXiaoYao, "Man_DXY"); if (man_DuXiaoYao) { _speaker = Speaker.Man_DuXiaoYao; } bool woman_DuYaYa = GUILayout.Toggle(_speaker == Speaker.Woman_DuYaYa, "Woman_DYY"); if (woman_DuYaYa) { _speaker = Speaker.Woman_DuYaYa; } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Volume:", GUILayout.Width(80)); _volume = EditorGUILayout.IntSlider(_volume, 0, 15); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Speed:", GUILayout.Width(80)); _speed = EditorGUILayout.IntSlider(_speed, 0, 9); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Pitch:", GUILayout.Width(80)); _pitch = EditorGUILayout.IntSlider(_pitch, 0, 9); GUILayout.EndHorizontal(); GUILayout.EndVertical(); }