RaspberryPiでビームフォーミングした音をストリーミング再生できるようになるまで

概要

音のビームフォーミングは、マイクに指向性を持たせて認識したい方向からの音声をより強調するものです。音声認識の前処理として利用されています。
関連記事
・ODASのインストールガイド

実行環境

・Raspberry Pi 3(Raspbian)
・PlayStation Eye

ODASライブラリを使ってビームフォーミング

マイクの設定ファイルを使用用途に合わせて変更してください。
・マイクの設定
PlayStation Eyeには4つコンデンサマイクが内蔵されています。それぞれのコンデンサマイクの間隔は2[cm]なので、それに合わせて"mu=( );"の値を書き換えてください。また、コンデンサマイクの向きに合わせて"angle=( );"の値を調整してください。以下コードはPlayStation Eyeを使用する場合の例になります。

general:
{

   ~中略~

   mics = (
       # Microphone 0
       {
           mu = ( +0.000, -0.030, +0.000 );
           sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 );
           direction = ( +1.000, +0.000, +0.000 );
           # angle = ( 90.0, 100.0 );
           angle = ( 0.0, 5.0 );
       },
       # Microphone 1
       {
           mu = ( +0.000, +0.010, +0.000 );
           sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 );
           direction = ( +1.000, +0.000, +0.000 );
           # angle = ( 90.0, 100.0 );
           angle = ( 0.0, 5.0 );
       },
       # Microphone 2
       {
           # mu = ( +0.000, +0.010, +0.000 );
           mu = ( +0.000, -0.010, +0.000 );
           sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 );
           direction = ( +1.000, +0.000, +0.000 );
           # angle = ( 90.0, 100.0 );
           angle = ( 0.0, 5.0 );
       },
       # Microphone 3
       {
           mu = ( +0.000, +0.030, +0.000 );
           sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 );
           direction = ( +1.000, +0.000, +0.000 );
           # angle = ( 90.0, 100.0 );
           angle = ( 0.0, 5.0 );
       }
   );

困った時の参考サイト
 
・ソースコード内のXYZ座標が知りたい

・床や壁からの反射音による誤認識を減らす
マイクの設置場所に応じてこちらを調整してください。
ゲインを下げる角度を"angle=( );"の値で指定します。壁や天井からの反射を防ぐには"direction=( );"で座標軸の変更をした上で"angle=( );"の値を調整してください。以下のコードは、床からの反射音による誤認識を減らす例になります。

general:
{

   ~中略~

   spatialfilters = (
       {
           direction = ( +0.000, +0.000, +1.000 );
           # angle = (90.0, 95.0);
           angle = (80.0, 90.0);
       }

   ~中略~

};

・ビームフォーミングを形成する方向設定
形成方向を動的に変化させる場合は"add=;"を"dynamic"にし、変化させない場合(事前に方向を指定する場合)は"static"にしてください。またビーム形成の方向などのパラメータ設定は使用用途に合わせて調整してください。以下のコードは正面の音声をより強調するパラメータになります。

sst:
{

   ~中略~

   # Add is either "static" or "dynamic"
   # add = "dynamic";
   add = "static";
   # Parameters used by both the Kalman and particle filter
   active = (
       # { weight = 1.0; mu = 0.4; sigma2 = 0.0025 }
       { weight = 1.0; mu = 0.8; sigma2 = 0.0020 }
   );
   inactive = (
       # { weight = 1.0; mu = 0.25; sigma2 = 0.0025 }
       { weight = 1.0; mu = 0.4; sigma2 = 0.0020 }
   );

   ~中略~

   # theta_new = 0.3;
   theta_new = 0.9;
   # N_prob = 9;
   N_prob = 5;
   theta_prob = 0.8;
   # N_inactive = ( 150, 150, 150, 150 );
   N_inactive = ( 1000 );

   ~中略~

   # target: ();
   target:
   (
       { tag = "myTrackedSource"; x = 1.0; y = 0.0; z = 0.0; }
   );

   ~中略~

}

ビームフォーミングした音データをソケット通信で送る

ビームフォーミングした音の出力設定がマイクの設定ファイルに含まれています。デフォルトの設定だとraw形式のファイルに保存されるようになっています。"type=;"の中をソケット通信に変更し、IPアドレスとポート番号の設定をしてください。

sss:
{

   ~中略~

   postfiltered: {

           ~中略~

                interface: {
           # type = "file";
           # path = "test_postfiltered.raw";

               type = "socket";
               ip = "**IPアドレス**";
               port = **port番号**;
       };
   };
};

困った時の対処法
 ・サーバーの起動方法

nc -l **port番号**

 ・ネットワーク状況の確認

netstat -ano

 ・音の出力先をイヤホンに変更

amixer cset numid=3 1

 ・音の出力先をディスプレイに変更

amixer cset numid=3 2

 ・音出力の動作確認
 ※実行前に音量のパラメータをご確認ください。音量が大きい場合があります。

speaker-test -t sine -f 600

実行

・サーバー経由で音を再生する
port番号はマイクの設定ファイルで設定したものを使用してください。

nc -l -p **port番号** | aplay -t raw -c 1 -r 16000 -f S16_LE -

・ODASを起動

./odaslive -c **使用するマイクの設定ファイル**

よろしければサポートお願いします。頂いたサポートは全額制作活動費(機材購入、イベント出展、エナドリ代)に活用させて頂きます。 制作活動の継続/生きる希望になりますので、よろしくお願いします。