C#将科大讯飞语音合成文件转换为MULAW音频格式
任务描述:通过科大讯飞语音合成组件在线完成文本转语音的合成,然后再转换为电话系统IVR要求的音频格式: wave mu-law 16位 8kHZ 64kbps。
完成步骤:
首先,我们要先通过科大讯飞语音合成组件实现文本合成,由于科大讯飞提供的接口都是C语言的,如果用C#调用需要做二次封装,为了快速完成任务,我们直接在科大讯飞论坛中找到一个现成组件进行修改,感谢wangkang提供的分享。
1、下载C#代码:http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=10182&highlight=c%23
2、修改iFlyDotNet的界面(根据自己的业务要求修改界面输入方式);
3、修改iFlydll工程中的iFlyTTS.cs文件
找到iFlyMSC.QTTSSessionBegin(str, ref errorCode )方法,修改转换参数str如下:
string str = "ssm=1," + this._speeker + ",spd=" + this._speed + ",aue=speex-wb;7,vol=" + this._vol + ",auf=audio/L16;rate=8000,ent=sms8k,rdn=3,rcn=0";
通过以上调用接口将输出采样速率8000,量化比特16位,8kHZ的PCM格式音频。
注,音频头部格式设置如下:
RIFF_ID = 0x46464952,
File_Size = data_len -8,
RIFF_Type = 0x45564157,
FMT_ID = 0x20746d66,
FMT_Size = 0x10,
FMT_Tag = 1,
FMT_Channel = 1,
FMT_SamplesPerSec = 8000,
AvgBytesPerSec = 16000,
BlockAlign = 2,
BitsPerSample = 16,
DATA_ID = 0x61746164,
DATA_Size = data_len- 44
接着我们要转换为wave mu-law 16位 8kHZ 64kbps的音频格式,这里借助了NAudio.dll的开源组件。
1)增加一个新类:
public class RawSourceWaveStream : WaveStream
{
private Stream sourceStream;
private WaveFormat waveFormat; public RawSourceWaveStream(Stream sourceStream, WaveFormat waveFormat)
{
this.sourceStream = sourceStream;
this.waveFormat = waveFormat;
} public override WaveFormat WaveFormat
{
get { return this.waveFormat; }
} public override long Length
{
get { return this.sourceStream.Length; }
} public override long Position
{
get
{
return this.sourceStream.Position;
}
set
{
this.sourceStream.Position = value;
}
} public override int Read(byte[] buffer, int offset, int count)
{
return sourceStream.Read(buffer, offset, count);
}
public override void Write(byte[] buffer, int offset, int count)
{
sourceStream.Write(buffer, offset, count);
}
}
2)将PCM音频转换为u-law格式
WaveFormat waveFormat = WaveFormat.CreateMuLawFormat(8000, 1);
RawSourceWaveStream rawStream = new RawSourceWaveStream(stream, new WaveFormat(8000, 16, 1));
WaveStream muStream = new WaveFormatConversionStream(WaveFormat.CreateMuLawFormat(8000, 1), rawStream);
WaveFileWriter.CreateWaveFile(outWaveFlie, muStream);
3)转换完成后输出的文件已经是u-law格式的电话音频格式了,我们用goldwave播放器进行播放,结果发现所有转换的结果开始部分会出现短暂的噪音。
用UltraEdit工具分析音频文件的头部发现格式后面会出现一些其他数据造成噪音(注:u-law格式头部为58个字节)
对输出的文件进一步处理后噪音问题解决:
using (FileStream stream2 = new FileStream(outWaveFlie, FileMode.Open))
{
byte[] blank = new byte[22];
for (int i = 0; i < 22; i++)
{
blank[i] = 0xFF;
}
stream2.Position = 58;
stream2.Write(blank, 0, blank.Length);
}
以下是正常u-law格式的电话音频:
C#将科大讯飞语音合成文件转换为MULAW音频格式的更多相关文章
- convertquota - 把老的配额文件转换为新的格式
总览 (SYNOPSIS) convertquota [ -ug ] filesystem 描述 (DESCRIPTION) convertquota 把老的配额文件 quota.user 和 quo ...
- 将腾讯视频客户端缓冲的文件转换为一个MP4格式文件
打开腾讯视频windows客户端,播放要下载的视频,逐步快进使其缓冲完毕: 按照下图所示,复制缓存路径: 在cmd.exe的界面中输入“cd C:\854456b6d5a187ff3c0f553918 ...
- 科大讯飞语音合成系统 V5.0绿色便携版
中文名: 中科大讯飞Interphonic 5.0语音合成系统英文名: Interphonic 5.0版本: 5.0发行时间: 2006年制作发行: 中科大讯飞语言: 简体中文系统简介InterPho ...
- C# 将PDF文件转换为word格式
Pdf(Portable Document Format)意为“便携式文档格式”,是现在最流行的文件格式之一,它有很多优点如:尺寸较小.阅读方便.操作系统平台通用等,非常适合在网络上传播和使用.如今在 ...
- 将Excel文件转换为Html
将Excel文件转换为HTML 背景 我的工作有时会涉及到财务数据的处理.我们大家都知道,Excel文件在处理数据中很流行并且被广泛使用.Excel让我们可以将存储在里面的数据进行数学计算.我在工作中 ...
- java 调用OpenOffice将word格式文件转换为pdf格式
一:环境搭建 OpenOffice 下载地址http://www.openoffice.org/ JodConverter 下载地址http://sourceforge.net/projects/jo ...
- 分享:Svg文件转换为图片(调用 Inkscape 命令行)
其实只是做了简单封装,可以方便进行批量转换. 获取Svg对象坐标的代码请看:根据svg节点对象类型和路径值转换坐标值, DrawingColor方法是进行颜色填充的. /// <summary& ...
- Excel文件转换为html静态网页
Excel文件转换为html静态网页:右键另存为:
- m文件转换为C/C++文件的编译、绘图、参数、打包问题总结
在工程计算相关项目中,常常利用Matlab来完成计算.算法.绘图等功能.使用Matlab来完成这些功能非常简单,Matlab提供的m编程语言功能强大,代码量少.为了在自己的C/C++项目中加入这些功能 ...
随机推荐
- PagedDataSource、Repeater以及AspNetPager在ASP.NET上分页。
一.前台使用服务器标签 1.1使用Repeater控件 <asp:Repeater ID="Repeater1" runat="server"> & ...
- 学习笔记-----Android的View绘制过程
边看源码边参考别人的博客等,做一下学习笔记. 要了解View的绘制,首先得知道View树的结构:(可以参考http://blog.csdn.net/qinjuning/article/details/ ...
- Dijkstra搜索算法
Dijkstra无向图 算法执行步骤如下: 上面两张图来源于:http://blog.csdn.net/v_july_v/article/details/6096981 很牛的大神,膜拜,此处有鲜花 ...
- 编辑器Ultraedit快捷键
编辑器Ultraedit快捷键说到编辑器的快捷键,VIM是无与伦比的.要反对,也得是带脚踏板的EmaCS.UE还是有差距的,很大差距.注意:VIM是开源.免费的,而UE则需要注册.UE是Windows ...
- NGUI 多场景情况下 管理多个界面
简单的说就是在一个AllUI场景中,所有场景所需要的界面都挂在一个Empty GameObject下,然后这个Empty GameObject在代码中DontDestroyOnLoad,但是回到这个A ...
- Quartz.net 定式调度任务
再用Quartz 做任务调度作业时,有以下步骤: ISchedulerFactory schedFact = new StdSchedulerFactory(); IScheduler _sched; ...
- agsXMPP参考代码
agsXMPP 1.删除好友 XmppCon.RosterManager.RemoveRosterItem(node.RosterItem.Jid); 2.注销用户 void userConn_OnL ...
- 清除WKWebView的缓存
OC写法: swift写法再下下面. 清除WKWebView的缓存,让H5页面一刷新就更新至最新的页面 要区分iOS9.0和8.0两种 - (void)deleteWebCache { if ([[U ...
- About memories in ASIC FPGA
1. Write first | Read First | No Change区别在于:en & wr的时候,dout是什么,三种case对应于: dout = din; dout = mem ...
- 浅谈SDN和NFV之间的关系
一个行业固定设备的折旧周期很长,任何变革的发生都绝非易事,但是网络却一次性面临两项革新--软件定义网络(SDN)和网络功能虚拟化(NFV),在变革网络的过程中,二者若想取得成功可能会依赖彼此的技术,或 ...