←戻る

WAVファイルの読み書き / Reading and Writing WAV files

RでWAVファイルの読み書きをはじめとする音の編集を行うにはtuneRパッケージを用いるとよい。

WAVの読み込み

ライブラリの使用開始とWAVファイルの読み込み。16ビットのファイルなら(-32768)〜(+32767)の範囲で読み込まれるため、([-1,+1))の範囲に変換すると、のちのち好都合なときが多い。

library(tuneR)
wavobj <- readWave(file.path("file_in.wav"))
fs <- wavobj@samp.rate             # サンプリング周波数 sampling frequency
nbits <- wavobj@bit                # 量子化ビット数 quantization bits
xL <- wavobj@left / 2^(nbits-1)    # 左チャンネルの信号を[-1,+1)に変換
xR <- wavobj@right / 2^(nbits-1)   # 右チャンネルの信号を[-1,+1)に変換

波形の確認

波形をプロットするときには以下のように行う。

plot(wavobj)

plot of chunk unnamed-chunk-2

([-1,+1))の範囲への変換後は以下のように。上記の方法よりもだいぶ時間がかかるので注意。

t <- (0:(length(xL)-1)) / fs
plot(t, xL, type="l", xlab="Time (s)", ylab="Amplitude", ylim=c(-1,+1))
grid()

plot of chunk unnamed-chunk-3

音の再生

音の再生はOS Xだと/usr/bin/afplayコマンドを使うように指定する必要がある。

play(wavobj, "/usr/bin/afplay")

WAVへの書き出し

一通り処理が終わったらファイルに書き出す。

wavobj@left <- xL * 2^(nbits-1)
wavobj@right <- xR * 2^(nbits-1)
writeWave(wavobj, file.path("file_out.wav"))

2チャンネルを超えるWAVファイルの扱い

tuneRのバージョン0.4-1では1chか2chのファイルしか扱えなかったが、バージョン1.0からマルチチャンネルもサポートされるようになった。

Waveオブジェクトは2チャンネルのファイルまでしか扱うことができない。しかし、サラウンドの音源作成などで2チャンネルを超えるファイルを扱いたいときもある。そのときにはWaveMCオブジェクトを使用する。

もちろん2チャンネルのファイルにWaveMCオブジェクトを使用しても良いのだが、tuneRをはじめとするパッケージのユーティリティ関数はWaveオブジェクトを入力とするものが多いため、2チャンネルまでのファイルであれば当面Waveオブジェクトを使用するほうが便利だろう。

WAVファイルの読み込み

tuneRのreadWave()を用いるとWAVファイルを読み込むことができる。filenameで読み込むファイル名を指定する。toWaveMC=TRUEはマルチチャンネル・オーディオに対応した形式で読み込むための方法だ。

wavobj <- readWave(filename="drums.wav", toWaveMC=TRUE)

WaveMCオブジェクト内にあるスロットのうち波形サンプルデータはleftrightではなく、.Dataという二次元行列(行がサンプル、列がチャンネル)となる。

x1 <- wavobj@.Data[,1]   # [,n]でnチャンネル目を指定する
fs <- wavobj@samp.rate   # サンプリング周波数
nbits <- wavobj@bit      # 量子化ビット数

WAVファイルの保存

信号を保存するときにはWaveMCオブジェクトを作り、そのオブジェクトをwriteWave()に渡す。その際、所望の量子化ビット数にあわせた振幅範囲に変換した上で、サンプリング周波数と量子化ビット数を指定する。

# データ、サンプリング周波数、量子化ビット数を指定してWaveMCオブジェクトを作成
wavobj <- WaveMC(data=x1, samp.rate=fs, bit=nbits)
# どのチャンネルに出力するものか指定
colnames(wavobj) <- c("FL")
# ファイル名を指定して保存
writeWave(object=wavobj, filename="hoge.wav")

WaveMCオブジェクトを保存する際には、データがどの再生チャンネルに向けて用意されたものであるかを指定する必要がある。

たとえば、ITUのチャンネル順序に従う5.1チャンネルのファイルを作成したいときには

colnames(wavobj) <- c("FL", "FR", "FC", "LF", "BL", "BR")

のように指定する。このような指定ができる背景には、自分が作成したWAVオブジェクト中のチャンネル順が、必ずしもITUやSMPTEの推奨するチャンネル順に並んでいない場合があることによる。

FLなどのタグ名についてはMCnamesで表示されるnameを使用する。以下のようにMCnamesを見ると、Top Front Left(TFL)などといった上方スピーカへの出力も考慮されている。これはWAVファイルの定義として、18チャンネルまで用意されているものである。(現状では2016年8月に試験放送が始まった22.2chなどには対応できていないが、今後3次元オーディオ用に34チャンネルまでの拡張が計画されている。)

MCnames
##    id                 label name
## 1   1            Front Left   FL
## 2   2           Front Right   FR
## 3   3          Front Center   FC
## 4   4         Low Frequency   LF
## 5   5             Back Left   BL
## 6   6            Back Right   BR
## 7   7  Front Left of Center  FLC
## 8   8 Front Right of Center  FRC
## 9   9           Back Center   BC
## 10 10             Side Left   SL
## 11 11            Side Right   SR
## 12 12            Top Center   TC
## 13 13        Top Front Left  TFL
## 14 14      Top Front Center  TFC
## 15 15       Top Front Right  TFR
## 16 16         Top Back Left  TBL
## 17 17       Top Back Center  TBC
## 18 18        Top Back Right  TBR

参考



[←戻る](index.html)