読者です 読者をやめる 読者になる 読者になる

きょーちか実験室

Raspberry Piで遊んだり、ブログのアクセス解析したり

Raspberry Pi3を音声操作する方法① USBマイクで音声を録音する

買ったあとスグに飽きてしまい、押し入れに眠っていたRaspberry Piを掘り起こしてきました。「声で家電を操作する」ことを目標に、遊びながら勉強していこうと思います。

 

当面の目標を具体化すると、

「ラズ!電気つけて!」と言うと部屋の照明が付く

このような感じ。

 

まずはRaspberry Piに音声を入力するまでを実現しようと思います。

ちなみにLinuxや電子工作はRaspberry Piで初めて触れるので、初歩的なこともメモしていきます。

 

f:id:KyoChika:20170114164533p:plain

 

準備するもの

今回新しく用意したのはUSBマイクです。以下のものを近所のJoshinで買ってきました。

 

Raspberry Pi 音声認識」で検索すると複数のサイトでこのUSBマイクを使っていて、実績の高さから選びました。機器の相性で悩むのは嫌ですから。

 

音声を録音するまでの手順

基本的には以下のサイトに習って進めていったのですが、環境の違いかそのままではうまくいかない部分もあったので、メモしていきます。

 

karaage.hatenadiary.jp

 

Raspberry PiがUSBマイクを認識しているか確認する 

USBマイクをRaspberry Piに刺したあと、Raspberry Piを起動します。

まずはRaspberry Piがマイクを認識しているかを確認するために、ターミナルで以下のコマンドを打ちます。 

 

$ lsusb

 

lsusbはUSBデバイスを表示させるLinuxコマンドです。

実行結果はコチラ。

 

Bus 001 Device 004: ID 0d8c:0134 C-Media Electronics, Inc. 
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

 

Bus 001 Device 004: ID 0d8c:0134 C-Media Electronics, Inc.がマイクとのことで、Raspberry PiはちゃんとUSBマイクを認識しているようです。良かった。

 

USBオーディオアダプタの優先度を変更する(→失敗)

次にUSBオーディオアダプタの優先度を変更します。良くわからないですが、どのオーディオを優先的に使うか、そんな設定があるのかもしれません。ターミナルで以下のコマンドを打ちます。

 

$ cat /proc/asound/modules

 

実行結果は以下のようになり、USBマイクは優先度が低いようです

(2番目のsnd_usb_audio)

 

0 snd_bcm2835
1 snd_usb_audio

 

そのため以下の設定ファイルを編集する必要があるのですが…

 

$ sudo vi /etc/modprobe.d/alsa-base.conf

 

この/etc/modprobe.d/alsa-base.confというファイルが私の環境にはありませんでした…

とりあえずダメ元でファイルを作成してRaspberry Piを再起動してみたのですが、今度はUSBマイクがシステムから消えてしまいました…

 

0 snd_bcm2835

 

困った。慌てて/etc/modprobe.d/alsa-base.confを以下のコマンドで削除したところ、とりあえずUSBマイクが認識される状態には戻りました。

 

$ sudo rm /etc/modprobe.d/alsa-base.conf

 

一安心だけど結局USBオーディオの優先度とやらは変わっていません。困った。

困ったときはネットで調べてみると、やはり同じようなことに困っている人の情報を見つけました。

 

qiita.com

 

なにやらALSADEV変数というものをいじったらいけるそうです。いやいや、ALSADEV変数とはなんですか…

 

Advanced Linux Sound Architectureの略、Linux標準のドライバ(OSS/Free)の問題を解決し、 PCM再生やMIDI再生機能をLinux上に提供するサービス。 Linux標準のドライバ(OSS/Free)より音が良いとされている。 現在はカーネルにも内蔵されている(2.6)

ALSAとは - はてなキーワード

 

ふむ。とりあえずLinuxの音声系サービスなんですかね。ALSADEVがわかったところで本題に戻り、以下のコマンドを打ってみます。こちらのコマンドではUSBサウンドカードの位置を確認できます。

 

$  arecord -l

 

実行結果はこちら。USBサウンドカードはカード[1]のデバイス[0]にあることがわかりました。このカードとかデバイスとかはよくわからないまま進んでいます…

 

**** List of CAPTURE Hardware Devices ****
card 1: Device [USB PnP Sound Device], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

 

USBサウンドカードの位置がわかったので、以下のコマンドで優先度を変更します。

 

export ALSADEV="plughw:1,0"

 

実行結果は何も出ませんでした。

こういうのは合っているのか不安になるから心臓に悪い…

 

マイクのボリュームを調整する

USBマイクの優先度が変更できたので今度はボリューム調整を行います。

 

$ amixer sset Mic 50 -c 1
Simple mixer control 'Mic',0
  Capabilities: cvolume cvolume-joined cswitch cswitch-joined
  Capture channels: Mono
  Limits: Capture 0 - 62
  Mono: Capture 50 [81%] [16.59dB] [on]

 

最後の[1]は先程調べたカード番号です。

こちらによると最後の[-c 1]はどっかの設定ファイルを書き換えれば不要らしいのですが、とりあえず保留しておきます。

ボリュームについては81%とのことですが、とりあえず先人はこれで設定したらしいのでこのままにします。

 

音声を録音する

録音するために以下のコマンドを打ちます。

 

$ arecord -r 16000 -f S16_LE test.wav

 

するとエラーが出ました…

 

arecord: main:722: audio open error: そのようなファイルやディレクトリはありません

 

これについては色々調べてみたものの解決策が見えず、別の録音コマンド(引数)を指定してみることに。

 

$ sudo arecord -D plughw:1,0 test.wav

 

それぞれの引数はコチラでわかります。-DはPCMの指定らしく、plughw:1,0とUSBサウンドカードを指定したら録音できるようになりました。それってさっきの優先度設定がうまく行っていないということだろうか…

コマンドを実行してから[Ctrl+C]を押すまでの間録音できています。

 

録音した音声を再生する

音声を再生するためにスピーカ出力オーディオの位置を調べます。

 

$ aplay l

 

実行結果はコチラ。

 

**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

 

カード[0],デバイス[0]がスピーカのようですので、

 

$ sudo aplay -Dhw:0,0 test.wav

 

これで録音した音声が再生できるようです。Raspberry Piにイヤホンをつけて確認してみると、確かにさっき録音した声が聞こえてくる!よし、何とかできたようだ…

 

まとめ

「USB刺して録音する」なんて普段使っているWindowsChromebookなら一瞬でできそうなものだけれど、USBの認識に始まりあらゆるところでつまづきました。

振り返ってみると「声を録音できた」というショッボイ結果なのですが、それまでに色々と悩んだおかげか、自分が録音した声が聞こえた瞬間は「…聞こえている!」と小さな感動がありました。学び始めって小さい「できた」に感動しますよね、悩むけど。

 

次回はjuliusというソフトをインストールして、録音した音声を文字列として認識させたいと思います。自分で言ってて何言ってるかよくわかりません。勉強あるのみです。