2014-01-26 24 views
1

嗨我正在使用语音合成在Mac上进行实验,并且我总是将while循环放在我的程序中,以便我可以使用它们直到我决定停止,并且使用此代码重复“您希望我说什么?同时它说了我所说的任何话。如何让Python等到前一个任务完成?

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等待,直到它说完我告诉它什么?

+0

那么这取决于什么'sp.startSpeaking'呢? NSSpeechSynthesizer的责任似乎比Python本身更重要。那个类没有类似'sp.waitUntilIsSaid'的方法吗? –

+1

我无法测试它,所以我不会让它成为答案,但请查看API中的实例方法'isSpeaking'(https://developer.apple.com/library/mac/documentation/Cocoa/参考/ ApplicationKit /类/ NSSpeechSynthesizer_Class/Reference/Reference.html#jumpTo_12)似乎你可以循环,直到_it不speaking_。这样你可以等待它完成。 –

+0

@PauloBu这篇文档对Python的使用非常不清楚。你对我如何使用它有任何想法吗? – user3151828

回答

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' 

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

希望这会有所帮助!

+0

这将使用100%的CPU等待语音停止。除此之外,这将浪费便携式用户的电池。你想在循环体中抛出一个'time.sleep(0.1)'或者什么来代替'continue'。 – kindall

+0

@ kindall我现在正要编辑有关这个问题,并建议“睡眠”。如果有像'callback'这样的东西,我首先会看API。非常感谢您指出。 –

0

问题是语音API会异步讲话。我对这个特定API没有任何了解,但为了使这些代码正常工作,您必须在循环中轮询或找到指定您的呼叫应该被阻止的参数。此问题与此API的工作方式特别相关。

对于此任务,假设您使用的是Mac,则可以改为使用命令行。在继续之前,这将等待演讲结束。

import subprocess 

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

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