C#讯飞语音文件转文字.NET版本
using Microsoft.Win32.SafeHandles; using System; using System.Collections.Generic; using System.IO; using System.Linq; using TaskScheduler; namespace ConsoleApp2c { public delegate void ganshi(string zuoshi); public class Program { public static void Main() { string filePath = @"C:\Users\Administrator\Desktop\_20200616150826.mp3"; var ifly = new Ifly(); string result = ifly.uploadSlice(filePath, true); string txtpath = filePath.Substring(0, filePath.Length - 3) + "txt"; Console.WriteLine(result); Console.ReadLine(); } } }
转载至https://blog.csdn.net/xu2034029667/article/details/104390917
简单整理了一下,将请求改用了WebClient。
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Security.Cryptography; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp2c { /// <summary> /// 生成slice_id的工具类 ///每个转写任务都新建一个SliceIdGenerator来按照分片顺序依次生成slice_id /// </summary> public class SliceIdGenerator { private const String INIT_STR = "aaaaaaaaa`"; private readonly int length = 0; private readonly char[] ch; public SliceIdGenerator() { this.length = INIT_STR.Length; this.ch = INIT_STR.ToCharArray(); } /** * 获取sliceId * * @return */ public String GetNextSliceId() { for (int i = 0, j = length - 1; i < length && j >= 0; i++) { if (ch[j] != 'z') { ch[j]++; break; } else { ch[j] = 'a'; j--; continue; } } return new String(ch); } } //{"data":"ec13805cb5e642649027f797ab7e9e31","err_no":0,"failed":null,"ok":0} public class IFlyResult { public int Ok { get; set; } public int Err_no { get; set; } public string Failed { get; set; } public string Data { get; set; } //public string task_id { get; set; } } //{\"bg\":\"310\",\"ed\":\"1980\",\"onebest\":\"1801. \",\"speaker\":\"0\"} public class StatusResult { public string desc { get; set; } public int status { get; set; } } public class GetResult { /// <summary> /// 开始时间 /// </summary> public string bg { get; set; } /// <summary> /// 结束时间 /// </summary> public string ed { get; set; } /// <summary> /// 内容 /// </summary> public string onebest { get; set; } /// <summary> /// 谁讲的话 /// </summary> public string speaker { get; set; } } // RequestApi api = new RequestApi("88888888", "888888888888888888888888", ""); public class Ifly { public string task_id = ""; string detail = ""; public void testSigna() { string signa = getSigna("37982798", "1512041814", "888888888888888888888888"); } //byte[] buffer, public string BuildParam_prepare(string app_id, string ts, string signa, string filepath, int slice_num) { System.IO.FileInfo fileInfo = new System.IO.FileInfo(filepath);//file完整文件路径 string file_len = fileInfo.Length.ToString();//kb string file_name = fileInfo.Name; //string lfasr_type = "0"; //string has_participle = "false"; //string max_alternatives = "0"; //.....其他非必选 return "&app_id=" + app_id + "&signa=" + signa + "&ts=" + ts + "&file_len=" + file_len + "&file_name=" + file_name + "&slice_num=" + slice_num; } public string getSigna(string appid, string ts, string key) { string baseString = appid + ts; string targetbase = GenerateMD5(baseString); string signa = HmacSha1Sign(key, targetbase); return signa; } public string GenerateMD5(string txt) { using (MD5 mi = MD5.Create()) { byte[] buffer = Encoding.Default.GetBytes(txt); //开始加密 byte[] newBuffer = mi.ComputeHash(buffer); StringBuilder sb = new StringBuilder(); for (int i = 0; i < newBuffer.Length; i++) { sb.Append(newBuffer[i].ToString("x2")); } return sb.ToString(); } } public string HmacSha1Sign(string secret, string strOrgData) { var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(secret)); var dataBuffer = Encoding.UTF8.GetBytes(strOrgData); var hashBytes = hmacsha1.ComputeHash(dataBuffer); return Convert.ToBase64String(hashBytes); } /// <summary> /// //第一步:预处理获取taskid /// </summary> /// <param name="app_id">APPID</param> /// <param name="ts">时间戳</param> /// <param name="signa">signa</param> /// <param name="filepath">文件路径</param> /// <param name="slice_num">分片数量</param> /// <returns></returns> public string Voice2txt(string app_id, string ts, string signa, string filepath, int slice_num) { //预处理必填参数 System.IO.FileInfo fileInfo = new System.IO.FileInfo(filepath);//file完整文件路径 string file_len = fileInfo.Length.ToString();//kb string file_name = fileInfo.Name; //预处理其他非必选参数 //string lfasr_type = "0"; //string has_participle = "false"; //string max_alternatives = "0"; //发音人个数 string speaker_number = "2"; //1: 通用角色分离2: 电话信道角色分离(适用于speaker_number为2的说话场景) string role_type = "2"; try { //创建WebClient 对象 System.Net.WebClient web = new System.Net.WebClient(); //需要上传的数据 string postString = "app_id=" + app_id + "&signa=" + signa + "&ts=" + ts + "&file_len=" + file_len + "&file_name=" + file_name + "&slice_num=" + slice_num + "&speaker_number=" + speaker_number + "&role_type=" + role_type; //以json的形式上传 web.Headers.Add("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); // 转化成二进制数组 byte[] postData = System.Text.Encoding.ASCII.GetBytes(postString); // 上传数据 byte[] responseData = web.UploadData("https://raasr.xfyun.cn/api/prepare", "POST", postData); //获取返回的二进制数据. string ret = System.Text.Encoding.UTF8.GetString(responseData); IFlyResult prepareresult = Newtonsoft.Json.JsonConvert.DeserializeObject<IFlyResult>(ret); return prepareresult.Data; } catch (Exception) { return ""; } } /// <summary> /// //第二步:上传数据,RequestApi api = new RequestApi("5e3950f1", "098d577bb69023d205ffaeba2bcf17e6", ""); /// </summary> /// <param name="filepath"></param> /// <param name="iszimu"></param> /// <returns></returns> public string uploadSlice(string filepath, bool iszimu) { //确保所有分片上传成功,再进行合并 SliceIdGenerator sg = new SliceIdGenerator(); FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fs); byte[] content_s = br.ReadBytes((int)fs.Length); int SLICE_SICE = 10485760; //正好几片 bool iszhen = false; int slice_num = (content_s.Length / SLICE_SICE); if (content_s.Length % SLICE_SICE != 0) { slice_num += 1; } else { iszhen = true; } string result = ""; string app_id = "控制台APPID"; string ts = Convert.ToInt64((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds).ToString(); string signa = getSigna(app_id, ts, "控制台的key"); //第一步:预处理获取task_id task_id = Voice2txt(app_id, ts, signa, filepath, slice_num); //计算出片的数量 //循环上传每片的流 int len = iszhen ? SLICE_SICE : (content_s.Length % SLICE_SICE); for (int i = 0; i < slice_num; i++) { byte[] content; //如果是最后一个那么取余 if (i == slice_num - 1) { content = new byte[len]; Array.Copy(content_s, (i) * SLICE_SICE, content, 0, len); } else { content = new byte[SLICE_SICE]; Array.Copy(content_s, (i) * SLICE_SICE, content, 0, SLICE_SICE); } string BuildParam_uploadSlide = "&app_id=" + app_id + "&signa=" + signa + "&ts=" + ts + "&task_id=" + task_id + "&slice_id=" + sg.GetNextSliceId(); string rett = HttpPostMulti("https://raasr.xfyun.cn/api/upload?" + BuildParam_uploadSlide, null, content, new FileInfo(filepath).Name); } //iFlyResult uploadresult = Newtonsoft.Json.JsonConvert.DeserializeObject<iFlyResult>(rett); //int ok = uploadresult.ok; //if (ok==0) //{ int o = merge(app_id, ts, signa); if (o == 0) { result = getProgress(app_id, ts, signa, iszimu); } //} return result; } /// <summary> /// //第三步:合并 ///byte[] buffer, /// </summary> /// <param name="app_id"></param> /// <param name="ts"></param> /// <param name="signa"></param> /// <returns></returns> public int merge(string app_id, string ts, string signa) { string ret = CommonHttpHandle(app_id, ts, signa, "merge"); IFlyResult prepareresult = Newtonsoft.Json.JsonConvert.DeserializeObject<IFlyResult>(ret); return prepareresult.Ok; } /// <summary> /// //获取结果 ///第四步:获取结果 ///byte[] buffer, /// </summary> /// <param name="app_id"></param> /// <param name="ts"></param> /// <param name="signa"></param> /// <param name="iszimu"></param> /// <returns></returns> public string getProgress(string app_id, string ts, string signa, bool iszimu) { //{"data":"{\"status\":2,\"desc\":\"音频合并完成\"}","err_no":0,"failed":null,"ok":0} string ret = CommonHttpHandle(app_id, ts, signa, "getProgress"); IFlyResult prepareresult = Newtonsoft.Json.JsonConvert.DeserializeObject<IFlyResult>(ret); StatusResult sr = Newtonsoft.Json.JsonConvert.DeserializeObject<StatusResult>(prepareresult.Data); while (sr.status != 9) { Thread.Sleep(6000); ret = CommonHttpHandle(app_id, ts, signa, "getProgress"); prepareresult = Newtonsoft.Json.JsonConvert.DeserializeObject<IFlyResult>(ret); sr = Newtonsoft.Json.JsonConvert.DeserializeObject<StatusResult>(prepareresult.Data); } string rett = CommonHttpHandle(app_id, ts, signa, "getResult"); IFlyResult r = Newtonsoft.Json.JsonConvert.DeserializeObject<IFlyResult>(rett); List<GetResult> listresult = Newtonsoft.Json.JsonConvert.DeserializeObject<List<GetResult>>(r.Data); foreach (GetResult item in listresult) { if (iszimu) { detail += Environment.NewLine +"讲话人:"+ item.speaker + "【" + second2hh_mm_ss(item.bg) + "--" + second2hh_mm_ss(item.ed) + "】" + item.onebest + Environment.NewLine; } else { detail += item.onebest; } //detail += item.onebest; } return detail; } /// <summary> /// 时间戳转秒数 /// </summary> /// <param name="time"></param> /// <returns></returns> public string second2hh_mm_ss(string time) { int ranlsecond = int.Parse((int.Parse(time) / 1000).ToString()); int hh = ranlsecond / 3600; int mm = (ranlsecond - hh * 3600) / 60; int ss = ranlsecond - hh * 3600 - mm * 60; string result = ""; if (hh < 10) { result += "0"; } result += hh + ":"; if (mm < 10) { result += "0"; } result += mm + ":"; if (ss < 10) { result += "0"; } result += ss; return result; } /// <summary> /// 发送请求 /// </summary> /// <param name="app_id"></param> /// <param name="ts"></param> /// <param name="signa"></param> /// <param name="urltype"></param> /// <returns></returns> public string CommonHttpHandle(string app_id, string ts, string signa, string urltype) { //创建WebClient 对象 System.Net.WebClient web = new System.Net.WebClient(); //需要上传的数据 string postString = "&app_id=" + app_id + "&signa=" + signa + "&ts=" + ts + "&task_id=" + task_id; //以json的形式上传 web.Headers.Add("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); // 转化成二进制数组 byte[] postData = System.Text.Encoding.ASCII.GetBytes(postString); // 上传数据 byte[] responseData = web.UploadData("https://raasr.xfyun.cn/api/" + urltype, "POST", postData); //获取返回的二进制数据. string huifu = System.Text.Encoding.UTF8.GetString(responseData); return huifu; } /// <summary> /// 分片上传 /// </summary> /// <param name="url"></param> /// <param name="postData"></param> /// <param name="body"></param> /// <param name="fileName"></param> /// <param name="headers"></param> /// <param name="contentType"></param> /// <param name="timeout"></param> /// <param name="encoding"></param> /// <returns></returns> public string HttpPostMulti(string url, Dictionary<string, string> postData, byte[] body, string fileName, Dictionary<string, string> headers = null, string contentType = null, int timeout = 60, Encoding encoding = null) { string result = string.Empty; HttpWebRequest request = null; HttpWebResponse response = null; Stream requestStream = null; Stream responseStream = null; //int SLICE_SICE = 10485760; //byte[] slide = new byte[SLICE_SICE]; //Array.Copy(body, slide, body.Length); //Array.Copy(body, slide, slide.Length); try { request = (HttpWebRequest)HttpWebRequest.Create(url); request.Timeout = -1; CookieContainer cookieContainer = new CookieContainer(); request.CookieContainer = cookieContainer; request.AllowAutoRedirect = true; request.Method = "POST"; //对发送的数据不使用缓存【重要、关键】 request.AllowWriteStreamBuffering = false; request.SendChunked = true;//支持分块上传 string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线 request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary; byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n"); byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n"); //请求头部信息 StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"content\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", fileName)); byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString()); //request.AddRange(body.Length); requestStream = request.GetRequestStream(); requestStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length); requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length); requestStream.Write(body, 0, body.Length); //requestStream.Write(slide, 0, slide.Length); //发送其他参数 requestStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length); response = (System.Net.HttpWebResponse)request.GetResponse(); responseStream = response.GetResponseStream(); System.IO.StreamReader streamReader = new System.IO.StreamReader(responseStream, System.Text.Encoding.UTF8); result = streamReader.ReadToEnd();//返回信息 streamReader.Close(); requestStream.Dispose(); responseStream.Dispose(); //Dispose(null, request, response, requestStream, responseStream); } catch (Exception ex) { return ""; } finally { requestStream.Dispose(); responseStream.Dispose(); //Dispose(null, request, response, requestStream, responseStream); } return result; } } }
调用代码是:
在控制台看