文本转语音播放

bool Voice(string info)
{

        int rate = Convert.ToInt16(ReadSetting("SoundRate"));
        bool Result = false;


        try
        {
            //.net4.0以上版本支持下面的方式
            // dynamic   spVoice = Activator.CreateInstance(Type.GetTypeFromProgID("SAPI.SpVoice", true));
            //   spVoice.Volume = 60; //定义音量大小:0~100  

            //   spVoice.Speak(info);//阻塞进程
            //
            //  return true;
            ////////////////////////

            SRead sP = new SRead();

            Result = sP.SpeakChina(info, VoiceName, 100, rate, saveWavFile);
            mdg_Decode.write_log("采用SpeechSynthesizer合成语音 ", 1, 1);

        }
        catch (Exception e)
        {
            mdg_Decode.write_log("发生错误:" + e.Message, 1, 1);

        }
        finally
        {

            if (!Result)
            {
                mdg_Decode.write_log("采用net4.0以上版本支持的 dynamic spVoice  ", 1, 1);
                //.net4.0以上版本支持下面的方式

                try
                {

                    dynamic spVoice = Activator.CreateInstance(Type.GetTypeFromProgID("SAPI.SpVoice"));
                    //   spVoice.Voice(VoiceName);
                    // synth.SpeakAsync(sndtext); //异步读

                    //String speechPeople = synth.Voice;
                    //使用 synth 设置朗读音量 [范围 0 ~ 100]
                    spVoice.Volume = 100;
                    //使用 synth 设置朗读频率 [范围 -10 ~ 10]
                    spVoice.Rate = rate;
                    //使用synth 合成 wav 音频文件:
                    //synth.SetOutputToWaveFile(string path);

                    spVoice.Speak(info);
                    // spVoice.Dispose();

                }
                catch (Exception e)
                {
                    mdg_Decode.write_log("发生错误:" + e.Message, 1, 1);

                }
                finally
                {
                    mdg_Decode.write_log("ok:播放完毕", 1, 1);
                }
            }

        };
        return true;
    }
  

public class SRead
{
    public SpeechSynthesizer synth; //语音合成对象
    public SRead()
    {
        synth = new SpeechSynthesizer();
   
    }
   
    public SRead(int m, int n)
    {
        //使用 synth 设置朗读音量 [范围 0 ~ 100]
        synth.Volume = m;
        //使用 synth 设置朗读频率 [范围 -10 ~ 10]
        synth.Rate = n;
    }
    public bool SpeakChina(string sndtext, string VoiceName, int Volume=90, int Rate=0,string WavFile="")
    {
        bool Result = false;
        FileStream fs1=null;
        StreamWriter m_streamWriter1 = null;
        try
        {



            int count = 0;


            string log_filename = @"Voice_list" + ".txt";
              fs1 = new FileStream(log_filename, FileMode.Create, FileAccess.Write);
              m_streamWriter1 = new StreamWriter(fs1);

            m_streamWriter1.BaseStream.Seek(0, SeekOrigin.End);


            foreach (InstalledVoice voices in synth.GetInstalledVoices()) //可查看本地电脑已经安装的语音包
            {
                count++;
                m_streamWriter1.WriteLine("已安装语音库:" + voices.VoiceInfo.Name + "\r\n");
            }


            if (count > 0)
            {
                synth.SelectVoice(VoiceName);
            }
        }
        catch (Exception e)
        {
            mdg_Decode.write_log("查找支持的语音库发生错误:" + e.Message, 1, 1);
        }
        finally
        {

            m_streamWriter1.Flush();
            m_streamWriter1.Close();
            fs1.Close();

        }

        try
        {
           
            // synth.SelectVoiceByHints(VoiceGender.Male, VoiceAge.Child, 2, System.Globalization.CultureInfo.CurrentCulture);

            //Voice.Speak(sndtext, SpFlags);
          // synth.SpeakAsyncCancelAll();
       //  mdg_Decode.write_log("SpeakAsyncCancelAll:", 1, 1);
            // synth.SpeakAsync(sndtext); //异步读
          
         //   mdg_Decode.write_log("Speak:", 1, 1);
            //String speechPeople = synth.Voice;
            //使用 synth 设置朗读音量 [范围 0 ~ 100]
            synth.Volume = Volume;
        //    mdg_Decode.write_log("Volume:", 1, 1);
            //使用 synth 设置朗读频率 [范围 -10 ~ 10]
            synth.Rate = Rate;
            //   mdg_Decode.write_log("Rate:", 1, 1);
            if (WavFile != "")
            {
                synth.SetOutputToWaveFile(WavFile);
                 synth.Speak(sndtext);
               // synth.SpeakAsync(sndtext); //异步读

            }
            //使用synth 合成 wav 音频文件:
            synth.SetOutputToDefaultAudioDevice();
            synth.Speak(sndtext);//输出到默认声音设备
           //synth.SpeakAsync(sndtext); //异步读
            synth.Dispose();
            Result = true;
        }
        catch (Exception e)
        {
            mdg_Decode.write_log("播放时发生错误:" + e.Message, 1, 1);
            Result = false;
        }
        return Result;

    }
    public void SpeakEnglish(string sndtext)
    {
        //SpVoice Voice = new SpVoice();
        synth.SelectVoice("VW Julie");
        synth.Speak(sndtext); //sndtext为要合成的内容
        synth.Dispose(); 
    }
    public int m
    {
        
        
            get
        {
            return synth.Volume;
        }
        set
        {
            synth.Volume = value;
        }


    

     }

public int n
{
get
{
return synth.Rate;
}
set
{
synth.Rate = value;
}
}
}

posted @ 2024-07-04 11:42  老马识途远  阅读(8)  评论(0编辑  收藏  举报