プログラムからパペロの音量を変える方法

パペロは座布団のスイッチでスピーカーの音量を変えることができますが、プログラムの中から音量を変える方法について調べてみました。

amixerコマンド

linuxの再生デバイスとしてのスピーカーの音量は、amixerコマンドで変更できます。
再生音量を数値0~63で指定する場合:

# amixer -c0 sset PCM 32
Simple mixer control 'PCM',0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 64
  Mono:
  Front Left: Playback 32 [50%] [-32.00dB] [on]
  Front Right: Playback 32 [50%] [-32.00dB] [on]

0%~100%で指定する場合:

# amixer -c0 sset PCM 50%
Simple mixer control 'PCM',0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 64
  Mono:
  Front Left: Playback 32 [50%] [-32.00dB] [on]
  Front Right: Playback 32 [50%] [-32.00dB] [on]

Pythonアプリであればsubprocess.Popen()でコマンド実行すれば良いでしょう。
aplayコマンドでwavファイルを再生すると指定した音量で再生されます。

# aplay /tmp/test.wav

ところがamixerコマンドで変更した音量は、パペロに発話させると変更前の値に戻ってしまいます。

# amixer -c0
Simple mixer control 'PCM',0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 64
  Mono:
  Front Left: Playback 25 [39%] [-39.00dB] [on]
  Front Right: Playback 25 [39%] [-39.00dB] [on]
# amixer -c0 sset PCM 50%
Simple mixer control 'PCM',0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 64
  Mono:
  Front Left: Playback 32 [50%] [-32.00dB] [on]
  Front Right: Playback 32 [50%] [-32.00dB] [on]
※ここでpythonアプリからpapero.send_start_speech("こんにちは")実行
# amixer -c0
Simple mixer control 'PCM',0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 64
  Mono:
  Front Left: Playback 25 [39%] [-39.00dB] [on]
  Front Right: Playback 25 [39%] [-39.00dB] [on]

 なお発話コマンドではボリュームを指定できますが、これは座布団スイッチで設定されたボリュームを100%とした相対ボリューム指定になります。

ボリューム保存ファイルを書き換える

パペロの発話では、ボリュームが保存されたファイルを毎回参照し、音量を設定し直してから発話させているようです。
このファイルは、

/Extension/robot_platform/conf/VolumeLevel.conf

の様です。内容は

volumeLevel=10
mute=0

の様になっています。数値は、調べたところ、20が最大音量(amixserの64=100%)となっていました。
このファイルを書き換えてから発話させると、書き換えた値のボリュームで発話しました。
従って、発話とaplay両方を使って音を再生する場合には、amixerとVolumeLevel.confの書き換えを両方行う必要があることになります。
なおプログラムの中から/Extension下にあるファイルを書き換える場合、うっかり連続で何度も書き換えてしまうとその分FLASHを痛めますので、細心の注意が必要です。

マイク音量について

 少し脱線になりますが、amixerコマンドをオプション無しで実行すると通常再生と録音デバイスの情報が表示されますが、PaPeRo iの場合、スピーカー(PCM)しか表示されませんので、amixerによる音量指定は出来ないようです。
(arecordでデバイスを表示させる場合にはマイクは表示されます。)

# arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: CODEC [USB AUDIO  CODEC], device 0: USB Audio [USB Audio]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: CODEC [USB AUDIO  CODEC], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
# amixer
Simple mixer control 'PCM',0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 64
  Mono:
  Front Left: Playback 22 [34%] [-42.00dB] [on]
  Front Right: Playback 22 [34%] [-42.00dB] [on]

0