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

C# SoundEffect在从SpeechLib分配缓冲区时引发错误,c#,silverlight,windows-phone-7,text-to-speech,C#,Silverlight,Windows Phone 7,Text To Speech,我正在开发WindowsPhone7应用程序,它可以阅读一些文本并说出文本 micsoroft库-interop.speechlib.dll将文本转换为缓冲区(字节数组)。而WindowsPhone7的SoundEffect插件就可以说出来 这一切都很好,但有时它会引发贝娄错误,从而产生问题- 缓冲区无效。确保缓冲区长度非零,并满足音频格式的块对齐要求 发言代码如下所示: SoundEffect se = new SoundEffect(buffer, 15000, AudioChannels.

我正在开发WindowsPhone7应用程序,它可以阅读一些文本并说出文本

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

我怀疑您没有遵守区块对齐要求。引述

块对齐和 如何计算它?

在单个句子中,块对齐 值是数据中的字节数 音频的原子单位(亦称块) 特定格式。对于PCM格式 公式非常简单:“块” 对齐=每个样本的字节数*个 “渠道管理”。例如,block 单声道16位PCM的校准值 格式为2,适用于立体声16位PCM 格式是4。我们手边有两个 可以帮助计算 块对齐值- GetSampleSizeInBytes和 GetSampleDuration从时间转换 块对齐字节值和 回来


经过一些测试后,它通过设置通道模式工作。 它通过将通道模式设置为单声道工作

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

查看这两者之间的差异

谢谢奥利弗,我找到了根本原因。它不是在SoundEffect,而是在缓冲区生成。我已经添加了我的代码,请看一看并提出建议。