C # SAPI в веб-сервисе - PullRequest
       32

C # SAPI в веб-сервисе

0 голосов
/ 28 октября 2009
var speechEngine = new SpVoiceClass();
SetVoice(speechEngine, job.Voice);

var fileMode = SpeechStreamFileMode.SSFMCreateForWrite;
var fileStream = new SpFileStream();
try
{
    fileStream.Open(filePath, fileMode, false);
    speechEngine.AudioOutputStream = fileStream;
    speechEngine.Speak(job.Script, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak | SpeechVoiceSpeakFlags.SVSFDefault); //TODO: Change to XML
    //Wait for 15 minutes only
    speechEngine.WaitUntilDone((uint)new TimeSpan(0, 15, 0).TotalMilliseconds);
}
finally
{
    fileStream.Close();
}

Этот точный код работает в приложении WinForm, но когда я запускаю его внутри веб-службы, я получаю следующее

System.Runtime.InteropServices.COMException was unhandled
  Message="Exception from HRESULT: 0x80045003"
  Source="Interop.SpeechLib"
  ErrorCode=-2147201021

У кого-нибудь есть идеи, что может быть причиной этой ошибки? Код ошибки означает

SPERR_UNSUPPORTED_FORMAT

Для полноты здесь используется метод SetVoice

void SetVoice(SpVoiceClass speechEngine, string voiceName)
{
    var voices = speechEngine.GetVoices(null, null);
    for (int index = 0; index < voices.Count; index++)
    {
        var currentToken = (SpObjectToken)voices.Item(index);
        if (currentToken.GetDescription(0) == voiceName)
        {
            speechEngine.SetVoice((ISpObjectToken)currentToken);
            return;
        }
    }
    throw new Exception("Voice not found: " + voiceName);
}

Я дал полный доступ к ПОЛЬЗОВАТЕЛЯМ в папке C: \ Temp, в которую должен быть записан файл. Любая помощь будет оценена!

Ответы [ 4 ]

1 голос
/ 25 июля 2011

Наше соглашение об именах требует, чтобы мы использовали нестандартное расширение файла. Это прекрасно работает в приложении Winforms, но не удалось на нашем веб-сервере. Изменение расширения файла обратно на .wav решило эту ошибку для нас.

1 голос
/ 29 октября 2009

Я не думаю, что System.Speech работает в службе Windows. Похоже, есть зависимость от Shell , которая недоступна для служб. Попробуйте взаимодействовать с интерфейсами SAPI C ++. Некоторые классы в System.Runtime.InteropServices могут помочь в этом.

0 голосов
/ 30 октября 2009

Я только что получил веб-сервис для запуска консольного приложения для выполнения обработки. ПИТА: -)

0 голосов
/ 29 октября 2009

Убедитесь, что вы явно установили формат для объекта SPFileStream. ISpAudio :: SetState (которая вызывается на нижнем уровне из speechEngine.Speak) вернет SPERR_UNSUPPORTED_FORMAT, если формат не поддерживается.

...