2.8. オーディオデバイス音声取得用ノード 【AI-Addon】

2.8.1. ice mic

入力端子から入力されたオーディオデバイスのアドレス(URLやエッジサーバ上のOSのデバイスの識別子) で接続できるオーディオデバイスから音声を取得し、 指定されたオーディオデバイス1台から音声を取得し、Node-REDのフローに音声データを出力するノードです。

2.8.1.1. 設定項目

ice micには以下の設定項目があります。

Device
接続するオーディオデバイスのアドレスを直接指定します。 この項目を設定した場合、入力端子が非表示になり、 入力を受け付けなくなります。 このため、本項目を入力した場合は1ノードで1オーディオデバイスとのみ接続します。 また、Profileに入力されたデバイスプロファイルを使用してバックエンドに対してデバイスを登録します。
Profile
デバイスを登録する際に使用される情報です。 デバイスの特徴等をJSON形式で記述してください。 Deviceに入力がある場合のみ表示され、必須項目となります。
User for RTSP
RTSP接続をする場合に利用する認証用ユーザIDです。
Password for RTSP
RTSP接続をする場合に利用する認証用パスワードです。
Output Type
音声を出力する形式をStream,Bufferのいずれかからプルダウンで指定できます。 必須項目で、デフォルトはBufferになっています。
Sampling Rate
音声のサンプリングレートをプルダウンから選択します。 8000, 16000, 44100, 48000から選択が可能です。 必須項目で、デフォルトは8000になっています。
Retry Times
デバイスとの接続が切れたとき、何回まで再接続を試みるかを指定します。 0以下の数字が指定された場合、デバイスとの接続が切れても再接続を行いません。 必須項目で、規定値は0になっています。
Retry Interval
デバイスとの再接続を試みる間隔を指定します。単位はミリ秒です。 デバイスとの接続が切れたとき、指定された秒数だけ待ってから再接続を行います。 必須項目で、規定値は30000になっています。
Data Type
イベントデータとして発行するData Typeを指定します。必須項目であり、規定値は「mic」になっています。
Name
ノードの名称を設定することができます。

2.8.1.2. メッセージ構造

2.8.1.2.1. 入力メッセージ

ice micノードは以下の形式のメッセージ入力を受け付けます。 カメラと接続時に入力があった場合、カメラとの接続を破棄し、新しい入力に対応したカメラに接続します。

{
    "payload":{
        "object_id" : "",              //onvif連携用ノードと組み合わせて使用する場合にonvif連携用ノードで割り振られるobject_idを入力します。
                                       //省略した場合、新規のオーディオデバイスとしてobject_idが割り振られます。
        "device" : "rtsp://xxxx",   //接続するオーディオデバイスの識別子を入力します。
        "profile" : {                  //デバイスのプロファイルを渡します。object_idが省略された場合必須です。
            ...
        }
    }
}

なお、stream_uriは以下の形式でも入力が可能です。

{
    "payload":{
        "object_id" : "",              //onvif連携用ノードと組み合わせて使用する場合にonvif連携用ノードで割り振られるobject_idを入力します。
                                       //省略した場合、新規のオーディオデバイスとしてobject_idが割り振られます。
        "camera" : {
            "stream_uri" : "rtsp://xxxx"   //接続するオーディオデバイスの識別子を入力します。
        },
        "profile" : {                  //デバイスのプロファイルを渡します。object_idが省略された場合必須です。
            ...
        }
    }
}

または、

{
    "payload":{
        "object_id" : "",              //onvif連携用ノードと組み合わせて使用する場合にonvif連携用ノードで割り振られるobject_idを入力します。
                                       //省略した場合、新規のオーディオデバイスとしてobject_idが割り振られます。
        "onvif_out" : {
            .....                      // onvif pipeノードでGetStreamUriを実行した場合の出力。 要調査。
        },
        "profile" : {                  //デバイスのプロファイルを渡します。object_idが省略された場合必須です。
            ...
        }
    }
}

2.8.1.2.2. 出力メッセージ

ice micノードは以下の形式でNode-REDフローにメッセージを送出します。

{
    "_msg_id": メッセージID,
    "payload": オーディオデータ or ストリーム,     //Output TypeがStreamはストリームを、Bufferの場合にはバイナリバッファを出力します
    "media_params" : {
        "type" : "audio",                        //audio固定
        "format": "pcm_s16le",                   // pcm_s16le固定
        "sampling_rate" : 8000,                  //出力音声のサンプリングレートです
        "channels": 1                            //音声のチャンネル数です。 1固定です。
    },
    "ice_params": {
        "type": "event_data",  //event_data固定
        "data_type": "...",     //Data Typeに指定した値
        "object_id": "..."     //オーディオデバイスのObject ID
    }
}

2.8.1.3. 使用方法

  • 自動発見したONVIF対応カメラから音声を取得する

onvif discoveryノードの出力を接続すると発見したカメラから映像を取得します。 複数のカメラを接続する場合は、onvif discoveryノードからの出力を switchノードで分け、それぞれice micに接続してください。 カメラのObject IDにはonvif discoveryで割り振られたIDが使用されます。

usage_ice_mic1

  • 自動発見したONVIF対応カメラに初期設定を実行した上で音声を取得する

