Rで音声解析

MikuHatsune2013-11-07

またコミケでの声優統計ネタで声優の音声解析をやろうと思った。
Rで音声解析をやろうと思ってやったら.wavが読み込めなくて諦めていたが実は loadSample ではなく readWave もしくは readMP3 だとうまくいくことに気づいたのでやってみる。
ubuntuでできなかったのでwindowsでやる。ここらへんのことをやると直りました。
パッケージはseewave, tuneRをインストールする。soundはもう使われていないので古いソースをインストールする。

library(sound)
library(tuneR)
library(seewave)

data(tico)

# スペクトルの表示
plot(tico)
oscillo(tico) # plot と同じ
spectro(tico)


 
2つの音声の類似度はCross-Covarianceを用いて計算される。入力の音声の長さは同じでないといけないらしい。nを大きくすると2つの音声の重ね合わせを動かす幅を小さくして細かく計算する。つまり遅い。
同じ音声を入力すればCross-Covarianceは1になる。

note1 <- cutw(tico, f=22050, from=0.5, to=0.9)
note2 <- cutw(tico, f=22050, from=0.9, to=1.3, plot=TRUE) # どこが抽出されたかプロットしてくれる。
covspectro(note1, note2, f=22050, n=37)




 
無音っぽい部分を抽出する。

par(mfrow=c(2, 1), mar=c(2, 4, 1, 2))
timer(tico, f=22050, threshold=5, msmooth=c(50, 0))
par(mar=c(5, 4, 1, 2))
oscillo(tico)


 
周波数分析をする。主成分分析とかいてあるがそういうことなんだろう(どういうことだってばよ…)

# 周波数分析
ptico <- periodogram(tico, normalize=TRUE, width=512, overlap=512-64)
image(ptico, col=grey(seq(1, 0, length=1000)))
# 主成分分析
ff <- FF(ptico)
plot(ff)


 
音声の合成は四則演算でできるっぽい。ただし、音声の長さが一致していないといけないっぽい。

# プロットしたら微妙に変わっているのがわかる。
spectro(tico * sin(2*pi*seq(0, 1, length=length(tico))))