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

自作ラズパイスマートスピーカーでテレビを音声操作

ホーム前へ次へ
Raspberry Piって?

自作ラズパイスマートスピーカーでテレビを音声操作

自作ラズパイスマートスピーカーでテレビを音声操作

2019/02/05

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

 主な機能は、

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

 音声認識にJuliusを使った自作スマートスピーカーに伝言とメモの機能を実装するにあたり、マイクとスピーカーを専有してしまうOSSやALSAからPulseAudioに移行しました。

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

 自ずとモニタ付きとなるPC版スマートスピーカーには、PC及びラズパイ双方のスマートスピーカー機能のデスクトップアプリとしてPyQt5/Qt Designerによる操作パネルも作成しました。

SHARP AQUOS TVを音声操作

ESP8266 NodeMCUリモコン

 今回は、テレビの機能の音声操作について。

 家電操作リモコンには、やはり、ESP8266による自作スマートリモコンを使い、今回は、ESP-01/12/ESP32でSHARP AQUOS TVをWiFi操作します。

ダイソー5個組ミニケースに入れたESP8266自作スマートリモコン発信器

[2019/05/07 追記]
 ピンヘッダ未ハンダのESP8266開発ボードに直接、抵抗220Ω+赤外線LEDをはんだ付けしてケーシング。
 先のトレカケースよりもっと小さなダイソーのミニケース(5個組108円)に入りました。
 ケースは青系半透明ですが、赤外線信号の増幅なし、赤外線LED1個でケース越しにかつ、前掲写真の位置付近で赤外線操作もできました。

概要

 詳細は、自作スマートスピーカー、自作スマートリモコン、SHARP AQUOS TV操作など各リンク先に譲りますが、概要としては、次のようになります。

 何をどう操作するかイメージすべく、

$ pwd
/home/xxx/julius/path/to/dictation-kit
$ vi ./mydic.list
<sil> [] silB
<sil> [] silE
<sp> [] sp
スタンバイ [スタンバイ] s u t a N b a i
ニュートラル [ニュートラル] n u t o r a r u
...
1ch [1ch] i q ch a N
2ch [2ch] n i ch a N
3ch [3ch] s a N ch a N
4ch [4ch] y o N ch a N
5ch [5ch] g o ch a N
6ch [6ch] r o k u ch a N
7ch [7ch] n a n a ch a N
8ch [8ch] h a q ch a N
9ch [9ch] ky u: ch a N
10ch [10ch] j u q ch a N
11ch [11ch] j u: i q ch a N
12h [12ch] j u: n i ch a N
テレビの音上げて [TV音量アップ] t e r e b i n o o t o a g e t e
テレビの音下げて [TV音量ダウン] t e r e b i n o o t o s a g e t e
番組表 [番組表] b a N g u m i hy o u
番組情報 [番組情報] b a N g u m i j o: h o u
...
$ iconv -f utf8 -t eucjp mydic.list > mydic.eucjp
$

 音声認識ソフトウェアJulius用には、

 []内が応答スクリプトvoicerecieve.plに音声テキスト(条件分岐の条件)として渡される部分。

$ pwd
/home/xxx/sound/
$ vi ./voicerecieve.pl
#!/usr/bin/env perl
...
      # 【TV】
      when("1ch"){
       system("/home/xxx/sound/script/tv_control.pl ch1 &");
      }
 ...
      when("番組表"){
       system("/home/xxx/sound/script/tv_control.pl prog_list &");
      }
 ...
      when("BS放送"){
       system("/home/xxx/sound/script/tv_control.pl bs &");
      }
 ...
 

 Juliusから渡される音声テキストへの応答スクリプトvoicerecieve.plは、

 このようなPerlスクリプトの場合、system()を使って実際の家電操作スクリプトtv_control.plを呼ぶ。

$ pwd
/home/xxx/sound/script
$ vi ./tv_control.pl
#!/usr/bin/env perl
use utf8;
#use strict;
use warnings;
 
use 5.10.0;
 
use Encode;
use IO::Socket;
 
use LWP::Simple;
use LWP::UserAgent;
use HTTP::Request::Common( "GET" );
 
# テレビ用スマートリモコンサーバー
local $esp_tv1_server='esp_tv1.local';
 
if ($ARGV[0] eq "power"){
  print "$esp_tv1_server/Power ON OFF\n";
 
  #### インスタンスの生成
  my $ua = new LWP::UserAgent;
  $ua->timeout( 10 );
  #### 要求条件を生成
  my $req = GET( "http://esp_tv1.local/Power" );
  my $res = $ua->request( $req );
  print $res->as_string;
}
...
elsif ($ARGV[0] eq "1ch"){
  print "$esp_tv1_server/ch1\n";
  my $ua = new LWP::UserAgent;
  $ua->timeout( 10 );
  my $req = GET( "http://esp_tv1.local/ch1" );
  my $res = $ua->request( $req );
}
...
elsif ($ARGV[0] eq "prog_list"){
  print "$esp_tv1_server/prog_list\n";
  my $ua = new LWP::UserAgent;
  $ua->timeout( 10 );
  my $req = GET( "http://esp_tv1.local/prog_list" );
  my $res = $ua->request( $req );
}
...
elsif ($ARGV[0] eq "bs"){
  print "$esp_tv1_server/bs\n";
  my $ua = new LWP::UserAgent;
  $ua->timeout( 10 );
  my $req = GET( "http://esp_tv1.local/bs" );
  my $res = $ua->request( $req );
}
...
else {
  print "Argument Error!";
}

 テレビ各種操作スクリプトtv_control.plは、

 ユーザーエージェントのインスタンス化、タイムアウト、リクエスト要求は、共用してもよいかも。

 また、use文は、要らないのもあるかも。

 自動起動時(や現在のログイン状態)に反映すべく、

 リモコン送受信回路については、

ホーム前へ次へ