takahiro_itazuriの公倍数的ブログ

本やWebを通して学習したことをまとめるブログです。最大公約数(つまり、共通部分)的なという表現と対比して、「なるべく包括的にカバーしつつ、更に+αの要素も加えられたらいいな」という意味で公倍数的ブログと名付けました。

音声処理の基礎

はじめに

今回は音声処理に関する基礎中の基礎をざっくり紹介します。

音声処理のための言語

言語 特徴
python 無料。様々なライブラリがある(numpy, wave, ffmpy)。
matlab 有料。簡単。機能が豊富。
SPTKやSoX 無料。コマンドラインで動かす。自由度が小さく、研究や開発などには向いてない。

C++で良い音声処理を御存じの方は教えていただけると幸いです。

音声データ

今回は音声ファイルにはどのような情報が入っているかを見ていきます。

チャンネル数
1チャンネルのときをモノラル、2チャンネルのときをステレオと言います。

両耳で同じ音が流れるものをモノラル、それぞれ違う音が流れるものをステレオと考えていいです。

サンプリングレート
音を聞いているときは連続的に音が鳴っているように感じますが、実際は離散的なデータが入っています。

サンプリングレートは1秒間をどれくらい細かく区切って音を出しているかを示します。

一般的には、44.1kHzのデータをよく見ます(CDもそうです)。

つまり、1秒間に44100個のデータが詰まっています。

人間の耳は20kHz程度の音まで聞こえるということが知られており、その音を表現するためには40kHz以上にする必要があったからだそうです。(詳しくは「ナイキストのサンプリング定理」を調べてください。)

データ
データは各サンプルごとに各チャンネルの音(振幅の値)が格納されています。

ステレオであれば、左耳と右耳のデータが交互に並んでいるという感じです。

FFT

FFTとは高速離散フーリエ変換の略でDFT(離散フーリエ変換)を高速にしたものです。

フーリエ変換とは周波数成分を抽出する方法で、それを離散値に適用したものがDFT、それを高速化したものがFFTと考えてください。

実際には、長い音声ファイル全体の周波数を調べてもあまり得ることがないので、短時間に区切ってフーリエ変換を行うSTFT(短時間フーリエ変換)を行います。


ここで一つ問題となることがあります。

フーリエ変換はもともと無限遠の長さの信号に対して行う処理であるため、短時間に区切ったものを繰り返し繋げたものをフーリエ変換します。

その際に問題となるのが、無理やり繋げたつなぎ目の部分で不連続になってしまい、本来の波形にない周波数成分が現れてしまいます。

そこで次の窓関数というものを用います。

窓関数

窓関数にもいくつか種類があり、ハミング窓、ハニング窓、カイザー窓などがあります。

これら全ては端がゼロとなっていて、真ん中にいくにつれて大きくなっていく形になっています。

この窓を畳み込み計算してあげることで、先程不連続になっていたつなぎ目をゼロにして無理やり合わせるということをします。

パワースペクトル密度

パワースペクトル密度とは、フーリエ変換して得たスペクトルの大きさの二乗であるパワースペクトルの密度のことです。

信号{ \displaystyle f(t)}に対してフーリエ変換

{ \displaystyle F(\omega)=\frac{1}{\sqrt{T}}\int_{0}^{T} f(t)\exp(-i \omega t)dt}
で、パワースペクトル密度は
{ \displaystyle PSD(\omega) = lim_{T \to \infty}E \left( |F(\omega)|^2 \right)}
になります。

ここで言う \displaystyle E\left(\cdot \right)とは期待値です。期待値とは確率実現値を確率の重みで平均した値である。

まとめ

今回は音声処理の超基礎の部分のお話をしました。

今後も音声処理について更新していけたらと思っています。