質問

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アプリで動作しますが、Webサービス内で実行すると、次のものが得られます

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のUSERSへのフルアクセスを許可しました。助けていただければ幸いです!

役に立ちましたか?

解決

System.SpeechがWindowsサービスで機能するとは思わない。 があるシェルへの依存関係。サービスには使用できません。 SAPIのC ++インターフェイスとの相互運用を試してください。 System.Runtime.InteropServicesの一部のクラスは、これに役立つ場合があります。

他のヒント

命名規則では、非標準のファイル拡張子を使用する必要があります。これはWinformsアプリでは正常に機能しますが、Webサーバーでは失敗しました。ファイル拡張子を.wavに戻すと、このエラーは解決されました。

SPFileStreamオブジェクトの形式を明示的に設定してください。 ISpAudio :: SetState (これは呼び出されますspeechEngine.Speakの下位層)は、形式がサポートされていない場合に SPERR_UNSUPPORTED_FORMAT を返します。

処理を実行するコンソールアプリを生成するWebサービスを取得しました。 PITA:-)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top