首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NAudio与SpeechSynthesizer的结合

NAudio与SpeechSynthesizer的结合
EN

Stack Overflow用户
提问于 2015-07-01 07:43:30
回答 2查看 2.2K关注 0票数 5

我想将NAudio与SpeechSynthesizer一起使用,但如果不首先将.wav文件写入磁盘,则无法使其工作。

我不知道为什么,我尝试了原始波浪数据和波浪与标头,请参阅以下例子.

示例1-此操作有效,但保存了一个.wav文件

代码语言:javascript
复制
  using (var synth = new SpeechSynthesizer())
  {
    synth.SetOutputToWaveFile(@".\Test.wav");
    synth.Speak("This is sample text-to-speech output.");
    synth.SetOutputToNull();

    var reader = new WaveFileReader(@".\Test.wav");
    var waveOut = new WaveOut();
    waveOut.Init(reader);
    waveOut.Play();
  }

示例2-这同样有效,但仍然使用文件

代码语言:javascript
复制
  using (var synth = new SpeechSynthesizer())
  using (var stream = new MemoryStream())
  {
    synth.SetOutputToWaveStream(stream);
    synth.Speak("This is sample text-to-speech output.");

    using (var fileStream = File.Create(@".\Test.wav"))
    {
      stream.Seek(0, SeekOrigin.Begin);
      stream.CopyTo(fileStream);
    }

    var reader = new WaveFileReader(@".\Test.wav");
    var waveOut = new WaveOut();
    waveOut.Init(reader);
    waveOut.Play();
  }

示例3-这不起作用,它只是播放了一小部分秒并停止了

为了避免设置波形格式,我故意使用SetOutputToWaveStream来保留RIFF头。

代码语言:javascript
复制
    using (var synth = new SpeechSynthesizer())
    using (var stream = new MemoryStream())
    {
      synth.SetOutputToWaveStream(stream);
      synth.Speak("This is sample text-to-speech output.");

      stream.Seek(0, SeekOrigin.Begin);
      var reader = new WaveFileReader(stream);
      var waveOut = new WaveOut();
      waveOut.Init(reader);
      waveOut.Play();
    }

示例4-结果与示例3相同

它使用原始数据,有点笨重。

代码语言:javascript
复制
  using (var synth = new SpeechSynthesizer())
  using (var stream = new MemoryStream())
  {
    synth.SetOutputToAudioStream(stream, new SpeechAudioFormatInfo(44100, AudioBitsPerSample.Sixteen, AudioChannel.Mono));
    synth.Speak("This is sample text-to-speech output.");

    stream.Seek(0, SeekOrigin.Begin);
    IWaveProvider provider = new RawSourceWaveStream(stream, new WaveFormat(44100, 16, 1));
    var waveOut = new WaveOut();
    waveOut.Init(provider);
    waveOut.Play();
  }

我也尝试过使用WasapiOut,但这更糟糕。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-01 14:25:33

在重新定位到开始之前,请在内存流上调用Flush。而且,Play只开始播放,所以您需要等待播放完成,或者将WaveOut实例移动到using块之外。否则,它只会收集垃圾,然后才能很好地回放。

票数 2
EN

Stack Overflow用户

发布于 2016-12-26 09:38:07

这段代码适用于我,如果可以帮助(对于解决方案3)。

代码语言:javascript
复制
        IWaveProvider provider = null;
        var stream = new MemoryStream();
        using (var synth = new SpeechSynthesizer())
        {

            synth.SetOutputToAudioStream(stream,
                new SpeechAudioFormatInfo(44100, AudioBitsPerSample.Sixteen, AudioChannel.Mono));
            synth.Speak("This is sample text-to-speech output.");

            stream.Seek(0, SeekOrigin.Begin);
            provider = new RawSourceWaveStream(stream, new WaveFormat(44100, 16, 1));

        }
        var waveOut = new WaveOut();
        waveOut.Init(provider);
        waveOut.Play();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31155374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档