研究で使用する音声ファイルは可逆性が必要なので、WAVファイルやAIFFファイルといった無圧縮のファイル形式を使用することが多いです。WAVファイルをRで読み書きできる機能はtuneRパッケージに提供されており、「WAVファイルの読み書き」でも使い方を説明しています。
一方で、長い音や多くのファイル数を扱うと、より大きなハードディスク容量を必要としますので、ファイルを小さくしたいのも事実です。かといってMP3やAACのような音質劣化を伴う非可逆圧縮を使用することは望ましくありません。FLACやApple Losslessのような可逆圧縮がRからシームレスに使えると便利です。
そこで、(自分が使っているMac OS Xが対象ですが)FLACファイルを読み書きできるような関数を作りました。ただ、FLACの読み書きを直に書くのはハードルが高いので、一時的にWAVファイルを書き出しておき、バックグラウンドでFLACに変換することにしました。そのために、コマンドラインで実行できるFLAC変換するバイナリ(flac
)をあらかじめインストールしておきます。
Homebrewを使用するとインストールが簡単です。
$ brew install flac
上記で書いたように、FLACの読み書きはflac
のラッパーとして実現しました。tempfile()
によって一時的に使用できるファイル名を取得して、一時ファイルとして使います。また、flac
はsystem()
関数で呼び出しています。
readFLAC <- function(filename) {
require(tuneR)
tmpfile <- tempfile()
system(sprintf("flac -d -o %s.wav %s", tmpfile, filename))
wavobj <- readWave(sprintf("%s.wav", tmpfile))
file.remove(sprintf("%s.wav", tmpfile))
return(wavobj)
}
writeFLAC <- function(object, filename) {
require(tuneR)
tmpfile <- tempfile()
writeWave(wavobj, sprintf("%s.wav", tmpfile))
system(sprintf("flac -o %s %s.wav", filename, tmpfile))
file.remove(sprintf("%s.wav", tmpfile))
return(wavobj)
}
この関数がアタッチされていれば、以下のようにFLACファイルの書き出し・読み込みができます。
writeFLAC(wobj, "filename.flac")
wobj <- readFLAC("filename.flac")