R

Rで音声信号処理(1)

More than 1 year has passed since last update.

はじめに

音声信号処理を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))