Вопрос

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, где должен быть записан файл. Любая помощь будет оценена!

Это было полезно?

Решение

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top