NET3.0+中使软件发出声音[整理篇]<转>

 

.NET3.0+中使软件发出声音[整理篇]

2009-08-10 13:14 by kkun, 13 visits, 网摘, 编辑

第一种方法:Speech

Speech控件在.NET中使用非常简单了,都被封装好了

官方连接:system.speech.synthesis.speechsynthesizer.pause.aspx

分三步,第一步添加引用(.NET3.0+ SDK中自带)

using System.Speech.Synthesis

第二步,初始化设置

Talker.Rate = -2;
Talker.Volume = 100;
Talker.SelectVoiceByHints( VoiceGender.Male, VoiceAge.Child, 2, System.Globalization.CultureInfo.CurrentCulture );

第三步,直接朗读文本

Talker.SpeakAsync( "Hello world!" );
 

第二种方法:System.Media.SoundPlayer

这个更简单,一步即可
        private void playSound(string path)
        {
            System.Media.SoundPlayer player =
                new System.Media.SoundPlayer();
            player.SoundLocation = path;
            player.Load();
            player.Play();
        }
这个简单是简单了些,功能也简单了,仅支持标准的wav格式
 

第三种方法:调用平台DLL,winmm.dll

官网连接:http://msdn.microsoft.com/zh-cn/library/ms229685(VS.80).aspx
如何查看系统DLL的方法及如何在C#调用它们点我
这里有一个他人封装好的类,见注释
using System;   
using System.Runtime.InteropServices;    
using System.Text;    
using System.IO ;
namespace Tstring.Util
{

    #region
    /// <SUMMARY>   
    /// clsMci 的摘要说明。   
    /// </SUMMARY>   
    public class Mp3Player
    {
        //http://msdn.microsoft.com/zh-cn/library/ms229685(VS.80).aspx
        public Mp3Player()
        {
            //   
            // TODO: 在此处添加构造函数逻辑   
            //   
        }

        //定义API函数使用的字符串变量    
        [MarshalAs( UnmanagedType.ByValTStr, SizeConst = 260 )]
        private string Name = "";
        [MarshalAs( UnmanagedType.ByValTStr, SizeConst = 128 )]
        private string durLength = "";
        [MarshalAs( UnmanagedType.LPTStr, SizeConst = 128 )]
        private string TemStr = "";
        int ilong;
        //定义播放状态枚举变量   
        public enum State
        {
            mPlaying = 1,
            mPuase = 2,
            mStop = 3
        };
        //结构变量   
        public struct structMCI
        {
            public bool bMut;
            public int iDur;
            public int iPos;
            public int iVol;
            public int iBal;
            public string iName;
            public State state;
        };

        public structMCI mc = new structMCI();

        //取得播放文件属性   
        public string FileName
        {
            get
            {
                return mc.iName;
            }
            set
            {
                //ASCIIEncoding asc = new ASCIIEncoding();    
                try
                {
                    TemStr = "";
                    TemStr = TemStr.PadLeft( 127, Convert.ToChar( " " ) );
                    Name = Name.PadLeft( 260, Convert.ToChar( " " ) );
                    mc.iName = value;
                    ilong = APIClass.GetShortPathName( mc.iName, Name, Name.Length );
                    Name = GetCurrPath( Name );
                    //Name = "open " + Convert.ToChar(34) + Name + Convert.ToChar(34) + " alias media";   
                    Name = "open " + Convert.ToChar( 34 ) + Name + Convert.ToChar( 34 ) + " alias media";
                    ilong = APIClass.mciSendString( "close all", TemStr, TemStr.Length, 0 );
                    ilong = APIClass.mciSendString( Name, TemStr, TemStr.Length, 0 );
                    ilong = APIClass.mciSendString( "set media time format milliseconds", TemStr, TemStr.Length, 0 );
                    mc.state = State.mStop;
                }
                catch( Exception exp )
                {
                    Log.Error( exp );
                    //MessageBox.Show("出错错误!");
                }
            }
        }
        //播放   
        public void play()
        {
            TemStr = "";
            TemStr = TemStr.PadLeft( 127, Convert.ToChar( " " ) );
            APIClass.mciSendString( "play media", TemStr, TemStr.Length, 0 );
            mc.state = State.mPlaying;
        }
        //停止   
        public void StopT()
        {
            TemStr = "";
            TemStr = TemStr.PadLeft( 128, Convert.ToChar( " " ) );
            ilong = APIClass.mciSendString( "close media", TemStr, 128, 0 );
            ilong = APIClass.mciSendString( "close all", TemStr, 128, 0 );
            mc.state = State.mStop;
        }

        public void Puase()
        {
            TemStr = "";
            TemStr = TemStr.PadLeft( 128, Convert.ToChar( " " ) );
            ilong = APIClass.mciSendString( "pause media", TemStr, TemStr.Length, 0 );
            mc.state = State.mPuase;
        }
        private string GetCurrPath( string name )
        {
            if( name.Length < 1 )
                return "";
            name = name.Trim();
            name = name.Substring( 0, name.Length - 1 );
            return name;
        }
        //总时间   
        public int Duration
        {
            get
            {
                durLength = "";
                durLength = durLength.PadLeft( 128, Convert.ToChar( " " ) );
                APIClass.mciSendString( "status media length", durLength, durLength.Length, 0 );
                durLength = durLength.Trim();
                if( durLength == "" )
                    return 0;
                return (int)( Convert.ToDouble( durLength ) / 1000f );
            }
        }

        //当前时间   
        public int CurrentPosition
        {
            get
            {
                durLength = "";
                durLength = durLength.PadLeft( 128, Convert.ToChar( " " ) );
                APIClass.mciSendString( "status media position", durLength, durLength.Length, 0 );
                mc.iPos = (int)( Convert.ToDouble( durLength ) / 1000f );
                return mc.iPos;
            }
        }
    }

    public class APIClass
    {
        [DllImport( "kernel32.dll", CharSet = CharSet.Auto )]
        public static extern int GetShortPathName(
         string lpszLongPath,
         string shortFile,
         int cchBuffer
        );

        [DllImport( "winmm.dll", EntryPoint = "mciSendString", CharSet = CharSet.Auto )]
        public static extern int mciSendString(
         string lpstrCommand,
         string lpstrReturnString,
         int uReturnLength,
         int hwndCallback
        );
    }
    #endregion
}
 

第四种:由第三种引申,使主板发出声音

        [DllImport( "kernel32.dll" )]
        private static extern int Beep( int dwFreq, int dwDuration );
        void _Beep() {
            System.Random r = new Random();
            for( int i = 0 ; i < 100 ; i++ ) {
                int c = r.Next( 10000 );
                Beep( c, 100 );
            }

            Beep( 2047, 200 );
        }

 

参考资料及常见问题

System.Speech.Synthesis Namespace

语音合成(使用.net3.0中的System.Speech.Synthesis心得)

Speech SDK 5.1 语言包下载- 华军软件园- 系统程序- 系统辅助
Microsoft Speech: Home Page

C#中如何使用Speech发音 高手进

C#如何让软件发声

求一能播放mp3,wav,wma,mid文件的组件

微软Speech SDK开发资料

------------------------------------

记录学习中的点点滴滴,记录这一路走来的风景
原文地址:http://www.cnblogs.com/kkun/archive/2009/08/10/1542797.html
posted @ 2009-08-10 22:32  温景良(Jason)  Views(539)  Comments(0Edit  收藏  举报