Perlスクリプト(※)でWin32::OLEでSpeech API(sapi)を呼び出し音声出力をすることを考えています。
音声出力が始まったらすぐにスクリプトの次の行の実行をしてほしいのですが、そうなりません。
※ Windows 10 + Strawberry Perl 5.32.1
音声の終了を待たずに次の行の実行に移るにはどうしたら良いでしょうか?
発生している問題・エラーメッセージ
下記のスクリプトをコマンドプロンプトから実行すると、音声が出力されますが、その後の「print "OK";」は、音声の出力が終了しないと実行されません。「... long long sentence.」をしゃべり終わった後で初めて「OK」と表示されます。
該当のソースコード
Perl
1#!/usr/bin/perl 2use utf8; 3use strict; 4use warnings; 5use Win32::OLE; 6 7speak('This is a test message. And this is a very long long sentence.'); 8print "OK"; # 実際はこの後に色々な処理 9exit; 10 11sub speak{ 12 my($text) = @_; 13 my $tts = Win32::OLE->new("Sapi.SpVoice") or die "Sapi.SpVoice failed"; 14 $tts->{Voice} = $tts->GetVoices->Item(1); 15 16 $tts->Speak($text, 1); 17 $tts->WaitUntilDone(-1); 18}
補足情報(FW/ツールのバージョンなど)
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ee125223(v=vs.85)
Microsoft Speech API 5.4 SpeechVoiceSpeakFlags Enum
や、
https://www.tek-tips.com/viewthread.cfm?qid=1262913
を見るとSpeakメソッドの第2引数を1にすると非同期(speak asynchronously)になると書いてあるようなのですが..
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/24 06:29