to top page
2013-03-21
オーディオファイルを分割して適当につなぎなおす実験――プチ成功編
オーディオファイルからデータを1サンプルずつ取り出してマルコフチェーンに落としこみ、できあがったチェーンから1サンプルずつ取り出してつなぎなおすテストの続き。

材料のオーディオは前に使った data.short
「青い植木鉢」と言っている。


材料オーディオの属性は次の通り。長さは1.2秒。
Channels        : 1
Sample Rate : 16000
Precision : 16-bit
Duration : 00:00:01.20 = 19201 samples ~ 90.0047 CDDA sectors
File Size : 38.4k
Bit Rate : 256k
Sample Encoding : 16-bit Signed Integer PCM

このオーディオを SPTK の dmp コマンドでダンプする。
dmp +s data.short > ueki.txt

ueki.txt を次の Ruby スクリプトに与えると新しいオーディオが生成される。
require 'markov'

chain = MarkovChain.new(1)
while line = gets do
  chain.add line.split(/\t/)[1].to_i
end

audio = []
1.upto(20000) do
  audio.push chain.get
end
print audio.pack("s*")

昨日のテストで使った Chain クラスは単純マルコフ連鎖しか扱えないので、かわりに連鎖の次数を変えられる MarkovChain クラス(markov.rb)を require した。MarkovChain.new の引数で連鎖の次数を指定できる。

次数 N=1,2,3 の場合の結果は次の通り。
N=1
N=2
N=3

N=2 でそれらしい結果が出た。N=3 ではほとんど元のまま。
波形を見ておくと次の通り。

N=1


N=2


N=3


材料オーディオ