C# SoundEffect在从SpeechLib分配缓冲区时引发错误
我正在开发WindowsPhone7应用程序,它可以阅读一些文本并说出文本 micsoroft库-interop.speechlib.dll将文本转换为缓冲区(字节数组)。而WindowsPhone7的SoundEffect插件就可以说出来 这一切都很好,但有时它会引发贝娄错误,从而产生问题- 缓冲区无效。确保缓冲区长度非零,并满足音频格式的块对齐要求 发言代码如下所示: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.
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,而是在缓冲区生成。我已经添加了我的代码,请看一看并提出建议。