пытается использовать SpeechSynthesizer и NAudio, но процесс не может получить доступ к файлу - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь использовать SpeechSynthesizer и NAduio, мой код приведен ниже. Я не могу заставить его работать, хотя. Я получаю сообщение об ошибке,

Процесс не может получить доступ к файлу 'some file.wav', поскольку он используется другим процессом.

Это происходит на линии,

wave = new WaveFileReader (путь + имя файла);

В методе synth_SpeakCompleted.

Я не понимаю, хотя, что использует файл? SpeechSynthesizer завершил создание файла по мере возникновения события. Очевидно, я что-то упустил.

Я сохраняю файл только потому, что не знаю, как перейти непосредственно из SpeechSynthesizer в NAudio, поэтому, если есть решение, которое не сохраняет файл, который был бы великолепен.

Файл в порядке и отлично работает, когда я запускаю его вручную.

      using NAudio.Wave;

      public partial class MainWindow : Window
      {

        private WaveFileReader wave = null;
        private DirectSoundOut output = null;
        SpeechSynthesizer synthesizer = null;

        private void DrawContent()
        {
              string path = @"C:\Users\MyPath\";
              string fileName = "MyFile.wav";

              // delete previous file if it exists
              if (File.Exists(path + fileName))
                  File.Delete(path + fileName);

              synthesizer = new SpeechSynthesizer();
              synthesizer.Volume = 100;  // 0...100
              synthesizer.Rate = 3;     // -10...10

              synthesizer.SetOutputToWaveFile(path + fileName);
              synthesizer.SpeakCompleted += new EventHandler<SpeakCompletedEventArgs>(synth_SpeakCompleted);
              synthesizer.SpeakAsync(someText);



         }

    void synth_SpeakCompleted(object sender, SpeakCompletedEventArgs e)
    {

        synthesizer.SetOutputToNull();

        string path = @"C:\Users\MyPath\";
        string fileName = "MyFile.wav";

        wave = new WaveFileReader(path + fileName);
        output = new DirectSoundOut();
        output.Init(new WaveChannel32(wave));
        output.Play();

    }

    private void DisposeWave()
    {
        if(output != null)
        {
            if (output.PlaybackState == PlaybackState.Playing)
                output.Stop();

            output.Dispose();
            output = null;
        }

        if(wave != null)
        {
            wave.Dispose();
            wave = null;
        }
    }


  }
...