1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

praat + シェルスクリプトで複数ファイルまとめて処理&グラフ保存

Last updated at Posted at 2022-01-17

あらすじ

訳あって、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 を選択。

praat-objects.png

新しく出てきたウィンドウ untitled scriptEdit -> Paste history を選択します。

untitled-script.png

さてさて、得られたスクリプトは・・・。

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 入力のダイアログが出てきます。)

これをこうしてああして・・・こうじゃ。

spect.praat
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 の実行ファイルをパスで指定、またはパスの通った所に配置する必要があります。)

spect.sh
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

ね?簡単でしょう?

1
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?