ソフトウェア開発部、粕谷(@daiksy)です。

今回は音声ファイルの操作についてのお話です。

我々のチームでは、ソーシャルゲームのサーバサイドの開発・運用を行っています。
昨今のソーシャルゲームは、アニメーションや音声の再生など、一昔前に比べて表現がずいぶんリッチになっています。

そのような流れの中で、我々のチームでも音声ファイルの操作について検証をはじめました。

別にどのような技術を用いても良かったのですが、我々のチームでは、ゲームのサーバサイドのシステムをPlay + Scalaで構築しており、どうせならScalaから音声ファイルを操作しようと思いました。

やりたいことは、

  • wav -> mp3 などの形式変換
  • 音声ファイルのサイズ(再生秒数)の取得
  • 複数の音声ファイルの結合

の3要件です。

我々が扱っているScalaは、JVMで動作する言語であり、Javaの豊富なライブラリを使用することができます。
そういったライブラリ群を用いれば、音声ファイルの操作は行えるでしょうが、今回はそれらを使わずにSoXというツールをScalaから呼び出すことで要件を実現することにしました。
理由は、SoXは基本的にコマンドラインで音声ファイルを操作するツールなので、Scalaからこれらのコマンドを呼び出せば、Javaのライブラリを使うよりも楽に要件が実現できそうだったからです。

まとめると、システム構成は以下のようになります。

  • OS: CentOS 5.5
  • 使用言語: Scala
  • 音声ファイル操作: SoX

まず、最初の手順としては、SoXをCentOSにインストールする必要があります。
インストールは実に簡単で、wgetで最新版をとってきて解凍し、makeするだけです。  

 
これだけで、SoXは使えるようになるはずです。しかし、CentOSを扱っている場合は注意が必要です。  

 
を実行すると、SoXの設定状態が一覧表示されます。この時点での設定状態を見てみましょう。
注目すべきはこの部分です。  

 
ご覧のように、mp3がサポートされていません。
今回、我々はmp3のファイルを扱う必要があるのですが、CentOSはデフォルトではmp3を扱えないのです。 そこで、mp3を扱うために必要なライブラリを入れましょう。  
こちらのサイトを参考にしました。  

 
再度、SoXをmakeします。  
 

 
これで、SoXの状態が下記になっていれば準備完了です。    

 
サーバでSoXさえ動くようになれば、Scalaからこれを呼び出すのは容易です。  
ScalaからOSのコマンドを叩くには scala.sys.process を使います。
これは非常に強力で、import scala.sys.process._とimportすると、Scalaの暗黙の型変換(implicit conversion)によってStringにプロセスを実行するメソッドが拡張されます。  
例えば、  

 
を実行してやると、変数retls -lコマンドの実行結果が格納されます。
詳しくは、こちらをご参照ください。  
この scala.sys.process と、Scala2.10のString Interpolationを組み合わせることで、可読性も非常に高くSoXコマンドを扱うことができます。
それぞれのコード例を見てみましょう。  
 
例1) wav -> mp3 の形式変換

 
例2) 音声ファイルのサイズ取得

 
例3) 複数の音声ファイルの結合

 
非常に簡単ですね!!