2002年在首鋼實施焦爐四大機車自動化項目的時候,爲了使系統更加友好,便增加了語音提示功能。不過控制設備是PLC,所以語音模塊是通過IO進行控制的。接觸WAV解碼,是在2009年,爲TI DM355平臺移植.NET Micro Framework系統,同事進行驅動移植,我封裝上層C#接口,不過那時候技術有限,封裝的接口只能同步播放。
當前市場上的語音模塊一般分兩種,一種是可錄音的模塊,錄上音,觸發一下,就可以播放。另外一種就是燒錄WAV文件(或其它自定義格式的語音數據)。前者往往很難做到分段錄音分段播放,而後一種,由於是部署文件,所以相對容易的分段控制。控制方式一種是IO方式,另一種就是串口發命令控制。
最近和一個朋友合作開發一個醫療上的上肢康復設備,需要用到語音提示功能。最初想到的也是採用語音模塊控制,便花了一百多元購買了兩個語音模塊進行研究,語音模塊雖然有些小貴,但是價格和音質還可以,既可以用IO控制,也可以通過RS485發指令控制。不過朋友感覺外接一個模塊的方式不大好,建議加一個解碼芯片或PWM驅動控制。
因此便開始研究語音控制技術,由於.NET Micro Framework已經支持了DA輸出功能,而STM32芯片時鐘中斷功能也比較強大,所以就嘗試做WAV解碼。沒有想到實際做出的效果竟然非常好,特別是用外接音箱播放的時候,幾乎可以媲美一些播放器的音質。
系統直接支持語音播放,可以非常方便實現各種功能,比如做一個報時功能,由於可能在任一個時間要求報時,所以不可能像整點報時一樣,做20多個語音文件到時播放即可。更好的做法就是把各個語音分成單元,到時候用程序控制擬合播放。不僅僅是報時,如電子秤稱重報數、計算器語音報時、智能家居控制中的智能提示,都需要語音。並且由文件系統支持,100多兆字節的存儲空間,可以存放很多語音文件。不像一些語音模塊,存儲空間都是比較有限的,比如我採購的那款價格相對較高的語音模塊,存儲空間才8M。
下面我以一個WAV播放器爲實例,介紹WAV播放類庫的使用。
第一步:準備WAV聲音文件
我們可以藉助一些聲音轉換工具,把常見的MP3格式的文件轉換爲WAV格式的文件。比如GoldWave軟件,聲音文件最好重新採樣,建議速率爲16000Hz(最好不要大於44100Hz),如下圖所示:
保存的格式,建議爲:PCM unsigned 8bit,mono。16位、雙聲道播放(需要兩路DA),WavPlay函數也是支持的,不過感覺沒有必要,一是文件會增大幾倍,但是音質改善並不大。
第二步:把WAV聲音文件下載到文件系統
如果WAV文件不大,把WAV文件作爲資源文件(WAV文件添加資源的時候,要修改擴展名,以二進制資源的方式加入)也是可以的,WavPlay函數可直接播放字節數組數據。但是對一些比較大的WAV文件,如一首歌曲,一般就得3M Byte左右的大小了,是不能添加到資源中去的。
我們還是用在博文《Html5:Canvas+WebSocket實現遠程實時通信》中介紹的YFFileViewer工具,參見下圖。
第三步:設計播放界面
我們採用YFSoft.WinForm庫進行界面編寫(WinForm相關博文,請參見《WinForm for .NET MF 功能一覽》)。界面設計,我們還是先用桌面版的程序進行設計,設計好後,把代碼加入.NET Micro Framework工程。
第四步:播放代碼編寫
(1) 枚舉文件系統根目錄下所有的WAV文件
string[] files = Directory.GetFiles("\\ROOT"); foreach (string file in files) { if (file.Substring(file.Length - 3, 3).ToLower() == "wav") { listBox1.Items.Add(file); } }
(2) 播放和停止播放
private void button1_Click(object sender, EventArgs e) { WavPlay.Play(listBox1.Text,true); tm.Enabled = true; progressBar1.Value = 0; button1.Enabled = false; button2.Enabled = true; } private void button2_Click(object sender, EventArgs e) { WavPlay.Stop(); tm.Enabled = false; button1.Enabled = true; button2.Enabled = false; }
WavPlay庫下載:http://www.sky-walker.com.cn/MFRelease/library/v42/YFSoft.WavPlay.rar
示例源碼下載:http://www.sky-walker.com.cn/MFRelease/Sample/YFWavPlay.rar
程序運行後界面如下:
注:DA輸出可以接音箱,也可以接耳機,不過直接驅動揚聲器,則聲音有些小,需要加一個功放模塊(可以單擊這裏,購買功放+喇叭套件)。
目前紫藤207平臺已經支持屏幕橫豎屏切換了,系統啓動的時候,先檢查是不是豎屏,如果不是,則自動切換(YFAccessFlash工具也可以配置橫豎屏模式),相關代碼如下:
//檢查LCD是否豎屏顯示模式
YFStream.Utility.LCD_ViewMode mode = YFStream.Utility.Instance.GetLcdMode(); if (mode != YFStream.Utility.LCD_ViewMode.Portrait) { YFStream.Utility.Instance.SetLcdMode(YFStream.Utility.LCD_ViewMode.Portrait); //重啓系統 Microsoft.SPOT.Hardware.PowerState.RebootDevice(false); Thread.Sleep(Timeout.Infinite); }
實際的運行效果如何,請看相關視頻:
播放鏈接:http://v.youku.com/v_show/id_XNDgwODgyOTky.html
-----------------------------------------------------------------
MF簡介:http://blog.csdn.net/yefanqiu/article/details/5711770
MF資料:http://www.sky-walker.com.cn/News.asp?Id=25