Raspberry PiでJabra Speak 410を使う

# はじめに

生活空間の中において音声認識を用いたアプリケーションにはマイクとスピーカが必要になります。特にマイクの性能は重要で、高い評価を得ているAmazon Echoシリーズにおいては複数のマイクからの入力に対して信号処理などを行い、それを音声認識エンジンに渡すことにより高い精度での認識を実現しているといわれています。Raspberry Piを用いて独自のアプリケーションを実装する際、製品の一部として搭載されているマイクに近いものとして、ビデオ会議用に販売されているスピーカーフォンを用いることができます。ここでは、比較的低価格で入手できかつ高性能のスピーカーフォンとして[Jabra](http://www.jabra.jp/)の[Jabra Speak 410](http://www.jabra.com/Business/speakerphones/jabra-speak-series/jabra-speak-410)をとりあげ、Raspberry Piで使用するための設定を紹介します。

なお、ここで紹介する内容はRaspberry Pi 3 Model BとRaspbian Jessie with PIXEL（January 2017）を用いて確認した内容に基づいています。

# 問題

Jabra Speak 410は、特に専用のドライバをインストールすることなく、Raspberry Piに接続するだけで認識されます。

```bash
$ 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`を用いて録音と再生を試してみると、問題なく録音及び再生されます。

```bash
$ 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にセットしています）。

```bash
$ 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倍弱のピッチになってしまうためです。

```bash
$ 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であることを指定しても同様です。

```bash
$ 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](http://respeaker.io/)用に開発された[マイクアレイ](https://www.seeedstudio.com/ReSpeaker-Mic-Array-Far-field-w%2F-7-PDM-Microphones--p-2719.html)など、Raspberry Piで利用できるマイクアレイも増えてくることが期待できますが、現時点において手軽に利用できる方法としては有効なのではないでしょうか。

# リファレンス

- https://github.com/alexylem/jarvis/issues/65#issuecomment-257472419