人工知性を作りたい

私が日々、挑戦したことや学んだことなどを紹介していく雑記ブログです。 (新しいAI技術HTM, 専門の音声信号処理, 趣味のアニメ等も書いてます。)

Pythonで音声信号処理② 〜ITD(両耳間時間差)編〜

今回は久々に技術ブログを書いていこうと思います。

 

音声信号処理第2弾はITD(両耳間時間差)の技術について紹介したいと思います。

この技術は人間が音の到来方向を感知するときに使っている感覚の1つです。

 

人が音の方向感で使用する感覚:

・両耳間時間差

・両耳間強度差

・周波数の変化

以上の3つが人が音の到来方向を認識する上で必要な大きな要素となっています。

 

 

・両耳間時間差

 ひとつの音が右耳、左耳に到達する時間の差

f:id:hiro-htm877:20181018133445p:plain

t(時間) = l(道のり) / v(速さ)

式より、L、Rの耳に到達する時間は微妙に変わって来ます(0.1ms単位)。この微妙な変化から人は音の到来方向を認識しています。

 

 

・両耳間強度差

 ひとつの音の右耳、左耳における強度(音の大きさ)の差

f:id:hiro-htm877:20181018133910p:plain

 L、Rでは音源との距離が違うため、音の減衰量も変わって来ます。なので、絵のように左側に音源がある場合は、左側に到達する音の方が大きく聞こえます。

 

 

・周波数変化

 耳介と呼ばれる耳の凸凹、頭部の解説などによる音の周波数変化

 音は耳介の凸凹にぶつかることで変化します。入ってくる角度で凸凹のぶつかり方も変化するため、その変化を利用して、主に到来方向の垂直方向を認識できると言われています。

f:id:hiro-htm877:20181018134247j:plain

 

 

今回はこの中で人が音の到来方向を認識するのに一番関与している両耳間時間差を用いて音声信号処理を行い、音源に方向感を付与して行きたいと思います。

 

ITD 両耳間時間差

 コード:


def itd(sig, fs):
    itdParam = int(fs*(4/10000))
    outLength = int(len(sig) + itdParam)

    sigL = np.zeros(outLength)
    sigR = np.zeros(outLength)

    for i, data in enumerate(sig):
        sigL[i+itdParam] = data
        sigR[i] = data
    return sigL, sigR

 

解説:

まず、引数として音声データsigとサンプリング周波数fsを受け取る。

 

 変数:

  itdParam: 両耳間時間差のパラメータ、ここの値を変化させることで到来方向が変わっていく。

  outLength: itdPram分の時間差をつけるために配列の長さを調整する

  sigL: 左耳の音声データ

  sigR: 右耳の音声データ

 

 for文:

  sigL, sigR用の配列に値を格納していく。

f:id:hiro-htm877:20181018142019p:plain

こうすることによって左右の耳で再生される音声に時間差が与えられる。

 

・処理前

 ・ITD処理(itdParam = 0.4ms)

 ・ITD処理(itdParam = 0.8ms)

 

・正面(馬場このみ)、右前(ジュリア)、右(豊川風花) 

()内はアイマスのキャラ名です。特に気にしないでください。

 

正面や右前などを意識してみてください。意識したら声を聞き分けられると思います。これはカクテルパーティー効果を言う現象でまた後日ブログにて詳しく紹介します。

 

www.youtube.com

 

github:

github.com