TTS 语音增强
背景
在Windows上,使用TTS生成语音并播放时,声音比较低,即便声明为最大音量,有时候依然不能满足用户的要求。通常只有增加系统音量使语音的音量达到用户的预期,但如果用户同时播放音乐、看视频等,声音也会随之增大。
需要一种可以将TTS的声音单独增强的方法。
环境
系统: Windows
运行时: .Net Framework 4.5.2+
依赖:NAudio.dll(1.10.0.0+)
生成语音
生成语音需要本机安装中文语音包。将TTS的语音写入内存流中,然后由NAudio播放。
var synthesizer = new SpeechSynthesizer();
synthesizer.SetOutputToDefaultAudioDevice();
synthesizer.Volume = 100; //音量设置最大
InstalledVoice iv=null;
foreach (InstalledVoice item in synthesizer.GetInstalledVoices())
{
//寻找第一个可用的中文语音包
if (item.Enabled && "zh-cn".Equals(item.VoiceInfo.Culture.Name.ToLower()))
{
iv = item;
break;
}
}
//将生成的语音写入内存流
MemoryStream wave = new MemoryStream();
synthesizer.SelectVoice(iv.VoiceInfo.Name);
synthesizer.SetOutputToWaveStream(wave);
synthesizer.Speak("收款,一亿元");
wave.Flush();
wave.Position = 0;
增强语音并播放
使用WaveFileReader加载语音的内存流,然后设置播放时的VolumeSampleProvider来增强音量。
WaveFileReader wav = new WaveFileReader(wave);
WaveOut waveout = new WaveOut();
var volumeSampleProvider = new VolumeSampleProvider(wav.ToSampleProvider());
volumeSampleProvider.Volume = (float)this.numericUpDown1.Value; // double the amplitude of every sample - may go above 0dB
waveout.Init(volumeSampleProvider);
waveout.Play();
注意事项
以上的方法是每次播放都会声明一个新的播放器实例,所以连续播放会有重叠的现象。如果需要新的语音播放时终止上一次的语音播放,需要使用单例WaveOutEvent。