LoginSignup
5
4

More than 5 years have passed since last update.

Rで音声信号処理(1)

Last updated at Posted at 2017-12-02

はじめに

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