R言語でWaveファイル、録音、再生
C# で書いていたWavIO2.DLLを元に、R言語のエクステンションを作って見ました。
機能は、WAV形式ファイルの読み書きと録音再生です。
16ビットサンプルのモノとステレオを扱います。
制限は、
- 全てメモリ上の処理で、ファイルを分割して読み書きできません。
- 録音も直接ファイルへ格納することはできません。
ベクターにアップロードしました。
「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にして、チャネル数とサンプリングレートを含めておけば、再生には便利になります。
|