Shell-Script

如何計算輸出持續時間?

  • July 22, 2018

say我的目標是計算使用命令時將文本輸出到音頻需要多長時間。

例如,say會實時說話:

$ say -v Alex "Hello there"

然後我可以結合saytime回答文中的問題,儘管我們要等到實際音頻輸出結束:

$ time say -v Alex "Hello there. How long will this take?"

real    0m2.993s
user    0m0.006s
sys     0m0.009s
  1. 有沒有辦法計算在say不實際執行的情況下輸出任何命令需要多長時間?如何?
  2. 如果沒有,我怎麼能用grep拉出真實的線?

我正在嘗試這樣的事情:

time say -v Alex "Hello there. How long will this take?" | grep "^real   .*$"

但是當然沒有結果。

輸出是否沒有傳遞給grepgrep對於這個多行輸出不起作用,或者我使用了錯誤的模式匹配?

如果grep不工作,會怎樣?

更新#1

實際上,我認為我真正在尋找的是生成的音頻文件的持續時間,該文件由say.

計時執行say

  1. 有沒有辦法計算輸出任何say命令而不實際執行它需要多長時間?如何?

say我看不到使用該命令提供的任何開關來完成此操作。

  1. 如果沒有,我該如何使用grep來拉出真實的線路?

要解析time輸出,您可以執行以下操作:

$ ( time say -v Alex "Hello there. How long will this take?" ) |& grep real
real    0m2.987s

或者:

$ ( time say -v Alex "Hello there. How long will this take?" ) 2>&1 | grep real
real    0m2.987s

在上面,我們將time ...命令包裝在一個子 shell 中,然後將 STDOUT 和 STDERROR ( |&) 重定向到grep. 在不適用於您的特定版本的 Bash的情況下,該2>&1表單會執行相同的操作。|&

/dev/null

順便說一句,如果您使用-o <file>參數 tosay您可以加快文本到音頻的翻譯。在這裡,由於我們實際上並不想要音頻文件,因此我們/dev/null改為:

$ ( time say -v Alex "Hello there. How long will this take?" -o /dev/null ) |& grep real
real    0m0.310s

或者:

$ ( time say -v Alex "Hello there. How long will this take?" -o /dev/null ) 2>&1 | grep real
real    0m0.283s

請注意,當不必使用揚聲器執行此操作時,它的速度有多快,這就是使用音頻 I/O 的延遲。相反,通過定向到文件,效率更高。

計算音頻的持續時間

要確定生成say的音頻文件的持續時間,您可以執行以下操作:

$ say -v Alex "Hello there. How long will this take?" -o a.aiff && \
   ffmpeg -i a.aiff 2>&1 | grep Duration && rm a.aiff
 Duration: 00:00:02.85, start: 0.000000, bitrate: 364 kb/s

在這裡我們可以看到生成的音頻的持續時間是 2.85 秒。

進一步改進?

我研究了將輸出say直接從管道輸送到ffmpegsay顯然不能這樣做。其他人根據題為“如何將“說”的輸出通過管道傳輸到另一個命令的問答問答環節得出了相同的結論。

參考

引用自:https://unix.stackexchange.com/questions/457113