【物聯網智能網關-15】WAV播放器(WinForm+WavPlay庫實例)

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

相關硬件: http://www.sky-walker.com.cn/Products.asp?Id=24

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章