中国自动化学会专家咨询工作委员会指定宣传媒体
免费注册 登录 广告服务 | 客服中心
您现在所在的是:

微软嵌入式

fluketop kollmorgen 抖音 西门子减速电机 德嘉 台达 英威腾 泓格论坛 西门子 我和LOGO!有个约会 FLIR红外热像论坛 【有奖活动】英威腾 “Ni美国国家仪器 “PLC发展趋势大讨论”活动圆满结束 艾睿光电产品体验活动 cc-link图文征集活动 西门子SMART LINE V3
工控论坛首页 微软嵌入式 → 浏览主题: 【物联网智能网关-15】WAV播放器(WinForm+WavPlay库实例)
发表新帖 回复该主题
回帖:0个,阅读:417 [上一页] [1] [下一页]
* 帖子主题:

【物联网智能网关-15】WAV播放器(WinForm+WavPlay库实例)

分享到
734
yefanqiu
文章数:33
年度积分:50
历史总积分:734
注册时间:2004/8/19
发站内信
发表于:2012/11/28 23:20:48
#0楼
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文件
[URL=]图[/URL]
string[] files = Directory.GetFiles("\\ROOT");
foreach(stringfileinfiles)
{
if(file.Substring(file.Length -3,3).ToLower() =="wav")
     {
          listBox1.Items.Add(file);
      }
}
[URL=]图[/URL]
(2)       播放和停止播放

[URL=]图[/URL]
privatevoidbutton1_Click(objectsender, EventArgs e)
 {    
      WavPlay.Play(listBox1.Text,true);
      tm.Enabled=true;
      progressBar1.Value=0;
      button1.Enabled=false;
      button2.Enabled=true;
}
privatevoidbutton2_Click(objectsender, EventArgs e)
 {
      WavPlay.Stop();
      tm.Enabled=false;
      button1.Enabled=true;
      button2.Enabled=false;
}
[URL=]图[/URL]
    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是否竖屏显示模式
[URL=]图[/URL]
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);
}
[URL=]图[/URL]
实际的运行效果如何,请看相关视频:
图
播放链接: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
图
此帖来自中华工控网工控博客
原文件地址:http://blog.gkong.com/more.asp?id=168076&Name=yefanqiu
工控学堂推荐视频:

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2021 Gkong.com, All Rights Reserved

78