mikeo_410


R言語でWaveファイル、録音、再生

C# で書いていたWavIO2.DLLを元に、R言語のエクステンションを作って見ました。
機能は、WAV形式ファイルの読み書きと録音再生です。
16ビットサンプルのモノとステレオを扱います。
制限は、

  1. 全てメモリ上の処理で、ファイルを分割して読み書きできません。
  2. 録音も直接ファイルへ格納することはできません。

ベクターにアップロードしました。
R言語のスクリプトから録音再生、WAV入出力

作成したエクステンションの詳細は、「WavIO DLL R言語 エクステンション」に書きました。

 

> r <- wav16record()
> plot(r,type="l")
> title(main="「あ」と言ってみた(全体ー2秒)")
 

 デフォルトで11025Hz、モノラルで2秒間録音します。
左図は、2秒分をプロットしたものです。

R言語の関数wav16record()は、以下のようになっています。 

> wav16record
function(ch=1, hz=11025, sec=2){
  if(hz<8192) stop("hz too small.")
  if((ch<1) || (ch>2)) stop("ch 1:mono, 2:stereo.")
  if((sec<1) || (sec>5)) stop("0<sec<=5.")
  result <- .Call("wav16pcm_record",ch,hz,sec)
  return(result)
}

   

 

ここから、C++の関数を呼び出し、C#の本体で処理をしています。 

> plot(r[11000:15000],type="l")
> title(main="「あ」と言ってみた(部分ー360ms)")
 

 左図は、振幅の大きな部分を拡大したものです。

 

 

 

 

 

 

 

 

 

 

 ステレをWAVファイルを読み込んで、左右を分離する例です。

> r <- wav16read("/windows/media/chimes.wav")
[1] 27842
> plot(r$pcm,type="l")
> title(main="chimes.wav(左右混合)")

> ch_L <- r$pcm[seq(1,by=2,length.out=(length(r$pcm)/2))]
> ch_R <- r$pcm[seq(2,by=2,length.out=(length(r$pcm)/2))]
> plot(ch_L[6000:6100],type="l",ylim=c(-6000,6000))
> par(new=T)
> plot(ch_R[6000:6100],type="l",ylim=c(-6000,6000),col=2)
>title(main="chimes.wav(左:黒、右:赤)")

 

 

 

 

 

 R言語のスクリプトで、奇数、偶数に分けることで、ステレオの左右を分離できます。

合成も同様に行えます。

> r <- wav16read("n.wav")
> str(r)
List of 3
 $ ch : int 1
 $ hz : int 16000
 $ pcm: int [1:92383] 0 -16 -17 -21 -22 -14 -14 -13 -28 -25 ...
> x[seq(1,by=2,length.out=length(r$pcm))] <- r$pcm
> x[seq(2,by=2,length.out=length(r$pcm))] <- r$pcm
> wav16play(x)
[1] 184766
> wav16play(x,ch=2)
[1] 184766
> wav16play(x,ch=2,hz=16000)
[1] 184766

 

この実行結果では、読み込んだデータの構造を、str()で表示しています。LISTで、WAVファイルに書かれていた、チャネル数とサンプリングレートを付与しています。

wav16play()で、再生してみました。のろのろ再生されます。デフォルトでは、チャネルが1で、11025Hzなので正しく再生できません。正しいチャネル数とサンプリングレートを与えれば正常に再生できました。
ここで再生しているデータ x  は、ベクトルです。r と同じように、LISTにして、チャネル数とサンプリングレートを含めておけば、再生には便利になります。

 

 

 


アルパイン クリック証券 FX 保険 見直し ノベルティ 千葉 不動産