0

我已经开始使用 Ruby on Rails 为 Siri 代理服务器制作一些插件。我对 Ruby 没有经验,但已经掌握了基础知识。

我做了什么:

################ 命令

 listen_for (/show a demo to (.*)/i) do |name|
   show_demo
   request_completed
 结尾

################ 行动

 def show_demo(名称)
    说“嗨#{name},让我为你做一个快速演示。”  
        说“例如,如果你告诉我‘打开侧灯’,我会像现在一样打开客厅的侧灯……”  
          系统“/usr/local/bin/tdtool --on 2”  
        说“那是侧灯,现在如果我可以为你打开画廊,就告诉我‘打开画廊’这样......”  
        系统“/usr/local/bin/tdtool --on 3”
        说“这只是我在改装后可以做的部分事情。”  
        说“现在我将关闭所有设备……”  
          系统“/usr/local/bin/tdtool --off 3”  
          系统“/usr/local/bin/tdtool --off 2”  
        说“谢谢#{name},再见。”

 结尾

问题是当我开始演示时,所有动作system "..."都在 Siri 开始说话之前执行。我怎样才能延迟上述行动,以便在我想要的话之后及时将它们放在正确的位置执行它们?

先感谢您。

4

1 回答 1

0

问题是它say不会等待 Siri 真正说出这些话,它只是将一个数据包发送到你的 iDevice,然后继续。我能想到的最简单的方法是等待几秒钟,具体取决于文本的长度。所以首先我们需要一个方法来给我们等待的时间(以秒为单位)。我尝试使用 OSX 内置say命令并得到以下结果:

$ time say "For example if You tell me 'Turn on sidelight' I will turn the sidelights in Living room like now..."
say   0,17s user 0,05s system 3% cpu 6,290 total

$ time say "That was the sidelights, and now if like I can turn on the gallery for You, just tell me 'turn on gallery' like so...  "
say   0,17s user 0,06s system 2% cpu 8,055 total

$ time say "This only part of things I can do after mod."
say   0,13s user 0,04s system 5% cpu 2,996 total

所以这意味着我们有以下数据:

# Characters w/o whitespace   |   Seconds to execute
------------------------------+---------------------
                         77   |                6.290
                         87   |                8.055
                         34   |                2.996

这使我们每个字符平均有大约0.0875几秒钟的时间。您可能需要自己评估场景的平均时间并使用更多样本。此函数将换say行,然后等待 Siri 说出文本:

def say_and_wait text, seconds_per_char=0.0875
  say text
  num_speakable_chars = text.gsub(/[^\w]/,'').size
  sleep num_speakable_chars * seconds_per_char
end

wheregsub(/[^\w]/,'')将从字符串中删除任何非单词字符。现在你可以用它来简单地说一些东西并等待它被说出来:

say_and_wait "This is a test, just checking if 0.875 seconds per character are a good fit."

或者您也可以在特殊情况下覆盖持续时间:

say_and_wait "I will wait for ten seconds here...", 10

请让我知道这对你有没有用。

于 2013-04-29T11:06:19.247 回答