はじめに
生活空間の中において音声認識を用いたアプリケーションにはマイクとスピーカが必要になります。特にマイクの性能は重要で、高い評価を得ているAmazon Echoシリーズにおいては複数のマイクからの入力に対して信号処理などを行い、それを音声認識エンジンに渡すことにより高い精度での認識を実現しているといわれています。Raspberry Piを用いて独自のアプリケーションを実装する際、製品の一部として搭載されているマイクに近いものとして、ビデオ会議用に販売されているスピーカーフォンを用いることができます。ここでは、比較的低価格で入手できかつ高性能のスピーカーフォンとしてJabraのJabra Speak 410をとりあげ、Raspberry Piで使用するための設定を紹介します。
なお、ここで紹介する内容はRaspberry Pi 3 Model BとRaspbian Jessie with PIXEL(January 2017)を用いて確認した内容に基づいています。
問題
Jabra Speak 410は、特に専用のドライバをインストールすることなく、Raspberry Piに接続するだけで認識されます。
$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: USB [Jabra SPEAK 410 USB], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
$ 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
card 1: USB [Jabra SPEAK 410 USB], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
nano
などで~/.asoundrc
を開き、pcm.!default
のplayback.pcm
とcapture.pcm
をそれぞれJabra SPEAK 410 USB
にセットします。
pcm.!default {
type asym
playback.pcm {
type plug
slave.pcm "hw:1,0"
}
capture.pcm {
type plug
slave.pcm "hw:1,0"
}
}
この状態でarecord
とaplay
を用いて録音と再生を試してみると、問題なく録音及び再生されます。
$ arecord -f S16_LE -r 44100 test.wav
Recording WAVE 'test.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Mono
(Ctrl - cで停止)
Aborted by signal Interrupt...
$ aplay test.wav
Playing WAVE 'test.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Mono
ここで、録音された声が小さいようであればamixer
コマンドでマイクのレベルを変更します(この例では設定可能な範囲である0〜7のうち0dBとなる5にセットしています)。
$ amixer sset Mic 5
Simple mixer control 'Mic',0
Capabilities: cvolume cvolume-joined cswitch cswitch-joined
Capture channels: Mono
Limits: Capture 0 - 7
Mono: Capture 5 [71%] [0.00dB] [on]
しかしながら、録音時のサンプルレートを音声認識時に良く用いられる16000Hzに変更するとテープの早回しのように高いピッチで再々されてしまいます。これは、本来はサンプルレート16000Hzで録音されたファイルが、その設定が無視されてJabra Speak 410の標準的なサンプルレート(48000Hz)で再生された結果、3倍弱のピッチになってしまうためです。
$ arecord -f S16_LE -r 16000 test2.wav
Recording WAVE 'test2.wav' : Signed 16 bit Little Endian, Rate 16000 Hz, Mono
(Ctrl - cで停止)
Aborted by signal Interrupt...
$ aplay test2.wav
Playing WAVE 'test2.wav' : Signed 16 bit Little Endian, Rate 16000 Hz, Mono
これは、次のようにしてaplay
にサンプルレートが16000Hzであることを指定しても同様です。
$ aplay -r 16000 test2.wav
Playing WAVE 'test2.wav' : Signed 16 bit Little Endian, Rate 16000 Hz, Mono
解決法
nano
などで~/.asoundrc
を開き、以下のように新たなデバイスjabra
を追加し、playback.pcm
のデバイスとしてセットします。この状態でaplay
コマンドを実行すると、正常なピッチで再生されるようになります。
pcm.jabra {
type hw
card 1
device 0
rate 48000
}
pcm.!default {
type asym
playback.pcm {
type plug
slave.pcm "jabra"
}
capture.pcm {
type plug
slave.pcm "hw:1,0"
}
}
なお、~/.asoundrc
はユーザごとのカスタム設定ファイルであるため、グローバルに設定したい時には/etc/asound.conf
に設定を記入するようにします。
以上で、Raspberry Piでの音声認識アプリケーション用にJabra Speak 410を利用できるようになりました。今後はSeeed StudioのReSpeaker用に開発されたマイクアレイなど、Raspberry Piで利用できるマイクアレイも増えてくることが期待できますが、現時点において手軽に利用できる方法としては有効なのではないでしょうか。