我正在开发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
答案 0 :(得分:2)
经过一些测试后,它可以通过设置通道模式来工作。 它的工作原理是将通道模式设置为单声道。
SoundEffect se = new SoundEffect(buffer, 30000, AudioChannels.Mono);
查看这些差异
答案 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