/// <summary>
/// 语音【文件、上传、解码、保存(WAV)】
/// </summary>
[DeveloperEx("Liwei:秘书语音需求单")]
public class AudioController : ClubBaseController
{
#region Android和IOS的一些音频参数
/****************
//格式
#define NAOMI_SPEEX_FORMAT kAudioFormatLinearPCM
//采样
#define NAOMI_SPEEX_RATE 8000
//声道
#define NAOMI_SPEEX_NUMBER_CHANNEL 1
//采样位数
#define NAOMI_SPEEX_BITDEPTH 16 private static final int FREQUENCY = 8000;
private static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
private static final int CHANNEL = AudioFormat.CHANNEL_IN_MONO;//0x10
***************/
#endregion
private ILogProvider log = LogFactory.Create();
private FileStream fileStream = null;
private BinaryWriter binaryWriter = null; /// <summary>
/// PCM To WAV
/// 添加Wav头文件
/// </summary>
[NonAction]
private void CreateSoundFile(string path)
{
fileStream = new FileStream(path, FileMode.Create);
binaryWriter = new BinaryWriter(fileStream); //Set up file with RIFF chunk info. 每个WAVE文件的头四个字节便是“RIFF”。
char[] ChunkRiff = { 'R', 'I', 'F', 'F' };
char[] ChunkType = { 'W', 'A', 'V', 'E' };
char[] ChunkFmt = { 'f', 'm', 't', ' ' };
char[] ChunkData = { 'd', 'a', 't', 'a' }; short shPad = ; // File padding
int nFormatChunkLength = 0x10; // Format chunk length.
int nLength = ; // File length, minus first 8 bytes of RIFF description. This will be filled in later. short bitsPerSample = ; //每个采样需要的bit数
//short khCaiYang = 8000; //16KHz 采样频率
//short bitSecondRate = 16000; //-每秒所需字节数
short channels = ; //声道数目,1-- 单声道;2-- 双声道
short shBytesPerSample = ; //一个样本点的字节数目 //------- RIFF 块 -------
binaryWriter.Write(ChunkRiff);
binaryWriter.Write(nLength);
binaryWriter.Write(ChunkType); //------- WAVE块 ---------
binaryWriter.Write(ChunkFmt);
binaryWriter.Write(nFormatChunkLength);
binaryWriter.Write(shPad); binaryWriter.Write(channels); //Mono,声道数目,1-- 单声道;2-- 双声道
binaryWriter.Write(); //16KHz 采样频率
binaryWriter.Write(); //每秒所需字节数
binaryWriter.Write(shBytesPerSample); //数据块对齐单位(每个采样需要的字节数)
binaryWriter.Write(bitsPerSample); //16Bit,每个采样需要的bit数 //------- 数据块 ---------
binaryWriter.Write(ChunkData);
binaryWriter.Write((int)); // The sample length will be written in later.
} /// <summary>
///【上传、保存、PCM源数据文件】
/// </summary>
[AllowAnonymous]
public ResponseModel UploadAudio()
{
try
{
//-------上传文件---------
var hash = CommonUpload("/UploadAudio/", (string i) =>
{
i = Guid.NewGuid().ToString("n");
return i;
}, isFile: true); if (hash["retInt"].Equals(""))
{
string uploadPcmFile = hash["retSrc"].ToString();
//--------获取pcm的文件名------------
string pcmFileName = uploadPcmFile.Substring(, uploadPcmFile.IndexOf(Path.GetExtension(uploadPcmFile))); string wavFile = pcmFileName + ".wav";
string physicPCMPath = hash["retSrcDirPath"].ToString();
string tempWavPath = Path.Combine(HttpContext.Current.Server.MapPath(physicPCMPath), wavFile); //--------添加wav文件头-----
CreateSoundFile(tempWavPath); #region 读取上传的PCM源文件
string fileName = Path.Combine(HttpContext.Current.Server.MapPath(physicPCMPath), uploadPcmFile);
FileInfo fileinfo = new FileInfo(fileName);
FileStream fs = fileinfo.OpenRead();
int length = (int)fs.Length;
byte[] bytes = new byte[length];
fs.Read(bytes, , length);
fs.Close();
fs.Dispose();
#endregion #region 向WAV音频中写入数据
binaryWriter.Write(bytes, , bytes.Length);
binaryWriter.Seek(, SeekOrigin.Begin);
binaryWriter.Write((int)(bytes.Length + )); // 写文件长度
binaryWriter.Seek(, SeekOrigin.Begin);
binaryWriter.Write(bytes.Length);
fileStream.Close();
#endregion //----------删除用户PCM的源文件---------------
if (System.IO.File.Exists(fileName))
{
FileInfo fi = new FileInfo(fileName);
if (fi.Attributes.ToString().IndexOf("ReadOnly") != -)
fi.Attributes = FileAttributes.Normal;
System.IO.File.Delete(fileName);
}
return SetOfMessage(data: new { filename = base.domainSite + physicPCMPath + wavFile });
}
else
{
return SetOfMessage(status: , message: hash["retMsg"].ToString());
}
}
catch (Exception ex)
{
log.Log(LogLevel.Info, "上传语音出错误了!", ex.Message);
//--------记录日志-------------
return SetOfMessage(data: null, message: "语音上传出现错误了!", status: ); ;
}
finally
{
if (fileStream != null)
{
fileStream.Close();
}
}
}

Web Api 中使用 PCM TO WAV 的语音操作的更多相关文章

