如何使python等到上一个任务完成?

时间:2014-01-26 15:26:22

标签: python while-loop speech-synthesis

您好我正在使用Mac上的语音合成进行实验,并且我总是在我的程序中添加while循环以便我可以使用它们直到我决定停止,并且使用此代码重复“您希望我说什么? “同时它说出我要说的任何内容。

from Cocoa import NSSpeechSynthesizer
while 1==1
    sp = NSSpeechSynthesizer.alloc().initWithVoice_(None)
    sp.startSpeakingString_("What would you like me to say?")    
    say_1 = raw_input("What would you like me to say?")
    sp.startSpeakingString_(say_1)

有人能告诉我如何告诉python等到完成后说出我告诉它的内容吗?

2 个答案:

答案 0 :(得分:1)

看来你正在寻找NSSpeechSynthesizer instance method: isSpeaking。您可以编写一个轮询循环来测试它是否正在发声并且一旦它不再继续工作。像这样:

import time
from Cocoa import NSSpeechSynthesizer
while 1:
    sp = NSSpeechSynthesizer.alloc().initWithVoice_(None)
    sp.startSpeakingString_("What would you like me to say?")    
    say_1 = raw_input("What would you like me to say?")
    sp.startSpeakingString_(say_1)

    while sp.isSpeaking():    # loop until it finish to speak
        time.sleep(0.9)       # be nice with the CPU

    print 'done speaking'

更新:循环内的time.sleepcontinue更好。后者会浪费大量的CPU和电池(正如@kindall所指出的那样)。

希望这有帮助!

答案 1 :(得分:0)

问题是语音API异步说话。我对这个特定的API一无所知,但为了使这个代码工作,你必须在循环中轮询或找到一个指定你的调用应该阻塞的参数。此问题与此API的工作方式有关。

对于此任务,假设您使用的是Mac,则可以使用命令行。这将等待演讲结束,然后再继续。

import subprocess

def say(text):
    subprocess.call(["say", text])

print("Before")
say("Wait for me!")
print("After")