(2019-03-21 初稿 - 転記・修正 2021-05-06)
はじめに
このページでは、Raspberry Pi3にマイクを接続して、音声認識の準備まで行う。
簡単だと思ったが、なかなか苦戦したので、確認ポイントを示しながら筆者の備忘録として記述する。
購入したマイク
購入したマイクは、以下の2種類。
後ほど接続の結果を示すが、それなりの感度をもったマイクの方が、音声認識が良いようだ。
- Elecom USBヘッドセット(HS-EP13USV) \1,500 (下写真 左)
- MINI Microphone MI-305 \440 (下写真 右)
両マイクともに、Raspberry Piで自動的に認識し、lsusb コマンドは、以下のとおり。
Bus 004 Device 005: ID 0c76:161f JMTek, LLC. # HS-EP13USV
Bus 004 Device 004: ID 8086:0808 Intel Corp. # NI-305
マイク認識の優先度を確認する
通常は、購入して挿したマイクの優先順位が低い状態である。
$ cat /proc/asound/modules
0 snd_bcm2835
1 snd_usb_audio
そこで、alsa-base.confの作成し、マイクの優先順位を上げる。
筆者が試した範囲では、マイクの優先順位が高くしないと、音声認識がうまく行かなかったので、以下のように /etc/modprobe.d/alsa-base.conf を作成し、優先順位を変更した。
(最終的に、確認、設定方法がわかっている場合は、この優先順位を上げる作業は不要。)
sudo vi /etc/modprobe.d/alsa-base.conf
options snd slots=snd_usb_audio,snd_bcm2835
options snd_usb_audio index=0
options snd_bcm2835 index=1
ここで、indexが0の場合が、最も優先順位が高いようだ。
設定したマイクのカード番号、デバイス番号を確認する。
arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 0: Device [USB PnP Audio Device], デバイス 0: USB Audio [USB Audio]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
ここでは、カード番号 0、 デバイス 0 であることを確認した。
録音する
録音は、以下のとおりarecordコマンドを実行する。
$ arecord -D plughw:0,0 test.wav
録音中 WAVE 'test.wav' : Unsigned 8 bit, レート 8000 Hz, モノラル
シグナル 割り込み で中断... ⇐ Ctrl+c で中断する。
続いて、録音したファイルを再生するが、まずはカード番号とデバイス番号を以下のとおり確認する。
aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: Device [USB PnP Audio Device], デバイス 0: USB Audio [USB Audio]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
カード 1: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA]
サブデバイス: 7/7
サブデバイス #0: subdevice #0
サブデバイス #1: subdevice #1
サブデバイス #2: subdevice #2
サブデバイス #3: subdevice #3
サブデバイス #4: subdevice #4
サブデバイス #5: subdevice #5
サブデバイス #6: subdevice #6
カード 1: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
購入したマイク(正式にはヘッドセット)には、片耳のスピーカーが付いているので、そちらでも再生できるが、HDMI接続のテレビの方が音が良いので、ここではカード番号1,デバイス0に出力する。
aplay -D plughw:1,0 test.wav
再生中 WAVE 'test.wav' : Unsigned 8 bit, レート 8000 Hz, モノラル
うまく聞こえただろうか? 筆者の場合、雑音だらけで、どちらのマイクも自分の声が聞き取れなかった。
この原因の主なものは、録音ボリュームが低いことによると考えらる。
現在の録音ボリュームは以下のコマンドで確認できる。
amixer sget Mic
Simple mixer control 'Mic',0
Capabilities: cvolume cvolume-joined cswitch cswitch-joined
Capture channels: Mono
Limits: Capture 0 - 496
Mono: Capture 496 [100%] [31.00dB] [on]
一方、ボリュームの設定は以下のコマンドで設定できるが、マイクによって最大の設定値が異なる。
amixer sset Mic 496 # HS-EP13USV 0〜496
amixer sset Mic 16 # MI-305 0〜16
また、最後の行に設定の割合と最大dbの記載があるので、注意すること。
筆者の手元のマイクでは、高価なマイクほどdbが大きかった。
Mono: Capture 496 [100%] [31.00dB] [on]
録音ボリュームを上げて、録音した音声がきれいに聞こえるようになるまで、上記の確認を行う。
うまく聞こえるようになったら、以下のとおり、出力(pcm)はHDMI(カード1)、録音(ctl)はカード0に設定します。
$ vi .asoundrc
defaluts.pcm.card 1
defaults.ctl.card 0pcm.!default {
type hw
card 1
}ctl.!default {
type hw
card 0
}
上記ファイルを作成したら、以下のとおりalsaを再起動する。
/etc/init.d/alasa-utils restart
簡単な確認方法
以下に、録音ファイルを作らずに、音声をダイレクトでスピーカーに出力する方法を示す。
頻繁に確認する場合等に利用すると便利である。
arecord -D plughw:0,0 | aplay
上記確認でエラーが出るようであれば、設定が間違っているので、これまでの設定を確認すること。
また、音声がはっきり聞こえるようにボリュームを調整すること。
ブラウザで音声認識
実際に以下のサイトで、音声認識できるか試すと良い。
筆者は、起動時のマイク有無等、再現性が乏しくて困っていましたが、chromium側のマイク設定があることに気がついて、安定して使えるようになった。
音声はちゃんと聞こえるのに、認識ができないときは、chromiumの以下の設定を確認すること。
「︙ 設定」⇒「詳細設定」 ⇒ 「コンテンツの設定」⇒「マイク」 ⇒ 「規定」の
ドロップダウンリストから「USB PnP Audio Device, …」を選択。
うまく認識できる場合がある。
筆者は、この設定を知らなかったので、かなり時間を浪費してしまった。^^;
余談だが、Speech Notesの音声認識能力は極めて高く、句読点や語句の修正をキーボードで行いながら、音声入力するとかなりの速度で文章を作成することができる。
試してみると良い。
おわりに
なんとかマイクをRaspberry Pi3に認識させることができた。今後は、googleの音声認識をchromeブラウザ以外から利用する方法等を検討し、筆者がしゃべったことばをRaspberry Piが認識し、それに対する回答をしゃべってもらうように改良を進めたいと考えている。
また、何かわかったら追記する。