Shell-Script
如何計算輸出持續時間?
say
我的目標是計算使用命令時將文本輸出到音頻需要多長時間。例如,
say
會實時說話:$ say -v Alex "Hello there"
然後我可以結合
say
來time
回答文中的問題,儘管我們要等到實際音頻輸出結束:$ time say -v Alex "Hello there. How long will this take?" real 0m2.993s user 0m0.006s sys 0m0.009s
- 有沒有辦法計算在
say
不實際執行的情況下輸出任何命令需要多長時間?如何?- 如果沒有,我怎麼能用
grep
拉出真實的線?我正在嘗試這樣的事情:
time say -v Alex "Hello there. How long will this take?" | grep "^real .*$"
但是當然沒有結果。
輸出是否沒有傳遞給
grep
,grep
對於這個多行輸出不起作用,或者我使用了錯誤的模式匹配?如果
grep
不工作,會怎樣?更新#1
實際上,我認為我真正在尋找的是生成的音頻文件的持續時間,該文件由
say
.
計時執行
say
- 有沒有辦法計算輸出任何say命令而不實際執行它需要多長時間?如何?
say
我看不到使用該命令提供的任何開關來完成此操作。
- 如果沒有,我該如何使用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
直接從管道輸送到ffmpeg
但say
顯然不能這樣做。其他人根據題為“如何將“說”的輸出通過管道傳輸到另一個命令的問答問答環節得出了相同的結論。參考