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


    第一种方法: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开发资料

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

    记录学习中的点点滴滴,记录这一路走来的风景
  • 相关阅读:
    iPhone 调用Web Service 例子(转)
    iPhone开发:在UIAlertView中显示进度条(转)
    Oracel 分页
    NYOJ 477
    NYOJ 108(数组中存的是前n个数的和)
    NYOJ 199
    NYOJ 311(完全背包)
    高效斐数(前92位)
    NYOJ 57(6174问题)
    NYOJ 546(分珠宝)
  • 原文地址:https://www.cnblogs.com/kkun/p/1542797.html
Copyright © 2020-2023  润新知