任務描述:通過科大訊飛語音合成組件線上完成文本轉語音的合成,然後再轉換為電話系統IVR要求的音頻格式: wave mu-law 16位 8kHZ 64kbps。 完成步驟: 首先,我們要先通過科大訊飛語音合成組件實現文本合成,由於科大訊飛提供的介面都是C語言的,如果用C#調用需要做二次封裝,為了快速 ...
任務描述:通過科大訊飛語音合成組件線上完成文本轉語音的合成,然後再轉換為電話系統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格式的電話音頻: