2

嗨,我正在 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 等到它完成后说出我告诉它的内容吗?

4

2 回答 2

1

看来您正在寻找NSSpeechSynthesizer实例方法: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 所指出的那样)。

希望这可以帮助!

于 2014-01-26T16:19:52.190 回答
0

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

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

import subprocess

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

print("Before")
say("Wait for me!")
print("After")
于 2014-01-26T15:35:02.927 回答