onvif discoveryノードとonvif pipeノードを使用して カメラに初期設定をした後に映像を取得することができます。 ice micノードの入力端子にGetStreamURIファンクションを実行するonvif pipeノードの出力を接続してください。

カメラのObject IDにはonvif discoveryで割り振られたIDが使用されます。

usage_ice_mic2

  • アドレスを直接指定してカメラ/マイクから音声を取得する

injectionノードからカメラのアドレスを指定してice micノードに接続することで、 指定したカメラのアドレスから映像を取得できます。 injectionノードからフローの開始時にメッセージを出力するように設定することで、 フロー開始時に自動的に指定のカメラから映像を取得できます。

usage_ice_mic3

  • 設定ファイルから指定してカメラ/マイクから音声を取得する

fileノードを使用して設定ファイルから接続先カメラのリストを取得することで、 設定ファイルを書き換えれば接続先カメラを変更可能なフローを作成できます。

たとえば以下のようなJSONファイルを読み込み、カメラごとに分解してice micノードに入力することで、 リストに登録されたカメラから映像を取得することができます。

[
    {
        "device": "デバイスのアドレス",
        "profile": {
            ...
        }
    },
    {
        "device": "デバイスのアドレス",
        "profile": {
            ...
        }
    },...
]

usage_ice_mic4

2.8.2. ice audio save

入力された音声データを一定の間隔で音声ファイルに出力するNode-REDノードです。 出力されるファイルはwave形式のファイルとなります。 ファイル名はice audio saveノード、オーディオデバイス、保存時刻ごとに ${Destination}/${ノードのID}/${object_id}_yyyyMMdd_hhmmss.wavとなります。

2.8.2.1. 設定項目

ice audio saveノードは以下の設定項目があります。

Interval
音声をファイル出力する際の時間間隔を指定します。単位は秒です。 必須項目です。0より大きい整数を入力してください。既定値は60です。
Destination
ファイルを出力するディレクトリを指定します。 絶対パスで指定してください。 ice file transferノードを用いてバックエンドに転送したい場合、 core_config.jsonのupload.white_dirsに記述したディレクトリ以下のパスを指定してください。 必須項目で、規定値は/tmpになっています。
Max Save Num
オーディオデバイス(Object ID)ごとに保存する音声ファイルの個数を指定します。 ここで指定された個数を超えた音声ファイルは古い順に削除されます。 0以下の数字が指定された場合、無限に保存することが可能です。この場合、自動的に削除はされないのでご注意ください。 必須項目で、既定値は5になっています。
Data Type
イベントデータとして発行するData Typeを指定します。必須項目で、規定値は「wav」になっています。
Name
ノードの名称を設定することができます。

2.8.2.2. メッセージ構造

2.8.2.2.1. 入力メッセージ

ice audio saveノードは以下の形式の入力を受け付けます。 msg.payloadReadable StreamまたはBuffer型のオブジェクトを受け付けることができます。 音声ファイルはmsg.ice_params.object_idごとに分けて出力されます。 同じobject_idを持つカメラに対してReadable Streamが複数回入力された場合、 後から入力されたReadable Streamを使用するようになります。 また、一度Readable Streamが入力されたobject_idに対してBufferが入力された場合には無視をします。

{
    "payload": オーディオデータ or ストリーム,     //Readable Streamまたは音声のBufferを受け付けます。
    "media_params" : {
        "type" : "audio",                        //audio以外の場合入力を無視します。
        "format": "pcm_s16le",                   // pcm_s16le以外の場合無視します。
        "sampling_rate" : 8000,                  //出力音声のサンプリングレートです
        "channels": 1                            //音声のチャンネル数です。
    },
    "ice_params": {
        "object_id": "..."     //オーディオデバイスのObject ID, 出力ファイルはobject_idごとに管理されます。
    }
}

2.8.2.2.2. 出力メッセージ

ice audio saveノードは以下の形式でNode-REDフローに オーディオデバイスごとのイベントデータとして保存した音声ファイルのパスを出力します。

{
    "payload" : "ファイルパス",           //音声ファイルのファイルパスを出力します。
    "ice_params":{
        "type": "event_data",  //event_data固定
        "data_type": "...",     //Data Typeに指定した値
        "object_id": "..."     //オーディオデバイスのObject ID
    }
}

2.8.2.3. 注意事項

ice micノードは${ICE_HOME}/native/user/配下に接続されたカメラごとにデバイスアダプタを作成します。 デバイスアダプタはデフォルトではログを出力しないようになっています。 ログを出力させたい場合は、 ${ICE_HOME}/native/lib/_audio_device_adapter配下のconfig.jsonを以下のように編集してください。

{
    "command": "audio_device_adapter",
    "args":["device_adapter_profile.json"],
    "respawn": 0,
    "priority":10,
    "wait_for_shutdown": "true",
    "stdout": "file",
    "stderr": "file"
}

C APIの内部処理メッセージもログに出力したい場合は、 上記の通りconfig.jsonを編集した上で、 デバッグメッセージ出力機能の 「6.8.3.2.1. デバッグメッセージ出力機能」に記載の通り、環境変数を設定してください。