我正在开发Windows 7应用程序,它可以读取一些文本并说出文本。
micsoroft库- interop.speechlib.dll将我的文本转换为缓冲区(字节数组)。而Windows 7的SoundEffect插件就是这么说的。
这一切都很好,但有时它会引起问题-
缓冲区无效。确保缓冲区长度为非零,并满足音频格式的块对齐要求。
发言守则如下:
SoundEffect se = new SoundEffect(buffer, 15000, AudioChannels.Stereo);
FrameworkDispatcher.Update();
se.Play();请建议我,我在哪里做错了。
编辑从一些测试中得出结论,问题的根本原因是缓冲区的生成。下面是从文本生成缓冲区的代码。
using (MemoryStream ms = new MemoryStream())
{
SpeechLib.SpVoice oVoice = new SpeechLib.SpVoice();
SpeechLib.SpFileStream cpFileStream = new SpeechLib.SpFileStream();
cpFileStream.Open(filename, SpeechLib.SpeechStreamFileMode.SSFMCreateForWrite, false);
oVoice.AudioOutputStream = cpFileStream;
oVoice.Speak(value, SpeechLib.SpeechVoiceSpeakFlags.SVSFDefault);
oVoice = null;
cpFileStream.Close();
cpFileStream = null;
byte[] ImageData=File.ReadAllBytes(filename);
return ImageData;
}谢谢你,纳雷什·戈拉达拉
发布于 2011-05-11 09:54:43
经过一些测试,它通过设置通道模式工作。它通过将通道模式设置为mono来工作。
SoundEffect se = new SoundEffect(buffer, 30000, AudioChannels.Mono);在单声道与立体声上查看它们之间的差异
发布于 2011-05-10 12:22:16
我怀疑你没有遵守块对齐的要求。报价
什么是块对齐,我如何计算它? 在一个句子中,块对齐值是指特定格式的音频原子单元(又称块)中的字节数。对于PCM格式,公式非常简单:“块对齐=每个样本的字节数*通道数”。例如,mono 16位PCM格式的块对齐值是2,而立体声16位PCM格式的块对齐值是4。我们有一些方便的帮助程序可以帮助计算块对齐值-- GetSampleSizeInBytes和GetSampleDuration从时间单位转换到块对齐字节值和返回。
源http://blogs.msdn.com/b/ashtat/archive/2010/06/03/soundeffect-creation-in-xna-game-studio-4.aspx
https://stackoverflow.com/questions/5949451
复制相似问题