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;
}
}
}
调用代码是:
在控制台看

浙公网安备 33010602011771号