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。

posted @ 2024-07-11 10:35  烟台西炮台  阅读(1)  评论(0编辑  收藏  举报