文本转语音播放

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  老马识途远  阅读(83)  评论(0)    收藏  举报