こんにちは。物理学科3年の L という者です。最近 Julia を触り始めたのですがなかなかいい感じなので、今回は布教もかねて Julia で音声ファイルの簡単な加工をしてみます。Python でのプログラミングを知っていれば Julia のコードもなんとなく分かると思います。物理とはほとんど関係ないです。
The Julia Programming Language
筆者は Julia の全貌をまだ把握しきれていません。とりあえず、Julia はプログラミング言語の1つです。一番の特徴は Python と同じくらい気軽にプログラムが書ける[^1]上で動作が速いことと言ってよいでしょう。並列処理などを活用してさらに高速化を図ることもできるようです。
ライブラリも充実していて、グラフのプロットや固有値計算だけでなく、群論・環論といった抽象代数学や、Webフレームワークを提供するライブラリも存在します。
また対話環境(REPL)も凝られています。Julia では全角文字もソースコード中で使うことができて、例えば円周率として"π"が用意されていたり、整数除算が"÷"だったりします[^2]。しかし全角記号をわざわざ変換から出すのは面倒(そもそも Julia の開発者は日本語IMEとか持ってないはずなので)です。実は LaTeX コマンドの書き方が REPL 上でできます。"\pi" と打って Tab キーを押せば "π" になるし、"\div" と打って Tab キーを押せば "÷" になります。LaTeX に搭載されていないコマンドが Julia の REPL には搭載されていたり(\Alpha など)その逆もあったりして、遊んでいると無限に時間が溶けます。
あと Why We Created Julia(和訳)がかっこいい。ここから生まれた言語が実用に耐える形で受肉していることを思うと、トレードオフって何だろうという気持ちになれます。
Julia を始めるのは簡単で、公式ページからインストーラをダウンロードしてインストール(Add Julia to PATH のチェックはオン)します。終わったらターミナルを開いて "julia" と打ち込めば対話環境(REPL)が始まります。Ctrl + D で抜けられます。
Julia のライブラリは広範で、音声ファイルの読み書きに関するものも存在しています。パッケージを追加するには、REPL 上で "]" を押してパッケージモードに移り、"add パッケージ名" とします。今回使うのは FileIO、LibSndFile、SampledSignals です。ライブラリを使う場合は "using パッケージ名" が必要です。
音声ファイルは Windows なら .mp3 などもありますが、今回は圧縮されておらずプログラムで扱いやすい .wav の読み書きをします。
snd = load("ooooo.wav")
とすれば snd に音声データが読み込まれます。具体的には
という感じでアクセスします。サンプリング周波数というのは、アナログな音の振幅の情報をデジタル的に保存するときに、どういう間隔で音の振幅を保存するかという情報です。snd.data には音の振幅を表す-1以上1以下の実数が並んだデータ(配列)が保持されていて、1つ1つの振幅の時間間隔がサンプリング周波数の逆数になります。この振幅をいじることが音声ファイルの加工そのものになります。
また、音声ファイルにはモノラルとステレオの2種類あります。モノラルは両方のスピーカーから出る音が同じで、ステレオは左右のスピーカーから違う音が出せる形式です。ステレオの場合は振幅の情報が右と左のそれぞれで必要です。snd.data には、モノラル形式のファイルを読み込んだ場合には1列の配列が、ステレオ形式のファイルを読み込んだ場合には2列の配列が入っています。