Web Api 中使用 PCM TO WAV 的语音操作
/// <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 的语音操作的更多相关文章
- Web Api中的get传值和post传值
GET 方式 get方式传参 我们一般用于获取数据做条件筛选,也就是 “查” 1.无参 var look = function () { $.ajax({ type: "GET", ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【五】——在Web Api中实现Http方法(Put,Post,Delete)
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我们对资源的CRUD操作都是通过相应的Http方法来实现——Post(新 ...
- Web Api中实现Http方法(Put,Post,Delete)
在Web Api中实现Http方法(Put,Post,Delete) 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我 ...
- Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化
9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...
- ASP.NET Web API中的Controller
虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...
- Web APi 2.0优点和特点?在Web APi中如何启动Session状态?
前言 曾几何时,微软基于Web服务技术给出最流行的基于XML且以扩展名为.asmx结尾的Web Service,此服务在.NET Framework中风靡一时同时也被.NET业界同仁所青睐,几年后在此 ...
- 在ASP.NET Web API中使用OData
http://www.alixixi.com/program/a/2015063094986.shtml 一.什么是ODataOData是一个开放的数据协议(Open Data Protocol)在A ...
- WEB API 中HTTP的get、post、put,delete 请求方式
一.WEB API 中HTTP 请求方式的四个主要方法 (GET, PUT, POST, DELETE), 按照下列方式映射为 CURD 操作: 1.POST 用于新建资源,服务端在指定的URI 上创 ...
- ASP.NET Web API 中的异常处理(转载)
转载地址:ASP.NET Web API 中的异常处理
随机推荐
- html+css学习笔记 2[标签]
img标签/a标签 <img src="图片地址" alt="图片名"/> 图片(单标签)alt属性 是图片名字,是给百度搜索引擎抓取使用: ...
- Sublime text 取消记住上一次打开的,这功能太墨迹了!
比较恨,这sublime text的配置全部都是配置文件. 选择菜单:Preferences->Settings-User,增加配置项 //热退出,其实实现一种模拟没有退出的状态,当程序再次启动 ...
- Jquery 判断浏览器类型
$(function() { //FireFox2及以上 if ($.browser.MozillaSideBar && $.browser.version >= "1 ...
- [转载]ASP.NET对路径"xxxxx"的访问被拒绝的解决方法小结
异常详细信息: System.UnauthorizedAccessException: 对路径“D:/temp1/MyTest.txt”的访问被拒绝 在windows 2003下,在运行web ...
- hdu 4869
一个机智题,可惜比赛的时候没有机智出来 #include<cstdio> #include<cstring> #include<cmath> #include< ...
- $('li','div') $('div li') $('div li')
$('div','li')是$(子,父),是从父节点里找子,而不是找li外面的div $('div , li')才是找所有的div和li,之间不存在父子关系 $('div li') 是找div里面所有 ...
- hdu 1524 A Chess Game 博弈论
SG函数!! 代码如下: #include<stdio.h> #include<cstring> #define I(x) scanf("%d",& ...
- [主席树]HDOJ3874 Necklace
题意:n个数 m个询问 询问的是[l, r]区间内不同的数的和 没有修改,静态的主席树即可 与 SPOJ QUERY 一样 将重复的元素建树即可 注意范围:$N \le 50000$ 每个值不超过1 ...
- @QueryParam和@PathParam比较
来源:http://jackyrong.iteye.com/blog/1128364 1 先来看@queryparam Path("/users") public class Us ...
- 单例模式与Android
http://blog.csdn.net/ljianhui/article/details/29275655 多线程下的单例模式是不安全的 Android中的单例模式 Android中存在着大量的单例 ...