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
。
答え1
タイマーの実行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 ...
コマンドをサブシェルにラップし、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
出力を直接パイプする方法を見てみましたが、そうすることはできないようですffmpeg
。say
他の人も「Q&Aに尋ねてください」というタイトルの質問と回答に基づいて同じ結論に達しました。「say」の出力を別のコマンドにパイプする方法。