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

音声処理の基本を色々

先日から音声処理を色々やっていると書かせていただいています。
ですが、環境構築の話ばっかりで肝心な音声処理を書いてないじゃないかということで、今回は音声処理をするに当たって基礎的な部分をまとめてみようと思います。

音声処理をするための言語

音声処理をするにあたって適している言語をまずまとめたいと思います。
ちょっと雑談をします。
筆者の場合は、C++を主言語としていて、本当はC++で音声処理をしたかったのですが、自分で書いたプログラムはやはりスピードが遅くて諦めて、色々なものを試すことに至りました。
是非C++でも音声処理が簡単にできるライブラリがほしいところです。誰か作ってください、早急に。
このように現状でC++で良い音声処理のライブラリは筆者の知る限りないので、C++を使っている人は次に紹介するものでプログラムを組むことをおすすめします。
python
筆者も実際使わせていただいているpython。超高級言語で、気軽にプログラムが書けます。
利点

  • 簡単に音声処理ができるライブラリがある。(numpy, wave, ffmpegなど)
  • 無料

欠点

  • pythonで書き慣れるまで少し時間がかかる

matlab
筆者はほとんど使ったことがありません。理由は欠点を参照。
利点

  • とっても簡単
  • 行列演算が得意
  • 機能がとても豊富

欠点

  • 有料

有料なことだけが傷なmatlabですが、学生であれば少し安く使えるらしい。研究室で買ってもらえる人は使ってみるといいでしょう

SPTKやSoX
利点

欠点

  • 既存のものを組み合わせていく感じなので、プログラムを書く点ではなんとも、、、

以上が思い当たる言語です。最終的にC++のプログラムを書きたい人(筆者)はC++からpythonmatlabコマンドラインにアクセスするようにすればOKです。強引ですね。はい。

音声処理の基礎

ファイル形式
おそらく音声処理を始めるに当たって、まず音ってどういうデータなんだとなりますよね。
筆者が音声処理をするときに使うファイルの形式は「.wav」(以下wavファイル)です。
wavファイルはRIFF形式というバイナリファイルの形式で書かれています。RIFFファイルとはチャンクに分かれていて、チャンクごとに色々な情報が入っています。(アバウトすぎてすみません。時間があるときに触れようと思います。)
wavファイルの場合、fmtチャンクというものにwavファイル自体の形式(ファイルサイズやサンプリングレートなど)が書いてあり、dataチャンクに実際の音のデータが入っています。
他にもmp3とか音声を保存したファイル形式はありますが、プログラムを書くときはwavファイルが一般的です。

音声データ
wavファイルが使われているのはわかったけど、いまいち納得いかないと思いますので、そのファイルがどんなデータを持っているのか説明します。

  • チャンネル数

1チャンネルのときをモノラル、2チャンネルのときをステレオといいます。
両耳で同じ音が流れるのをモノラル、それぞれ違う音が流れるのがステレオと考えていいでしょう。

  • サンプリングレート

音を聞いていると連続に聞こえていますが、実は離散的なデータになっています。そこで、1秒間をどれくらいに区切って音をデータ化しているかがサンプリングレートです。

  • データ

実際のデータはサンプリングされたデータがバイナリで入っています。そこでwavファイルの読み込みでは16bit(モノラルの場合)ずつデータを読み込んで数字に変えていきます。

FFT
FFTとは高速離散フーリエ変換の略でDFT(離散フーリエ変換)を高速にしたものです。
しかしながら、何分もの長い音に対してFFTをすると、magnitudeやphaseが雑然としてわかりにくいので、短時間に区切った短時間フーリエ変換(STFT)が行われます。
短く区切ったことによる弊害があり、フーリエ変換はもともと無限の長さの信号に対して行う処理なので、区切った波形が繰り返されているものとして処理をします。
すると、区切った部分が不連続になり、本来の波形にない高周波な成分がでてきてしまいます。
そこで窓関数というものをかけます。

窓関数
窓関数には色々種類があり、たとえばハミング窓、ハニング窓、カイザー窓などがあります。しかし、音声処理でよく用いられるのはハミング窓ですので、よくわからない人はハミング窓を使いましょう。
で、この窓関数が何をしているかというと、STFTでの問題は端の部分ということだったので、端の方にかけて減衰させてやるのが窓関数です。
実際にこの窓関数をかけると余計は高周波成分がでにくくなります。