はじめに
音に関する識別実験などを行っていると,音クラス毎に時間長を計算したいときがあります.わざわざスクリプトを書くほどの計算でもないため,ワンライナーでどうにか計算するというのがモチベーションです.
環境
- OS: Ubuntu 16.04
- 必要なソフトウェア: SoX
SoX は音データを取り扱う際に非常に便利なコマンドを提供してくれるため,入れておくと何かと便利です.以下のようにインストールできます.
sudo apt install -y sox
本題
背景でも申したとおり,path_to_dataset
以下に,たくさんの wav ファイルが格納されていて,それらを合算した時間長を取得するという問題にします.
SoX を入れたことで,soxi
コマンドが使えるようになっているはずです.たとえば,soxi
を使うと以下のような出力を得ることが出来ます.
Input File : 'path_to_dataset/A1_0000.wav'
Channels : 1
Sample Rate : 16000
Precision : 16-bit
Duration : 00:00:01.00 = 16000 samples ~ 75 CDDA sectors
File Size : 32.0k
Bit Rate : 256k
Sample Encoding: 16-bit Signed Integer PCM
そのため,この Duration の項を用いてしまえば,割と簡単に目的を達成できます.
find path_to_dataset/ -type f | \
xargs soxi | \
grep Duration | \
awk '{print $3}' | \
tr ':.' ' ' | \
awk '{sum += $3; sum += $2*60; sum += $3*3600} END {s = int(sum%60); sum /= 60; m = int(sum%60); sum /= 60; h = int(sum%60) print h":"m":"s}'
ちょっと長いので,可読性意識して改行してみましたw とりあえず,これで 2:44:2
みたいなフォーマットで時間長を見れます.
おわりに
なんとなく書いてみただけなのですが誰かの役に立てばと思いつつ終わります.