LoginSignup
1
2

More than 5 years have passed since last update.

音データセット全体の時間長を計算したいときのシェル芸

Posted at

はじめに

音に関する識別実験などを行っていると,音クラス毎に時間長を計算したいときがあります.わざわざスクリプトを書くほどの計算でもないため,ワンライナーでどうにか計算するというのがモチベーションです.

環境

  • 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 みたいなフォーマットで時間長を見れます.

おわりに

なんとなく書いてみただけなのですが誰かの役に立てばと思いつつ終わります.

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2