Rubyでwavファイルのフォーマットを読んだり、データチャンクを編集するためのgemを作った。

ベースは以前作ったやつで、ついでにwavファイル操作のサンプルをたくさん追加してrubygems.orgに登録しておいた。
あくまでサーバーで音を合成して返すようなwebサービスで使う事を想定している物で、マイクからの入力をリアルタイムに音声処理するための物ではない。

■インストール

gem install wav-file


■使う

フォーマットとデータチャンクを読む
require 'rubygems'
require 'wav-file'

f = open("input.wav")
format = WavFile::readFormat(f)
dataChunk = WavFile::readDataChunk(f)
f.close

puts format

するとこんな感じにフォーマットが取れる。
Format ID:      1
Channels: 2
Sampling Ratio: 48000 (Hz)
Byte per Sec: 192000
Bit per Sample: 16
Block Size: 4


バイナリからwavの波形を配列として取り出す
bit = 's*' if format.bitPerSample == 16 # int16_t
bit = 'c*' if format.bitPerSample == 8 # signed char
wavs = dataChunk.data.unpack(bit) # read binary


音量を半分にしてみる
wavs = wavs.map{|w| w/2}


逆再生にして、バイナリに戻す
dataChunk.data = wavs.reverse.pack(bit) # reverse


wavファイルに保存する
open("output.wav", "w"){|out|
WavFile::write(out, format, [dataChunk])
}


samplesディレクトリの中に色々と例を入れておいた。githubからも見れる。
  • 音量が小さいのを大きくする
  • 左右チャンネルを分けて保存する
  • wavファイル同士を連結する
  • wavファイル同士を重ねて同時に鳴らす
  • 再生速度を上げる
  • 波形をグラフにする
とかまあ色々入れておいた。


■tips
使う前にwavファイルのフォーマットについて理解しておいた方が良いかもしれない。
wav ファイルフォーマットが参考になる。


あと、複数のwavファイルを合成して新しいファイルを作る場合、操作する前にffmpegでformatを揃えた方が良い。その方が楽だし高速。
adjust_wav_format.rbにやり方を書いておいた。

サンプルを実行するのに必要なwavも、ffmpegでmp3とかから変換して作れる。
ffmpeg -i input.mp3 -ac 2 -ar 44100 output.wav