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

材料のオーディオは SPTK の導入時に利用した data.short の一部。
「あおいうえき」と言っている。


材料オーディオの属性は次の通り。長さは0.62秒。
Channels        : 1
Sample Rate : 16000
Precision : 16-bit
Duration : 00:00:00.62 = 10000 samples ~ 46.875 CDDA sectors
File Size : 20.0k
Bit Rate : 257k
Sample Encoding : 16-bit Signed Integer PCM

まずこのオーディオを SPTK の dmp コマンドでダンプする。
aoiue.raw が材料オーディオ、aoiue.txt がダンプされたテキストデータ。
dmp +s aoiue.raw > aoiue.txt

この aoiue.txt を次の Ruby スクリプトに与えると、はじめに述べた一連の作業が行われて新しいオーディオができる。
class Chain
  def initialize
    @nodes = { 0 => [] }
    @curnode = 0
  end

  def add(leaf)
    if @nodes.has_key?(@curnode)
      @nodes[@curnode].push leaf
    else
      @nodes[@curnode] = [leaf]
    end
    @curnode = leaf
  end

  def get()
    leaves = @nodes[@curnode]
    leaf = leaves[rand(leaves.size)]
    @curnode = leaf
    return leaf
  end
end

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

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

aoiue.txt の各行は、行番号と振幅を示す数値の2カラムでできているので、split メソッドで第2カラムを取り出している。
コマンドラインは次の通り。
ruby generate.rb < aoiue.txt > euioa.raw

生成されたオーディオ。雑音だった。


グラフにすると次の通り。


いちおうオーディオめいた波形になっていて、ランダムに生成されたわけでないことは確認できる。

[課題]
1. マルコフ連鎖の次数を上げる。
2. サンプルの取り方を変える。
3. 材料を選ぶ。