読者です 読者をやめる 読者になる 読者になる

RubyでAIFFファイルをいじるスクリプト書いた

目的

最近声優の良さがわかってきてもっと声優のことを知りたくなった.好きな声優の声を分析することでより理解が深まるんじゃないかと思った.

そこでドラマCDのデータを見ようと思った時に普段iTunesで音源を取り込んでいて,保存する際に使っているファイル形式がAIFFだった.AIFFAppleが使っている音声ファイルフォーマット.WAVと似ているのだけど若干構造が違っているので,WAV用に書かれたスクリプトをそのまま流用できなかったためAIFF用に書いてみた.

AIFFの構造

AIFFはWAVE同様にchunk(チャンク)と呼ばれるブロック構造で音データを記録している.

f:id:alice345:20150802093557p:plain

iTunesで取り込んだ曲は上の画像のように3つのブロックから成っていて,それぞれはファイル全体のchunkを表す「FORM AIFF Chunk」,標本化周波数や量子化精度といった音データのプロパティを格納している「Common Chunk」,音データそのものを表す「Sound Data Chunk」となっている.それぞれのchunkの詳細を以下に示す.

f:id:alice345:20150802095735p:plain

こんな順番でデータが格納されてる.詳細が知りたい場合はドキュメントのほうを見たほうがよい.僕が悩んだのがsampleRateのところで10byte確保されているのだけど,僕がもっていて楽曲データの場合後ろ8byteにsampleRateのデータが入っていて頭の2byteには何の意味があるのか分からなかった...何なんだろう...

書いたコード

github.com

@shokaiさんがWAV用に書いたコードをほぼそのままパクらせてもらった.違うのはバイナリを読むときにリトルエンディアンだったのをビッグエンディアンに変えたことくらい.Array#unpackの存在を初めて知った. 今のところはchunkの情報を雑に表示するだけ.実行させるとこんな風になる.

f:id:alice345:20150802101242p:plain

ここまでくれば音のデータを編集するのはSound Data ChunkのsoundDataを弄ればいいだけなので簡単そう.

所感

リポジトリ名を声優の名前にしようかと思ったけど,それはもっとちゃんとしたプロダクトの時に付けたいなと思ったので今回は好きなキャラクターの名前にした. とりあえずAIFFファイルのデータをいじれるようにはなったので色んな波形みてみたりフィルタ作ったりとかして遊んでみることにする.

参考URL

AIFF - Wikipedia

http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/AIFF/Docs/AIFF-1.3.pdf

槻ノ木隆の「BBっとWORDS」

GO!GO!neko819 AIFFファイルのバイナリを見る

橋本商会 » Rubyでwavファイルをいじる WavFile.rbを作った