音声の周波数スペクトル

目的

音声を処理する際に,離散フーリエ変換をかけ,時間領域から周波数領域に変換することがある.ここでは,音声データに対して離散フーリエ変換を行い,音声の周波数スペクトルを求める方法を学ぶ.

説明

音声データの読み込みと表示

まず音声データを読み込んで,音声波形を表示してみよう.

11,12行目でURLを指定し,16行目から19行目で日本語母音の「あ」と発声しているwav形式の音声データをダウンロードしている.4行目でsoundfileモジュールをインポートし,21行目でsoundfileモジュールのread関数を使用して音声データを読み込んでいる.read関数の返り値は音声データと標本化周波数であり,22行目から25行目で標本化周波数と音声データのshapeとdtypeとデータそのものを表示している.27行目でトータルの時間を求め,28行目でグラフを描画する際の横軸のデータを作成している.30行目から37行目で読み込んだ音声を描画している.

実行すると,以下のように読み込んだデータの情報と音声波形が表示される.

発話区間の検出

読み込んだ音声データには発話区間の前後に無音区間がある.ここでは,簡単な手法で発話区間の音声データだけを取り出してみよう.

9行目から19行目で発話区間を検出する関数を定義している.9行目で音声データとしきい値を引数で受け取り,10行目から13行目で音声データを前から走査し,振幅が初めてしきい値を越えたときのインデックス番号を求め,発話区間の最初としている.14行目から17行目で音声データを後ろから走査し,振幅が初めてしきい値を越えたときのインデックス番号を求め,発話区間の最後としている.18行目で求めた発話区間の音声データを返している.

定義した関数を37行目で呼び出している.ここではしきい値を0.1としている.38行目と39行目で発話区間の時間長とグラフを描くときに使用する横軸のデータを作成している.

49行目から53行目で発話区間の音声データを描画しており,実行すると以下のように表示される.

音声の周波数スペクトル

音声データに離散フーリエ変換をかけ,周波数スペクトルを求めてみよう.

音声データに離散フーリエ変換をかける際には,音声データを短い時間区間に分割し,短時間の音声データに対して変換することが多い.ここでは,発話区間の中央の512標本点のデータを取り出して変換を行うことにしよう.37行目で取り出す標本点を指定し,その時間長を38行目で求め,39行目でグラフの横軸のデータを作成している.40行目で発話区間の中央から標本点の半分だけ左に移動した位置を求め,これを取り出すデータの開始点としている.41行目で発話区間の中央の512点のデータを取り出し,Hanning Windowをかけている.

43行目で高速フーリエ変換を行い,44行目でグラフの横軸のデータを作成している.46行目で振幅スペクトルを求め,56行目から61行目でグラフを描画している.結果の図からわかるように,音声データの振幅スペクトルでは高周波成分の値が低周波成分の値に対して小さいため,値の比較が難しい.そこで,音声データでは対数スケールで振幅を描画することが多い.よく使用されるのが,振幅を2乗したパワーに対して対数をとった対数パワースペクトルである.単位をdBとすると,対数パワースペクトルは以下のように表現される.$$10\log_{10}|X_k|^2 = 20\log_{10}|X_k|$$47行目で対数パワーを求め,63行目から69行目で対数パワースペクトルを描画している.

実行すると,以下のように表示され,振幅スペクトルよりも対数パワースペクトルのほうが周波数成分の値を比較しやすいことが確認できる.

離散フーリエ逆変換

音声データに対して離散フーリエ変換と離散フーリエ逆変換を行い,元のデータが得られるかどうかを確認しよう.

48行目で離散フーリエ逆変換をかけ,得られた複素数の実数成分を取り出し,66行目から70行目で逆変換して得られたデータを描画している.実行すると以下のように表示され,元の音声データが得られていることが確認できる.

課題

以下の音声データを使用して課題を行え.

  • 「あ」と発声している音声データ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/05/a_normal.wav
  • 「い」と発声している音声データ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/05/i_normal.wav
  • 「う」と発声している音声データ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/05/u_normal.wav
  • 「え」と発声している音声データ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/05/e_normal.wav
  • 「お」と発声している音声データ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/05/o_normal.wav
  • 高い声で「あ」と発声している音声データ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/05/a_high.wav
  • 低い声で「あ」と発声している音声データ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/05/a_low.wav
  • 高い声で「い」と発声している音声データ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/05/i_high.wav
  • 低い声で「い」と発声している音声データ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/05/i_low.wav
  • 高い声で「う」と発声している音声データ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/05/u_high.wav
  • 低い声で「う」と発声している音声データ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/05/u_low.wav
  • 高い声で「え」と発声している音声データ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/05/e_high.wav
  • 低い声で「え」と発声している音声データ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/05/e_low.wav
  • 高い声で「お」と発声している音声データ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/05/o_high.wav
  • 低い声で「お」と発声している音声データ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/05/o_low.wav

課題0

「あ」と発声している音声データの一部にHanning Windowをかけた音声波形と,対数パワースペクトルと,離散フーリエ逆変換によって得られた音声波形を表示せよ.取り出す音声データの標本点数は512とすること.

課題1

「い」と発声している音声データの一部にHanning Windowをかけた音声波形と,対数パワースペクトルと,離散フーリエ逆変換によって得られた音声波形を表示せよ.取り出す音声データの標本点数は512とすること.

課題2

「う」と発声している音声データの一部にHanning Windowをかけた音声波形と,対数パワースペクトルと,離散フーリエ逆変換によって得られた音声波形を表示せよ.取り出す音声データの標本点数は512とすること.

課題3

「え」と発声している音声データの一部にHanning Windowをかけた音声波形と,対数パワースペクトルと,離散フーリエ逆変換によって得られた音声波形を表示せよ.取り出す音声データの標本点数は512とすること.

課題4

「お」と発声している音声データの一部にHanning Windowをかけた音声波形と,対数パワースペクトルと,離散フーリエ逆変換によって得られた音声波形を表示せよ.取り出す音声データの標本点数は512とすること.

課題5

高い声と普通の声と低い声で「あ」と発声している音声データの一部にHanning Windowをかけた音声波形と,対数パワースペクトルを表示し,比較せよ.取り出す音声データの標本点数は512とすること.

課題6

高い声と普通の声と低い声で「い」と発声している音声データの一部にHanning Windowをかけた音声波形と,対数パワースペクトルを表示し,比較せよ.取り出す音声データの標本点数は512とすること.

課題7

高い声と普通の声と低い声で「う」と発声している音声データの一部にHanning Windowをかけた音声波形と,対数パワースペクトルを表示し,比較せよ.取り出す音声データの標本点数は512とすること.

課題8

高い声と普通の声と低い声で「え」と発声している音声データの一部にHanning Windowをかけた音声波形と,対数パワースペクトルを表示し,比較せよ.取り出す音声データの標本点数は512とすること.

課題9

高い声と普通の声と低い声で「お」と発声している音声データの一部にHanning Windowをかけた音声波形と,対数パワースペクトルを表示し,比較せよ.取り出す音声データの標本点数は512とすること.