문제

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 서비스에서 작동한다고 생각하지 않습니다. 보입니다 쉘에 의존성이 있습니다, 서비스에 사용할 수 없습니다. SAPI의 C ++ 인터페이스와 인터롭을 사용해보십시오. System.runtime.interopservices의 일부 클래스가 도움이 될 수 있습니다.

다른 팁

우리의 이름 지정 협약은 비표준 파일 확장을 사용해야합니다. 이것은 WinForms 앱에서 잘 작동하지만 웹 서버에서는 실패했습니다. 파일 확장자를 .wav로 다시 변경하면이 오류가 해결되었습니다.

SPFILESTREAM 객체에서 형식을 명시 적으로 설정해야합니다. ISPAUDIO :: SETSTATE (speechengine.speak에서 하위 계층으로 호출) 반환됩니다. SPERR_UNSUPPORTED_FORMAT 형식이 지원되지 않은 경우

방금 웹 서비스를 통해 처리를 수행하기 위해 콘솔 앱을 스폰했습니다. 피타 :-)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top