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格式的電話音頻:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM