我可能是错的,但是看起来我在NAudio中的WAV文件是异步播放的,如果我从库中调用它,我可以听到WAV开始,但它几乎立即退出(并停止播放)。有没有办法在NAudio中同步播放WAV文件?
如果我从窗体(保持打开状态)运行它,那很好。但是,如果我试图从代码运行它作为后台线程,我只会在开始时听到一个小碎片。它听起来像方法在声音播放完毕之前退出。
我使用的文本到语音合成器对内存流创建WAV:
SpeechSynthesizer m_speechSynth = new SpeechSynthesizer();
m_speechSynth.Volume = 100;
m_speechSynth.Rate = 2;
MemoryStream waveStream = new MemoryStream();
m_speechSynth.SetOutputToWaveStream(waveStream);
m_speechSynth.Speak(txtToRead);
m_speechSynth.SetOutputToNull();
waveStream.Position = 0; // reset counter to start
这工作正常。然后,我创建一个类,我缠n音讯:
VoiceThroughNetAudio netAudio = new VoiceThroughNetAudio(waveStream, "WAV");
我试图保持代码示例这里容易执行...但这个类的确仅仅是初始化的事情,并给了我一个更高的水平控制上做的n音讯播放器的主要事情......里面的VoiceThroughNetAudio构造,
首先我从MemStream创建读者流:
readerStream = new WaveFileReader(memStream);
readerStream = WaveFormatConversionStream.CreatePcmStream(readerStream);
readerStream = new BlockAlignReductionStream(readerStream);
并附加一个音量控制(所以我可以放大它):
_volumeStream = new WaveChannel32(Reader);
,当我把它从我的WinForm的代码这一切工作正常:几乎立即
MemoryStream waveStream = new MemoryStream();
ReadStringAmplified(readTextField.Text, waveStream); // TTS to waveStream
VoiceThroughNetAudio PlaySound = new VoiceThroughNetAudio (waveStream, "WAV");
PlaySound.Volume = 9;
PlaySound.Play();
但是,当我提出这个代码进入语音类代替,声音开始播放,然后停止( )。就像它正在开始一个事件,然后在声音结束之前退出?如果是这样,是否有一种方法可以让方法等到声音结束? (我尝试了一段时间的循环,并检查状态,但这只是进入无限期的while循环(注释在这里...)
下面是当我将它移动到。语音类如果我实例从表单,并运行它都在那里,我也得到了被截断的声音:
SpeechSynthesizer m_speechSynth = new SpeechSynthesizer();
m_speechSynth.Volume = 100;
m_speechSynth.Rate = 2;
MemoryStream waveStream = new MemoryStream();
m_speechSynth.SetOutputToWaveStream(waveStream);
m_speechSynth.Speak(txtToRead);
m_speechSynth.SetOutputToNull();
waveStream.Position = 0; // reset counter to start
VoiceThroughNetAudio netAudio = new VoiceThroughNetAudio(waveStream, "WAV");
netAudio.Volume = 9;
TimeSpan ts = netAudio.TotalDuration;
string len = ts.Milliseconds.ToString();
netAudio.Play();
//VoiceThroughNetAudio.PlayBackState chkState = netAudio.State;
//while (netAudio.State != VoiceThroughNetAudio.PlayBackState.Stopped)
//{
// chkState = netAudio.State;
//}
好像我失去了一些东西简单,但我似乎无法得到这个在语音课上工作,只能从表格中获得。
我打算将此标记为已接受的答案 - 即使当我开始一切备份并添加了断点时,一切都开始正常工作!我甚至把它放在后台线程中,它仍然有效......当我退出,重新开始并重建时,它可能已经被修复了吗? IDK。 (我也拿出WaveFormatConversionStream和BlockAlignReductionStream,虽然我怀疑是造成这个问题......) – MarkJoel60 2013-05-08 16:39:02