またコミケでの声優統計ネタで声優の音声解析をやろうと思った。
昔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))))