문제
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
형식이 지원되지 않은 경우
방금 웹 서비스를 통해 처리를 수행하기 위해 콘솔 앱을 스폰했습니다. 피타 :-)
제휴하지 않습니다 StackOverflow