我可以在bash脚本中与OSX“say”命令的输出进行交互吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以在bash脚本中与OSX“say”命令的输出进行交互吗?相关的知识,希望对你有一定的参考价值。

我在终端中运行以下行:

say "hello, this is the computer talking" --interactive

当我运行此命令时,计算机会在引号中说出单词并突出显示单词。我想做的是获得每个口语的时间。例如:

  • 00.00你好
  • 01.23这个
  • 01.78是
  • 02.10
  • 02.70电脑
  • 03.30说话

我想知道是否有任何方法可以编写一个与该行输出交互的bash脚本。

答案

这是一个几乎完全符合你想要的Zsh脚本。

#!/bin/zsh
zmodload zsh/datetime
say --interactive "hello, this is the computer talking" | {
    counter=0
    while IFS= read -r -d $'
' line; do
        (( counter++ )) || continue  # first line in the output of `say --interactive` suppresses the cursor; discard this line
        timestamp=$EPOCHREALTIME
        (( counter == 2 )) && offset=$timestamp  # set the timestamp of the actual first line at the offset
        (( timestamp -= offset ))
        printf '%05.2f %s
' $timestamp ${${line%$'e[m'*}#*$'e[7m'}
    done
}

样本输出:

00.00 hello
00.26 ,
00.52 this
00.65 is
00.78 the
01.36 computer
02.04 talking

如果你想将它转换为bash,那么浮点运算需要在bc这样的外部命令中完成,并且要获得精确的时间戳,你需要coreutils datetimestamp=$(gdate +%s.%N))。

顺便说一句,如果您不想看到逗号,可以将其过滤掉。

以上是关于我可以在bash脚本中与OSX“say”命令的输出进行交互吗?的主要内容,如果未能解决你的问题,请参考以下文章

Bash 脚本将命令输出存储到变量中

在 bash 脚本中执行命令,直到输出超过某个值

在 Python 中与另一个命令行程序交互

如何在 bash 脚本中为命令输出着色?

Bash 循环 ping 成功

需要 sudo 密码的 Bash 脚本