2019年12月20日pythonで簡単な音声認識をやってみたいぞ。そもそも何から始めればいいのかしら。今回は,基本的な音声認識をpythonで行う方法をお伝えしていこうと思います。本記事はpython実践講座シリーズの内容になります。その他の記事は,こちらの「Python入門講座/実践講座まとめ」をご覧ください。9.リスト...コーディングに関して未熟な部分がたくさんあると思いますので,もし何かお気づきの方は教えていただけると幸いです。誤りについてもご指摘していただけると非常に助かります。可視化スペクトログラム上に可視化お題F0推定をpythonで実装してみよう。流れ今回対象とするデータは「あいうえお」ではなく,データ長が2をべき乗に制限した「ドレミファソラシド」にしようと思います。以下のファイルを対象とします。データ長を調整したドレミファソラシドF0推定の概要F0は基本周波数とも呼ばれており,音楽でいうところの音高(ピッチ)に相当します。基本的な音声認識の特徴量としても利用されます。基本周波数はどのように推定すれば良いのでしょうか。ここでポイントとなるのが「自己相関(AutoCorrelation)」です。結論から言うと,自己相関のピークを捉えることで基本周波数を(近似)推定することができます。自己相関は,以下の式で計算していきます。$x$をある信号とします。1}x_{t}x_{t+\tau}\end{eqnarray}数式上ではイメージが掴みにくいと思います。自己相関は,自分自身の信号を複製し,1フレームずつズラしながら掛けて足し合わせるという操作で計算していきます。そのときのズレが「$\tau$」となります。どんなときに自己相関は大きくなるのでしょうか。わかりやすいのは$\tau=0$のときです。自分自身と掛け合わせるのが一番大きな自己相関になるのは想像がつきやすいです。二番目に大きな自己相関は$\tau$がどのような値の時でしょうか。二番めに大きなピークを与える$\tau$こそ「基本周期」なのです。基本周波数(F0)の逆数に相当します。以下では,自己相関を求めて二番目のピークを与える$\tau$を計算することで,基本周波数を近似推定していきます。ちなみに,STFTのときと同じように,元の信号に窓をかけながらステップごとに自己相関を計算していきます。一応上限にlimという引数を与えています。窓で切り出す場合は特に必要ないかもしれません。np.array(AC)ピークの判定ここでは「ピーク」からデータの先頭・末尾をのぞいています。自己相関において先頭は「一番大きなピーク」を持つことが自明だからです。することで,算出されたピークのうち最も大きな点を探し出せば良いというシンプルな問題に帰着できます。np.array(second_peak_indexes)先頭と末尾の調整STFTでは関数内でデータの先頭と末尾の調整をしました。窓関数を適用するときには避けては通れない調整(地獄)です。今回は単純に,推定された先頭の値をデータの先頭で推定された周波数,末尾の値をデータの末尾で推定された周波数と補完することにします。ここ,説明が難しいです。本来であれば,先頭のデータから窓関数を適用していかなくてはならないのですが,先頭から適用すると窓関数の半分がはみ出てしまうため,はみ出ない位置から始めていたのです。補完のコードは以下の通りです。自己相関のイメージを掴んでもらうために,wavファイルを大きな1つのデータとして捉えて自己相関を可視化してみます。AC)データ全体の自己相関。$\tau=0$が最大値となっている。スペクトログラム上に可視化それではクライマックスです。スペクトログラム上に推定された基本周波数を乗せてみましょう。扱うスペクトログラムは「ドレミファソラシド」です。y_axis="log")「ドレミファソラシド」のスペクトログラム仮説を立てるとすれば,スペクトログラム上で濃い色になっている部分が基本周波数だと考えられます。これはピアノの音ですから,倍音成分を持っています。濃い部分に対して,周波数は2倍,3倍...の成分を持ちます。見事に仮説通りになりました!今回はピアノだけの「ドレミファソラシド」という単純なデータを扱っていたため簡単に推定できたのだと思います。コメントをキャンセルメールアドレスが公開されることはありません。付いている欄は必須項目です過去問解説販売中!zuka京都大学で機械学習を学んでいます。iBTの出題形式が大幅変更!新テストの注意点まとめ。