あらすじ
訳あって、praat を用いてある音声ファイルのスペクトル解析をする必要が出たときのこと。
えーと、Open から Read from file で音声ファイル選んでと・・・、Analyse spectrum から To Spectrum で・・・、ほんでこいつを Draw してやればいいわけだ。
あとは描画されたのを PNG に保存と。
さて、こいつをあと 70個近くある音声ファイルに・・・。
死んでしまうな、これ。
何か良い手は無いものかと調べてみた。
ターミナル上で praat --help
、すると・・・
--run regard the command line as a script to run, with its arguments
お?スクリプト組んで何かできる臭いぞ?
そうだ、自動化、しよう
と、いうわけで、praat スクリプトを使って先程の退屈な作業を簡単に片付けてみることに。
こちらの記事を一部参考にさせていただきました。
私自身シェルスクリプトに慣れているので、praat script の方は最低限にして、ループとかはシェルスクリプト側で処理してしまうことにします。
単に一定の作業をスクリプトに起こすのは、さして難しくはありません。(後述の GUI 作業履歴スクリプト取得機能のおかげで。)
praat で完結せず sh シェルを利用しているため、(Linux や Mac では問題無いですが) Windows 環境では動作させるのに sh 環境を導入する必要があります。
慣れた言語で手っ取り早く仕事を片付けたかったので、今回はこの手にしました。
praat script
まずは praat script。
こちらが行う動作は、「1つの音声ファイルのスペクトル解析グラフを出力する」だけです。
1からスクリプトを書いても良いのですが、ここでは praat の GUI 作業履歴からスクリプトを作る機能を使うことにします。
praat 起動後、最初のあらすじで書いたような作業を行った後に、Praat Objects
ウィンドウから Praat -> New Praat Script
を選択。
新しく出てきたウィンドウ untitled script
で Edit -> Paste history
を選択します。
さてさて、得られたスクリプトは・・・。
Read from file: "/home/akuad/audio.wav"
To Spectrum: "yes"
Draw (log freq): 10, 10000, 0, 0, "yes"
Save as 300-dpi PNG file: "/home/akuad/plot.png"
ふむ、1行目の所に入力ファイル、4行目の所に出力ファイルを書くようにしてやればいいわけだ。
あとは、入力ファイル、出力ファイルをコマンドライン引数から指定できるように変えてやるだけです。
絶対パスを指定するため (相対パスでも良いのかも?)、入出力ファイルのディテクトリの指定も受け取ります。
form
構文から引数を受け取ることができます。(GUI で praat script を読み込んで実行したとき、form 入力のダイアログが出てきます。)
これをこうしてああして・・・こうじゃ。
form
text fdir
text fnamein
text fnameout
endform
Read from file: fdir$ + "/" + fnamein$
To Spectrum: "yes"
Draw (log freq): 10, 20000, 0, 0, "yes"
Save as 300-dpi PNG file: fdir$ + "/" + fnameout$
変数を入れるには 変数名$
と。
文字列を結合するには +
でつなげれば良いようです。
このスクリプトを使うには、端末上で以下のように実行します。
./praat --run spect.praat "`pwd`" "in.wav" "plot.png"
シェルスクリプト
ここまで来たら、あとは上で作ったスクリプトをこちらでループで回してやるだけです。
(praat の実行ファイルをパスで指定、またはパスの通った所に配置する必要があります。)
for f in data/*.wav; do
./praat --run spect.praat "`pwd`" "$f" "${f%.*}.png"
done
f=sound.wav
のとき、${f%.*}
-> sound
同じく、${f%.*}.png
-> sound.png
実行
上記の praat script とシェルスクリプトを同じディレクトリ上に配置。
同ディレクトリ上に data
ディレクトリを作って、解析する音声ファイルをその中に配置。
data/
|-audio01.wav
|-audio02.wav
|-audio03.wav
praat (praat 実行ファイル)
spect.praat
spect.sh
そしてシェルスクリプトを実行します。
chmod +x spect.sh
./spect.sh
ね?簡単でしょう?