  1. Web Api中的get传值和post传值

    GET 方式 get方式传参 我们一般用于获取数据做条件筛选,也就是 “查” 1.无参 var look = function () { $.ajax({ type: "GET", ...

  2. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【五】——在Web Api中实现Http方法(Put,Post,Delete)

    系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我们对资源的CRUD操作都是通过相应的Http方法来实现——Post(新 ...

  3. Web Api中实现Http方法(Put,Post,Delete)

    在Web Api中实现Http方法(Put,Post,Delete) 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我 ...

  4. Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化

    9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...

  5. ASP.NET Web API中的Controller

    虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...

  6. Web APi 2.0优点和特点?在Web APi中如何启动Session状态?

    前言 曾几何时,微软基于Web服务技术给出最流行的基于XML且以扩展名为.asmx结尾的Web Service,此服务在.NET Framework中风靡一时同时也被.NET业界同仁所青睐,几年后在此 ...

  7. 在ASP.NET Web API中使用OData

    http://www.alixixi.com/program/a/2015063094986.shtml 一.什么是ODataOData是一个开放的数据协议(Open Data Protocol)在A ...

  8. WEB API 中HTTP的get、post、put,delete 请求方式

    一.WEB API 中HTTP 请求方式的四个主要方法 (GET, PUT, POST, DELETE), 按照下列方式映射为 CURD 操作: 1.POST 用于新建资源,服务端在指定的URI 上创 ...

  9. ASP.NET Web API 中的异常处理(转载)

    转载地址:ASP.NET Web API 中的异常处理

随机推荐

  1. [原创汉化]linux前端神器 WebStorm8 汉化

    只汉化了linux版本 因为linux的工具没win多 不过汉化应该都通用的,自行尝试下. 汉化的不是很完全.有时间放出完全版本来.汉化是个体力活 转载随易,汉化不易,且转且注明 截图: http:/ ...

  2. java split函数 对空的处理

    String str = "5,6,55,66,,,,@"; String[] chk_deep = str.split("@"); System.out.pr ...

  3. Java注解全面解析

    1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(Retentio ...

  4. lintcode 中等题:Majority number II 主元素 II

    题目 主元素II 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一. 样例 给出数组[1,2,1,2,1,3,3] 返回 1 注意 数组中只有唯一的主元素 挑战 要求时 ...

  5. iOS开发网络篇--NSURLConnection

    S简介 NSURLConnection: 作用: 1.负责发送请求,建立客户端和服务器的连接发送数据给服务器 2.并收集来自服务器的响应数据 步骤: 1.创建一个NSURL对象,设置请求路径 2.传入 ...

  6. 利用纯真ip地址库 查询 ip所属地

    1. 首先下周数据源,选择是纯真数据库:http://www.cz88.net/ 2. 安装后,打开软件,将数据导出为txt格式. 3. 处理数据,参照网上的文章(http://www.jb51.ne ...

  7. 如何获取多核、多cpu系统中指定cpu的序列号

    如何获取多核.多cpu系统中指定cpu的序列号作者:SkyJacker(转贴请保持完整并注明作者和出处)http://www.cnpack.orgCnPack IV  QQ Group: 130970 ...

  8. JavaScript DOM编程基础精华03(动态设置,层的操作,性能问题)

    代码是否需要放置到onload中  //如果js代码需要操作页面上的元素,则将该代码放到onload里面.         //因为当页面加载完毕之后页面上才会有相关的元素 //如果js代码中没有操作 ...

  9. phpcms V9首页 频道页 列表页 推荐位 简单获取文章浏览量和评论统计

    phpcms V9首页 频道页 列表页 推荐位 简单获取文章浏览量和评论统计 列表取得数据方法: {pc:content action="lists" catid="$c ...

  10. 40. Combination Sum II

    题目: Given a collection of candidate numbers (C) and a target number (T), find all unique combination ...