ブロックを積みながら(48) Node-RED、play audioノードにwavファイル

Joseph Halfmoon

前回はDashboardの audio outノードを使って、文字列から「言葉をしゃべる」TTS機能を使ってみました。今回は、NodeREDエディタ上で音声を鳴らす play audioノードに wav形式の「バイナリバッファ」を食わせて音が鳴ることを確かめたいと思います。バイナリファイルからの読み出しには file inノードを使用。NodeREDサーバー機上のローカルファイルシステムから読み出します。

※「ブロックを積みながら」投稿順 index はこちら

今回使用する play audioノードも、文字列を送り込めばTTS(Text To Speach)で喋ってくれるようです。また、前回のDashboardのaudio outノードにもwav形式のバイナリを送り込めば音を鳴らすことができました。ハッキリした違いは、

    • 今回の play audioノードは、ブラウザでDashboardを開いていなくともNode-REDのエディタ画面を開いていたら鳴る。
    • 前回の audio outノードは、ブラウザでDashboardを開いていないと鳴らない。

という音の出る行き先です。しかしHelpを読むと、audio outは、mp3形式にも対応しているみたいですが、play audioにはmp3のことが書かれていません。テストしてないのでその差が行き先だけなのか、それ以外にもあるのか微妙。

file in ノード

file in ノードは、NodeREDサーバーが動作しているマシンのローカルファイルシステムからファイルを読み取ることができるノードです。読み取るファイルがテキストファイルであれば split ノード的に、行毎に分割して、順番付きの複数 msg の列として送り出してもくれるみたいです。

しかし、今回は .wav 形式の音声ファイル(16kサンプリングのモノラル)であるので、バイナリバッファ形式での読み出しとなります。設定は以下に。

FileInSettingsHelpみると、ファイルの在り処は絶対パスで指定するのがお勧めみたいなことが書いてあったので、ことさらに絶対パスで指定してみました。

ともかく設定すれば、テキストでもバイナリでもファイルの内容を msg に載せて送り出せてしまうお役立ちノードです。

なお、バイナリ形式でも決まったバッファサイズで分割する機能があるみたいです。今回の wavファイルは、ありがちな

ただいまマイクのテスト中!

と自分で喋っている短いファイルなので素のままで送っています。

なお、ファイルを読み出すタイミングは、入力に何か msg が到来すると、です。今回は Injectノードからデフォルトの日時を送り込んでみたのですが、ファイル読み出しのトリガにはなりました。Injectノードから送り込んだ msg はトリガに使われただけに見えます。後は捨てられちゃうのかね。

play audio ノード

play audioノードには、前回同様、TTSボイスの選択のプルダウンウインドウがあります。そこを開いても WAVで音を鳴らせといった指定はありません。以下のように Microsoft Ayumiを指定したまま(デフォルトのまま、何も設定変えず)でも、WAVファイルを搭載したバイナリバッファを送り込めば音が鳴りました。
PlayAudio

バイナリバッファの中身を覗く

バイナリバッファの中身がどうなのか気になったので、デバッグノードを取り付けて観察してみました。大量のバイナリデータに溺れることのない表示でした。以下のようにpayloadには、bufferという名のバイト数分の配列が載っており、デフォルトでは、頭の1行くらいが見えているだけです。改めて buffer を開くと10個毎のインデックス番号ごとに並べてくれていて(見やすく省略あり)、見たいインデックスのところを開くとバイナリデータ(といっても10進表現)がようやく表れます。

BinarryBuffer
この形式であれば、単なるバイト数列なので、何か処理することも簡単じゃないかと思います。つい、良からぬことに使いそう。。。

ブロックを積みながら(47) Node-RED、Dashboard, audio out に戻る

ブロックを積みながら(49) Node-RED、fileノードでファイルへ書き込み へ進む