出力期間を計算する方法は?

出力期間を計算する方法は?

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
  1. say実際にコマンドを実行せずにコマンドを出力するのにかかる時間を計算する方法はありますか?どのように?
  2. そうでなければ、grep実際の糸を引き出すためにどのように使用できますか?

私は次のことを試しています:

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

しかし、もちろん何も出ませんでした。

出力がに渡されないgrepgrepこの複数行出力に対して機能しない、または誤ったパターンマッチングを使用していますか?

うまくいかないとgrepどうなりますか?

アップデート#1

実際、私が本当に探しているのは、結果のオーディオファイルの持続時間だと思いますsay

答え1

タイマーの実行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 ...コマンドをサブシェルにラップし、STDOUTとSTDERROR(|&)にリダイレクトしますgrep。特定のバージョンのBashで動作しない場合、この2>&1形式は同じことを行います。|&

/dev/空

ただし、-o <file>パラメータをに使用すると、sayテキストをオーディオに翻訳する速度を上げることができます。実際にオーディオファイルは必要ないので、/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他の人も「Q&Aに尋ねてください」というタイトルの質問と回答に基づいて同じ結論に達しました。「say」の出力を別のコマンドにパイプする方法

引用する

関連情報