2014-01-26 23 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")