オーディオファイルを分割して適当につなぎなおす実験――失敗編
オーディオファイルからデータを1サンプルずつ取り出してマルコフチェーンに落としこみ、できあがったチェーンから1サンプルずつ取り出してつなぎなおすテスト。
材料のオーディオは SPTK の導入時に利用した data.short の一部。
「あおいうえき」と言っている。
材料オーディオの属性は次の通り。長さは0.62秒。
まずこのオーディオを SPTK の dmp コマンドでダンプする。
aoiue.raw が材料オーディオ、aoiue.txt がダンプされたテキストデータ。
この aoiue.txt を次の Ruby スクリプトに与えると、はじめに述べた一連の作業が行われて新しいオーディオができる。
aoiue.txt の各行は、行番号と振幅を示す数値の2カラムでできているので、split メソッドで第2カラムを取り出している。
コマンドラインは次の通り。
生成されたオーディオ。雑音だった。
グラフにすると次の通り。
いちおうオーディオめいた波形になっていて、ランダムに生成されたわけでないことは確認できる。
[課題]
1. マルコフ連鎖の次数を上げる。
2. サンプルの取り方を変える。
3. 材料を選ぶ。
材料のオーディオは 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. 材料を選ぶ。