はじめに
音声信号処理をRでやっている人が少なそうなので,気が向いた時に書いてみたい。便利だよ。
Rの基礎知識
は,あると想定しております
Waveファイルの扱い
パッケージ導入
Waveファイルを扱うには,tuneR パッケージを使う。
install.packages("tuneR")
で導入しておこう。
読み書き
Waveファイルを読むのはreadWave()
,書くのはwriteWave()
library(tuneR)
w <- readWave("foo.wav")
writeWave(w,"foo2.wav")
readWave()
が返すのは(元のWaveが2チャンネル以下の場合)Waveオブジェクト。
-
w@left
は左チャネル(1番目のチャネル)の値を表すベクトル -
w@right
は右チャネル(2番目のチャネル)の値を表すベクトル -
w@stereo
は1チャネル信号なら FALSE,2チャネル信号なら TRUE -
w@samp.rate
はサンプリング周波数 -
w@bit
は量子化ビット数 -
w@pcm
はPCM形式かどうか(PCMでなければ浮動小数系列)
w@left
を取り出して使えば,音データをサンプル値列として使うことができる。Matlabと違って,読んだ時点で正規化は行われないので,16ビット量子化なら-32768~32767の値を持つ。
MP3ファイルは読むことだけできる。関数はreadMP3(filename)
再生・表示
play(w)
で外部の再生アプリを呼び出して音を再生する(Windowsの場合にはMedia Playerが呼ばれる)。アプリを終了しないとRに制御が戻らない。再生に使うアプリはgetWavPlayer()
でチェックでき,setWavPlayer()
で指定ができる。
plot(w)
で波形を表示する。サンプルを1点ずつ表示しているわけではなく,長い波形でも高速に描画する。
基本的な操作
-
channel(w,"left")
特定のチャネルを選ぶ。結果もWaveオブジェクト -
extractWave(w,from=0,to=1,xunit="time")
音声きりだし。fromとtoで始点と終点を指定。xunit="time"
だと時間(秒),xunit="samples"
だとサンプル数として始点と終点の数字を解釈する。 -
Wave(vector,samp.rate=16000,bit=16)
ベクトルをWaveオブジェクトに変換する。
こんなこともできる
スペクトル分析
-
powspec(vector,sr=samplingrate,wintime=0.25,steptime=0.10,dither=FALSE)
パワースペクトル計算。窓関数はハミング -
audspec(powerspectrum,sr=samplingrate,fbtype="bark")
聴覚スペクトルの計算。入力はパワースペクトル -
melfcc(w)
MFCC計算。そのままだとHTKとは若干定義の違う計算をする。パラメータを調整することでHTK互換にすることが可能(やりかたはマニュアルに書いてある)。 -
deltas(x,w=windowlength)
Δ係数の計算。windowlength
は計算のフレーム幅(デフォルトは9)。これを使うと,次のような感じでMFCC+Δが計算できる。
mfc <- melfcc(w)
mfc <- cbind(mfc,deltas(mfc))