博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#将科大讯飞语音合成文件转换为MULAW音频格式
阅读量:4968 次
发布时间:2019-06-12

本文共 2888 字,大约阅读时间需要 9 分钟。

任务描述:通过科大讯飞语音合成组件在线完成文本转语音的合成,然后再转换为电话系统IVR要求的音频格式: wave mu-law 16位 8kHZ 64kbps。

完成步骤:

首先,我们要先通过科大讯飞语音合成组件实现文本合成,由于科大讯飞提供的接口都是C语言的,如果用C#调用需要做二次封装,为了快速完成任务,我们直接在科大讯飞论坛中找到一个现成组件进行修改,感谢提供的分享。

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格式的电话音频:

转载于:https://www.cnblogs.com/HZM/p/5443903.html

你可能感兴趣的文章
64位UBUNTU下安装adobe reader后无法启动
查看>>
组件:slot插槽
查看>>
Nginx配置文件nginx.conf中文详解(转)
查看>>
POJ 1308 Is It A Tree?(并查集)
查看>>
N进制到M进制的转换问题
查看>>
利用sed把一行的文本文件改成每句一行
查看>>
Android应用开发:核心技术解析与最佳实践pdf
查看>>
python——爬虫
查看>>
孤荷凌寒自学python第五十八天成功使用python来连接上远端MongoDb数据库
查看>>
求一个字符串中最长回文子串的长度(承接上一个题目)
查看>>
简单权限管理系统原理浅析
查看>>
springIOC第一个课堂案例的实现
查看>>
求输入成绩的平均分
查看>>
php PDO (转载)
查看>>
wordpress自动截取文章摘要代码
查看>>
[置顶] 一名优秀的程序设计师是如何管理知识的?
查看>>
scanf和gets
查看>>
highcharts 图表实例
查看>>
ubuntu下如何查看用户登录及系统授权相关信息
查看>>
秋季学期学习总结
查看>>