SVSFlag = 11 # SVSFIsXML | SVSFlagsAsync | SVSFPurgeBeforeSpeak
SVSFlagsAsync
は「Speak
は音声再生処理を開始するが再生完了を待たずに返ってくる(つまり後続する他の処理と並行して音声の再生を行える)」という意味だと思います。このフラグを指定して再生した場合、もし後続する処理が何もなくてPythonインタープリタの実行が完了してしまうと「バックグラウンドでの非同期再生も自動的に停止」というような動作となり結果として「音が再生されない」ことになるのではないでしょうか。実際にWindows10 (ver 1803), Python 3.7.0, pywin32 224で試したところ生成音が聞こえずにプログラムが終了する現象が再現しました。
とりあえずSVSFlagからSVSFlagsAsyncのビット(=0b1みたいです)を除くと、期待通りに同期的な再生(再生完了後にSpeak
から戻ってくる)が行えるように見えました。
Python
1import win32com.client
2
3speech = win32com.client.Dispatch("Sapi.SpVoice")
4SVSFlag = 0b1011 # SVSFIsXML | SVSFlagsAsync | SVSFPurgeBeforeSpeak
5SVSFlag = 0b1010 # SVSFIsXML | SVSFPurgeBeforeSpeak
6
7voiceInfo = speech.GetVoices()
8for i in range(voiceInfo.Count):
9 voice_name = voiceInfo.Item(i).GetAttribute("Name")
10 print("(" + str(i) + ") " + voice_name)
11
12voiceNo = voiceInfo.Count - 1 # 自分の環境では1
13voice = voiceInfo.Item(voiceNo) # 自分の環境ではZiraの音声
14
15print("current voice is ", speech.Voice)
16
17speech.Voice = voice
18# speech.SetVoice(voice) # (参照:https://teratail.com/questions/124906)
19
20for sentence in ["Stop, Dave", "I'm afraid, Dave", "Dave, my mind is going"]:
21 print('before speak: ' + sentence)
22 speech.Speak(sentence, SVSFlag)
23 print('after speak: ' + sentence)
なおネットを漁ると
python
1from win32com.client import constants
2...
3
4SVSFlag = constants.SVSFlagsAsync | ...
5...
のようなコードが見つかるのですが自分の環境(前述)だと「constantsにSVSFlagsAsyncというプロパティーがない」というエラーになってしまいました。本来このconstantsはCOMオブジェクトの定数のproxyとして動作することが期待なのだと思いますが、自分が使っているpywin32ではconstantsは単なる空の辞書でしかないように見えたのでimport自体不要と判断しました。類似機能のpypiwin32といったものがもあるのでそういうものを使った場合は意味が出てくるのかも知れません。(そこまでは試してません。)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/07 03:54