Я пытаюсь использовать 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;
}
}
}