(2019-03-21 初稿 - 転記 2020-08-13)
前回の Raspberry Pi3にしゃべってもらう では、女性の美しい声でしゃべってもらうところまで説明しました。
このページでは、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 0
pcm.!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が認識し、それに対する回答をしゃべってもらうように改良を進めたいと考えています。
また、何かわかったら追記します。