SoundEffect在从SpeechLib分配缓冲区时引发错误

时间:2011-05-10 11:40:59

标签: c# silverlight windows-phone-7 text-to-speech

我正在开发Windows Phone 7应用程序,它可以读取一些文本并说出文本。

micsoroft库 - interop.speechlib.dll 将我的文本转换为缓冲区(字节数组)。 Windows Phone 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;
 }

谢谢, Naresh Goradara

2 个答案:

答案 0 :(得分:2)

经过一些测试后,它可以通过设置通道模式来工作。 它的工作原理是将通道模式设置为单声道。

SoundEffect se = new SoundEffect(buffer, 30000, AudioChannels.Mono);

mono vs stereo

查看这些差异

答案 1 :(得分:0)

我怀疑你没有遵守块对齐要求。引用

  

块对齐究竟是什么?   我该如何计算呢?

     

在一个句子中,阻止对齐   value是一个字节数   原子单位(又名块)的音频   特殊格式。对于PCM格式   公式非常简单:“阻止   对齐=每个样本的字节数*数字   频道“。例如,阻止   单声道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