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

    }
}

  调用代码是:

 

 

在控制台看
posted @ 2020-06-16 16:16  Vanling  阅读(1128)  评论(0编辑  收藏  举报