Ejemplo n.º 1
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);
            }
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
    //文字转语音,将音频文件输出到指定的路径
    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;
        }
    }
Ejemplo n.º 6
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);
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
    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));
            }
        }
    }
Ejemplo n.º 9
0
Archivo: Tts.cs Proyecto: Gikeeee/SRP
    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);
        }
    }