質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

解決済

PerlのWin32::OLEのsapiで非同期音声出力をしたい

Hirakou
Hirakou

総合スコア0

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

2回答

0評価

0クリップ

61閲覧

投稿2021/10/20 06:20

Perlスクリプト(※)でWin32::OLEでSpeech API(sapi)を呼び出し音声出力をすることを考えています。
音声出力が始まったらすぐにスクリプトの次の行の実行をしてほしいのですが、そうなりません。
※ Windows 10 + Strawberry Perl 5.32.1

音声の終了を待たずに次の行の実行に移るにはどうしたら良いでしょうか?

発生している問題・エラーメッセージ

下記のスクリプトをコマンドプロンプトから実行すると、音声が出力されますが、その後の「print "OK";」は、音声の出力が終了しないと実行されません。「... long long sentence.」をしゃべり終わった後で初めて「OK」と表示されます。

該当のソースコード

Perl

#!/usr/bin/perl use utf8; use strict; use warnings; use Win32::OLE; speak('This is a test message. And this is a very long long sentence.'); print "OK"; # 実際はこの後に色々な処理 exit; sub speak{ my($text) = @_; my $tts = Win32::OLE->new("Sapi.SpVoice") or die "Sapi.SpVoice failed"; $tts->{Voice} = $tts->GetVoices->Item(1); $tts->Speak($text, 1); $tts->WaitUntilDone(-1); }

補足情報(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)になると書いてあるようなのですが..

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。