●Bluetooth マイク で julius 接続
2020.07.13
Raspberry Pi ROBOT に音声認識させたくても、USB Mic では周囲の雑音を
拾ってしまい、自分の出す Motor 音で音声命令がかき消されて
julius は認識してくれません。
これを避けるには、Motor の消音しかありませんが、木製の Transmission の
内側にゴムを張って消音をしてみましたが、やはり Motor 音は残ります。
これ以上音を小さくするのは、難しい状況になってきたので、
Mic から雑音をできるだけ拾わない方法を考えるしかない。
Raspberry Pi 4B には、Bluetooth が標準で装備されていますので、
Bluetooth Mic を使用して、音声命令を認識させる方法を取ります。
RasRobo 音声命令に使用する Headset
Headset から juliusu に接続
Raspberry Pi 4B には、Bluetooth 5.0 が最初から Support されていますので、
Headset を付ければ簡単に接続できると思いましたが、
いきなりハマってしまいました。
まず julius は Bluetooth Interface から音声入力をする事は考慮されていません。
Raspberry Pi 4B の内蔵 Bluetooth は Ver5.0 で最新ですが、
この LSI とアプリをつなぐ SOFT は、ALSA が開発をやめてしまったので、
Pulseaudio しかありません。
Pulseaudio は Bluetooth で Raspberry Pi と接続できますが、
Pulsesudio で録音 Pulseaudio で再生しかできません。
私がほしかった headset から Bluetooth で取りこんだ音声を
USB Mic Interface に変換して alsa で再生して、
他のアプリに渡せる機能など無いのです。
USB Mic をやめて Bluetooth Mic にして julius を動作させようとしたい人は、
いきなりここで、つまづくのです。
Raspberry Pi 3B の対策
Pulseaudio を使用して headset から直接 Bluetooth で
内部の LSI Chip(BCM43438) に接続する事ができなかった。
Pulseaudio と内部 LSI Chip 間の Interface に問題があり、
Raspberry Pi の内蔵 Bluetooth LSI を使用せずに外付けの
Bluetooth〜USB 変換 Adapter(USB Dongle) で対処したのです。
また、Raspberry Pi 3B では、2.4Ghz 帯だけしか使用できなかったので、
Bluetooth の電波に Wifi の電波がかぶってしまうので、
Bluetooth か Wifi のどちらかしか使用できませんでした。
この事は英国人で「Youness」という Home page を書いている人が
1年以上かけて調べた結果を公開しています。
Youness の Page
↓
Bluetooth Headset 又は Speaker を Raspberry Pi3 に接続する方法
私が USB Dongle に変更しようと考えた時に Youness の Home page に
たどり着きました。この page は、大変参考になりました。
Raspberry Pi 4B の対策
Raspberry Pi 4B では、内部の LSI Chip が
Cypress(CYW43455) に変更されています。
これにより、Bluetooth 5.0 規格を Support できる様になり、
Wifi も 802.11/ac が Support されたので 2.4Ghz 帯と 5Ghz 帯を使用できる
様になりました。
この LSI Chip では Wifi を 5Ghz 帯に設定して使用すれば、
2.4Ghz 帯を使用する Bluetooth を共存させる事もできます。
機器の機能は向上したのですが、Pulseaudio と新 LSI Chip(CYW43455)
との接続がうまくいくのかどうかは、まだわかりません。
Pulseaudio に問題があれば、USB Dongle を使用するしかありません。
Bluetooth で julius と接続できなかった記録
Bluetooth の install は、まず Bluetooth Library の
DownLoad から始めます。
■Bluetooth Library
$ sudo apt-get install pi-bluetooth
これは正常に install できた。
$ sudo apt-get install bluetooth
これは正常に install できた。
■Pulseaudio-alsa
$ sudo apt-get install pulseaudio-alsa
Error が出て install できません。
git からもらってこないといけない様です。
$ sudo git clone https://aur.archlinux.org/bluez-alsa-git.git
$ cd bluez-alsa-git
$ sudo install bluealsa.install
これもダメな様です。
alsa は、Raspberry Pi 用の Bluetooth SOFT の開発をやめてしまった
様ですから、pulseaudio を使用するしか選択肢はありません。
■bluez
$ sudo apt-get install bluez
これは正常に install できました。
■bluez-utils
$ sudo apt-get install bluez-utils
以下の install Message が出てきた。
bluez-utils Package は使用できませんが、
別の Package から参照されます。
これは Package が欠落しているか、廃止されたか、また別の Source
からのみ利用可能である事を意味します。
しかし、以下の Package が置き換えます。
↓
bluez
この Error から推測すると bluez に置き換えられている様です。
■bluez-firmware
$ sudo apt-get install bluez-firmware
これは正常に install できた。
■bluez-libs
$ sudo apt-get install bluez-libs
Package が見つかりませんという Error がでた。
これはもはや非推奨になっていて、UPdate される事は無いので
使用しないでくださいと書いてあった。
■blueman Library [GUIで Pairing を行う]
$ sudo apt-get install blueman
これは正常に install できた。
■pulseAudio Library [Bluetooth と内部機構を連携する]
$ sudo apt-get install pulseaudio-module-bluetooth
dpkg -l pulseaudio pulseaudio-module-blutooth
これは正常に install できた。
■pulseAudio Volume control Library [pulse Audio を利用した音量調整機能]
$ sudo apt-get install pavucontrol
これは正常に install できた。
これらの Library を install すると、Bluetooth を、
raspberry Pi Console 画面から設定できる様になります。
電源立上げ後、Bluetooth 画面を開いて、新規端末登録、Pairing 、
接続をその都度やらなくてはなりません。
これは面倒です。
Headset の電源を立上げて、Pairing 要求で接続出来れば便利ですけどね。
main.conf の設定
まず、Raspberry Pi の電源立上げ後に、Bluetooth を自動で有効に
する様に設定します。
$ cd /etc/bluetooth
$ sudo nano main.conf
[Policy] Section の下に下記の行を追加します。
#[Policy]
AutoEnable = true
Headset を直接接続できる様にする場合。
$ cd /etc/bluetooth
$ sudo nano main.conf
[General] Section の下に下記の行を追加します。
#[General]
DiscoverableTimeout = 0
Discoverable = true
PulseAudio の設定
Headset を自動接続するには、/etc/pulse/default.pa に
switch-on-connect Modules を追加します。
$ cd /etc/pulse
$ sudo nano default.pa
下記の行を追加します。
# automatically switch to newly-connected devices
load-module module-switch-on-connect
.asoundrc の変更
/home 直下に作成してある隠し File の .asoundrc を変更します。
$ cd /home
$ sudo nano .asoundrc
pcm.!default { # Speaker 部分
type hw
card 1
}
ctl.!default { # ←ここがMic部分
type hw
card 0
}
.asoundrc を下記の様に書替ます。
Raspberry Pi からは Mic が Pairing 済と認識されても、
Mic 側からは認識されない。
$ cd /etc/bluetooth
$ sudo nano main.conf
ControllerMode = bredr
上記の1行を追加する。
Mic 認識がされない。
Pulseaudio では、Audio Interface の入出力を、Sink/Source と表記する様です。
Sink:Speaker への Audio 出力。
Source:Microphone からの Audio 入力。
$ pactl list short sources
0 alsa_output.platform-soc_audio.analog-mono.monitor module-alsa-card.c s16le 1ch 44100Hz SUSPENDED
1 bluez_sink.00_6A_8E_00_04_40.headset_head_unit.monitor module-bluez5-device.c s16le 1ch 44100Hz SUSPENDED
2 bluez_source.00_6A_8E_00_04_40.headset_head_unit module-bluez5-device.c s16le 1ch 8000Hz SUSPENDED
以上の様に表示が出た。
00_6A_8E_00_04_40 は、headset の MAC Address です。
Mic を入力を Default Device として設定したい。
$ pacmd set-default-source 1
何も表示せず。
module-cork-music-on-phone Modules の
Load を無効にするとよいとどこかに書いてあった。
$ scd /etc/pulse
$ sudo nano default.pa
###Cork music/video streams when a phone stream is active
#load-module module-role-cork
変わらず。
Mic が arecord -l で認識されない
(注:Pulseaudio では ALSA の Command の arecord, aplay, amixer などの
命令がすべて使えない事がどこかに書いてあった。)
HeadPhone や Speaker などを使用する場合は、
/etc/pulse/system.pa に下記の2行を追加しなければならない。
$ cd /etc/pulse
$ sudo nano system.pa
load-module module-bluetooth-policy
load-module module-bluetooth-discover
まだ、うまくいかない。
Headset のサスペンド問題
この Modules はアイドル状態の時に sink/source を自動的にサスペンドする
module-suspend-on-idle をコメントアウトする。
$ cd /etc/pulse
$ sudo nano default.pa
load-module module-suspend-on-idle
↓
#load-module module-suspend-on-idle
やっぱりダメか。
Pulseaudio Profile 設定
Headset を Sources (入力側)に設定する
$ pacmd set-card-profile bluez_card.00_6A_8E_00_04_40 headset_head_unit
$ pacmd list-sources # 内容表示
Pulseaudio headset source/sink の設定確認
$ pacmd list-sources #(入力側:1/2) (index3:Speaker-moniter)
$ pacmd list-sources #(入力側:2/2) (index4:Mic)
$ pacmd list-sinks #(出力側:1/2) (index0: Speaker)
$ pacmd list-sinks #(出力側:2/2) (index3: headset Speaker)
入力側の Interface 確認
$ pacmd list-sources|egrep -i 'index:|name:'
index1 Headset の Speaker 出力の monitor に * 印が付いており、
これが default になっている。
これでは、Mic 入力が出来ない訳だ。
Mic を入力を Default Device として設定変更する。
$ pacmd set-default-source 2
出力側の Interface 確認
$ pacmd list-sinks|egrep -i 'index:|name:'
index1 Headset の Speaker が default になっている。
これは問題なし。
Pulseaudio 録音
$ cd /home/pi
$ parecord -v test.wav
Pulseaudio 再生
$ paplay -v test.wav
Pulseaudio で録音して、Pulseaudio で再生する事はできた。
しかし、ROBOT の Speaker から音声は出てこないし Headset Speaker にも
つながらない。
この状態でもなぜか Open jTalk のメイちゃんの声だけは、
Headset Speaker から再生できている。訳わからん。
まだどこかで、Pulseaudio と ALSA がうまくつながっておらず、
競合しているみたい。
pactl で card 番号を調べる。
$ pactl list short cards
alsa が 0 で headset が 1 になっている。
これ自体は Speaker から音が出ない事と関係しないので、問題はないはずだが。
pacmd ls で内容を見ると。
$ pacmd ls
Headset は source(Mic側) は headset head unit に接続されており
sink(speaker側) は default に設定されている。
これなら音は出るはず。
julius の起動
それでも julius を起動すると Error が出る。
/etc/profile に、 ALSADEV="plughw:0,0" を設定してあったので、
これはコメントアウトした。
$ cd /etc
$ sudo nano profile
export ALSADEV="plughw:0,0"
↓
#export ALSADEV="plughw:0,0"
これは、再起動しないと有効にならない。
この状態で、headset Mic から pulseaudio で録音して、
headset speaker から再生できる様になった。
ようやく speaker から音が出る様になった。
それでは、julius を起動してみる。
$ cd /home/pi/julius
$ jjulius -C julius-test.conf
しかし、今度は別の Error が出る様になった。
julius は pulseaudio が動いてもダメで、alsa しか Interface は無いみたい。
これは、振出しに戻ってしまった。
----------------------------------------------------------------------------------------------------------------------------