Exemple #1
0
        /// <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();
        }
Exemple #3
0
 /// <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;
 }
Exemple #4
0
        /// <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);
            }
        }
Exemple #5
0
        /// <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);
        }
Exemple #7
0
    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);
    }
Exemple #8
0
        /// <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));
        }
Exemple #9
0
        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)
 {
 }
Exemple #13
0
        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);
        }
Exemple #14
0
 /// <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)
 {
 }
Exemple #15
0
 /// <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)
 {
 }
Exemple #16
0
        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();
        }