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(); }
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; }