吐槽一下,讯飞官方webapi,没有提供.NET版本案例,只有python,java,只好自己摸索,代码不太简洁,这里复习总结一下,权当作做笔记摘抄一样总结一番,也给第一天尝试其他小伙伴一点参考。

检查每个参数名,根据官网提供的api

https://www.xfyun.cn/doc/asr/lfasr/API.html

关于生成分片文件名称,本质是生成类似aaaaaaaa字符串

分片文件本质是,将流一节节发送过去,

有图有真相

using Newtonsoft.Json;
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.Web;
using System.Web.Script.Serialization;namespace audio
{/*** 生成slice_id的工具类* 每个转写任务都新建一个SliceIdGenerator来按照分片顺序依次生成slice_id* * @author white**/public class SliceIdGenerator{private const String INIT_STR = "aaaaaaaaa`";private int length = 0;private 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{public string bg { get; set; }public string ed { get; set; }public string onebest { get; set; }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){         FileInfo fileInfo = new FileInfo(filepath);//file完整文件路径string file_len = fileInfo.Length.ToString();//kbstring 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);}//第一步:获取taskidpublic string voice2txt(string app_id,string ts,string signa,string filepath,int slice_num){detail = "";HttpWebRequest request = null;HttpWebResponse response = null;Stream reqStream = null;request = (HttpWebRequest)WebRequest.Create("https://raasr.xfyun.cn/api/prepare");request.Method = "post"; //设置为post请求request.ReadWriteTimeout = 5000;request.KeepAlive = false;request.ContentType = "application/x-www-form-urlencoded;charset=utf-8";byte[] postData = Encoding.UTF8.GetBytes(BuildParam_prepare(app_id,ts,signa,filepath,slice_num)); //使用utf-8格式组装post参数reqStream = request.GetRequestStream();reqStream.Write(postData, 0, postData.Length);response = (HttpWebResponse)request.GetResponse();Stream myResponseStream = response.GetResponseStream();StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);string ret = myStreamReader.ReadToEnd();iFlyResult prepareresult = new JavaScriptSerializer().Deserialize<iFlyResult>(ret);return prepareresult.data;           }//第二步:上传数据,RequestApi api = new RequestApi("5e3950f1", "098d577bb69023d205ffaeba2bcf17e6", "");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 = "88888888";string ts = Convert.ToInt64((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds).ToString();string signa = getSigna(app_id, ts, "098d577bb69023d205ffaeba2bcf17e6");//计算出片的数量task_id = voice2txt(app_id, ts, signa, filepath, slice_num);//循环上传每片的流int len = iszhen ? SLICE_SICE : (content_s.Length % SLICE_SICE);byte[] content = null;for (int i = 0; i < slice_num; i++){//如果是最后一个那么取余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 = new JavaScriptSerializer().Deserialize<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;           }//第三步:合并//byte[] buffer,public int merge(string app_id,string ts,string signa){string ret = commonHttpHandle(app_id, ts, signa, "merge"); iFlyResult prepareresult = new JavaScriptSerializer().Deserialize<iFlyResult>(ret);         return prepareresult.ok;}//获取结果//第四步:获取结果//byte[] buffer,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 = new JavaScriptSerializer().Deserialize<iFlyResult>(ret);StatusResult sr = new JavaScriptSerializer().Deserialize<StatusResult>(prepareresult.data);while (sr.status != 9){Thread.Sleep(6000);ret = commonHttpHandle(app_id, ts, signa, "getProgress");prepareresult = new JavaScriptSerializer().Deserialize<iFlyResult>(ret);sr = new JavaScriptSerializer().Deserialize<StatusResult>(prepareresult.data);}string rett = commonHttpHandle(app_id, ts, signa, "getResult");iFlyResult r = new JavaScriptSerializer().Deserialize<iFlyResult>(rett);List<getResult> listresult = new JavaScriptSerializer().Deserialize<List<getResult>>(r.data);foreach (getResult item in listresult){if (iszimu){detail += Environment.NewLine + "【" + second2hh_mm_ss(item.bg) + "--" + second2hh_mm_ss(item.ed) + "】" + item.onebest + Environment.NewLine;}else{detail += item.onebest;}//detail += item.onebest;}return detail;//if (sr.status == 9)//{//    //{"data":"[{\"bg\":\"310\",\"ed\":\"1980\",\"onebest\":\"1801. \",\"speaker\":\"0\"},{\"bg\":\"1990\",\"ed\":\"4310\",\"onebest\":\"12345678! \",\"speaker\":\"0\"}]","err_no":0,"failed":null,"ok":0}//    string rett = commonHttpHandle(app_id, ts, signa, "getResult");//    iFlyResult r = new JavaScriptSerializer().Deserialize<iFlyResult>(rett);//    List<getResult> listresult = new JavaScriptSerializer().Deserialize<List<getResult>>(r.data);              //    foreach (getResult item in listresult)//    {//        if (iszimu)//        {//            detail += Environment.NewLine + "【" + second2hh_mm_ss(item.bg) + "--" + second2hh_mm_ss(item.ed) + "】" + item.onebest + Environment.NewLine;//        }//        else {//            detail += item.onebest;//        }//        //detail += item.onebest;//    }//    return detail;//}//else {//    Thread.Sleep(60000);//    getProgress(app_id, ts, signa,iszimu);//}//return detail;//return prepareresult.data;}//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;}public string commonHttpHandle(string app_id, string ts, string signa,string urltype){string BuildParam_merge = "&app_id=" + app_id + "&signa=" + signa + "&ts=" + ts + "&task_id=" + task_id;HttpWebRequest request = null;HttpWebResponse response = null;Stream reqStream = null;request = (HttpWebRequest)WebRequest.Create("https://raasr.xfyun.cn/api/"+urltype);request.Method = "post"; //设置为post请求request.ReadWriteTimeout = 5000;request.KeepAlive = false;request.ContentType = "application/x-www-form-urlencoded;charset=utf-8";byte[] postData = Encoding.UTF8.GetBytes(BuildParam_merge); //使用utf-8格式组装post参数reqStream = request.GetRequestStream();reqStream.Write(postData, 0, postData.Length);response = (HttpWebResponse)request.GetResponse();Stream myResponseStream = response.GetResponseStream();StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);return myStreamReader.ReadToEnd();}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 = (HttpWebResponse)request.GetResponse();responseStream = response.GetResponseStream();StreamReader streamReader = new 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;}}
}

调用:

 var ifly = new ifly();string result = ifly.uploadSlice(filePath, true);string txtpath = filePath.Substring(0, filePath.Length - 3) + "txt";translate(result, txtpath);

替换里面API涉及的关于申请用户的关键参数值

讯飞语音转写.NET版本相关推荐

  1. AI赋能日常生活:讯飞语音转写在会议、采编、上课等场景中的应用

    人工智能在日常生活中的应用已经非常广泛了.除了ChatGPT这种对话生成式AI,语音转文字技术也可以在很多场景中派上用场.比如,奔波于各种会议之间的打工人.经常采访的媒体从业者以及要上网课的学生们,每 ...

  2. 讯飞语音转写php版demo

    是转写,不是听写!!! 是转写,不是听写!!! 是转写,不是听写!!! 讯飞开放平台提供的api里面,demo只提供了py3和java的版本!!! github包括码云我也没有找到现成的代码(不一定没 ...

  3. Python讯飞语音转文字保存到文件

    因为有朋友需要将录音转成文字, 给我的是m4a格式, 我给转成txt发给他的. 我找了找, 发现网上很多都是收费软件,而且转换结果不尽人意., 最后决定使用讯飞服务来完成转换, 讯飞语音转写api支持 ...

  4. 讯飞输入法更新10.0版本 上线全新A.I.语音输入引擎

    原标题:讯飞输入法10.0最新版本隆重发布 更快更准更智能 迈入人工智能时代,A.I.赋能并不是简单的口号.近日,讯飞输入法更新至10.0版.据悉,上线全新的A.I.语音输入引擎,使通用语音识别率98 ...

  5. 讯飞语音万能五笔超强手写3合1输入法:

    原创   作者:发威时刻 新版本的讯飞语音真的不错,因为它依托于以下几个文件就能动嘴说话了,你只要有一个话筒,另外再能连网就可以了,不仅能说英语还能说各地方言. 再说那个新版本的万能五笔输入法(五笔拼 ...

  6. Android自带语音播报+讯飞语音播报封装(直接用)

    一.Android自带的语音播报 1.查看是否支持中文,在测试的设备中打开'设置' -->找到 '语言和输入法'-->查看语音选项,是否支持中文,默认仅支持英文. 使用如下: public ...

  7. 讯飞语音——带你简单实现语音听写

    语音听写 de 简单实现 一.前言 如果你没有在讯飞语音平台上创建应用,请先参考讯飞语音的详细配置使用 二.功能描述 语音听写和语音合成都是较为基础也是最常使用的两个基本功能. 语音合成是将文本转化为 ...

  8. Android——讯飞语音唤醒简介及实现

    前段时间写了一个关于百度语音唤醒文章,最近有做了一个讯飞语音的应用,在这里把学习的资料整理一下. 唤醒的整个过程如下: (图源自讯飞官网) 讯飞的语音唤醒功能实现起来挺方便的(相比百度,百度语音And ...

  9. Android讯飞语音播报新闻

    1:讯飞开放平台注册登录:https://www.xfyun.cn/?ch=bdtg 2: 3:创建新应用获取APPID值 4:注册好就可以直接在项目中使用appid值 5:将下载的sdk中libs文 ...

最新文章

  1. 个人所得税计算器2016 by Jacksile
  2. android开发常用的设计模式,android开发设计模式之——单例模式详解
  3. 与孩子一起学编程 python_【和孩子一起学编程】 python笔记--第五天
  4. 通过调用门进行有特权级变换的转移,详细注解 对pmtest5.asm解释很详细.
  5. AI公开课:19.05.29 浣军-百度大数据实验室主任《AutoDL 自动化深度学习建模的算法和应用》课堂笔记以及个人感悟
  6. 0基础如何入门Python编程
  7. HTTP概念详解与案例测试
  8. 【OpenPose-Windows】error1 OpenPose项目加载失败
  9. 计算机二级web题目(8.2)--基本操作题2
  10. 《原神》移动端总收入达8.74亿美元
  11. java反射机制深入详解_Java基础与提高干货系列——Java反射机制
  12. 最新基于高德地图的android进阶开发(5)地图的基本操作、事件监听、用户UI、图层选择等
  13. Java周记(第一周)
  14. Vue学习--黑马电商管理系统
  15. MSCS+FailSafe 双机集群做HA 小结
  16. CNN-ResNet
  17. 奇葩报错之返回值为 -1073741515 (0xc0000135) ‘未找到依赖 dll‘
  18. [源码和文档分享]基于QT的英文文献的编辑与检索系统的实现
  19. firefox android 去更新,Firefox Android移动版更新
  20. 养成类游戏——动物餐厅开发制作

热门文章

  1. 静下心来学习MVC之基本概念
  2. 遥感图像数据集简介之二
  3. 麦克风有电流声怎么办?
  4. redo synch writes在什么情况下发生
  5. Python筛选某列满足条件的值(isin用法)
  6. 桂电计算机系入学怎么分班,桂电研究生-()学期课程总表.doc
  7. java里面怎么开根号_新手求解呀!!!!!!!怎么开根号,为嘛我开不了
  8. 计算机考研每日安排,计算机考研如何安排复习计划
  9. Scala中Seq转Map的方法(:_*)
  10. java8中的流(Stream)