2015/05/16(土) [n年前の日記]
#1 [ruby] Rubyでwavファイルを読んでみるテスト
昨日メモしたけど、以下の2つの gem を使ってみたり。
_wavefile | RubyGems.org | your community gem host
_wav-file | RubyGems.org | your community gem host
WIndows7 x64 + Ruby 2.0.0p645 mingw版( _RubyInstaller版 )で、以下をするだけでインストールできた。
解説ページを見ながらテスト。
_wavread.rb
_wavread2.rb
_wavread3.rb
とりあえず、wavefile も wav-file も、Ruby 2.0.0上で動くことを確認。また、wavefile を使って、wavファイルの波形データを読み取れることも確認できた。
後は音量をどうやって求めるか、だけど…。
例えば、秒間24コマの映像を前提にするなら、音声データ1秒分を24分割して、1つあたりの音量がどのくらいあるか、しきい値より大きいかを判別して、そのコマは口パクするかしないかを決めてしまえばイケるんじゃないかと安直に考えているところ。
wavデータを綺麗に24分割するには、wavのサンプリング周波数が48KHzとかじゃないと都合が悪いのがアレだけど。一般的なサンプリング周波数は、音楽CDの44.1KHzだったりするのだろうか…。
音量がどのくらいあるかは…。波形データの値を全部足して、ソレを音量扱いしたらどうかなと、これまた安直に考えていたり。例えば、-100,120,-60,70、といった値が並んでたら、100+120+60+70 = 350 と全部足しちゃって、この合計値を音量として扱っちゃう。コレ、甘いかな。どうかな。
_wavefile | RubyGems.org | your community gem host
_wav-file | RubyGems.org | your community gem host
WIndows7 x64 + Ruby 2.0.0p645 mingw版( _RubyInstaller版 )で、以下をするだけでインストールできた。
gem install wavefile gem install wav-file
解説ページを見ながらテスト。
_wavread.rb
# Rubyでwavファイルを処理する例 # wav-file を使う事例 require "rubygems" require "wav-file" f = open("input.wav") # wavファイルを開く format = WavFile::readFormat(f) # フォーマットを得る dataChunk = WavFile::readDataChunk(f) # データ部分を得る f.close # wavファイルを閉じる puts format # フォーマットを表示
_wavread2.rb
# Rubyでwavファイルを処理する例 # wavefile を使う事例 require "rubygems" require "wavefile" IN_FILE = "input.wav" # wavファイルの情報を表示してみる info = WaveFile::Reader.info(IN_FILE) puts "Audio Format: #{info.audio_format}" puts "Channels: #{info.channels}" puts "Bits per sample: #{info.bits_per_sample}" puts "Samples per second: #{info.sample_rate}" puts "Bytes per second: #{info.byte_rate}" puts "Block align: #{info.block_align}" puts "Sample frame count: #{info.sample_frame_count}" # wavの時間を表示 duration = info.duration formatted_duration = duration.hours.to_s.rjust(2, "0") << ":" << duration.minutes.to_s.rjust(2, "0") << ":" << duration.seconds.to_s.rjust(2, "0") << ":" << duration.milliseconds.to_s.rjust(3, "0") puts "Play time: #{formatted_duration}"
_wavread3.rb
# Rubyでwavファイルを処理する例 # wavefile を使う事例 require "rubygems" require "wavefile" IN_FILE = "input.wav" HZ_V = 48000 # サンプリング周波数 FPS = 24 / 3 # 1秒間あたりの映像のコマ数 SAMPLES_PER_BUFFER = HZ_V / FPS # WaveFile::Reader.new(IN_FILE).each_buffer(SAMPLES_PER_BUFFER) do |buffer| # puts "Read #{buffer.samples.length} samples." # end # データ部分をバッファに読み込んでみる # :mono , :stereo # :pcm_8, :pcm_16, :pcm_32, :float_32, :float_64 format = WaveFile::Format.new(:mono, :pcm_16, HZ_V) reader = WaveFile::Reader.new(IN_FILE, format) begin while true do vmin, vmax = 0, 0 buffer = reader.read(SAMPLES_PER_BUFFER) sumv = 0 buffer.samples.each do |v| vmin = v if v < vmin vmax = v if v > vmax sumv += (v > 0)? v : -v end puts "Read #{buffer.samples.length} samples. / min,max = #{vmin}, #{vmax} / sum = #{sumv}" end rescue EOFError reader.close end
とりあえず、wavefile も wav-file も、Ruby 2.0.0上で動くことを確認。また、wavefile を使って、wavファイルの波形データを読み取れることも確認できた。
後は音量をどうやって求めるか、だけど…。
例えば、秒間24コマの映像を前提にするなら、音声データ1秒分を24分割して、1つあたりの音量がどのくらいあるか、しきい値より大きいかを判別して、そのコマは口パクするかしないかを決めてしまえばイケるんじゃないかと安直に考えているところ。
wavデータを綺麗に24分割するには、wavのサンプリング周波数が48KHzとかじゃないと都合が悪いのがアレだけど。一般的なサンプリング周波数は、音楽CDの44.1KHzだったりするのだろうか…。
音量がどのくらいあるかは…。波形データの値を全部足して、ソレを音量扱いしたらどうかなと、これまた安直に考えていたり。例えば、-100,120,-60,70、といった値が並んでたら、100+120+60+70 = 350 と全部足しちゃって、この合計値を音量として扱っちゃう。コレ、甘いかな。どうかな。
[ ツッコむ ]
以上、1 日分です。