Saturday 17 December 2011

scilab-analysing .wav files

scilab で .wav ファイルの分析をしてみよう.色々predefined なのが充実してて驚きである.
一方色々覚えなあかんの大変やなぁという感じ.
かえって一から組むのも楽しいかもしれない.

取り敢えず,自分のPCの中から見つけた .wav のファイルを分析してみる.
英語の短いフレーズが入ったのがあったので,それを発声毎に区切ってみたい.
手を動かしてみることも目的の一つなので,上手いアルゴリズムを考えるより初回は安直に,
その時刻まわりの少しの間の振幅の二乗平均がある値を下回れば音の切れ目と判断してみる.
どうなるかを見て,うまいやりかたはまた考えよう.

今回のソースコードがこちら.
sound0=wavread("blah.wav");//ステレオなので2×nが出てくる
sound1=sound0(1,:);
sound2=sound0(2,:);//片方ずつ取り出す,以下sound1のみ考える
plot2d(sound1)//最初に波形を表示
a=input("input 1 to continue")
if a==1 then
examine=sound1^2;//二乗とった波
chop=length(examine)/200;//「周り」として判断する幅.本来は.wav から情報を取るべき
judge=zeros(1,length(examine));//有音無音の判定をsound1と対応させて記録
for i=1:length(examine),
    if mean(examine(max(i-chop/2,1):min(i+chop/2,length(examine))))>0.001//
    then judge(1,i)=0.4;//見やすさのため0.4で
    end
end
plot2d(judge);//有音無音示す
end
 ここから copy & paste すると改行とかの加減でうまく行かないかもしれないからその時は適当に.
一応結果は
括弧みたいに括られてるのが有音と判定されたところ.
改良の余地は,勿論多いにあるが,ぱっと出のプログラムの割には良好かなと思ってわりと満足.
chop, 閾値の変更でもっときれいに取れるかもしれない.
少なくともたったこれだけでちょっとしたグラフが描けたりするのはさすが scilab, というところか.

何箇所か,アルゴリズム以前の問題として,正書法,あるいはこんなコマンドもあるよ,
みたいな感じで「ここは better な書き方があるんだろうな」と思われるのはあるけど,
まあまずは手札の範囲から.
ハサミもプロが使うと化けるように,手札とも仲良くなっていきたいし,手札も増やしたいところ.
色々触っていこう.

No comments:

Post a Comment