linux環境下では、soxという素敵な 音声処理のためのスイスアーミーナイフ が存在します。
画像におけるImageMagick、動画におけるffmpegのように、サーバ内で自動的に音声処理をするのに向いています。
それをrubyでお手軽に使えるようにしたのがruby-soxです。
ruby-soxの使い方のレクチャーとして、rubyで自動的に音声をぶった切って新しい音色を作る、ということをやってみたいと思います。
まずはsoxのインストール。
ruby-soxはgemからインストールできます。
gem install ruby-sox
soxにはいろいろコマンドが用意されているのですが、ただ使うだけだとコマンドラインからsoxを実行するのとあまりかわらないので、せっかくなのでループを使ってできることをしてみたいと思います。
今回のサンプルでは、グラニュラーシンセシスという技法を使います。
グラニュラーシンセシスとは、元々ある音源を非常に細かく切ってグレイン(粒子)という単位まで分割し、再構成することによって新しい音色を作るというものです。
今回は音源を一定の個数に切り、それをランダムにつなぎ直す用にしました。
サンプルでは5.5秒のデータを0.1秒ごとに区切って並び替えています。
require "ruby-sox"
try_num = 55
try_num.times do |num|
sox = Sox::Cmd.new().add_input("test.mp3")
.set_output("tmp/test_#{num}.mp3")
.set_effects(:trim => "=#{num*0.1} =#{(num+1)*0.1}",:rate => 44100, :channels => 2)
.run
end
a = []
try_num.times do |num|
r = rand try_num
a.push "tmp/test_#{r}.mp3"
end
combiner = Sox::Combiner.new(a, :combine => :concatenate, :rate => 44100, :channels => 2)
combiner.write('test.mp3')
soxのドキュメントを見ると、エフェクトをかけたり、音の調整をしたり、音響周りのいろいろなことができるので、画像や動画投稿サービスに続いて、これらを駆使したシステムを作ってみるのもいいのかもしれないなと思っています。