Julius サーバーにネットワークマイクを接続する
◯やりたい事
日本語の解析を担当するjuliusサーバーと集音を担当するマイクを adintool を利用してネットワークで接続し、それぞれを分離運用して利便性を上げたい。
(今回はマイクが1つだけの設定方法です。複数マイクを稼働させてみた方法は別にレポートします。)
◯やった事
まずは音声データを送るマイクの選定から。いろいろなものを試してみました。
USBマイク、
USBオーディオ変換ツールを利用した
ミニジャックマイク、
シリコンデジタルマイクなんていうのも試してみましたが、
結論から言うともうこれ一択。
seeedの ReSpeaker。
集音性、操作性、拡張性、どれを取っても抜群。
マイクは各部屋に置くことになるので、ついでにセンサも付けて各部屋の温湿度も集めてます。
◯設定方法
・julius サーバー側の設定
juliusをインストール後、juliusサーバーを
1. サーバー:モジュールモード
2. マイク入力:ネットワーク入力モード
の設定で起動します。
# サーバーモジュール起動 def mp_julius_module(): source = "adinnet" # source = mic,file,adinnet julius = '/usr/local/bin/julius' jconf = '/home/pi/julius/julius-kit/dictation-kit-v4.4/am-gmm.jconf' jdic = '使用する辞書をパス付きで記載' port = 10500 mic_port = 5530 cmd = [julius,'-C',jconf,'-nostrip','-gram',jdic] cmd += ['-input',source,'-adport',mic_port,'-module',port] wr = subprocess.call(cmd)
最終的に複数のjuliusモジュールがポート別にマルチプロセスで起動する事になるので少し冗長ぎみになってます。
・ReSpeaker側の設定
ReSpeakerをセットアップ後、adintool クライアントとしてjuliusサーバーを指定して起動します。adintool はそれ単体で動作しますので、juliusをインストールしたサーバーからReSpeakerの /usr/local/bin/ へコピーするだけでセットアップ完了です。ちなみにマイクのデバイス・カード番号は0,0に設定しておいた方が無難です。
なおマイク入力・データ送信は独立したスレッドとして起動させ、他の動作(温湿度データ収集)などと関係なく裏で動作させてます。
# 音声送信スレッド def th_julius_mic(): ip = 'モジュールモードで起動しているjuliusサーバーのipアドレス' port = 5530 #/// サーバ接続・マイク入力コマンド準備 adintool = '/usr/local/bin/adintool' cmd = [adintool,'-in','mic','-out','adinnet','-server',ip,'-port',port] #/// juliusサーバー接続開始。切断・エラーは再接続トライし続ける while True: try: subprocess.call(cmd) # エラーは時間をあけて再接続 except: continue finally: time.sleep(3)
◯その後使ってみて
サーバーを奥にしまって置けるのが超便利。壁にpHAT付のラズパイゼロがぶら下がっているだけ、と言うのがいい感じです。
記事で書いたゼロ用ケース
のおかげでラズパイの携帯性あがったため、「えだまめ」だけでなく「お茶漬け」「きんぴら」「おはなみ」と兄弟たちが増殖中です。
(写真は寝室でテスト中の「おはなみ」。「おはなみ!」と呼びかけると隣のSpeakerHATが「はい!」と答えます。実際に答えているのは階段下倉庫で動作しているjuliusサーバーです。)