SoundEffect вызвало ошибку при назначении буфера из SpeechLib - PullRequest
2 голосов
/ 10 мая 2011

Я занимаюсь разработкой приложения для Windows Phone 7, которое читает текст и произносит текст.

Библиотека micsoroft - interop.speechlib.dll преобразует мой текст в буфер (байтовый массив).И SoundEffect плагин Windows Phone 7 говорит об этом.

Это все работает нормально, но иногда это создает проблемы, вызывая ошибку ниже -

Неверный буфер.Убедитесь, что длина буфера не равна нулю и соответствует требованию выравнивания блоков для аудиоформата

Код для выступления приведен ниже:

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;
 }

Спасибо, Нареш Горадара

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

После некоторого теста он работает, установив режим канала. Он работает путем установки режима канала на моно.

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

Посмотреть разницу между ними в моно против стерео

0 голосов
/ 10 мая 2011

Я подозреваю, что вы не выполнили требования по выравниванию блоков. Цитата

Что такое выравнивание блоков и как рассчитать?

В одном предложении выравнивание блоков значение - это число байтов в атомная единица (он же блок) аудио для конкретный формат. Для форматов 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

...