mieki256's diary



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版 )で、以下をするだけでインストールできた。
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 日分です。

過去ログ表示

Prev - 2015/05 - Next
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project