chakokuのブログ(rev4)

日々のごった煮ブログです

PiZeroで録音する

音声認識させるのを目標として、、次は録音してみる。
まずは録音・再生用デバイスの確認

root@raspberrypi:~# arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: U0x41e0x30d3 [USB Device 0x41e:0x30d3], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: U0x46d0x81b [USB Device 0x46d:0x81b], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

root@raspberrypi:~# 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: U0x41e0x30d3 [USB Device 0x41e:0x30d3], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

録音デバイスは、card:1,device0とcard:2,device:0の2種類検知されている。実際、Logicoolのカメラ(に付いたマイク)と、SoundBlasterのマイク入力の2系統あるのでいずれも検知されていることになる。どっちがどっちか分からないので動かして調べる。

録音のコマンドはググって以下と判明

arecord -f <format> -D hw:<CardID>,<DeviceID> <file>

aplayで怒られたので、フォーマットをS16_LE(Signed 16bit, Little Endian)と指定。1,0と2,0のデバイスをそれぞれ録音デバイスとして録再したところ、SBは1,0で、Logicoolは2,0であることが判明
SBのマイク入力から録音して再生

# arecord -f S16_LE -D hw:1,0 | aplay -D plughw:1,0

Logicookのカメラに付属するマイクから録音して再生

# arecord -f S16_LE -D hw:2,0 | aplay -D plughw:1,0

SBはマイク外付け必要なので、普段はLogicoolの内蔵マイク(2,0)で音声入力する予定。

補足

  • 録音時間は10秒を予定しているので、-d オプションでdurationを指定
  • 優先順位とか書いている記事があるのだけど、、優先順位を指定しないと何が問題か??
  • あと、、recordでは hw:n,nだけど、playでは plughw:n,nだ。。なぜ違うのか!?

■追記

Logicoolのカメラに付属するマイクで10秒間録音、16KHzサンプリングの例(S16_LEは、Signed16bit、LittleEndianの意味)、ch数の指定をしないとデフォルトはモノラル

# arecord -f S16_LE -D hw:2,0 -r 16000 -d 10 > test_16K_10sec.bin
# aplay -D plughw:1,0 test_16K_10sec.bin