nvdaController_isSpeaking は音声エンジンごとに対応状況や実装が異なるのですが、 念のために NVDA 日本語版のバージョンと、音声エンジンの種類、設定など教えていただけますか?
使用しているNVDA日本語版は2015.2JPです。
細かい設定としては、読み上げのレスポンスを最大になるよう調整しています。
* 点字ディスプレイ系 : 全て無効
* 言語判定系 : 全て無効
* NVDAのシステム言語 : 日本語
音声エンジンですが、いろいろ使ってみましたが、多少違いはあるものの基本的にどれも5回中0~2回ほど発声する状態でした。
* JTalk : 「Mai」、「lite」、「M001」
* SpeachAPI 5 : 「AquesTalk」、「ドキュメントトーカー たかし・太郎・ロボ太郎」、「VoiceText SHO」
* Haruka (nvdajp) : Haruka
* Microsoft speech platform 11 : Haruka
1回以上発音できる時があるということですと、どれくらい必要かはさておいて、ウェイトがあった方がいいのかもしれない… と思いつつあります。
念のためにこの API の使い方についてコメントします:
まず nvdaController_isSpeaking という API は本家版 NVDA にはないので、 この API そのものがエラーになる場合の考慮をおすすめします。 (NVDA が本家版か日本語版かを判定するような処理はおすすめしません)
それから isSpeaking は音声エンジンによっては常に 0 を返します。 (音声エンジンが「音声なし」、または Vocalizer などNVDA日本語チーム以外のベンダーが提供する音声エンジンの場合) isSpeaking がある時間以上 1 を返さない場合の考慮もおすすめします。 (選択中の音声エンジンの種類を判定するような処理はおすすめしません)
それから NVDA 本家ではオーディオのダッキングを実装しようという動きがあるので、 そのあたりの改善がすすめば、もっと安定して動作する isSpeaking API を 本家に提案できるかも知れません。 引き続き、検討、情報収集させてください。
推奨について了解しました。
本件に関しては、以下のようにウェイトを入れて実行し、それでも0が返るのは仕方ない、ということにします。
本家に isSpeaking API みたいな要望が出ていたのでコメントを書きました:
コントローラークライアントAPI「nvdajp-client-140119a」を使って以下のようなコードを書いたのですが、読み上げ終了を待つ部分の処理が期待通りに同さしていません。
「nvdaController_speakText」直後の「nvdaController_isSpeaking」が0になってしまいます。
「nvdaController_speakText」と「nvdaController_isSpeaking」の間に、100ms程度のウェイトを入れると正常に動作するようですが、読み上げさせるテキストは可変の予定のため、不必要にウェイトを入れるのは好ましくないと考えています。少なくともPC-TalkerやFocusTalk、SAPI5など、他の音声読み上げのAPI利用においては上記のようなコードでも期待通りに同さしています。
上記について、ウェイト以外の何らかの制御命令で対策可能なのか、ご教示頂ければと考えています。なお、ウェイトを入れるのが最良ということでしたら、それはそれでかまいません。