Example #1
0
        static void Main(string[] args)
        {
            string dirPath = FileHelper.GetAbsolutePath("/UpLoad/Voice");

            if (!Directory.Exists(dirPath))
            {
                Directory.CreateDirectory(dirPath);
            }
            string      relativePath = string.Format("/UpLoad/Voice/{0}.mp3", $"{Guid.NewGuid().ToString("N")}{DateTime.Now.ToString("yyyyMMddHHmmss")}");
            XFPostModel model        = new XFPostModel()
            {
                AppID       = "your AppID",
                APIKey      = "your APIKey",
                AueType     = AueType.Lame, //若保存此类型,文件后缀名请传mp3,若希望保存wav文件,AueType枚举类型为Raw,后缀名请传wav
                FilePath    = FileHelper.GetAbsolutePath(relativePath),
                TextContext = "测试文本转语音"
            };
            var result = XFSpeechHelper.Post(model);

            Console.WriteLine(result.Message);
            Console.ReadKey();
        }
Example #2
0
        public static SpeechResult Post(XFPostModel model)
        {
            SpeechResult result = new SpeechResult();
            String url = "http://api.xfyun.cn/v1/service/v1/tts";
            String bodys;
            //aue = raw, 音频文件保存类型为 wav
            //aue = lame, 音频文件保存类型为 mp3
            //获取文件拓展名
            var extension = Path.GetExtension(model.FilePath);
            string AUE = string.Empty;
            switch (model.AueType)
            {
                case AueType.Raw:
                    if (extension!=".wav")
                    {
                        result.ResultCode = ResultCode.ParameterError;
                        result.Message = AueType.Raw.GetDescription();
                        return result;
                    }
                    AUE = "raw";
                    break;
                case AueType.Lame:
                    AUE = "lame";
                    if (extension != ".mp3")
                    {
                        result.ResultCode = ResultCode.ParameterError;
                        result.Message = AueType.Lame.GetDescription();
                        return result;
                    }
                    break;
                default:
                    break;
            }
            string param = "{\"aue\":\"" + AUE + "\",\"auf\":\"audio/L16;rate=16000\",\"voice_name\":\"xiaoyan\",\"engine_type\":\"intp65\"}";
            //对要合成语音的文字先用utf-8然后进行URL加密
            //原文本长度
            var contextLength = model.TextContext.Length;
            byte[] textData = Encoding.UTF8.GetBytes(model.TextContext);
            var Contexts = HttpUtility.UrlEncode(textData);
            var encodeLength = Contexts.Length;
            var avg = encodeLength / (double)contextLength;//平均数
            var splitNum = 1000 / avg;//取字符串截取长度
            var val = model.TextContext.Length / splitNum;
            List<string> lst = new List<string>();
            var num = Math.Ceiling(decimal.Parse(val.ToString()));
            for (int i = 0; i < num; i++)
            {
                var file = Path.GetFileNameWithoutExtension(model.FilePath);
                var tempfileName = model.FilePath.Replace(file, $"{file}_{i.ToString()}");
                lst.Add(tempfileName);
                var body = FileHelper.GetMyStr(i, model.TextContext, (int)splitNum);//截取后的内容
                byte[] textDatas = Encoding.UTF8.GetBytes(body);//对要合成语音的文字先用utf-8然后进行URL加密
                var encodeContext = HttpUtility.UrlEncode(textDatas);
                bodys = string.Format("text={0}", encodeContext);
                //获取十位的时间戳
                TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
                string curTime = Convert.ToInt64(ts.TotalSeconds).ToString();
                //对参数先utf-8然后用base64编码
                byte[] paramData = Encoding.UTF8.GetBytes(param);
                string paraBase64 = Convert.ToBase64String(paramData);
                //形成签名
                string checkSum = FileHelper.Md5(model.APIKey + curTime + paraBase64);
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.Headers.Add("X-Param", paraBase64);
                request.Headers.Add("X-CurTime", curTime);
                request.Headers.Add("X-Appid", model.AppID);
                request.Headers.Add("X-CheckSum", checkSum);

                Stream requestStream = request.GetRequestStream();
                StreamWriter streamWriter = new StreamWriter(requestStream, Encoding.GetEncoding("gb2312"));
                streamWriter.Write(bodys);
                streamWriter.Close();

                String htmlStr = string.Empty;
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                Stream responseStream = response.GetResponseStream();
                using (StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("UTF-8")))
                {
                    string header_type = response.Headers["Content-Type"];
                    if (header_type == "audio/mpeg")
                    {
                        Stream st = response.GetResponseStream();
                        MemoryStream memoryStream = FileHelper.StreamToMemoryStream(st);
                        File.Create(tempfileName).Dispose();
                        File.WriteAllBytes(tempfileName, FileHelper.StreamTobyte(memoryStream));
                        result.ResultCode = 0;
                        result.Message = "语音合成成功";
                    }
                    else
                    {
                        htmlStr = reader.ReadToEnd();
                        var resultBody = JsonConvert.DeserializeObject<Body>(htmlStr);
                        result.ResultCode = resultBody.code;
                        result.Message = resultBody.code.GetDescription();
                        return result;
                    }
                }
                responseStream.Close();
            }
            FileHelper.Mp3Combine(model.FilePath, lst);
            FileHelper.DeleteFile(lst);
            return result;
        }