気の向くままに辿るIT/ICT/IoT
webzoit.net
IoT・電子工作

ラズパイ 3 B+自作スマートスピーカーに伝言メッセージ機能追加

ウェブ造ホーム前へ次へ
サイト内検索
カスタム検索
Raspberry Piって?

ラズパイ 3 B+自作スマートスピーカーに伝言メッセージ機能追加

ラズパイ 3 B+自作スマートスピーカーに伝言メッセージ機能追加

2019/05/28

 以前、作って運用しつつもブラッシュアップ中のRaspberry Pi 3 Model B+とJuliusOpen JTalkベースの自作スマートスピーカーがあります。

 主な機能は、

 尚、ラズパイ用ACアダプタを挿したスイッチ付きコンセントでのON/OFFとは別にラズパイ用boot/reboot/shutdown物理ボタン付き。

 ちなみに便利なのでラズパイだけでなく、PC/Debianにも自作スマートスピーカー機能を搭載しています。

伝言メッセージ機能

[2019/05/30]
 現在、音声メモは、機能しません。(スクリプトでは可、スマートスピーカーでは不可)
 原因は特定済み、解決策模索中。

[2019/06/02]
 ALSA/PulseAudio使用で解決
 スクリプトの実行、Linuxパソコン版スマートスピーカー、ラズパイ版スマートスピーカーで機能することを確認済みです。

 今回は、伝言メッセージ機能を追加してみました。

 伝言メッセージ機能は、伝言に特化(して音声メモとは別のパスに音源を保存)することで再生時、音声メモと混ざらないことを意図しているだけで基本、音声メモと同じです。

 ちなみに1人なら外出前に帰宅後に忘れずにやるべきことを録音、帰宅後、再生、2人なら一方のメッセージを他方が聞き、必要なら返事を録音、もしくは、複数人で利用するも基本、メッセージを残すのは、ほぼ特定の1人で聴くのは、その他大勢といったような状況を想定しました。

伝言メッセージ登録用スクリプト

$ chmod +x add_msg.pl
$ cat add_msg.pl
#!/usr/bin/perl
 
use utf8;
use strict;
use warnings;
 
use 5.10.0;
use Time::Local;
 
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
my $fname = "/path/to/voice/msg/$year$mon$mday$hour$min$sec.wav";
 
my $anounce="15秒以内で伝言をどうぞ";
my $saved_msg="伝言を保存しました";
 
system("pactl set-source-volume alsa_input.usb-Generic_USB2.0_PC_CAMERA-02.analog-mono 82% &");
system("/path/to/jsay $anounce &");
sleep 3;
#system("/usr/bin/arecord -D plughw:1,0 $fname &");
system("arecord $fname &");
sleep 15;
system("pactl set-source-volume alsa_input.usb-Generic_USB2.0_PC_CAMERA-02.analog-mono 70% &");
system("pkill -f arecord");
system("mplayer /usr/share/sounds/gnome/default/alerts/drip.ogg");
system("pkill -f mplayer");
system("/path/to/jsay $saved_msg &");
$

 現時点の自作スマートスピーカー仕様の場合、操作待ちさせるウェイクワードを発した後は、ウェイクワードなしで任意に設定できる有効時間内に「伝言を録音して」、「伝言入れて」などの音声操作をした時に呼ばれるスクリプトを想定しています。

 コールされると「15秒以内で伝言をどうぞ」の後、任意の音声を発して録音、ここでは、システムにあったポチャンのような効果音に続けて「伝言を保存しました」というメッセージを以て録音完了とすることにしました。

 ファイル名には、秒まで含むlocaltime値を数値の並びとして使うことで重複することなく、いくつでもメモを保存できるようにしてみました。

 たいていは、1件で十分と思われますが、時間切れで複数録音する可能性もあるかなと。

 一定の時間を決めて割り切ることができれば、誰かが1件入れ、他の誰かが聴くだけで次回録音時、もしくは、返事をする場合は、上書き(保存ファイル名は固定)でもよいでしょう。

[2019/06/02]
 本機能を使用可能にする解決策OSS(既存PC版スマートスピーカー)、ALSA(ラズパイ版)からALSA/PulseAudioへの変更に伴い、arecordの-D(デバイス指定)オプションが不要に。
 ちなみに音声操作と録音で音量を変更したかった為、解決策となるリンク先のpacmdによる事前設定に加え、PulseAudioのコマンドpactlで録音前後に音量調整する行を追加しました。

伝言メッセージ削除用スクリプト

$ chmod +x del_msg.pl
$ cat del_msg.pl
#!/usr/bin/perl
 
use utf8;
use strict;
use warnings;
 
my $fpath="/path/to/voice/msg/*";
my $anounce="全ての伝言を削除します";
my $deleted_msg="完了しました";
 
system("/path/to/jsay $anounce &");
sleep 5;
system("/bin/rm $fpath &");
sleep 1;
system("mplayer /usr/share/sounds/gnome/default/alerts/drip.ogg");
system("pkill -f mplayer");
system("/path/to/jsay $deleted_msg &");
$

 ウェイクワードを発した後、任意に設定できる有効時間内に「伝言を削除して」、「伝言を消して」などの音声操作をした時に呼ばれるスクリプトを想定しています。

 コールされると「全ての伝言を削除します」の後、ここでは、システムにあったポチャンのような効果音に続けて「完了しました」というメッセージを以て削除完了とすることにしました。

伝言メッセージ再生用スクリプト

$ chmod +x play_msg.sh
$ cat play_msg.sh
#!/bin/sh
 
fpath="/path/to/voice/msg/"
cnt=`ls $fpath | wc -l`
if [ $cnt -gt 0 ]
then
  anounce="メモは$cnt件です全ての伝言を再生します"
  complete="メモは以上です"
 
  /path/to/jsay $anounce
 
  for fname in `ls $fpath`
  do
    /usr/bin/aplay $fpath$fname
  done
  /path/to/jsay $complete
else
  non_msg="保存された伝言はありません"
  /path/to/jsay $non_msg
fi
$

 前後しましたが、伝言メッセージ再生用のスクリプトはこれです。

 ウェイクワードを発した後、任意に設定できる有効時間内に「伝言を再生して」、「伝言メッセージを再生して」、「伝言何かあったっけ」、「伝言メッセージ何かあったっけ」などの音声操作をした時に呼ばれるスクリプトを想定しています。

 コールされると録音済み伝言メッセージがある場合、「伝言はx件です全ての伝言を再生します」というメッセージの後、録音済みメッセージが1件ずつ読み上げられ、「メモは以上です」というメッセージを以て読み上げ完了とすることにしました。

 録音した伝言メッセージがない場合、「保存された伝言はありません」というメッセージが流れます。

機能は最小限

 やろうと思えば、他にもいろいろできるでしょうが、Simple is best.ということで。

ラズパイスマートスピーカーへの反映

 /path/to/jsayについてや自作スマートスピーカーへの反映についての詳細は、冒頭の「自作スマートスピーカー」他、リンク先を参照してください。

ウェブ造ホーム前へ次へ